on dev help sign in
Selection
27b0a3aEitan Chatav
squeal-postgresql/exe/Example.hs+1−1
@@ -79,7 +79,7 @@ getUsers :: Query DB '[]
79 '[ "userName" ::: 'NotNull 'PGtext
79 '[ "userName" ::: 'NotNull 'PGtext
80 , "userEmail" ::: 'Null 'PGtext
80 , "userEmail" ::: 'Null 'PGtext
81 , "userVec" ::: 'NotNull ('PGvararray ('Null 'PGint2))]
81 , "userVec" ::: 'NotNull ('PGvararray ('Null 'PGint2))]
82−getUsers = select
82+getUsers = select_
83 (#u ! #name `as` #userName :* #e ! #email `as` #userEmail :* #u ! #vec `as` #userVec)
83 (#u ! #name `as` #userName :* #e ! #email `as` #userEmail :* #u ! #vec `as` #userVec)
84 ( from (table (#users `as` #u)
84 ( from (table (#users `as` #u)
85 & innerJoin (table (#emails `as` #e))
85 & innerJoin (table (#emails `as` #e))
squeal-postgresql/src/Squeal/PostgreSQL/Migration.hs+1−1
@@ -291,7 +291,7 @@ selectMigration
291 :: Has "migrations" schemas MigrationsSchema
291 :: Has "migrations" schemas MigrationsSchema
292 => Query ('[] :=> schemas) '[ 'NotNull 'PGtext ]
292 => Query ('[] :=> schemas) '[ 'NotNull 'PGtext ]
293 '[ "executed_at" ::: 'NotNull 'PGtimestamptz ]
293 '[ "executed_at" ::: 'NotNull 'PGtimestamptz ]
294−selectMigration = select
294+selectMigration = select_
295 (#executed_at `as` #executed_at)
295 (#executed_at `as` #executed_at)
296 ( from (table ((#migrations ! #schema_migrations) `as` #m))
296 ( from (table ((#migrations ! #schema_migrations) `as` #m))
297 & where_ (#name .== param @1))
297 & where_ (#name .== param @1))
squeal-postgresql/src/Squeal/PostgreSQL/Query.hs+48−54
@@ -31,11 +31,9 @@ module Squeal.PostgreSQL.Query
31 Query (UnsafeQuery, renderQuery)
31 Query (UnsafeQuery, renderQuery)
32 -- ** Select
32 -- ** Select
33 , select
33 , select
34+ , select_
34 , selectDistinct
35 , selectDistinct
35− , selectStar
36+ , selectDistinct_
36− , selectDistinctStar
37− , selectDotStar
38− , selectDistinctDotStar
39 -- ** Values
37 -- ** Values
40 , values
38 , values
41 , values_
39 , values_
@@ -394,80 +392,76 @@ q1 `exceptAll` q2 = UnsafeQuery $
394SELECT queries
392SELECT queries
395-----------------------------------------}
393-----------------------------------------}
396
394
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+
397-- | the `TableExpression` in the `select` command constructs an intermediate
419-- | the `TableExpression` in the `select` command constructs an intermediate
398-- virtual table by possibly combining tables, views, eliminating rows,
420-- virtual table by possibly combining tables, views, eliminating rows,
399-- grouping, etc. This table is finally passed on to processing by
421-- grouping, etc. This table is finally passed on to processing by
400-- the select list. The select list determines which columns of
422-- the select list. The select list determines which columns of
401-- the intermediate table are actually output.
423-- the intermediate table are actually output.
402select
424select
403− :: (SListI columns, columns ~ (col ': cols))
425+ :: (SListI row, row ~ (x ': xs))
404− => NP (Aliased (Expression db params grp from)) columns
426+ => Selection db params grp from row
405 -- ^ select list
427 -- ^ select list
406 -> TableExpression db params grp from
428 -> TableExpression db params grp from
407 -- ^ intermediate virtual table
429 -- ^ intermediate virtual table
408− -> Query db params columns
430+ -> Query db params row
409−select list rels = UnsafeQuery $
431+select selection tabexpr = UnsafeQuery $
410 "SELECT"
432 "SELECT"
411− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
433+ <+> renderSQL selection
412− <+> renderTableExpression rels
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)
413
442
414-- | After the select list has been processed, the result table can
443-- | After the select list has been processed, the result table can
415-- be subject to the elimination of duplicate rows using `selectDistinct`.
444-- be subject to the elimination of duplicate rows using `selectDistinct`.
416selectDistinct
445selectDistinct
417 :: (SListI columns, columns ~ (col ': cols))
446 :: (SListI columns, columns ~ (col ': cols))
418− => NP (Aliased (Expression db params 'Ungrouped from)) columns
447+ => Selection db params 'Ungrouped from columns
419 -- ^ select list
448 -- ^ select list
420 -> TableExpression db params 'Ungrouped from
449 -> TableExpression db params 'Ungrouped from
421 -- ^ intermediate virtual table
450 -- ^ intermediate virtual table
422 -> Query db params columns
451 -> Query db params columns
423−selectDistinct list rels = UnsafeQuery $
452+selectDistinct selection tabexpr = UnsafeQuery $
424 "SELECT DISTINCT"
453 "SELECT DISTINCT"
425− <+> renderCommaSeparated (renderAliasedAs renderExpression) list
454+ <+> renderSQL selection
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
455+ <+> renderTableExpression tabexpr
436
456
437−-- | A `selectDistinctStar` emits all columns that the table expression
457+selectDistinct_
438−-- produces and eliminates duplicate rows.
458+ :: (SListI columns, columns ~ (col ': cols))
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
459+ => NP (Aliased (Expression db params 'Ungrouped from)) columns
454− -- ^ intermediate virtual table
460+ -- ^ select list
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
465 -> TableExpression db params 'Ungrouped from
461 -> TableExpression db params 'Ungrouped from
466 -- ^ intermediate virtual table
462 -- ^ intermediate virtual table
467 -> Query db params columns
463 -> Query db params columns
468−selectDistinctDotStar rel tab = UnsafeQuery $
464+selectDistinct_ list = select (List list)
469− "SELECT DISTINCT" <+> renderAlias rel <> ".*"
470− <+> renderTableExpression tab
471
465
472-- | `values` computes a row value or set of row values
466-- | `values` computes a row value or set of row values
473-- specified by value expressions. It is most commonly used
467-- specified by value expressions. It is most commonly used