on dev help sign in
Selection

and refactor selects

commit27b0a3af6fbc800e5a8f2a970e974392ba21708a authorEitan Chatav <eitan.chatav@gmail.com> dateFri 7 Dec 2018, 01:07 (8 years ago) parent19476ad
3 files changed+50−56
squeal-postgresql/exe/Example.hs+1−1 squeal-postgresql/src/Squeal/PostgreSQL/Migration.hs+1−1 squeal-postgresql/src/Squeal/PostgreSQL/Query.hs+48−54
squeal-postgresql/exe/Example.hs+1−1
@@ -79,7 +79,7 @@ getUsers :: Query DB '[]
7979 '[ "userName" ::: 'NotNull 'PGtext
8080 , "userEmail" ::: 'Null 'PGtext
8181 , "userVec" ::: 'NotNull ('PGvararray ('Null 'PGint2))]
82−getUsers = select
82+getUsers = select_
8383 (#u ! #name `as` #userName :* #e ! #email `as` #userEmail :* #u ! #vec `as` #userVec)
8484 ( from (table (#users `as` #u)
8585 & innerJoin (table (#emails `as` #e))
squeal-postgresql/src/Squeal/PostgreSQL/Migration.hs+1−1
@@ -291,7 +291,7 @@ selectMigration
291291 :: Has "migrations" schemas MigrationsSchema
292292 => Query ('[] :=> schemas) '[ 'NotNull 'PGtext ]
293293 '[ "executed_at" ::: 'NotNull 'PGtimestamptz ]
294−selectMigration = select
294+selectMigration = select_
295295 (#executed_at `as` #executed_at)
296296 ( from (table ((#migrations ! #schema_migrations) `as` #m))
297297 & where_ (#name .== param @1))
squeal-postgresql/src/Squeal/PostgreSQL/Query.hs+48−54
@@ -31,11 +31,9 @@ module Squeal.PostgreSQL.Query
3131 Query (UnsafeQuery, renderQuery)
3232 -- ** Select
3333 , select
34+ , select_
3435 , selectDistinct
35− , selectStar
36− , selectDistinctStar
37− , selectDotStar
38− , selectDistinctDotStar
36+ , selectDistinct_
3937 -- ** Values
4038 , values
4139 , values_
@@ -394,80 +392,76 @@ q1 `exceptAll` q2 = UnsafeQuery $
394392SELECT queries
395393-----------------------------------------}
396394
395+data Selection db params grp from row where
396+ List
397+ :: SListI row
398+ => NP (Aliased (Expression db params grp from)) row
399+ -> Selection db params grp from row
400+ Star
401+ :: HasUnique tab from row
402+ => Selection db params 'Ungrouped from row
403+ DotStar
404+ :: Has tab from row
405+ => Alias tab
406+ -> Selection db params 'Ungrouped from row
407+ Also
408+ :: Selection db params grp from right
409+ -> Selection db params grp from left
410+ -> Selection db params grp from (Join left right)
411+
412+instance RenderSQL (Selection db params grp from row) where
413+ renderSQL = \case
414+ List list -> renderCommaSeparated (renderAliasedAs renderExpression) list
415+ Star -> "*"
416+ DotStar tab -> renderAlias tab <> ".*"
417+ Also right left -> renderSQL left <> ", " <> renderSQL right
418+
397419-- | the `TableExpression` in the `select` command constructs an intermediate
398420-- virtual table by possibly combining tables, views, eliminating rows,
399421-- grouping, etc. This table is finally passed on to processing by
400422-- the select list. The select list determines which columns of
401423-- the intermediate table are actually output.
402424select
403− :: (SListI columns, columns ~ (col ': cols))
404− => NP (Aliased (Expression db params grp from)) columns
425+ :: (SListI row, row ~ (x ': xs))
426+ => Selection db params grp from row
405427 -- ^ select list
406428 -> TableExpression db params grp from
407429 -- ^ intermediate virtual table
408− -> Query db params columns
409−select list rels = UnsafeQuery $
430+ -> Query db params row
431+select selection tabexpr = UnsafeQuery $
410432 "SELECT"
411− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
412− <+> renderTableExpression rels
433+ <+> renderSQL selection
434+ <+> renderTableExpression tabexpr
435+
436+select_
437+ :: (SListI row, row ~ (x ': xs))
438+ => NP (Aliased (Expression db params grp from)) row
439+ -> TableExpression db params grp from
440+ -> Query db params row
441+select_ list = select (List list)
413442
414443-- | After the select list has been processed, the result table can
415444-- be subject to the elimination of duplicate rows using `selectDistinct`.
416445selectDistinct
417446 :: (SListI columns, columns ~ (col ': cols))
418− => NP (Aliased (Expression db params 'Ungrouped from)) columns
447+ => Selection db params 'Ungrouped from columns
419448 -- ^ select list
420449 -> TableExpression db params 'Ungrouped from
421450 -- ^ intermediate virtual table
422451 -> Query db params columns
423−selectDistinct list rels = UnsafeQuery $
452+selectDistinct selection tabexpr = UnsafeQuery $
424453 "SELECT DISTINCT"
425− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
426− <+> renderTableExpression rels
427−
428−-- | The simplest kind of query is `selectStar` which emits all columns
429−-- that the table expression produces.
430−selectStar
431− :: HasUnique table from columns
432− => TableExpression db params 'Ungrouped from
433− -- ^ intermediate virtual table
434− -> Query db params columns
435−selectStar rels = UnsafeQuery $ "SELECT" <+> "*" <+> renderTableExpression rels
454+ <+> renderSQL selection
455+ <+> renderTableExpression tabexpr
436456
437−-- | A `selectDistinctStar` emits all columns that the table expression
438−-- produces and eliminates duplicate rows.
439−selectDistinctStar
440− :: HasUnique table from columns
441− => TableExpression db params 'Ungrouped from
442− -- ^ intermediate virtual table
443− -> Query db params columns
444−selectDistinctStar rels = UnsafeQuery $
445− "SELECT DISTINCT" <+> "*" <+> renderTableExpression rels
446−
447−-- | When working with multiple tables, it can also be useful to ask
448−-- for all the columns of a particular table, using `selectDotStar`.
449−selectDotStar
450− :: Has table from columns
451− => Alias table
452− -- ^ particular virtual subtable
453− -> TableExpression db params 'Ungrouped from
454− -- ^ intermediate virtual table
455− -> Query db params columns
456−selectDotStar rel tab = UnsafeQuery $
457− "SELECT" <+> renderAlias rel <> ".*" <+> renderTableExpression tab
458−
459−-- | A `selectDistinctDotStar` asks for all the columns of a particular table,
460−-- and eliminates duplicate rows.
461−selectDistinctDotStar
462− :: Has table from columns
463− => Alias table
464− -- ^ particular virtual table
457+selectDistinct_
458+ :: (SListI columns, columns ~ (col ': cols))
459+ => NP (Aliased (Expression db params 'Ungrouped from)) columns
460+ -- ^ select list
465461 -> TableExpression db params 'Ungrouped from
466462 -- ^ intermediate virtual table
467463 -> Query db params columns
468−selectDistinctDotStar rel tab = UnsafeQuery $
469− "SELECT DISTINCT" <+> renderAlias rel <> ".*"
470− <+> renderTableExpression tab
464+selectDistinct_ list = select (List list)
471465
472466-- | `values` computes a row value or set of row values
473467-- specified by value expressions. It is most commonly used