Copyright | (c) Eitan Chatav 2017 |
---|---|
Maintainer | [email protected] |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Squeal.PostgreSQL.Schema
Description
This module provides a type-level DSL for kinds of Postgres types, tables, schema, constraints, aliases, enumerated labels, and groupings. It also defines useful type families to operate on these. Finally, it defines an embedding of Haskell types into Postgres types.
Synopsis
- data PGType
- = PGbool
- | PGint2
- | PGint4
- | PGint8
- | PGnumeric
- | PGfloat4
- | PGfloat8
- | PGchar Nat
- | PGvarchar Nat
- | PGtext
- | PGbytea
- | PGtimestamp
- | PGtimestamptz
- | PGdate
- | PGtime
- | PGtimetz
- | PGinterval
- | PGuuid
- | PGinet
- | PGjson
- | PGjsonb
- | PGvararray PGType
- | PGfixarray Nat PGType
- | PGenum [Symbol]
- | PGcomposite [(Symbol, PGType)]
- | UnsafePGType Symbol
- class HasOid (ty :: PGType) where
- data NullityType
- type ColumnType = (ColumnConstraint, NullityType)
- type ColumnsType = [(Symbol, ColumnType)]
- type RelationType = [(Symbol, NullityType)]
- type family NilRelation :: RelationType where ...
- type RelationsType = [(Symbol, RelationType)]
- type TableType = (TableConstraints, ColumnsType)
- data SchemumType
- type SchemaType = [(Symbol, SchemumType)]
- type (:=>) constraint ty = '(constraint, ty)
- data ColumnConstraint
- data TableConstraint
- = Check [Symbol]
- | Unique [Symbol]
- | PrimaryKey [Symbol]
- | ForeignKey [Symbol] Symbol [Symbol]
- type TableConstraints = [(Symbol, TableConstraint)]
- type family NilTableConstraints :: TableConstraints where ...
- type family Uniquely (key :: [Symbol]) (constraints :: TableConstraints) :: Constraint where ...
- type (:::) (alias :: Symbol) ty = '(alias, ty)
- data Alias (alias :: Symbol) = Alias
- renderAlias :: KnownSymbol alias => Alias alias -> ByteString
- renderAliases :: All KnownSymbol aliases => NP Alias aliases -> [ByteString]
- data Aliased expression aliased where
- As :: KnownSymbol alias => expression ty -> Alias alias -> Aliased expression (alias ::: ty)
- class KnownSymbol alias => Aliasable alias expression aliased | aliased -> expression, aliased -> alias where
- renderAliasedAs :: (forall ty. expression ty -> ByteString) -> Aliased expression aliased -> ByteString
- type family AliasesOf aliaseds where ...
- class (SListI (ZipAs ns xs), All KnownSymbol ns) => ZipAliased ns xs where
- class KnownSymbol alias => Has (alias :: Symbol) (fields :: [(Symbol, kind)]) (field :: kind) | alias fields -> field
- type HasUnique alias fields field = fields ~ '[alias ::: field]
- class All KnownSymbol aliases => HasAll (aliases :: [Symbol]) (fields :: [(Symbol, kind)]) (subfields :: [(Symbol, kind)]) | aliases fields -> subfields
- class IsLabel (x :: Symbol) a where
- class IsQualified table column expression where
- class IsPGlabel (label :: Symbol) expr where
- data PGlabel (label :: Symbol) = PGlabel
- renderLabel :: KnownSymbol label => proxy label -> ByteString
- renderLabels :: All KnownSymbol labels => NP PGlabel labels -> [ByteString]
- data Grouping
- class (KnownSymbol relation, KnownSymbol column) => GroupedBy relation column bys
- type family Join xs ys where ...
- type family With (relations :: RelationsType) (schema :: SchemaType) :: SchemaType where ...
- type family Create alias x xs where ...
- type family Drop alias xs where ...
- type family Alter alias x xs where ...
- type family Rename alias0 alias1 xs where ...
- type family Elem x xs where ...
- type family In x xs :: Constraint where ...
- type PGNum ty = In ty '[PGint2, PGint4, PGint8, PGnumeric, PGfloat4, PGfloat8]
- type PGIntegral ty = In ty '[PGint2, PGint4, PGint8]
- type PGFloating ty = In ty '[PGfloat4, PGfloat8, PGnumeric]
- type family PGTypeOf (ty :: NullityType) :: PGType where ...
- type family SameTypes (columns0 :: ColumnsType) (columns1 :: ColumnsType) :: Constraint where ...
- class SamePGType (ty0 :: (Symbol, ColumnType)) (ty1 :: (Symbol, ColumnType))
- type family AllNotNull (columns :: ColumnsType) :: Constraint where ...
- type family NotAllNull (columns :: ColumnsType) :: Constraint where ...
- type family NullifyType (ty :: NullityType) :: NullityType where ...
- type family NullifyRelation (columns :: RelationType) :: RelationType where ...
- type family NullifyRelations (tables :: RelationsType) :: RelationsType where ...
- type family ColumnsToRelation (columns :: ColumnsType) :: RelationType where ...
- type family TableToColumns (table :: TableType) :: ColumnsType where ...
- type family TableToRelation (table :: TableType) :: RelationType where ...
- type family ConstraintInvolves column constraint where ...
- type family DropIfConstraintsInvolve column constraints where ...
- type family PG (hask :: Type) :: PGType where ...
- type family EnumFrom (hask :: Type) :: PGType where ...
- type family LabelsFrom (hask :: Type) :: [ConstructorName] where ...
- type family CompositeFrom (hask :: Type) :: PGType where ...
- type family FieldNamesFrom (hask :: Type) :: [FieldName] where ...
- type family FieldTypesFrom (hask :: Type) :: [PGType] where ...
- type family ConstructorsOf (datatype :: DatatypeInfo) :: [ConstructorInfo] where ...
- type family ConstructorNameOf (constructors :: ConstructorInfo) :: ConstructorName where ...
- type family ConstructorNamesOf (constructors :: [ConstructorInfo]) :: [ConstructorName] where ...
- type family FieldsOf (datatype :: DatatypeInfo) :: [FieldInfo] where ...
- type family FieldNameOf (field :: FieldInfo) :: FieldName where ...
- type family FieldNamesOf (fields :: [FieldInfo]) :: [FieldName] where ...
- type family FieldTypeOf (maybe :: Type) where ...
- type family FieldTypesOf (fields :: [Type]) where ...
- type family RecordCodeOf (hask :: Type) (code :: [[Type]]) :: [Type] where ...
- class MapMaybes xs where
- type family Nulls tys where ...
Types
PGType
is the promoted datakind of PostgreSQL types.
>>>
import Squeal.PostgreSQL.Schema
>>>
:kind 'PGbool
'PGbool :: PGType
Constructors
PGbool | logical Boolean (true/false) |
PGint2 | signed two-byte integer |
PGint4 | signed four-byte integer |
PGint8 | signed eight-byte integer |
PGnumeric | arbitrary precision numeric type |
PGfloat4 | single precision floating-point number (4 bytes) |
PGfloat8 | double precision floating-point number (8 bytes) |
PGchar Nat | fixed-length character string |
PGvarchar Nat | variable-length character string |
PGtext | variable-length character string |
PGbytea | binary data ("byte array") |
PGtimestamp | date and time (no time zone) |
PGtimestamptz | date and time, including time zone |
PGdate | calendar date (year, month, day) |
PGtime | time of day (no time zone) |
PGtimetz | time of day, including time zone |
PGinterval | time span |
PGuuid | universally unique identifier |
PGinet | IPv4 or IPv6 host address |
PGjson | textual JSON data |
PGjsonb | binary JSON data, decomposed |
PGvararray PGType | variable length array |
PGfixarray Nat PGType | fixed length array |
PGenum [Symbol] | |
PGcomposite [(Symbol, PGType)] | |
UnsafePGType Symbol | an escape hatch for unsupported PostgreSQL types |
Instances
PGAvg PGint2 PGnumeric Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGint2) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGint2) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # | |
PGAvg PGint4 PGnumeric Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGint4) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGint4) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # | |
PGAvg PGint8 PGnumeric Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGint8) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGint8) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # | |
PGAvg PGnumeric PGnumeric Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGnumeric) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGnumeric) -> Expression schema relations (Grouped bys) params (nullity PGnumeric) Source # | |
PGAvg PGfloat4 PGfloat8 Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGfloat4) -> Expression schema relations (Grouped bys) params (nullity PGfloat8) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGfloat4) -> Expression schema relations (Grouped bys) params (nullity PGfloat8) Source # | |
PGAvg PGfloat8 PGfloat8 Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGfloat8) -> Expression schema relations (Grouped bys) params (nullity PGfloat8) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGfloat8) -> Expression schema relations (Grouped bys) params (nullity PGfloat8) Source # | |
PGAvg PGinterval PGinterval Source # | |
Defined in Squeal.PostgreSQL.Expression Methods avg :: Expression schema relations Ungrouped params (nullity PGinterval) -> Expression schema relations (Grouped bys) params (nullity PGinterval) Source # avgDistinct :: Expression schema relations Ungrouped params (nullity PGinterval) -> Expression schema relations (Grouped bys) params (nullity PGinterval) Source # |
class HasOid (ty :: PGType) where Source #
The object identifier of a PGType
.
>>>
:set -XTypeApplications
>>>
oid @'PGbool
16
Minimal complete definition
Instances
data NullityType Source #
NullityType
encodes the potential presence or definite absence of a
NULL
allowing operations which are sensitive to such to be well typed.
>>>
:kind 'Null 'PGint4
'Null 'PGint4 :: NullityType>>>
:kind 'NotNull ('PGvarchar 50)
'NotNull ('PGvarchar 50) :: NullityType
Instances
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (NP (Aliased (Expression schema relations (Grouped bys) params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) Source # | |
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (Aliased (Expression schema relations (Grouped bys) params) (column ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (NP (Aliased (Expression schema relations Ungrouped params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) Source # | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (Aliased (Expression schema relations Ungrouped params) (column ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(KnownNat n, HasParameter (n - 1) schema params ty) => HasParameter n schema (ty' ': params) ty Source # | |
Defined in Squeal.PostgreSQL.Expression Methods parameter :: TypeExpression schema (PGTypeOf ty) -> Expression schema relations grouping (ty' ': params) ty Source # | |
HasParameter 1 schema (ty1 ': tys) ty1 Source # | |
Defined in Squeal.PostgreSQL.Expression Methods parameter :: TypeExpression schema (PGTypeOf ty1) -> Expression schema relations grouping (ty1 ': tys) ty1 Source # | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (NP (Aliased (Expression schema relations (Grouped bys) params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (Aliased (Expression schema relations (Grouped bys) params) (column ::: ty)) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (NP (Aliased (Expression schema relations Ungrouped params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (Aliased (Expression schema relations Ungrouped params) (column ::: ty)) # | |
Defined in Squeal.PostgreSQL.Expression | |
FromValue pg y => FromColumnValue (column ::: NotNull pg) y Source # | |
Defined in Squeal.PostgreSQL.Binary Methods fromColumnValue :: K (Maybe ByteString) (column ::: NotNull pg) -> y Source # | |
FromValue pg y => FromColumnValue (column ::: Null pg) (Maybe y) Source # | |
Defined in Squeal.PostgreSQL.Binary Methods fromColumnValue :: K (Maybe ByteString) (column ::: Null pg) -> Maybe y Source # | |
ty0 ~ ty1 => SamePGType (alias0 ::: (def0 :=> nullity0 ty0)) (alias1 ::: (def1 :=> nullity1 ty1)) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
AddColumn (Def :=> ty) Source # | |
Defined in Squeal.PostgreSQL.Definition | |
AddColumn (NoDef :=> Null ty) Source # | |
Defined in Squeal.PostgreSQL.Definition |
type ColumnType = (ColumnConstraint, NullityType) Source #
ColumnType
encodes the allowance of DEFAULT
and NULL
and the
base PGType
for a column.
>>>
:set -XTypeFamilies -XTypeInType
>>>
import GHC.TypeLits
>>>
type family IdColumn :: ColumnType where IdColumn = 'Def :=> 'NotNull 'PGint4
>>>
type family EmailColumn :: ColumnType where EmailColumn = 'NoDef :=> 'Null 'PGtext
Tables
type ColumnsType = [(Symbol, ColumnType)] Source #
ColumnsType
is a row of ColumnType
s.
>>>
:{
type family UsersColumns :: ColumnsType where UsersColumns = '[ "name" ::: 'NoDef :=> 'NotNull 'PGtext , "id" ::: 'Def :=> 'NotNull 'PGint4 ] :}
type RelationType = [(Symbol, NullityType)] Source #
RelationType
is a row of NullityType
>>>
:{
type family PersonRelation :: RelationType where PersonRelation = '[ "name" ::: 'NotNull 'PGtext , "age" ::: 'NotNull 'PGint4 , "dateOfBirth" ::: 'Null 'PGdate ] :}
type family NilRelation :: RelationType where ... Source #
A monokinded empty RelationType
.
Equations
NilRelation = '[] |
type RelationsType = [(Symbol, RelationType)] Source #
RelationsType
is a row of RelationType
s, thought of as a product.
type TableType = (TableConstraints, ColumnsType) Source #
TableType
encodes a row of constraints on a table as well as the types
of its columns.
>>>
:{
type family UsersTable :: TableType where UsersTable = '[ "pk_users" ::: 'PrimaryKey '["id"] ] :=> '[ "id" ::: 'Def :=> 'NotNull 'PGint4 , "name" ::: 'NoDef :=> 'NotNull 'PGtext ] :}
Schema
data SchemumType Source #
A SchemumType
is a user-defined type, either a Table
,
View
or Typedef
.
Instances
Category Definition # | |
Defined in Squeal.PostgreSQL.Definition |
type SchemaType = [(Symbol, SchemumType)] Source #
The schema of a database consists of a list of aliased,
user-defined SchemumType
s.
Constraints
type (:=>) constraint ty = '(constraint, ty) infixr 7 Source #
The constraint operator, :=>
is a type level pair
between a "constraint" and some type, for use in pairing
a ColumnConstraint
with a NullityType
to produce a ColumnType
or a TableConstraints
and a ColumnsType
to produce a TableType
.
data ColumnConstraint Source #
ColumnConstraint
encodes the availability of DEFAULT
for inserts and updates.
A column can be assigned a default value.
A data Manipulation
command can also
request explicitly that a column be set to its default value,
without having to know what that value is.
Constructors
Def |
|
NoDef |
|
Instances
ty0 ~ ty1 => SamePGType (alias0 ::: (def0 :=> nullity0 ty0)) (alias1 ::: (def1 :=> nullity1 ty1)) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
AddColumn (Def :=> ty) Source # | |
Defined in Squeal.PostgreSQL.Definition | |
AddColumn (NoDef :=> Null ty) Source # | |
Defined in Squeal.PostgreSQL.Definition |
data TableConstraint Source #
TableConstraint
encodes various forms of data constraints
of columns in a table.
TableConstraint
s give you as much control over the data in your tables
as you wish. If a user attempts to store data in a column that would
violate a constraint, an error is raised. This applies
even if the value came from the default value definition.
Constructors
Check [Symbol] | |
Unique [Symbol] | |
PrimaryKey [Symbol] | |
ForeignKey [Symbol] Symbol [Symbol] |
type TableConstraints = [(Symbol, TableConstraint)] Source #
A TableConstraints
is a row of TableConstraint
s.
type family NilTableConstraints :: TableConstraints where ... Source #
A monokinded empty TableConstraints
.
Equations
NilTableConstraints = '[] |
type family Uniquely (key :: [Symbol]) (constraints :: TableConstraints) :: Constraint where ... Source #
A ForeignKey
must reference columns that either are
a PrimaryKey
or form a Unique
constraint.
Aliases
data Alias (alias :: Symbol) Source #
Alias
es are proxies for a type level string or Symbol
and have an IsLabel
instance so that with -XOverloadedLabels
>>>
:set -XOverloadedLabels
>>>
#foobar :: Alias "foobar"
Alias
Constructors
Alias |
Instances
IsQualified table column (Alias table, Alias column) Source # | |
alias1 ~ alias2 => IsLabel alias1 (Alias alias2) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
(alias0 ~ alias1, alias0 ~ alias2, KnownSymbol alias2) => IsLabel alias0 (Aliased Alias (alias1 ::: alias2)) Source # | |
aliases ~ (alias ': ([] :: [Symbol])) => IsLabel alias (NP Alias aliases) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
Eq (Alias alias) Source # | |
Ord (Alias alias) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
Show (Alias alias) Source # | |
Generic (Alias alias) Source # | |
NFData (Alias alias) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
KnownSymbol alias => RenderSQL (Alias alias) Source # | |
Defined in Squeal.PostgreSQL.Schema Methods renderSQL :: Alias alias -> ByteString Source # | |
type Rep (Alias alias) Source # | |
renderAlias :: KnownSymbol alias => Alias alias -> ByteString Source #
>>>
renderAlias #jimbob
"\"jimbob\""
renderAliases :: All KnownSymbol aliases => NP Alias aliases -> [ByteString] Source #
>>>
import Generics.SOP (NP(..))
>>>
renderAliases (#jimbob :* #kandi)
["\"jimbob\"","\"kandi\""]
data Aliased expression aliased where Source #
The As
operator is used to name an expression. As
is like a demoted
version of :::
.
>>>
Just "hello" `As` #hi :: Aliased Maybe ("hi" ::: String)
As (Just "hello") Alias
Constructors
As :: KnownSymbol alias => expression ty -> Alias alias -> Aliased expression (alias ::: ty) |
Instances
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (NP (Aliased (Expression schema relations (Grouped bys) params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) Source # | |
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (Aliased (Expression schema relations (Grouped bys) params) (column ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (NP (Aliased (Expression schema relations Ungrouped params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) Source # | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (Aliased (Expression schema relations Ungrouped params) (column ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(KnownSymbol alias, tys ~ ((alias ::: ty) ': ([] :: [(Symbol, k)]))) => Aliasable alias (expression ty) (NP (Aliased expression) tys) Source # | |
(alias ~ alias1, KnownSymbol alias) => Aliasable alias (expression ty) (Aliased expression (alias1 ::: ty)) Source # | |
(alias0 ~ alias1, alias0 ~ alias2, KnownSymbol alias2) => IsLabel alias0 (Aliased Alias (alias1 ::: alias2)) Source # | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (NP (Aliased (Expression schema relations (Grouped bys) params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (Aliased (Expression schema relations (Grouped bys) params) (column ::: ty)) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (NP (Aliased (Expression schema relations Ungrouped params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (Aliased (Expression schema relations Ungrouped params) (column ::: ty)) # | |
Defined in Squeal.PostgreSQL.Expression | |
Eq (expression ty) => Eq (Aliased expression (alias ::: ty)) Source # | |
Ord (expression ty) => Ord (Aliased expression (alias ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Schema Methods compare :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Ordering # (<) :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Bool # (<=) :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Bool # (>) :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Bool # (>=) :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Bool # max :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) # min :: Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) -> Aliased expression (alias ::: ty) # | |
Show (expression ty) => Show (Aliased expression (alias ::: ty)) Source # | |
class KnownSymbol alias => Aliasable alias expression aliased | aliased -> expression, aliased -> alias where Source #
Minimal complete definition
renderAliasedAs :: (forall ty. expression ty -> ByteString) -> Aliased expression aliased -> ByteString Source #
>>>
let renderMaybe = fromString . maybe "Nothing" (const "Just")
>>>
renderAliasedAs renderMaybe (Just (3::Int) `As` #an_int)
"Just AS \"an_int\""
class (SListI (ZipAs ns xs), All KnownSymbol ns) => ZipAliased ns xs where Source #
The ZipAliased
class provides a type family for zipping
Symbol
lists together with arbitrary lists of the same size,
with an associated type family ZipAs
, together with
a method zipAs
for zipping heterogeneous lists of Alias
es
together with a heterogeneous list of expressions into
a heterogeneous list of Aliased
expressions.
Minimal complete definition
Associated Types
type ZipAs (ns :: [Symbol]) (xs :: [k]) = (zs :: [(Symbol, k)]) | zs -> ns xs Source #
Instances
ZipAliased ([] :: [Symbol]) ([] :: [k]) Source # | |
(KnownSymbol n, ZipAliased ns xs) => ZipAliased (n ': ns) (x ': xs :: [k]) Source # | |
class KnownSymbol alias => Has (alias :: Symbol) (fields :: [(Symbol, kind)]) (field :: kind) | alias fields -> field Source #
Has alias fields field
is a constraint that proves that
fields
has a field of alias ::: field
, inferring field
from alias
and fields
.
Instances
(KnownSymbol alias, Has alias fields field) => Has alias (field' ': fields :: [(Symbol, kind)]) (field :: kind) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
KnownSymbol alias => Has alias ((alias ::: field) ': fields :: [(Symbol, kind)]) (field :: kind) Source # | |
Defined in Squeal.PostgreSQL.Schema |
type HasUnique alias fields field = fields ~ '[alias ::: field] Source #
HasUnique alias fields field
is a constraint that proves that
fields
is a singleton of alias ::: field
.
class All KnownSymbol aliases => HasAll (aliases :: [Symbol]) (fields :: [(Symbol, kind)]) (subfields :: [(Symbol, kind)]) | aliases fields -> subfields Source #
Instances
HasAll ([] :: [Symbol]) (fields :: [(Symbol, kind)]) ([] :: [(Symbol, kind)]) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
(Has alias fields field, HasAll aliases fields subfields) => HasAll (alias ': aliases) (fields :: [(Symbol, k)]) ((alias ::: field) ': subfields :: [(Symbol, k)]) Source # | |
Defined in Squeal.PostgreSQL.Schema |
class IsLabel (x :: Symbol) a where #
Minimal complete definition
Instances
alias1 ~ alias2 => IsLabel alias1 (Alias alias2) # | |
Defined in Squeal.PostgreSQL.Schema | |
Has alias schema (Typedef ty) => IsLabel alias (TypeExpression schema ty) # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: TypeExpression schema ty # | |
Has field fields ty => IsLabel field (Expression schema relation grouping params (nullity (PGcomposite fields)) -> Expression schema relation grouping params (Null ty)) # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Expression schema relation grouping params (nullity (PGcomposite fields)) -> Expression schema relation grouping params (Null ty) # | |
(HasUnique rel rels cols, Has col cols ty, by ~ (,) rel col) => IsLabel col (By rels by) # | |
Defined in Squeal.PostgreSQL.Query | |
(alias0 ~ alias1, alias0 ~ alias2, KnownSymbol alias2) => IsLabel alias0 (Aliased Alias (alias1 ::: alias2)) # | |
aliases ~ (alias ': ([] :: [Symbol])) => IsLabel alias (NP Alias aliases) # | |
Defined in Squeal.PostgreSQL.Schema | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (NP (Aliased (Expression schema relations (Grouped bys) params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (Aliased (Expression schema relations (Grouped bys) params) (column ::: ty)) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (NP (Aliased (Expression schema relations Ungrouped params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (Aliased (Expression schema relations Ungrouped params) (column ::: ty)) # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique rel rels cols, Has col cols ty, bys ~ ((,) rel col ': ([] :: [(Symbol, Symbol)]))) => IsLabel col (NP (By rels) bys) # | |
Defined in Squeal.PostgreSQL.Query | |
(HasUnique relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsLabel column (Expression schema relations (Grouped bys) params ty) # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Expression schema relations (Grouped bys) params ty # | |
(HasUnique relation relations columns, Has column columns ty) => IsLabel column (Expression schema relations Ungrouped params ty) # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Expression schema relations Ungrouped params ty # |
class IsQualified table column expression where Source #
Analagous to IsLabel
, the constraint
IsQualified
defines !
for a column alias qualified
by a table alias.
Minimal complete definition
Instances
IsQualified table column (Alias table, Alias column) Source # | |
(Has rel rels cols, Has col cols ty, by ~ (,) rel col) => IsQualified rel col (By rels by) Source # | |
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (NP (Aliased (Expression schema relations (Grouped bys) params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) Source # | |
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (Aliased (Expression schema relations (Grouped bys) params) (column ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (NP (Aliased (Expression schema relations Ungrouped params)) ((column ::: ty) ': ([] :: [(Symbol, NullityType)]))) Source # | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (Aliased (Expression schema relations Ungrouped params) (column ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has rel rels cols, Has col cols ty, bys ~ ((,) rel col ': ([] :: [(Symbol, Symbol)]))) => IsQualified rel col (NP (By rels) bys) Source # | |
(Has relation relations columns, Has column columns ty, GroupedBy relation column bys) => IsQualified relation column (Expression schema relations (Grouped bys) params ty) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has relation relations columns, Has column columns ty) => IsQualified relation column (Expression schema relations Ungrouped params ty) Source # | |
Defined in Squeal.PostgreSQL.Expression |
Enumerated Labels
class IsPGlabel (label :: Symbol) expr where Source #
IsPGlabel
looks very much like the IsLabel
class. Whereas
the overloaded label, fromLabel
is used for column references,
label
s are used for enum terms. A label
is called with
type application like `label @"beef"`.
Minimal complete definition
Instances
label ~ label1 => IsPGlabel label (PGlabel label1) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
labels ~ (label ': ([] :: [Symbol])) => IsPGlabel label (NP PGlabel labels) Source # | |
(KnownSymbol label, In label labels) => IsPGlabel label (Expression schema relations grouping params (nullity (PGenum labels))) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods label :: Expression schema relations grouping params (nullity (PGenum labels)) Source # |
data PGlabel (label :: Symbol) Source #
Constructors
PGlabel |
renderLabel :: KnownSymbol label => proxy label -> ByteString Source #
Renders a label
renderLabels :: All KnownSymbol labels => NP PGlabel labels -> [ByteString] Source #
Renders a list of labels
Grouping
class (KnownSymbol relation, KnownSymbol column) => GroupedBy relation column bys Source #
A GroupedBy
constraint indicates that a table qualified column is
a member of the auxiliary namespace created by GROUP BY
clauses and thus,
may be called in an output Expression
without aggregating.
Instances
(KnownSymbol relation, KnownSymbol column) => GroupedBy relation column ((,) table column ': bys :: [(k, Symbol)]) Source # | |
Defined in Squeal.PostgreSQL.Schema | |
(KnownSymbol relation, KnownSymbol column, GroupedBy relation column bys) => GroupedBy relation column (tabcol ': bys :: [a]) Source # | |
Defined in Squeal.PostgreSQL.Schema |
Type Families
type family Join xs ys where ... Source #
Join
is simply promoted ++
and is used in JOIN
s in
FromClause
s.
type family With (relations :: RelationsType) (schema :: SchemaType) :: SchemaType where ... Source #
Used in with
.
type family Create alias x xs where ... Source #
Create alias x xs
adds alias ::: x
to the end of xs
and is used in
createTable
statements and in ALTER TABLE
addColumn
.
type family Drop alias xs where ... Source #
Drop alias xs
removes the type associated with alias
in xs
and is used in dropTable
statements
and in ALTER TABLE
dropColumn
statements.
type family Alter alias x xs where ... Source #
Alter alias x xs
replaces the type associated with an alias
in xs
with the type x
and is used in alterTable
and alterColumn
.
type family Rename alias0 alias1 xs where ... Source #
Rename alias0 alias1 xs
replaces the alias alias0
by alias1
in xs
and is used in alterTableRename
and
renameColumn
.
type family In x xs :: Constraint where ... Source #
In x xs
is a constraint that proves that x
is in xs
.
type PGNum ty = In ty '[PGint2, PGint4, PGint8, PGnumeric, PGfloat4, PGfloat8] Source #
PGNum
is a constraint on PGType
whose
Expression
s have a Num
constraint.
type PGIntegral ty = In ty '[PGint2, PGint4, PGint8] Source #
PGIntegral
is a constraint on PGType
whose
Expression
s
have div_
and
mod_
functions.
type PGFloating ty = In ty '[PGfloat4, PGfloat8, PGnumeric] Source #
PGFloating
is a constraint on PGType
whose
Expression
s
have Fractional
and Floating
constraints.
type family PGTypeOf (ty :: NullityType) :: PGType where ... Source #
PGTypeOf
forgets about NULL
and any column constraints.
Equations
PGTypeOf (nullity pg) = pg |
type family SameTypes (columns0 :: ColumnsType) (columns1 :: ColumnsType) :: Constraint where ... Source #
SameTypes
is a constraint that proves two ColumnsType
s have the same
length and the same ColumnType
s.
class SamePGType (ty0 :: (Symbol, ColumnType)) (ty1 :: (Symbol, ColumnType)) Source #
Equality constraint on the underlying PGType
of two columns.
Instances
ty0 ~ ty1 => SamePGType (alias0 ::: (def0 :=> nullity0 ty0)) (alias1 ::: (def1 :=> nullity1 ty1)) Source # | |
Defined in Squeal.PostgreSQL.Schema |
type family AllNotNull (columns :: ColumnsType) :: Constraint where ... Source #
AllNotNull
is a constraint that proves a ColumnsType
has no NULL
s.
Equations
AllNotNull '[] = () | |
AllNotNull ((column ::: (def :=> NotNull ty)) ': columns) = AllNotNull columns |
type family NotAllNull (columns :: ColumnsType) :: Constraint where ... Source #
NotAllNull
is a constraint that proves a ColumnsType
has some
NOT NULL
.
Equations
NotAllNull ((column ::: (def :=> NotNull ty)) ': columns) = () | |
NotAllNull ((column ::: (def :=> Null ty)) ': columns) = NotAllNull columns |
type family NullifyType (ty :: NullityType) :: NullityType where ... Source #
NullifyType
is an idempotent that nullifies a ColumnType
.
Equations
NullifyType (Null ty) = Null ty | |
NullifyType (NotNull ty) = Null ty |
type family NullifyRelation (columns :: RelationType) :: RelationType where ... Source #
NullifyRelation
is an idempotent that nullifies a ColumnsType
.
Equations
NullifyRelation '[] = '[] | |
NullifyRelation ((column ::: ty) ': columns) = (column ::: NullifyType ty) ': NullifyRelation columns |
type family NullifyRelations (tables :: RelationsType) :: RelationsType where ... Source #
NullifyRelations
is an idempotent that nullifies a RelationsType
used to nullify the left or right hand side of an outer join
in a FromClause
.
Equations
NullifyRelations '[] = '[] | |
NullifyRelations ((table ::: columns) ': tables) = (table ::: NullifyRelation columns) ': NullifyRelations tables |
type family ColumnsToRelation (columns :: ColumnsType) :: RelationType where ... Source #
ColumnsToRelation
removes column constraints.
Equations
ColumnsToRelation '[] = '[] | |
ColumnsToRelation ((column ::: (constraint :=> ty)) ': columns) = (column ::: ty) ': ColumnsToRelation columns |
type family TableToColumns (table :: TableType) :: ColumnsType where ... Source #
TableToColumns
removes table constraints.
Equations
TableToColumns (constraints :=> columns) = columns |
type family TableToRelation (table :: TableType) :: RelationType where ... Source #
Convert a table to a relation.
Equations
TableToRelation tab = ColumnsToRelation (TableToColumns tab) |
type family ConstraintInvolves column constraint where ... Source #
Check if a TableConstraint
involves a column
Equations
ConstraintInvolves column (Check columns) = column `Elem` columns | |
ConstraintInvolves column (Unique columns) = column `Elem` columns | |
ConstraintInvolves column (PrimaryKey columns) = column `Elem` columns | |
ConstraintInvolves column (ForeignKey columns tab refcolumns) = column `Elem` columns |
type family DropIfConstraintsInvolve column constraints where ... Source #
Drop all TableConstraint
s that involve a column
Equations
DropIfConstraintsInvolve column '[] = '[] | |
DropIfConstraintsInvolve column ((alias ::: constraint) ': constraints) = If (ConstraintInvolves column constraint) (DropIfConstraintsInvolve column constraints) ((alias ::: constraint) ': DropIfConstraintsInvolve column constraints) |
Embedding
type family PG (hask :: Type) :: PGType where ... Source #
The PG
type family embeds a subset of Haskell types
as Postgres basic types.
>>>
:kind! PG LocalTime
PG LocalTime :: PGType = 'PGtimestamp
Equations
PG Bool = PGbool | |
PG Int16 = PGint2 | |
PG Int32 = PGint4 | |
PG Int64 = PGint8 | |
PG Word16 = PGint2 | |
PG Word32 = PGint4 | |
PG Word64 = PGint8 | |
PG Scientific = PGnumeric | |
PG Float = PGfloat4 | |
PG Double = PGfloat8 | |
PG Char = PGchar 1 | |
PG Text = PGtext | |
PG Text = PGtext | |
PG ByteString = PGbytea | |
PG ByteString = PGbytea | |
PG LocalTime = PGtimestamp | |
PG UTCTime = PGtimestamptz | |
PG Day = PGdate | |
PG TimeOfDay = PGtime | |
PG (TimeOfDay, TimeZone) = PGtimetz | |
PG DiffTime = PGinterval | |
PG UUID = PGuuid | |
PG (NetAddr IP) = PGinet | |
PG Value = PGjson | |
PG ty = TypeError (Text "There is no Postgres basic type for " :<>: ShowType ty) |
type family EnumFrom (hask :: Type) :: PGType where ... Source #
The EnumFrom
type family embeds Haskell enum types, ADTs with
nullary constructors, as Postgres enum types
>>>
data Schwarma = Beef | Lamb | Chicken deriving GHC.Generic
>>>
instance Generic Schwarma
>>>
instance HasDatatypeInfo Schwarma
>>>
:kind! EnumFrom Schwarma
EnumFrom Schwarma :: PGType = 'PGenum '["Beef", "Lamb", "Chicken"]
Equations
EnumFrom hask = PGenum (LabelsFrom hask) |
type family LabelsFrom (hask :: Type) :: [ConstructorName] where ... Source #
The LabelsFrom
type family calculates the constructors of a
Haskell enum type.
>>>
data Schwarma = Beef | Lamb | Chicken deriving GHC.Generic
>>>
instance Generic Schwarma
>>>
instance HasDatatypeInfo Schwarma
>>>
:kind! LabelsFrom Schwarma
LabelsFrom Schwarma :: [Type.ConstructorName] = '["Beef", "Lamb", "Chicken"]
Equations
LabelsFrom hask = ConstructorNamesOf (ConstructorsOf (DatatypeInfoOf hask)) |
type family CompositeFrom (hask :: Type) :: PGType where ... Source #
The CompositeFrom
type family embeds Haskell record types as
Postgres composite types, as long as the record fields
are Maybe
s of Haskell types that can be embedded as basic types
with the PG
type family.
>>>
data Row = Row { a :: Maybe Int16, b :: Maybe LocalTime } deriving GHC.Generic
>>>
instance Generic Row
>>>
instance HasDatatypeInfo Row
>>>
:kind! CompositeFrom Row
CompositeFrom Row :: PGType = 'PGcomposite '['("a", 'PGint2), '("b", 'PGtimestamp)]
Equations
CompositeFrom hask = PGcomposite (ZipAs (FieldNamesFrom hask) (FieldTypesFrom hask)) |
type family FieldNamesFrom (hask :: Type) :: [FieldName] where ... Source #
>>>
data Row = Row { a :: Maybe Int16, b :: Maybe LocalTime } deriving GHC.Generic
>>>
instance Generic Row
>>>
instance HasDatatypeInfo Row
>>>
:kind! FieldNamesFrom Row
FieldNamesFrom Row :: [Type.FieldName] = '["a", "b"]
Equations
FieldNamesFrom hask = FieldNamesOf (FieldsOf (DatatypeInfoOf hask)) |
type family FieldTypesFrom (hask :: Type) :: [PGType] where ... Source #
>>>
data Row = Row { a :: Maybe Int16, b :: Maybe LocalTime } deriving GHC.Generic
>>>
instance Generic Row
>>>
instance HasDatatypeInfo Row
>>>
:kind! FieldTypesFrom Row
FieldTypesFrom Row :: [PGType] = '['PGint2, 'PGtimestamp]
Equations
FieldTypesFrom hask = FieldTypesOf (RecordCodeOf hask (Code hask)) |
type family ConstructorsOf (datatype :: DatatypeInfo) :: [ConstructorInfo] where ... Source #
Calculates constructors of a datatype.
Equations
ConstructorsOf (ADT _module _datatype constructors) = constructors | |
ConstructorsOf (Newtype _module _datatype constructor) = '[constructor] |
type family ConstructorNameOf (constructors :: ConstructorInfo) :: ConstructorName where ... Source #
Calculates the name of a nullary constructor, otherwise generates a type error.
Equations
ConstructorNameOf (Constructor name) = name | |
ConstructorNameOf (Infix name _assoc _fix) = TypeError (Text "ConstructorNameOf error: non-nullary constructor " :<>: Text name) | |
ConstructorNameOf (Record name _fields) = TypeError (Text "ConstructorNameOf error: non-nullary constructor " :<>: Text name) |
type family ConstructorNamesOf (constructors :: [ConstructorInfo]) :: [ConstructorName] where ... Source #
Calculate the names of nullary constructors.
Equations
ConstructorNamesOf '[] = '[] | |
ConstructorNamesOf (constructor ': constructors) = ConstructorNameOf constructor ': ConstructorNamesOf constructors |
type family FieldsOf (datatype :: DatatypeInfo) :: [FieldInfo] where ... Source #
Calculate the fields of a datatype.
type family FieldNameOf (field :: FieldInfo) :: FieldName where ... Source #
Calculate the name of a field.
Equations
FieldNameOf (FieldInfo name) = name |
type family FieldNamesOf (fields :: [FieldInfo]) :: [FieldName] where ... Source #
Calculate the names of fields.
Equations
FieldNamesOf '[] = '[] | |
FieldNamesOf (field ': fields) = FieldNameOf field ': FieldNamesOf fields |
type family FieldTypeOf (maybe :: Type) where ... Source #
>>>
:kind! FieldTypeOf (Maybe Int16)
FieldTypeOf (Maybe Int16) :: PGType = 'PGint2
Equations
FieldTypeOf (Maybe hask) = PG hask | |
FieldTypeOf ty = TypeError (Text "FieldTypeOf error: non-Maybe type " :<>: ShowType ty) |
type family FieldTypesOf (fields :: [Type]) where ... Source #
Calculate the types of fields.
Equations
FieldTypesOf '[] = '[] | |
FieldTypesOf (field ': fields) = FieldTypeOf field ': FieldTypesOf fields |
type family RecordCodeOf (hask :: Type) (code :: [[Type]]) :: [Type] where ... Source #
Inspect the code of an algebraic datatype and ensure it's a product, otherwise generate a type error
Equations
RecordCodeOf _hask '[tys] = tys | |
RecordCodeOf hask _tys = TypeError (Text "RecordCodeOf error: non-Record type " :<>: ShowType hask) |