@@ -31,6 +31,7 @@ import Rel8.Expr.Bool ( boolExpr )
3131import Rel8.Expr.Null ( nullify, unsafeUnnullify )
3232import Rel8.Expr.Opaleye ( fromPrimExpr, toPrimExpr )
3333import Rel8.Kind.Context ( SContext(..) )
34+import Rel8.Schema.Field ( Field )
3435import qualified Rel8.Schema.Kind as K
3536import Rel8.Schema.Name ( Name( Name ) )
3637import Rel8.Schema.Null ( Nullify, Nullity( Null, NotNull ) )
@@ -64,7 +65,8 @@ instance Nullifiable Name where
6465
6566type NonNullifiability :: K.Context -> Type
6667data NonNullifiability context where
67− NNResult :: NonNullifiability Result
68+ NField :: NonNullifiability (Field table)
69+ NResult :: NonNullifiability Result
6870
6971
7072nullifiableOrNot :: ()
@@ -73,8 +75,9 @@ nullifiableOrNot :: ()
7375nullifiableOrNot = \case
7476 SAggregate -> Right NAggregate
7577 SExpr -> Right NExpr
78+ SField -> Left NField
7679 SName -> Right NName
77− SResult -> Left NNResult
80+ SResult -> Left NResult
7881
7982
8083absurd :: Nullifiability context -> NonNullifiability context -> a
@@ -91,21 +94,20 @@ guarder :: ()
9194 -> (Expr tag -> Expr Bool)
9295 -> context (Maybe a)
9396 -> context (Maybe a)
94−guarder SAggregate tag _ isNonNull (Aggregate a) =
95− mapInputs (toPrimExpr . run . fromPrimExpr) $
96− Aggregate $
97− run <$> a
98− where
99− mtag = foldInputs (\_ -> pure . fromPrimExpr) tag
100− run = maybe id (sguard . isNonNull) (getFirst mtag)
101−guarder SExpr tag _ isNonNull a = sguard condition a
102− where
103− condition = isNonNull tag
104−guarder SName _ _ _ name = name
105−guarder SResult (Identity tag) isNonNull _ (Identity a) =
106− Identity (bool Nothing a condition)
107− where
108− condition = isNonNull tag
97+guarder = \case
98+ SAggregate -> \tag _ isNonNull (Aggregate a) ->
99+ let
100+ mtag = foldInputs (\_ -> pure . fromPrimExpr) tag
101+ run = maybe id (sguard . isNonNull) (getFirst mtag)
102+ in
103+ mapInputs (toPrimExpr . run . fromPrimExpr) $
104+ Aggregate $
105+ run <$> a
106+ SExpr -> \tag _ isNonNull a -> sguard (isNonNull tag) a
107+ SField -> \_ _ _ field -> field
108+ SName -> \_ _ _ name -> name
109+ SResult -> \(Identity tag) isNonNull _ (Identity a) ->
110+ Identity (bool Nothing a (isNonNull tag))
109111
110112
111113nullifier :: ()
@@ -113,10 +115,11 @@ nullifier :: ()
113115 -> Spec a
114116 -> context a
115117 -> context (Nullify a)
116−nullifier NAggregate Spec {nullity} (Aggregate a) =
117− Aggregate $ snullify nullity <$> a
118−nullifier NExpr Spec {nullity} a = snullify nullity a
119−nullifier NName _ (Name a) = Name a
118+nullifier = \case
119+ NAggregate -> \Spec {nullity} (Aggregate a) ->
120+ Aggregate $ snullify nullity <$> a
121+ NExpr -> \Spec {nullity} a -> snullify nullity a
122+ NName -> \_ (Name a) -> Name a
120123
121124
122125unnullifier :: ()
@@ -124,10 +127,11 @@ unnullifier :: ()
124127 -> Spec a
125128 -> context (Nullify a)
126129 -> context a
127−unnullifier NAggregate Spec {nullity} (Aggregate a) =
128− Aggregate $ sunnullify nullity <$> a
129−unnullifier NExpr Spec {nullity} a = sunnullify nullity a
130−unnullifier NName _ (Name a) = Name a
130+unnullifier = \case
131+ NAggregate -> \Spec {nullity} (Aggregate a) ->
132+ Aggregate $ sunnullify nullity <$> a
133+ NExpr -> \Spec {nullity} a -> sunnullify nullity a
134+ NName -> \_ (Name a) -> Name a
131135
132136
133137sguard :: Expr Bool -> Expr (Maybe a) -> Expr (Maybe a)