Copyright | (c) Eitan Chatav 2019 |
---|---|
Maintainer | [email protected] |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Squeal.PostgreSQL.Type.Alias
Contents
Description
This module embeds Postgres's alias system in Haskell in
a typesafe fashion. Thanks to GHC's OverloadedLabels
extension,
Squeal can reference aliases by prepending with a #
.
Synopsis
- type (:::) (alias :: Symbol) ty = '(alias, ty)
- data Alias (alias :: Symbol) = Alias
- class IsLabel (x :: Symbol) a where
- fromLabel :: a
- 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
- renderAliased :: (forall ty. expression ty -> ByteString) -> Aliased expression aliased -> ByteString
- mapAliased :: (expr x -> expr y) -> Aliased expr (alias ::: x) -> Aliased expr (alias ::: y)
- type Has (alias :: Symbol) (fields :: [(Symbol, kind)]) (field :: kind) = HasErr fields alias fields field
- type HasUnique alias fields field = fields ~ '[alias ::: field]
- class KnownSymbol alias => HasErr err (alias :: Symbol) (fields :: [(Symbol, kind)]) (field :: kind) | alias fields -> field
- class All KnownSymbol aliases => HasAll (aliases :: [Symbol]) (fields :: [(Symbol, kind)]) (subfields :: [(Symbol, kind)]) | aliases fields -> subfields
- class HasIn fields field
- data QualifiedAlias (qualifier :: Symbol) (alias :: Symbol) = QualifiedAlias
- class IsQualified qualifier alias expression where
- data Grouping
- class (KnownSymbol table, KnownSymbol column) => GroupedBy table column bys
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 qualifier alias (Alias qualifier, Alias alias) Source # | |
alias1 ~ alias2 => IsLabel alias1 (Alias alias2) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
(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.Type.Alias | |
Eq (Alias alias) Source # | |
Ord (Alias alias) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
Show (Alias alias) Source # | |
Generic (Alias alias) Source # | |
NFData (Alias alias) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
KnownSymbol alias => RenderSQL (Alias alias) Source # |
|
Defined in Squeal.PostgreSQL.Type.Alias Methods renderSQL :: Alias alias -> ByteString Source # | |
All KnownSymbol aliases => RenderSQL (NP Alias aliases) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
type Rep (Alias alias) Source # | |
class IsLabel (x :: Symbol) a where #
Instances
alias1 ~ alias2 => IsLabel alias1 (Alias alias2) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
(q' ~ "public", a ~ a') => IsLabel a (QualifiedAlias q' a') Source # | |
Defined in Squeal.PostgreSQL.Type.Alias Methods fromLabel :: QualifiedAlias q' a' # | |
IsLabel fld (MaybeT (DecodeRow row) y) => IsLabel fld (MaybeT (DecodeRow (field ': row)) y) Source # | |
Defined in Squeal.PostgreSQL.Session.Decode | |
FromValue ty (Maybe y) => IsLabel fld (MaybeT (DecodeRow ((fld ::: ty) ': row)) y) Source # | |
IsLabel fld (DecodeRow row y) => IsLabel fld (DecodeRow (field ': row) y) Source # | |
Defined in Squeal.PostgreSQL.Session.Decode | |
FromValue ty y => IsLabel fld (DecodeRow ((fld ::: ty) ': row) y) Source # | |
Defined in Squeal.PostgreSQL.Session.Decode | |
(HasUnique rel rels cols, Has col cols ty, by ~ (,) rel col) => IsLabel col (By rels by) Source # | |
Defined in Squeal.PostgreSQL.Query.Table | |
(q ~ "public", a0 ~ a1, a1 ~ a2, KnownSymbol a2) => IsLabel a0 (Aliased (QualifiedAlias q) (a1 ::: a2)) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias Methods fromLabel :: Aliased (QualifiedAlias q) (a1 ::: a2) # | |
(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.Type.Alias | |
(HasUnique tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsLabel col (NP (Aliased (Expression (Grouped bys) lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, column ~ (col ::: ty)) => IsLabel col (Aliased (Expression (Grouped bys) lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Aliased (Expression (Grouped bys) lat with db params from) column # | |
(HasUnique tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, tys ~ (ty ': ([] :: [NullType]))) => IsLabel col (NP (Expression (Grouped bys) lat with db params from) tys) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: NP (Expression (Grouped bys) lat with db params from) tys # | |
(HasUnique tab (Join from lat) row, Has col row ty, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsLabel col (NP (Aliased (Expression Ungrouped lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique tab (Join from lat) row, Has col row ty, column ~ (col ::: ty)) => IsLabel col (Aliased (Expression Ungrouped lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Aliased (Expression Ungrouped lat with db params from) column # | |
(HasUnique tab (Join from lat) row, Has col row ty, tys ~ (ty ': ([] :: [NullType]))) => IsLabel col (NP (Expression Ungrouped lat with db params from) tys) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: NP (Expression Ungrouped lat with db params from) tys # | |
(HasUnique rel rels cols, Has col cols ty, bys ~ ((,) rel col ': ([] :: [(Symbol, Symbol)]))) => IsLabel col (NP (By rels) bys) Source # | |
Defined in Squeal.PostgreSQL.Query.Table | |
(HasUnique tab (Join from lat) row, Has col row ty, GroupedBy tab col bys) => IsLabel col (Expression (Grouped bys) lat with db params from ty) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Expression (Grouped bys) lat with db params from ty # | |
(HasUnique tab (Join from lat) row, Has col row ty) => IsLabel col (Expression Ungrouped lat with db params from ty) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Expression Ungrouped lat with db params from ty # | |
(HasUnique tab (Join from lat) row0, Has col row0 ty, row1 ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)])), GroupedBy tab col bys) => IsLabel col (Selection (Grouped bys) lat with db params from row1) Source # | |
Defined in Squeal.PostgreSQL.Query.Select | |
(HasUnique tab (Join from lat) row0, Has col row0 ty, row1 ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsLabel col (Selection Ungrouped lat with db params from row1) Source # | |
Defined in Squeal.PostgreSQL.Query.Select |
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
(q0 ~ q1, a0 ~ a1, a1 ~ a2, KnownSymbol a2) => IsQualified q0 a0 (Aliased (QualifiedAlias q1) (a1 ::: a2)) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
(Has tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsQualified tab col (NP (Aliased (Expression (Grouped bys) lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, column ~ (col ::: ty)) => IsQualified tab col (Aliased (Expression (Grouped bys) lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsQualified tab col (NP (Aliased (Expression Ungrouped lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, column ~ (col ::: ty)) => IsQualified tab col (Aliased (Expression Ungrouped lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(KnownSymbol alias, tys ~ ((alias ::: ty) ': ([] :: [(Symbol, k)]))) => Aliasable alias (expression ty) (NP (Aliased expression) tys) Source # | |
(KnownSymbol alias, aliased ~ (alias ::: ty)) => Aliasable alias (expression ty) (Aliased expression aliased) Source # | |
(q ~ "public", a0 ~ a1, a1 ~ a2, KnownSymbol a2) => IsLabel a0 (Aliased (QualifiedAlias q) (a1 ::: a2)) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias Methods fromLabel :: Aliased (QualifiedAlias q) (a1 ::: a2) # | |
(alias0 ~ alias1, alias0 ~ alias2, KnownSymbol alias2) => IsLabel alias0 (Aliased Alias (alias1 ::: alias2)) Source # | |
(HasUnique tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsLabel col (NP (Aliased (Expression (Grouped bys) lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, column ~ (col ::: ty)) => IsLabel col (Aliased (Expression (Grouped bys) lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Aliased (Expression (Grouped bys) lat with db params from) column # | |
(HasUnique tab (Join from lat) row, Has col row ty, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsLabel col (NP (Aliased (Expression Ungrouped lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(HasUnique tab (Join from lat) row, Has col row ty, column ~ (col ::: ty)) => IsLabel col (Aliased (Expression Ungrouped lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression Methods fromLabel :: Aliased (Expression Ungrouped lat with db params from) column # | |
Eq (expression ty) => Eq (Aliased expression (alias ::: ty)) Source # | |
Ord (expression ty) => Ord (Aliased expression (alias ::: ty)) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias 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 #
Instances
(KnownSymbol alias, tys ~ ((alias ::: ty) ': ([] :: [(Symbol, k)]))) => Aliasable alias (expression ty) (NP (Aliased expression) tys) Source # | |
(KnownSymbol alias, aliased ~ (alias ::: ty)) => Aliasable alias (expression ty) (Aliased expression aliased) Source # | |
(KnownSymbol cte, with1 ~ ((cte ::: common) ': with)) => Aliasable cte (statement with db params common) (Path (CommonTableExpression statement db params) with with1) Source # | |
Defined in Squeal.PostgreSQL.Query.With | |
(KnownSymbol cte, with1 ~ ((cte ::: common) ': with)) => Aliasable cte (statement with db params common) (CommonTableExpression statement db params with with1) Source # | |
Defined in Squeal.PostgreSQL.Query.With Methods as :: statement with db params common -> Alias cte -> CommonTableExpression statement db params with with1 Source # | |
(KnownSymbol col, row ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => Aliasable col (Expression grp lat with db params from ty) (Selection grp lat with db params from row) Source # | |
Defined in Squeal.PostgreSQL.Query.Select |
renderAliased :: (forall ty. expression ty -> ByteString) -> Aliased expression aliased -> ByteString Source #
>>>
let renderMaybe = fromString . maybe "Nothing" (const "Just")
>>>
renderAliased renderMaybe (Just (3::Int) `As` #an_int)
"Just AS \"an_int\""
mapAliased :: (expr x -> expr y) -> Aliased expr (alias ::: x) -> Aliased expr (alias ::: y) Source #
Map a function over an Aliased
expression.
type Has (alias :: Symbol) (fields :: [(Symbol, kind)]) (field :: kind) = HasErr fields 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
.
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 KnownSymbol alias => HasErr err (alias :: Symbol) (fields :: [(Symbol, kind)]) (field :: kind) | alias fields -> field Source #
HasErr
is like Has
except it also retains the original
list of fields being searched, so that error messages are more
useful.
Instances
(KnownSymbol alias, HasErr err alias fields field) => HasErr (err :: k) alias (field' ': fields :: [(Symbol, kind)]) (field :: kind) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
(KnownSymbol alias, field0 ~ field1) => HasErr (err :: k) alias ((alias ::: field0) ': fields :: [(Symbol, kind)]) (field1 :: kind) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias |
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.Type.Alias | |
(Has alias fields field, HasAll aliases fields subfields) => HasAll (alias ': aliases) (fields :: [(Symbol, k)]) ((alias ::: field) ': subfields :: [(Symbol, k)]) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias |
class HasIn fields field Source #
HasIn fields (alias ::: field)
is a constraint that proves that
fields
has a field of alias ::: field
. It is used in UPDATE
s to
choose which subfields to update.
Qualified Aliases
data QualifiedAlias (qualifier :: Symbol) (alias :: Symbol) Source #
QualifiedAlias
es enables multi-schema support by allowing a reference
to a Table
, Typedef
or View
to be qualified by their schemas. By default,
a qualifier of public
is provided.
>>>
:{
let alias1 :: QualifiedAlias "sch" "tab" alias1 = #sch ! #tab alias2 :: QualifiedAlias "public" "vw" alias2 = #vw in printSQL alias1 >> printSQL alias2 :} "sch"."tab" "vw"
Constructors
QualifiedAlias |
Instances
class IsQualified qualifier alias expression where Source #
Analagous to IsLabel
, the constraint
IsQualified
defines !
for a column alias qualified
by a table alias.
Instances
(q ~ q', a ~ a') => IsQualified q a (QualifiedAlias q' a') Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
IsQualified qualifier alias (Alias qualifier, Alias alias) Source # | |
(Has rel rels cols, Has col cols ty, by ~ (,) rel col) => IsQualified rel col (By rels by) Source # | |
(q0 ~ q1, a0 ~ a1, a1 ~ a2, KnownSymbol a2) => IsQualified q0 a0 (Aliased (QualifiedAlias q1) (a1 ::: a2)) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
(Has tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsQualified tab col (NP (Aliased (Expression (Grouped bys) lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, column ~ (col ::: ty)) => IsQualified tab col (Aliased (Expression (Grouped bys) lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, GroupedBy tab col bys, tys ~ (ty ': ([] :: [NullType]))) => IsQualified tab col (NP (Expression (Grouped bys) lat with db params from) tys) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, columns ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsQualified tab col (NP (Aliased (Expression Ungrouped lat with db params from)) columns) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, column ~ (col ::: ty)) => IsQualified tab col (Aliased (Expression Ungrouped lat with db params from) column) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty, tys ~ (ty ': ([] :: [NullType]))) => IsQualified tab col (NP (Expression Ungrouped lat with db params from) tys) 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 tab (Join from lat) row, Has col row ty, GroupedBy tab col bys) => IsQualified tab col (Expression (Grouped bys) lat with db params from ty) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row, Has col row ty) => IsQualified tab col (Expression Ungrouped lat with db params from ty) Source # | |
Defined in Squeal.PostgreSQL.Expression | |
(Has tab (Join from lat) row0, Has col row0 ty, row1 ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)])), GroupedBy tab col bys) => IsQualified tab col (Selection (Grouped bys) lat with db params from row1) Source # | |
(Has tab (Join from lat) row0, Has col row0 ty, row1 ~ ((col ::: ty) ': ([] :: [(Symbol, NullType)]))) => IsQualified tab col (Selection Ungrouped lat with db params from row1) Source # | |
Grouping
class (KnownSymbol table, KnownSymbol column) => GroupedBy table 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 table, KnownSymbol column) => GroupedBy table column ((,) table column ': bys :: [(Symbol, Symbol)]) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias | |
(KnownSymbol table, KnownSymbol column, GroupedBy table column bys) => GroupedBy table column (tabcol ': bys :: [a]) Source # | |
Defined in Squeal.PostgreSQL.Type.Alias |