on dev help sign in
database kind and qualified aliases
commit5ff9bf3a7fc23fb5babdc971f3abc3f6adc488b4 authorEitan Chatav <eitan.chatav@gmail.com> dateFri 23 Nov 2018, 18:47 (8 years ago) parenta67e103
1 file changed+41−3
squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+41−3
squeal-postgresql/src/Squeal/PostgreSQL/Schema.hs+41−3
@@ -54,6 +54,7 @@ module Squeal.PostgreSQL.Schema
5454 , TableType
5555 , SchemumType (..)
5656 , SchemaType
57+ , DBType
5758 -- * Constraints
5859 , (:=>)
5960 , ColumnConstraint (..)
@@ -62,8 +63,10 @@ module Squeal.PostgreSQL.Schema
6263 , Uniquely
6364 -- * Aliases
6465 , (:::)
65− , Alias (Alias)
66+ , Alias (..)
67+ , IsLabel (..)
6668 , renderAlias
69+ , renderAliasString
6770 , renderAliases
6871 , Aliased (As)
6972 , Aliasable (as)
@@ -71,9 +74,10 @@ module Squeal.PostgreSQL.Schema
7174 , Has
7275 , HasUnique
7376 , HasAll
74− , IsLabel (..)
77+ , QualifiedAlias (..)
7578 , IsQualified (..)
76− , renderAliasString
79+ , renderQualifiedAlias
80+ , HasQualified
7781 -- * Enumerated Labels
7882 , IsPGlabel (..)
7983 , PGlabel (..)
@@ -471,6 +475,38 @@ class IsQualified table column expression where
471475 infixl 9 !
472476instance IsQualified table column (Alias table, Alias column) where (!) = (,)
473477
478+data QualifiedAlias (qualifier :: Symbol) (alias :: Symbol) = QualifiedAlias
479+instance (q ~ q', a ~ a') => IsQualified q a (QualifiedAlias q' a') where
480+ _!_ = QualifiedAlias
481+instance (a ~ a') => IsLabel a (QualifiedAlias "public" a') where
482+ fromLabel = QualifiedAlias
483+
484+renderQualifiedAlias
485+ :: forall q a. (KnownSymbol q, KnownSymbol a)
486+ => QualifiedAlias q a -> ByteString
487+renderQualifiedAlias _ =
488+ let
489+ qualifier = renderAlias (Alias @q)
490+ alias = renderAlias (Alias @a)
491+ in
492+ if qualifier == "public" then alias else qualifier <> "." <> alias
493+
494+class (KnownSymbol qualifier, KnownSymbol alias) => HasQualified
495+ (qualifier :: Symbol)
496+ (alias :: Symbol)
497+ (xss :: [(Symbol,[(Symbol, kind)])])
498+ (xs :: [(Symbol,kind)])
499+ (x :: kind)
500+ | qualifier xss -> xs
501+ , alias xs -> x where
502+
503+instance
504+ ( KnownSymbol qualifier
505+ , KnownSymbol alias
506+ , Has qualifier xss xs
507+ , Has alias xs x
508+ ) => HasQualified qualifier alias xss xs x
509+
474510-- | @Elem@ is a promoted `Data.List.elem`.
475511type family Elem x xs where
476512 Elem x '[] = 'False
@@ -657,6 +693,8 @@ type family Schema :: SchemaType where
657693-}
658694type SchemaType = [(Symbol,SchemumType)]
659695
696+type DBType = [(Symbol,SchemaType)]
697+
660698-- | `IsPGlabel` looks very much like the `IsLabel` class. Whereas
661699-- the overloaded label, `fromLabel` is used for column references,
662700-- `label`s are used for enum terms. A `label` is called with