@@ -31,6 +31,7 @@ import Rel8.Expr.Bool ( boolExpr )
31import Rel8.Expr.Null ( nullify, unsafeUnnullify )
31import Rel8.Expr.Null ( nullify, unsafeUnnullify )
32import Rel8.Expr.Opaleye ( fromPrimExpr, toPrimExpr )
32import Rel8.Expr.Opaleye ( fromPrimExpr, toPrimExpr )
33import Rel8.Kind.Context ( SContext(..) )
33import Rel8.Kind.Context ( SContext(..) )
34+import Rel8.Schema.Field ( Field )
34import qualified Rel8.Schema.Kind as K
35import qualified Rel8.Schema.Kind as K
35import Rel8.Schema.Name ( Name( Name ) )
36import Rel8.Schema.Name ( Name( Name ) )
36import Rel8.Schema.Null ( Nullify, Nullity( Null, NotNull ) )
37import Rel8.Schema.Null ( Nullify, Nullity( Null, NotNull ) )
@@ -64,7 +65,8 @@ instance Nullifiable Name where
65type NonNullifiability :: K.Context -> Type
66type NonNullifiability :: K.Context -> Type
66data NonNullifiability context where
67data NonNullifiability context where
68+ NField :: NonNullifiability (Field table)
67− NNResult :: NonNullifiability Result
69+ NResult :: NonNullifiability Result
70nullifiableOrNot :: ()
72nullifiableOrNot :: ()
@@ -73,8 +75,9 @@ nullifiableOrNot :: ()
73nullifiableOrNot = \case
75nullifiableOrNot = \case
74 SAggregate -> Right NAggregate
76 SAggregate -> Right NAggregate
75 SExpr -> Right NExpr
77 SExpr -> Right NExpr
78+ SField -> Left NField
76 SName -> Right NName
79 SName -> Right NName
77− SResult -> Left NNResult
80+ SResult -> Left NResult
80absurd :: Nullifiability context -> NonNullifiability context -> a
83absurd :: Nullifiability context -> NonNullifiability context -> a
@@ -91,21 +94,20 @@ guarder :: ()
91 -> (Expr tag -> Expr Bool)
94 -> (Expr tag -> Expr Bool)
92 -> context (Maybe a)
95 -> context (Maybe a)
93 -> context (Maybe a)
96 -> context (Maybe a)
94−guarder SAggregate tag _ isNonNull (Aggregate a) =
98+ SAggregate -> \tag _ isNonNull (Aggregate a) ->
95− mapInputs (toPrimExpr . run . fromPrimExpr) $
99+ let
99− mtag = foldInputs (\_ -> pure . fromPrimExpr) tag
100+ mtag = foldInputs (\_ -> pure . fromPrimExpr) tag
100− run = maybe id (sguard . isNonNull) (getFirst mtag)
101+ run = maybe id (sguard . isNonNull) (getFirst mtag)
103+ mapInputs (toPrimExpr . run . fromPrimExpr) $
101−guarder SExpr tag _ isNonNull a = sguard condition a
106+ SExpr -> \tag _ isNonNull a -> sguard (isNonNull tag) a
102− where
107+ SField -> \_ _ _ field -> field
103− condition = isNonNull tag
104−guarder SName _ _ _ name = name
108+ SName -> \_ _ _ name -> name
105−guarder SResult (Identity tag) isNonNull _ (Identity a) =
109+ SResult -> \(Identity tag) isNonNull _ (Identity a) ->
106− Identity (bool Nothing a condition)
110+ Identity (bool Nothing a (isNonNull tag))
108− condition = isNonNull tag
111nullifier :: ()
113nullifier :: ()
@@ -113,10 +115,11 @@ nullifier :: ()
113 -> Spec a
115 -> Spec a
114 -> context a
116 -> context a
115 -> context (Nullify a)
117 -> context (Nullify a)
116−nullifier NAggregate Spec {nullity} (Aggregate a) =
119+ NAggregate -> \Spec {nullity} (Aggregate a) ->
117− Aggregate $ snullify nullity <$> a
120+ Aggregate $ snullify nullity <$> a
118−nullifier NExpr Spec {nullity} a = snullify nullity a
121+ NExpr -> \Spec {nullity} a -> snullify nullity a
119−nullifier NName _ (Name a) = Name a
122+ NName -> \_ (Name a) -> Name a
122unnullifier :: ()
125unnullifier :: ()
@@ -124,10 +127,11 @@ unnullifier :: ()
124 -> Spec a
127 -> Spec a
125 -> context (Nullify a)
128 -> context (Nullify a)
126 -> context a
129 -> context a
127−unnullifier NAggregate Spec {nullity} (Aggregate a) =
131+ NAggregate -> \Spec {nullity} (Aggregate a) ->
128− Aggregate $ sunnullify nullity <$> a
132+ Aggregate $ sunnullify nullity <$> a
129−unnullifier NExpr Spec {nullity} a = sunnullify nullity a
133+ NExpr -> \Spec {nullity} a -> sunnullify nullity a
130−unnullifier NName _ (Name a) = Name a
134+ NName -> \_ (Name a) -> Name a
133sguard :: Expr Bool -> Expr (Maybe a) -> Expr (Maybe a)
137sguard :: Expr Bool -> Expr (Maybe a) -> Expr (Maybe a)