@@ -21,6 +21,7 @@ module Rel8.Table.ADT
21 , InsertADT, insertADT
21 , InsertADT, insertADT
22 , NameADT, nameADT
22 , NameADT, nameADT
23 , AggregateADT, aggregateADT
23 , AggregateADT, aggregateADT
24+ , AggregateADT', aggregateADT'
@@ -32,19 +33,19 @@ import Data.Type.Equality ( (:~:)( Refl ) )
32import Prelude
33import Prelude
35−import Rel8.Aggregate ( Col( Aggregation ), Aggregate, mapInputs )
36+import Rel8.Aggregate ( Col( Aggregation ), Aggregate )
36import Rel8.Expr ( Col( DB ), Expr )
37import Rel8.Expr ( Col( DB ), Expr )
37import Rel8.Expr.Aggregate ( groupByExpr )
38import Rel8.Expr.Aggregate ( groupByExpr )
38import Rel8.Expr.Eq ( (==.) )
39import Rel8.Expr.Eq ( (==.) )
39import Rel8.Expr.Null ( nullify, snull, unsafeUnnullify )
40import Rel8.Expr.Null ( nullify, snull, unsafeUnnullify )
40−import Rel8.Expr.Opaleye ( fromPrimExpr, toPrimExpr )
41import Rel8.Expr.Serialize ( litExpr )
41import Rel8.Expr.Serialize ( litExpr )
42+import Rel8.FCF ( Compose )
42import Rel8.Generic.Construction.ADT
43import Rel8.Generic.Construction.ADT
43 ( GConstructableADT
44 ( GConstructableADT
44 , GBuildADT, gbuildADT, gunbuildADT
45 , GBuildADT, gbuildADT, gunbuildADT
45 , GConstructADT, gconstructADT, gdeconstructADT
46 , GConstructADT, gconstructADT, gdeconstructADT
46 , CorepConstructors, GConstructors, gcindex, gctabulate
47 , CorepConstructors, GConstructors, gcindex, gctabulate
47− , CorepFields, GFields, gfindex, gftabulate
48+ , CorepFields, gfindex, gftabulate, gftraverse
49import Rel8.Generic.Rel8able
50import Rel8.Generic.Rel8able
50 ( Rel8able, Algebra
51 ( Rel8able, Algebra
@@ -55,7 +56,6 @@ import Rel8.Generic.Rel8able
55import qualified Rel8.Generic.Table.ADT as G
56import qualified Rel8.Generic.Table.ADT as G
56import qualified Rel8.Kind.Algebra as K
57import qualified Rel8.Kind.Algebra as K
57import Rel8.Kind.Necessity ( SNecessity( SOptional, SRequired ) )
58import Rel8.Kind.Necessity ( SNecessity( SOptional, SRequired ) )
58−import Rel8.Schema.Context ( Col )
59import Rel8.Schema.Context.Nullify ( runTag )
59import Rel8.Schema.Context.Nullify ( runTag )
60import Rel8.Schema.HTable ( HTable )
60import Rel8.Schema.HTable ( HTable )
61import Rel8.Schema.HTable.Type ( HType( HType ) )
61import Rel8.Schema.HTable.Type ( HType( HType ) )
@@ -73,6 +73,9 @@ import Rel8.Table
73import Rel8.Table.Bool ( case_ )
73import Rel8.Table.Bool ( case_ )
74import Rel8.Type.Tag ( Tag )
74import Rel8.Type.Tag ( Tag )
77+import Data.Functor.Apply ( Apply, MaybeApply( MaybeApply ), liftF2 )
77type ADT :: K.Rel8able -> K.Rel8able
80type ADT :: K.Rel8able -> K.Rel8able
78newtype ADT t context = ADT (GColumnsADT t (Col context))
81newtype ADT t context = ADT (GColumnsADT t (Col context))
@@ -100,6 +103,7 @@ type ConstructableADT :: K.Rel8able -> Constraint
101 ( CorepConstructors TUnreify (GRep t (Reify Expr))
104 ( CorepConstructors TUnreify (GRep t (Reify Expr))
102 , CorepConstructors TUnreify (GRep t (Reify Insert))
105 , CorepConstructors TUnreify (GRep t (Reify Insert))
106+ , CorepFields (Compose Aggregate TUnreify) (GRep t (Reify Expr))
103 , CorepFields TUnreify (GRep t (Reify Aggregate))
107 , CorepFields TUnreify (GRep t (Reify Aggregate))
104 , CorepFields TUnreify (GRep t (Reify Expr))
108 , CorepFields TUnreify (GRep t (Reify Expr))
105 , CorepFields TUnreify (GRep t (Reify Name))
109 , CorepFields TUnreify (GRep t (Reify Name))
@@ -119,6 +123,7 @@ class
120 ( CorepConstructors TUnreify (GRep t (Reify Expr))
124 ( CorepConstructors TUnreify (GRep t (Reify Expr))
121 , CorepConstructors TUnreify (GRep t (Reify Insert))
125 , CorepConstructors TUnreify (GRep t (Reify Insert))
126+ , CorepFields (Compose Aggregate TUnreify) (GRep t (Reify Expr))
122 , CorepFields TUnreify (GRep t (Reify Aggregate))
127 , CorepFields TUnreify (GRep t (Reify Aggregate))
123 , CorepFields TUnreify (GRep t (Reify Expr))
128 , CorepFields TUnreify (GRep t (Reify Expr))
124 , CorepFields TUnreify (GRep t (Reify Name))
129 , CorepFields TUnreify (GRep t (Reify Name))
@@ -235,12 +240,63 @@ nameADT tag = gftabulate @TUnreify @(GRep t (Reify Name)) @(ADT t Name) $
235type AggregateADT :: K.Rel8able -> Type
240type AggregateADT :: K.Rel8able -> Type
236type AggregateADT t = forall r.
241type AggregateADT t = forall r.
237 GBuildADT TUnreify (GRep t (Reify Expr))
242 GBuildADT TUnreify (GRep t (Reify Expr))
238− (GBuildADT TUnreify (GRep t (Reify Aggregate)) r -> r)
243+ (GBuildADT (Compose Aggregate TUnreify) (GRep t (Reify Expr)) r -> r)
241aggregateADT :: forall t. ConstructableADT t
246aggregateADT :: forall t. ConstructableADT t
242− => AggregateADT t -> ADT t Expr -> ADT t Aggregate
247+ => AggregateADT t -> ADT t Expr -> Aggregate (ADT t Expr)
243aggregateADT builder (ADT columns) = f exprs $
248aggregateADT builder (ADT columns) = f exprs $
254+ @(TTable (Reify Expr))
258+ @(GRep t (Reify Expr))
259+ (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
260+ (\tag'' SSpec {nullity} (Reify (DB a)) ->
261+ Reify $ DB $ runTag nullity (tag ==. litExpr tag'') a)
262+ (HType (Reify (DB tag'))))
264+ gftraverse @TUnreify @(GRep t (Reify Expr)) @_ @Aggregate (MaybeApply . Left)
269+ @(GRep t (Reify Expr))
270+ @(GBuildADT (Compose Aggregate TUnreify) (GRep t (Reify Expr)) (Aggregate (ADT t Expr)) -> Aggregate (ADT t Expr))
271+ (builder @(Aggregate (ADT t Expr)))
274+ @(Compose Aggregate TUnreify)
275+ @(GRep t (Reify Expr))
276+ @(Aggregate (ADT t Expr))
277+ (HType (Reify (DB tag)), exprs) =
279+ @(TTable (Reify Expr))
283+ @(GRep t (Reify Expr))
284+ (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns)
285+ (\SSpec {nullity} -> case nullity of
287+ NotNull -> \(Reify (DB a)) -> Reify (DB (unsafeUnnullify a)))
291+type AggregateADT' :: K.Rel8able -> Type
292+type AggregateADT' t = forall r.
293+ GBuildADT TUnreify (GRep t (Reify Expr))
294+ (GBuildADT TUnreify (GRep t (Reify Aggregate)) r -> r)
297+aggregateADT' :: forall t. ConstructableADT t
298+ => AggregateADT' t -> ADT t Expr -> ADT t Aggregate
299+aggregateADT' builder (ADT columns) = f exprs $
245 hunreify .
301 hunreify .
246 gbuildADT
302 gbuildADT
@@ -250,14 +306,8 @@ aggregateADT builder (ADT columns) = f exprs $
250 @(Col (Reify Aggregate))
306 @(Col (Reify Aggregate))
251 @(GRep t (Reify Aggregate))
307 @(GRep t (Reify Aggregate))
252 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
308 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
253− (\tag' SSpec {nullity} (Reify (Aggregation aggregate)) ->
309+ (\tag' SSpec {nullity} (Reify (Aggregation a)) ->
255− condition = tag ==. litExpr tag'
310+ Reify $ Aggregation $ runTag nullity (tag ==. litExpr tag') <$> a)
259− mapInputs (toPrimExpr . runTag nullity condition . fromPrimExpr) $
260− runTag nullity condition <$> aggregate)
261 (HType (Reify (Aggregation (groupByExpr tag))))
311 (HType (Reify (Aggregation (groupByExpr tag))))
@@ -283,3 +333,9 @@ aggregateADT builder (ADT columns) = f exprs $
283 Null -> id
333 Null -> id
284 NotNull -> \(Reify (DB a)) -> Reify (DB (unsafeUnnullify a)))
334 NotNull -> \(Reify (DB a)) -> Reify (DB (unsafeUnnullify a)))
285 (hreify columns)
335 (hreify columns)
338+liftF1½ :: Apply v => (a -> b -> c) -> v a -> MaybeApply v b -> v c
339+liftF1½ f a (MaybeApply eb) = case eb of
340+ Left b -> liftF2 f a b
341+ Right b -> fmap (`f` b) a