@@ -54,6 +54,7 @@ module Squeal.PostgreSQL.Schema
54 , TableType
54 , TableType
55 , SchemumType (..)
55 , SchemumType (..)
56 , SchemaType
56 , SchemaType
57 -- * Constraints
58 -- * Constraints
59 , ColumnConstraint (..)
60 , ColumnConstraint (..)
@@ -62,8 +63,10 @@ module Squeal.PostgreSQL.Schema
62 , Uniquely
63 , Uniquely
63 -- * Aliases
64 -- * Aliases
65− , Alias (Alias)
66+ , Alias (..)
66 , renderAlias
68 , renderAlias
67 , renderAliases
70 , renderAliases
68 , Aliased (As)
71 , Aliased (As)
69 , Aliasable (as)
72 , Aliasable (as)
@@ -71,9 +74,10 @@ module Squeal.PostgreSQL.Schema
72 , HasUnique
75 , HasUnique
74− , IsLabel (..)
77+ , QualifiedAlias (..)
75 , IsQualified (..)
78 , IsQualified (..)
76− , renderAliasString
79+ , renderQualifiedAlias
77 -- * Enumerated Labels
81 -- * Enumerated Labels
78 , IsPGlabel (..)
82 , IsPGlabel (..)
79 , PGlabel (..)
83 , PGlabel (..)
@@ -471,6 +475,38 @@ class IsQualified table column expression where
471 infixl 9 !
475 infixl 9 !
472instance IsQualified table column (Alias table, Alias column) where (!) = (,)
476instance IsQualified table column (Alias table, Alias column) where (!) = (,)
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
485+ :: forall q a. (KnownSymbol q, KnownSymbol a)
486+ => QualifiedAlias q a -> ByteString
487+renderQualifiedAlias _ =
489+ qualifier = renderAlias (Alias @q)
490+ alias = renderAlias (Alias @a)
492+ if qualifier == "public" then alias else qualifier <> "." <> alias
494+class (KnownSymbol qualifier, KnownSymbol alias) => HasQualified
495+ (qualifier :: Symbol)
497+ (xss :: [(Symbol,[(Symbol, kind)])])
498+ (xs :: [(Symbol,kind)])
500+ | qualifier xss -> xs
501+ , alias xs -> x where
504+ ( KnownSymbol qualifier
506+ , Has qualifier xss xs
508+ ) => HasQualified qualifier alias xss xs x
474-- | @Elem@ is a promoted `Data.List.elem`.
510-- | @Elem@ is a promoted `Data.List.elem`.
475type family Elem x xs where
511type family Elem x xs where
476 Elem x '[] = 'False
512 Elem x '[] = 'False
@@ -657,6 +693,8 @@ type family Schema :: SchemaType where
658type SchemaType = [(Symbol,SchemumType)]
694type SchemaType = [(Symbol,SchemumType)]
696+type DBType = [(Symbol,SchemaType)]
660-- | `IsPGlabel` looks very much like the `IsLabel` class. Whereas
698-- | `IsPGlabel` looks very much like the `IsLabel` class. Whereas
661-- the overloaded label, `fromLabel` is used for column references,
699-- the overloaded label, `fromLabel` is used for column references,
662-- `label`s are used for enum terms. A `label` is called with
700-- `label`s are used for enum terms. A `label` is called with