@@ -37,9 +37,8 @@ module Squeal.PostgreSQL.Expression
37 ( -- * Expression
37 ( -- * Expression
38 Expression (UnsafeExpression, renderExpression)
38 Expression (UnsafeExpression, renderExpression)
39 , HasParameter (param)
39 , HasParameter (param)
40− , HasColumn (getColumn)
41− , Column (Column)
40+ -- , Column (Column)
42− , renderColumn
41+ -- , renderColumn
43 , GroupedBy (getGroup1, getGroup2)
42 , GroupedBy (getGroup1, getGroup2)
44 -- ** Null
43 -- ** Null
@@ -100,8 +99,7 @@ module Squeal.PostgreSQL.Expression
100 , every, everyDistinct
99 , every, everyDistinct
101 , max_, maxDistinct, min_, minDistinct
100 , max_, maxDistinct, min_, minDistinct
102 -- * Tables
101 -- * Tables
103− , Table (UnsafeTable, renderTable)
102+ , Subtable (UnsafeSubtable, renderSubtable)
104− , HasTable (getTable)
105 , TypeExpression (UnsafeTypeExpression, renderTypeExpression)
103 , TypeExpression (UnsafeTypeExpression, renderTypeExpression)
106 , PGTyped (pgtype)
104 , PGTyped (pgtype)
@@ -206,32 +204,11 @@ instance {-# OVERLAPPING #-} PGTyped (PGTypeOf ty1)
206instance {-# OVERLAPPABLE #-} (KnownNat n, HasParameter (n-1) params ty)
204instance {-# OVERLAPPABLE #-} (KnownNat n, HasParameter (n-1) params ty)
207 => HasParameter n (ty' : params) ty
205 => HasParameter n (ty' : params) ty
209−{- | A `HasColumn` constraint indicates an unqualified column reference.
210−`getColumn` can only be unambiguous when the `TableExpression` the column
211−references is unique, in which case the column may be referenced using
212−@-XOverloadedLabels@. Otherwise, combined with a `HasTable` constraint, the
213−qualified column reference operator `!` may be used.
215−class KnownSymbol column => HasColumn
217− (columns :: RelationType)
219− | column columns -> ty where
221− :: HasUnique table tables columns
207+instance (HasUnique table tables columns, Has column columns ty)
223− -> Expression tables 'Ungrouped params ty
224− getColumn column = UnsafeExpression $ renderAlias column
225−instance {-# OVERLAPPING #-} KnownSymbol column
226− => HasColumn column (column ::: ty ': tys) ty
227−instance {-# OVERLAPPABLE #-} (KnownSymbol column, HasColumn column table ty)
228− => HasColumn column (ty' ': table) ty
230−instance (HasColumn column columns ty, HasUnique table tables columns)
231 => IsLabel column (Expression tables 'Ungrouped params ty) where
208 => IsLabel column (Expression tables 'Ungrouped params ty) where
232− fromLabel = getColumn (Alias @column)
209+ fromLabel = UnsafeExpression $ renderAlias (Alias @column)
234−instance (HasTable table tables columns, HasColumn column columns ty)
211+instance (Has table tables columns, Has column columns ty)
235 => IsTableColumn table column (Expression tables 'Ungrouped params ty) where
212 => IsTableColumn table column (Expression tables 'Ungrouped params ty) where
236 table ! column = UnsafeExpression $
213 table ! column = UnsafeExpression $
237 renderAlias table <> "." <> renderAlias column
214 renderAlias table <> "." <> renderAlias column
@@ -240,21 +217,21 @@ instance (HasTable table tables columns, HasColumn column columns ty)
240-- in `Squeel.PostgreSQL.Definition.unique` and other
217-- in `Squeel.PostgreSQL.Definition.unique` and other
241-- `Squeel.PostgreSQL.Definition.TableConstraint`s to witness a
218-- `Squeel.PostgreSQL.Definition.TableConstraint`s to witness a
242-- subcolumns relationship.
219-- subcolumns relationship.
243−data Column
220+-- data Column
244− (columns :: RelationType)
221+-- (columns :: RelationType)
245− (columnty :: (Symbol,NullityType))
222+-- (columnty :: (Symbol,NullityType))
248− :: HasColumn column columns ty
225+-- :: Has column columns ty
249− => Alias column
226+-- => Alias column
250− -> Column columns (column ::: ty)
227+-- -> Column columns (column ::: ty)
251−deriving instance Show (Column columns columnty)
228+-- deriving instance Show (Column columns columnty)
252−deriving instance Eq (Column columns columnty)
229+-- deriving instance Eq (Column columns columnty)
253−deriving instance Ord (Column columns columnty)
230+-- deriving instance Ord (Column columns columnty)
255−-- | Render a `Column`.
232+-- -- | Render a `Column`.
256−renderColumn :: Column columns columnty -> ByteString
233+-- renderColumn :: Column columns columnty -> ByteString
257−renderColumn (Column column) = renderAlias column
234+-- renderColumn (Column column) = renderAlias column
259{- | A `GroupedBy` constraint indicates that a table qualified column is
236{- | A `GroupedBy` constraint indicates that a table qualified column is
260a member of the auxiliary namespace created by @GROUP BY@ clauses and thus,
237a member of the auxiliary namespace created by @GROUP BY@ clauses and thus,
@@ -263,12 +240,12 @@ may be called in an output `Expression` without aggregating.
263class (KnownSymbol table, KnownSymbol column)
240class (KnownSymbol table, KnownSymbol column)
264 => GroupedBy table column bys where
241 => GroupedBy table column bys where
265 getGroup1
242 getGroup1
266− :: (HasUnique table tables columns, HasColumn column columns ty)
243+ :: (HasUnique table tables columns, Has column columns ty)
267 => Alias column
244 => Alias column
268 -> Expression tables ('Grouped bys) params ty
245 -> Expression tables ('Grouped bys) params ty
269 getGroup1 column = UnsafeExpression $ renderAlias column
246 getGroup1 column = UnsafeExpression $ renderAlias column
270 getGroup2
247 getGroup2
271− :: (HasTable table tables columns, HasColumn column columns ty)
248+ :: (Has table tables columns, Has column columns ty)
272 => Alias table
249 => Alias table
273 -> Alias column
250 -> Alias column
274 -> Expression tables ('Grouped bys) params ty
251 -> Expression tables ('Grouped bys) params ty
@@ -284,15 +261,15 @@ instance {-# OVERLAPPABLE #-}
286 ( HasUnique table tables columns
263 ( HasUnique table tables columns
287− , HasColumn column columns ty
264+ , Has column columns ty
288 , GroupedBy table column bys
265 , GroupedBy table column bys
289 ) => IsLabel column
266 ) => IsLabel column
290 (Expression tables ('Grouped bys) params ty) where
267 (Expression tables ('Grouped bys) params ty) where
291 fromLabel = getGroup1 (Alias @column)
268 fromLabel = getGroup1 (Alias @column)
294− ( HasTable table tables columns
271+ ( Has table tables columns
295− , HasColumn column columns ty
272+ , Has column columns ty
296 , GroupedBy table column bys
273 , GroupedBy table column bys
297 ) => IsTableColumn table column
274 ) => IsTableColumn table column
298 (Expression tables ('Grouped bys) params ty) where (!) = getGroup2
275 (Expression tables ('Grouped bys) params ty) where (!) = getGroup2
@@ -961,31 +938,19 @@ minDistinct = unsafeAggregateDistinct "min"
962-----------------------------------------}
939-----------------------------------------}
964−-- | A `Table` from a schema without its alias with an `IsLabel` instance
941+-- | A `Subtable` from a table expression is a way
965-- to call a table reference by its alias.
942-- to call a table reference by its alias.
966−newtype Table
943+newtype Subtable
967− (schema :: RelationProduct)
944+ (table :: RelationProduct)
968 (columns :: RelationType)
945 (columns :: RelationType)
969− = UnsafeTable { renderTable :: ByteString }
946+ = UnsafeSubtable { renderSubtable :: ByteString }
970 deriving (GHC.Generic,Show,Eq,Ord,NFData)
947 deriving (GHC.Generic,Show,Eq,Ord,NFData)
972−-- | A `HasTable` constraint indicates a table reference.
973−class KnownSymbol table => HasTable
974− (table :: Symbol)
949+ (subtable :: Symbol)
975− (tables :: RelationProduct)
950+ (table :: RelationProduct)
976 (columns :: RelationType)
951 (columns :: RelationType)
977− | table tables -> columns where
952+ => IsLabel subtable (Subtable table columns) where
978− getTable :: Alias table -> Table tables columns
953+ fromLabel = UnsafeSubtable $ renderAlias (Alias @subtable)
979− getTable table = UnsafeTable $ renderAlias table
980−instance {-# OVERLAPPING #-} KnownSymbol table
981− => HasTable table ((table ::: columns) ': tables) columns
982−instance {-# OVERLAPPABLE #-}
983− (KnownSymbol table, HasTable table schema columns)
984− => HasTable table (table' ': schema) columns
986−instance HasTable table schema columns
987− => IsLabel table (Table schema columns) where
988− fromLabel = getTable (Alias @table)
990{-----------------------------------------
955{-----------------------------------------
991type expressions
956type expressions