on dev help sign in
more cleanup
commit5cfbd5eeb38907052003f9bb1eb7d6c7d00c8779 authorEitan Chatav <eitan.chatav@gmail.com> dateSat 17 Feb 2018, 12:59 (9 years ago) parentcebc2a7
4 files changed+79−79
squeal-postgresql/src/Squeal/PostgreSQL/Definition.hs+3−3 squeal-postgresql/src/Squeal/PostgreSQL/Expression.hs+10−11 squeal-postgresql/src/Squeal/PostgreSQL/Query.hs+15−14 squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+51−51
squeal-postgresql/src/Squeal/PostgreSQL/Definition.hs+3−3
@@ -206,7 +206,7 @@ unique
206206 :: SOP.SListI subcolumns
207207 => NP (Column columns) subcolumns
208208 -- ^ unique column or group of columns
209− -> TableConstraintExpression schema columns ('Unique (Aliases subcolumns))
209+ -> TableConstraintExpression schema columns ('Unique (AliasesOf subcolumns))
210210unique columns = UnsafeTableConstraintExpression $
211211 "UNIQUE" <+> parenthesized (renderCommaSeparated renderColumn columns)
212212
@@ -226,7 +226,7 @@ primaryKey
226226 :: (SOP.SListI subcolumns, AllNotNull subcolumns)
227227 => NP (Column columns) subcolumns
228228 -- ^ identifying column or group of columns
229− -> TableConstraintExpression schema columns ('PrimaryKey (Aliases subcolumns))
229+ -> TableConstraintExpression schema columns ('PrimaryKey (AliasesOf subcolumns))
230230primaryKey columns = UnsafeTableConstraintExpression $
231231 "PRIMARY KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
232232
@@ -289,7 +289,7 @@ foreignKey
289289 -> OnUpdateClause
290290 -- ^ what to do when reference is updated
291291 -> TableConstraintExpression schema columns
292− ('ForeignKey (Aliases subcolumns) table (Aliases refsubcolumns))
292+ ('ForeignKey (AliasesOf subcolumns) table (AliasesOf refsubcolumns))
293293foreignKey columns reftable refcolumns onDelete onUpdate =
294294 UnsafeTableConstraintExpression $
295295 "FOREIGN KEY" <+> parenthesized (renderCommaSeparated renderColumn columns)
squeal-postgresql/src/Squeal/PostgreSQL/Expression.hs+10−11
@@ -97,7 +97,7 @@ module Squeal.PostgreSQL.Expression
9797 , every, everyDistinct
9898 , max_, maxDistinct, min_, minDistinct
9999 -- * Tables
100− , Subtable (UnsafeSubtable, renderSubtable)
100+ , Table (UnsafeTable, renderTable)
101101 , TypeExpression (UnsafeTypeExpression, renderTypeExpression)
102102 , PGTyped (pgtype)
103103 , bool
@@ -936,19 +936,18 @@ minDistinct = unsafeAggregateDistinct "min"
936936tables
937937-----------------------------------------}
938938
939−-- | A `Subtable` from a table expression is a way
939+-- | A `Table` from a table expression is a way
940940-- to call a table reference by its alias.
941−newtype Subtable
942− (table :: RelationsType)
941+newtype Table
942+ (schema :: TablesType)
943943 (columns :: RelationType)
944− = UnsafeSubtable { renderSubtable :: ByteString }
944+ = UnsafeTable { renderTable :: ByteString }
945945 deriving (GHC.Generic,Show,Eq,Ord,NFData)
946−instance Has
947− (subtable :: Symbol)
948− (table :: RelationsType)
949− (columns :: RelationType)
950− => IsLabel subtable (Subtable table columns) where
951− fromLabel = UnsafeSubtable $ renderAlias (Alias @subtable)
946+instance
947+ ( Has alias schema table
948+ , relation ~ ColumnsToRelation (TableToColumns table)
949+ ) => IsLabel alias (Table schema relation) where
950+ fromLabel = UnsafeTable $ renderAlias (Alias @alias)
952951
953952{-----------------------------------------
954953type expressions
squeal-postgresql/src/Squeal/PostgreSQL/Query.hs+15−14
@@ -12,6 +12,7 @@ Squeal queries.
1212 DataKinds
1313 , DeriveDataTypeable
1414 , DeriveGeneric
15+ , FlexibleContexts
1516 , FlexibleInstances
1617 , GADTs
1718 , GeneralizedNewtypeDeriving
@@ -45,7 +46,7 @@ module Squeal.PostgreSQL.Query
4546 , selectDistinctDotStar
4647 -- * Table Expressions
4748 , TableExpression (..)
48− , renderSubtableExpression
49+ , renderTableExpression
4950 , from
5051 , where_
5152 , group
@@ -70,7 +71,7 @@ module Squeal.PostgreSQL.Query
7071
7172import Control.DeepSeq
7273import Data.ByteString (ByteString)
73−import Data.Monoid
74+import Data.Monoid hiding (All)
7475import Data.String
7576import Data.Word
7677import Generics.SOP hiding (from)
@@ -348,7 +349,7 @@ select
348349select list tabs = UnsafeQuery $
349350 "SELECT"
350351 <+> renderCommaSeparated (renderAliasedAs renderExpression) list
351− <+> renderSubtableExpression tabs
352+ <+> renderTableExpression tabs
352353
353354-- | After the select list has been processed, the result table can
354355-- be subject to the elimination of duplicate rows using `selectDistinct`.
@@ -362,7 +363,7 @@ selectDistinct
362363selectDistinct list tabs = UnsafeQuery $
363364 "SELECT DISTINCT"
364365 <+> renderCommaSeparated (renderAliasedAs renderExpression) list
365− <+> renderSubtableExpression tabs
366+ <+> renderTableExpression tabs
366367
367368-- | The simplest kind of query is `selectStar` which emits all columns
368369-- that the table expression produces.
@@ -371,7 +372,7 @@ selectStar
371372 => TableExpression schema params tables 'Ungrouped
372373 -- ^ intermediate virtual table
373374 -> Query schema params columns
374−selectStar tabs = UnsafeQuery $ "SELECT" <+> "*" <+> renderSubtableExpression tabs
375+selectStar tabs = UnsafeQuery $ "SELECT" <+> "*" <+> renderTableExpression tabs
375376
376377-- | A `selectDistinctStar` emits all columns that the table expression
377378-- produces and eliminates duplicate rows.
@@ -381,32 +382,32 @@ selectDistinctStar
381382 -- ^ intermediate virtual table
382383 -> Query schema params columns
383384selectDistinctStar tabs = UnsafeQuery $
384− "SELECT DISTINCT" <+> "*" <+> renderSubtableExpression tabs
385+ "SELECT DISTINCT" <+> "*" <+> renderTableExpression tabs
385386
386387-- | When working with multiple tables, it can also be useful to ask
387388-- for all the columns of a particular table, using `selectDotStar`.
388389selectDotStar
389390 :: Has table tables columns
390391 => Alias table
391− -- ^ particular virtual subtable
392+ -- ^ particular virtual Table
392393 -> TableExpression schema params tables 'Ungrouped
393394 -- ^ intermediate virtual table
394395 -> Query schema params columns
395396selectDotStar table tables = UnsafeQuery $
396− "SELECT" <+> renderAlias table <> ".*" <+> renderSubtableExpression tables
397+ "SELECT" <+> renderAlias table <> ".*" <+> renderTableExpression tables
397398
398399-- | A `selectDistinctDotStar` asks for all the columns of a particular table,
399400-- and eliminates duplicate rows.
400401selectDistinctDotStar
401402 :: Has table tables columns
402403 => Alias table
403− -- ^ particular virtual subtable
404+ -- ^ particular virtual Table
404405 -> TableExpression schema params tables 'Ungrouped
405406 -- ^ intermediate virtual table
406407 -> Query schema params columns
407408selectDistinctDotStar table tables = UnsafeQuery $
408409 "SELECT DISTINCT" <+> renderAlias table <> ".*"
409− <+> renderSubtableExpression tables
410+ <+> renderTableExpression tables
410411
411412{-----------------------------------------
412413Table Expressions
@@ -466,10 +467,10 @@ data TableExpression
466467 }
467468
468469-- | Render a `TableExpression`
469−renderSubtableExpression
470+renderTableExpression
470471 :: TableExpression schema params tables grouping
471472 -> ByteString
472−renderSubtableExpression
473+renderTableExpression
473474 (TableExpression tables whs' grps' hvs' srts' lims' offs') = mconcat
474475 [ "FROM ", renderFromClause tables
475476 , renderWheres whs'
@@ -612,7 +613,7 @@ their placement in SQL.
612613-}
613614data FromClause schema params tables where
614615 Table
615− :: Aliased (Subtable (TablesToRelations schema)) table
616+ :: Aliased (Table schema) table
616617 -> FromClause schema params '[table]
617618 Subquery
618619 :: Aliased (Query schema params) table
@@ -646,7 +647,7 @@ data FromClause schema params tables where
646647-- | Renders a `FromClause`.
647648renderFromClause :: FromClause schema params tables -> ByteString
648649renderFromClause = \case
649− Table table -> renderAliasedAs renderSubtable table
650+ Table table -> renderAliasedAs renderTable table
650651 Subquery selection -> renderAliasedAs (parenthesized . renderQuery) selection
651652 CrossJoin right left ->
652653 renderFromClause left <+> "CROSS JOIN" <+> renderFromClause right
squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+51−51
@@ -43,21 +43,29 @@ module Squeal.PostgreSQL.Schema
4343 , TableType
4444 , TablesType
4545 , Grouping (..)
46− -- * Constraints
47− , PGNum
48− , PGIntegral
49− , PGFloating
50− -- * Aliases
46+ -- * PostgreSQL Constraints
47+ , (:=>)
48+ , ColumnsToRelation
49+ , TableToColumns
50+ , TablesToRelations
51+ , ColumnConstraint (..)
52+ , TableConstraint (..)
53+ -- * AliasesOf
5154 , (:::)
5255 , Alias (Alias)
5356 , renderAlias
5457 , Aliased (As)
5558 , renderAliasedAs
59+ , AliasesOf
60+ , Has
61+ , HasUnique
5662 , IsLabel (..)
5763 , IsTableColumn (..)
5864 -- * Type Families
5965 , In
60− , HasUnique
66+ , PGNum
67+ , PGIntegral
68+ , PGFloating
6169 , PGTypeOf
6270 , SameTypes
6371 , AllNotNull
@@ -75,15 +83,6 @@ module Squeal.PostgreSQL.Schema
7583 -- * Generics
7684 , SameField
7785 , SameFields
78− -- * PostgreSQL Constraints
79− , (:=>)
80− , ColumnsToRelation
81− , TableToColumns
82− , TablesToRelations
83− , ColumnConstraint (..)
84− , TableConstraint (..)
85− , Aliases
86− , Has
8786 ) where
8887
8988import Control.DeepSeq
@@ -198,22 +197,6 @@ data Grouping
198197 = Ungrouped -- ^ no aggregation permitted
199198 | Grouped [(Symbol,Symbol)] -- ^ aggregation required for any column which is not grouped
200199
201−-- | `PGNum` is a constraint on `PGType` whose
202−-- `Squeal.PostgreSQL.Expression.Expression`s have a `Num` constraint.
203−type PGNum ty =
204− In ty '[ 'PGint2, 'PGint4, 'PGint8, 'PGnumeric, 'PGfloat4, 'PGfloat8]
205−
206−-- | `PGFloating` is a constraint on `PGType` whose
207−-- `Squeal.PostgreSQL.Expression.Expression`s
208−-- have `Fractional` and `Floating` constraints.
209−type PGFloating ty = In ty '[ 'PGfloat4, 'PGfloat8, 'PGnumeric]
210−
211−-- | `PGIntegral` is a constraint on `PGType` whose
212−-- `Squeal.PostgreSQL.Expression.Expression`s
213−-- have `Squeal.PostgreSQL.Expression.div_` and
214−-- `Squeal.PostgreSQL.Expression.mod_` functions.
215−type PGIntegral ty = In ty '[ 'PGint2, 'PGint4, 'PGint8]
216−
217200-- | `Alias`es are proxies for a type level string or `Symbol`
218201-- and have an `IsLabel` instance so that with @-XOverloadedLabels@
219202--
@@ -225,8 +208,8 @@ data Alias (alias :: Symbol) = Alias
225208instance alias1 ~ alias2 => IsLabel alias1 (Alias alias2) where
226209 fromLabel = Alias
227210
228−-- | >>> renderAlias #alias
229−-- "alias"
211+-- | >>> renderAlias #jimbob
212+-- "jimbob"
230213renderAlias :: KnownSymbol alias => Alias alias -> ByteString
231214renderAlias = fromString . symbolVal
232215
@@ -261,6 +244,25 @@ renderAliasedAs
261244renderAliasedAs render (expression `As` alias) =
262245 render expression <> " AS " <> renderAlias alias
263246
247+-- | `AliasesOf` retains the AliasesOf in a row.
248+type family AliasesOf aliaseds where
249+ AliasesOf '[] = '[]
250+ AliasesOf (alias ::: ty ': tys) = alias ': AliasesOf tys
251+
252+-- | @HasUnique alias xs x@ is a constraint that proves that @xs@ is a singleton
253+-- of @alias ::: x@.
254+type HasUnique alias xs x = xs ~ '[alias ::: x]
255+
256+-- | @Has alias xs x@ is a constraint that proves that @xs@ has a field
257+-- of @alias ::: x@.
258+class KnownSymbol alias =>
259+ Has (alias :: Symbol) (fields :: [(Symbol,kind)]) (field :: kind)
260+ | alias fields -> field where
261+instance {-# OVERLAPPING #-} KnownSymbol alias
262+ => Has alias (alias ::: field ': fields) field
263+instance {-# OVERLAPPABLE #-} (KnownSymbol alias, Has alias fields field)
264+ => Has alias (field' ': fields) field
265+
264266-- | Analagous to `IsLabel`, the constraint
265267-- `IsTableColumn` defines `!` for a column alias qualified
266268-- by a table alias.
@@ -274,9 +276,21 @@ type family In x xs :: Constraint where
274276 In x (x ': xs) = ()
275277 In x (y ': xs) = In x xs
276278
277−-- | @HasUnique alias xs x@ is a constraint that proves that @xs@ is a singleton
278−-- of @alias ::: x@.
279−type HasUnique alias xs x = xs ~ '[alias ::: x]
279+-- | `PGNum` is a constraint on `PGType` whose
280+-- `Squeal.PostgreSQL.Expression.Expression`s have a `Num` constraint.
281+type PGNum ty =
282+ In ty '[ 'PGint2, 'PGint4, 'PGint8, 'PGnumeric, 'PGfloat4, 'PGfloat8]
283+
284+-- | `PGFloating` is a constraint on `PGType` whose
285+-- `Squeal.PostgreSQL.Expression.Expression`s
286+-- have `Fractional` and `Floating` constraints.
287+type PGFloating ty = In ty '[ 'PGfloat4, 'PGfloat8, 'PGnumeric]
288+
289+-- | `PGIntegral` is a constraint on `PGType` whose
290+-- `Squeal.PostgreSQL.Expression.Expression`s
291+-- have `Squeal.PostgreSQL.Expression.div_` and
292+-- `Squeal.PostgreSQL.Expression.mod_` functions.
293+type PGIntegral ty = In ty '[ 'PGint2, 'PGint4, 'PGint8]
280294
281295-- | `PGTypeOf` forgets about @NULL@ and any column constraints.
282296type family PGTypeOf (ty :: NullityType) :: PGType where
@@ -382,7 +396,7 @@ instance field ~ column => SameField ('Type.FieldInfo field) (column ::: ty)
382396
383397-- | A `SameFields` constraint proves that a
384398-- `Generics.SOP.Type.Metadata.DatatypeInfo` of a record type has the same
385−-- field names as the column aliases of a `ColumnsType`.
399+-- field names as the column AliasesOf of a `ColumnsType`.
386400type family SameFields
387401 (datatypeInfo :: Type.DatatypeInfo) (columns :: RelationType)
388402 :: Constraint where
@@ -394,17 +408,3 @@ type family SameFields
394408 ('Type.Newtype _module _datatype ('Type.Record _constructor fields))
395409 columns
396410 = AllZip SameField fields columns
397−
398−-- type Unconstraint = ('[] :: [(Symbol,TableConstraint)])
399−
400−type family Aliases xs where
401− Aliases '[] = '[]
402− Aliases ((alias ::: x) ': xs) = alias ': Aliases xs
403−
404−class KnownSymbol alias =>
405− Has (alias :: Symbol) (fields :: [(Symbol,kind)]) (field :: kind)
406− | alias fields -> field where
407−instance {-# OVERLAPPING #-} KnownSymbol alias
408− => Has alias (alias ::: field ': fields) field
409−instance {-# OVERLAPPABLE #-} (KnownSymbol alias, Has alias fields field)
410− => Has alias (field' ': fields) field