{-# LANGUAGE
    AllowAmbiguousTypes
  , DataKinds
  , FlexibleContexts
  , FlexibleInstances
  , MultiParamTypeClasses
  , OverloadedLabels
  , OverloadedStrings
  , RankNTypes
  , ScopedTypeVariables
  , TypeApplications
  , TypeFamilies
  , TypeOperators
  , UndecidableInstances
#-}
module Squeal.PostgreSQL.Expression.Array
  ( 
    array
  , array0
  , array1
  , array2
  , cardinality
  , index
  , index1
  , index2
  , unnest
  , arrAny
  , arrAll
  ) where
import Data.String
import Data.Word (Word64)
import GHC.TypeNats
import qualified Generics.SOP as SOP
import Squeal.PostgreSQL.Expression
import Squeal.PostgreSQL.Expression.Logic
import Squeal.PostgreSQL.Expression.Type
import Squeal.PostgreSQL.Query.From.Set
import Squeal.PostgreSQL.Render
import Squeal.PostgreSQL.Type.Alias
import Squeal.PostgreSQL.Type.List
import Squeal.PostgreSQL.Type.Schema
array
  :: [Expression grp lat with db params from ty]
  
  -> Expression grp lat with db params from (null ('PGvararray ty))
array :: forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType) (null :: PGType -> NullType).
[Expression grp lat with db params from ty]
-> Expression grp lat with db params from (null ('PGvararray ty))
array [Expression grp lat with db params from ty]
xs = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$ ByteString
"ARRAY" forall a. Semigroup a => a -> a -> a
<>
  ByteString -> ByteString
bracketed ([ByteString] -> ByteString
commaSeparated (forall sql. RenderSQL sql => sql -> ByteString
renderSQL forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Expression grp lat with db params from ty]
xs))
array0
  :: TypeExpression db ty
  -> Expression grp lat with db params from (null ('PGvararray ty))
array0 :: forall (db :: SchemasType) (ty :: NullType) (grp :: Grouping)
       (lat :: FromType) (with :: FromType) (params :: [NullType])
       (from :: FromType) (null :: PGType -> NullType).
TypeExpression db ty
-> Expression grp lat with db params from (null ('PGvararray ty))
array0 TypeExpression db ty
ty = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType) (null :: PGType -> NullType).
[Expression grp lat with db params from ty]
-> Expression grp lat with db params from (null ('PGvararray ty))
array [] forall a b. a -> (a -> b) -> b
& forall (db :: SchemasType) (ty :: NullType) (grp :: Grouping)
       (lat :: FromType) (with :: FromType) (params :: [NullType])
       (from :: FromType).
TypeExpression db ty
-> Expression grp lat with db params from ty
-> Expression grp lat with db params from ty
astype (forall (db :: SchemasType) (pg :: NullType)
       (null :: PGType -> NullType).
TypeExpression db pg -> TypeExpression db (null ('PGvararray pg))
vararray TypeExpression db ty
ty)
array1
  :: (n ~ Length tys, SOP.All ((~) ty) tys)
  => NP (Expression grp lat with db params from) tys
    
  -> Expression grp lat with db params from (null ('PGfixarray '[n] ty))
array1 :: forall (n :: Nat) (tys :: [NullType]) (ty :: NullType)
       (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (null :: PGType -> NullType).
(n ~ Length tys, All ((~) ty) tys) =>
NP (Expression grp lat with db params from) tys
-> Expression
     grp lat with db params from (null ('PGfixarray '[n] ty))
array1 NP (Expression grp lat with db params from) tys
xs = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$ ByteString
"ARRAY" forall a. Semigroup a => a -> a -> a
<>
  ByteString -> ByteString
bracketed (forall {k} (xs :: [k]) (expression :: k -> *).
SListI xs =>
(forall (x :: k). expression x -> ByteString)
-> NP expression xs -> ByteString
renderCommaSeparated forall sql. RenderSQL sql => sql -> ByteString
renderSQL NP (Expression grp lat with db params from) tys
xs)
array2
  ::  ( SOP.All ((~) tys) tyss
      , SOP.All SOP.SListI tyss
      , Length tyss ~ n1
      , SOP.All ((~) ty) tys
      , Length tys ~ n2 )
  => NP (NP (Expression grp lat with db params from)) tyss
  
  -> Expression grp lat with db params from (null ('PGfixarray '[n1,n2] ty))
array2 :: forall (tys :: [NullType]) (tyss :: [[NullType]]) (n1 :: Nat)
       (ty :: NullType) (n2 :: Nat) (grp :: Grouping) (lat :: FromType)
       (with :: FromType) (db :: SchemasType) (params :: [NullType])
       (from :: FromType) (null :: PGType -> NullType).
(All ((~) tys) tyss, All SListI tyss, Length tyss ~ n1,
 All ((~) ty) tys, Length tys ~ n2) =>
NP (NP (Expression grp lat with db params from)) tyss
-> Expression
     grp lat with db params from (null ('PGfixarray '[n1, n2] ty))
array2 NP (NP (Expression grp lat with db params from)) tyss
xss = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$ ByteString
"ARRAY" forall a. Semigroup a => a -> a -> a
<>
  ByteString -> ByteString
bracketed (forall {k} (c :: k -> Constraint) (xs :: [k])
       (expression :: k -> *).
(All c xs, SListI xs) =>
(forall (x :: k). c x => expression x -> ByteString)
-> NP expression xs -> ByteString
renderCommaSeparatedConstraint @SOP.SListI (ByteString -> ByteString
bracketed forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k} (xs :: [k]) (expression :: k -> *).
SListI xs =>
(forall (x :: k). expression x -> ByteString)
-> NP expression xs -> ByteString
renderCommaSeparated forall sql. RenderSQL sql => sql -> ByteString
renderSQL) NP (NP (Expression grp lat with db params from)) tyss
xss)
cardinality :: null ('PGvararray ty) --> null 'PGint8
cardinality :: forall (null :: PGType -> NullType) (ty :: NullType).
null ('PGvararray ty) --> null 'PGint8
cardinality = forall (x :: NullType) (y :: NullType). ByteString -> x --> y
unsafeFunction ByteString
"cardinality"
index
  :: Word64 
  -> null ('PGvararray ty) --> NullifyType ty
index :: forall (null :: PGType -> NullType) (ty :: NullType).
Word64 -> null ('PGvararray ty) --> NullifyType ty
index Word64
i Expression grp lat with db params from (null ('PGvararray ty))
arr = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$
  ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression grp lat with db params from (null ('PGvararray ty))
arr) forall a. Semigroup a => a -> a -> a
<> ByteString
"[" forall a. Semigroup a => a -> a -> a
<> forall a. IsString a => String -> a
fromString (forall a. Show a => a -> String
show Word64
i) forall a. Semigroup a => a -> a -> a
<> ByteString
"]"
index1
  :: forall i n ty
   . (1 <= i, i <= n, KnownNat i)
  => 'NotNull ('PGfixarray '[n] ty) --> ty
  
index1 :: forall (i :: Nat) (n :: Nat) (ty :: NullType).
(1 <= i, i <= n, KnownNat i) =>
'NotNull ('PGfixarray '[n] ty) --> ty
index1 Expression
  grp lat with db params from ('NotNull ('PGfixarray '[n] ty))
arr = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$
  ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression
  grp lat with db params from ('NotNull ('PGfixarray '[n] ty))
arr)
  forall a. Semigroup a => a -> a -> a
<> ByteString
"[" forall a. Semigroup a => a -> a -> a
<> forall a. IsString a => String -> a
fromString (forall a. Show a => a -> String
show (forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (forall {k} (t :: k). Proxy t
SOP.Proxy @i))) forall a. Semigroup a => a -> a -> a
<> ByteString
"]"
index2
  :: forall i j m n ty
   . ( 1 <= i, i <= m, KnownNat i
     , 1 <= j, j <= n, KnownNat j
     )
  => 'NotNull ('PGfixarray '[m,n] ty) --> ty
  
index2 :: forall (i :: Nat) (j :: Nat) (m :: Nat) (n :: Nat)
       (ty :: NullType).
(1 <= i, i <= m, KnownNat i, 1 <= j, j <= n, KnownNat j) =>
'NotNull ('PGfixarray '[m, n] ty) --> ty
index2 Expression
  grp lat with db params from ('NotNull ('PGfixarray '[m, n] ty))
arr = forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$
  ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression
  grp lat with db params from ('NotNull ('PGfixarray '[m, n] ty))
arr)
  forall a. Semigroup a => a -> a -> a
<> ByteString
"[" forall a. Semigroup a => a -> a -> a
<> forall a. IsString a => String -> a
fromString (forall a. Show a => a -> String
show (forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (forall {k} (t :: k). Proxy t
SOP.Proxy @i))) forall a. Semigroup a => a -> a -> a
<> ByteString
"]"
  forall a. Semigroup a => a -> a -> a
<> ByteString
"[" forall a. Semigroup a => a -> a -> a
<> forall a. IsString a => String -> a
fromString (forall a. Show a => a -> String
show (forall (n :: Nat) (proxy :: Nat -> *). KnownNat n => proxy n -> Nat
natVal (forall {k} (t :: k). Proxy t
SOP.Proxy @j))) forall a. Semigroup a => a -> a -> a
<> ByteString
"]"
unnest :: null ('PGvararray ty) -|-> ("unnest" ::: '["unnest" ::: ty])
unnest :: forall (null :: PGType -> NullType) (ty :: NullType).
null ('PGvararray ty) -|-> ("unnest" ::: '["unnest" ::: ty])
unnest = forall (fun :: Symbol) (ty :: NullType)
       (row :: [(Symbol, NullType)]).
KnownSymbol fun =>
ByteString -> ty -|-> (fun ::: row)
unsafeSetFunction ByteString
"unnest"
arrAll
  :: Expression grp lat with db params from ty1 
  -> Operator ty1 ty2 ('Null 'PGbool) 
  -> Expression grp lat with db params from (null ('PGvararray ty2)) 
  -> Condition grp lat with db params from
arrAll :: forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty1 :: NullType) (ty2 :: NullType) (null :: PGType -> NullType).
Expression grp lat with db params from ty1
-> Operator ty1 ty2 ('Null 'PGbool)
-> Expression grp lat with db params from (null ('PGvararray ty2))
-> Condition grp lat with db params from
arrAll Expression grp lat with db params from ty1
x Operator ty1 ty2 ('Null 'PGbool)
(?) Expression grp lat with db params from (null ('PGvararray ty2))
xs = Expression grp lat with db params from ty1
x Operator ty1 ty2 ('Null 'PGbool)
? (forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$ ByteString
"ALL" ByteString -> ByteString -> ByteString
<+> ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression grp lat with db params from (null ('PGvararray ty2))
xs))
arrAny
  :: Expression grp lat with db params from ty1 
  -> Operator ty1 ty2 ('Null 'PGbool) 
  -> Expression grp lat with db params from (null ('PGvararray ty2)) 
  -> Condition grp lat with db params from
arrAny :: forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty1 :: NullType) (ty2 :: NullType) (null :: PGType -> NullType).
Expression grp lat with db params from ty1
-> Operator ty1 ty2 ('Null 'PGbool)
-> Expression grp lat with db params from (null ('PGvararray ty2))
-> Condition grp lat with db params from
arrAny Expression grp lat with db params from ty1
x Operator ty1 ty2 ('Null 'PGbool)
(?) Expression grp lat with db params from (null ('PGvararray ty2))
xs = Expression grp lat with db params from ty1
x Operator ty1 ty2 ('Null 'PGbool)
? (forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
       (db :: SchemasType) (params :: [NullType]) (from :: FromType)
       (ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall a b. (a -> b) -> a -> b
$ ByteString
"ANY" ByteString -> ByteString -> ByteString
<+> ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression grp lat with db params from (null ('PGvararray ty2))
xs))