@@ -15,7 +15,7 @@
1515module Rel8.Schema.Insert
1616 ( Insert(..)
1717 , OnConflict(..)
18− , Col( RequiredInsert, OptionalInsert )
18+ , Col( InsertCol )
1919 , Inserts
2020 , Insertion(..)
2121 )
@@ -29,14 +29,14 @@ import Prelude
2929-- rel8
3030import Rel8.Aggregate ( Aggregate )
3131import Rel8.Expr ( Expr )
32−import Rel8.Kind.Necessity ( Necessity(Optional, Required) )
32+import Rel8.Kind.Necessity ( Necessity(Optional, Required), KnownNecessity )
3333import Rel8.Schema.Context ( Interpretation(..) )
3434import Rel8.Schema.Context.Label ( Labelable(..) )
3535import Rel8.Schema.Context.Nullify
3636 ( Nullifiable, encodeTag, decodeTag, nullifier, unnullifier
3737 , runTag, unnull
3838 )
39−import Rel8.Schema.HTable.Identity ( HIdentity( HType ), HType )
39+import Rel8.Schema.HTable.Identity ( HIdentity( HIdentity ) )
4040import Rel8.Schema.Name ( Name, Selects )
4141import Rel8.Schema.Null ( Sql )
4242import Rel8.Schema.Reify ( notReify )
@@ -79,80 +79,78 @@ data Insert a where
7979
8080instance Interpretation Insert where
8181 data Col Insert _spec where
82− RequiredInsert :: Expr a -> Col Insert ('Spec labels 'Required a)
83− OptionalInsert :: Maybe (Expr a) -> Col Insert ('Spec labels 'Optional a)
82+ InsertCol :: Insertion necessity a -> Col Insert ('Spec labels necessity a)
8483
8584
86−type Insertion :: Type -> Type
87−newtype Insertion a = Insertion (Expr a)
85+type Insertion :: Necessity -> Type -> Type
86+data Insertion necessity a where
87+ Default :: Insertion 'Optional a
88+ Insertion :: Expr a -> Insertion necessity a
8889
8990
90−instance Sql DBType a => Table Insert (Insertion a) where
91− type Columns (Insertion a) = HType a
92− type Context (Insertion a) = Insert
91+instance (KnownNecessity necessity, Sql DBType a) =>
92+ Table Insert (Insertion necessity a)
93+ where
94+ type Columns (Insertion necessity a) = HIdentity ('Spec '[] necessity a)
95+ type Context (Insertion necessity a) = Insert
9396
94− toColumns (Insertion a) = HType (RequiredInsert a)
95− fromColumns (HType (RequiredInsert a)) = Insertion a
97+ toColumns = HIdentity . InsertCol
98+ fromColumns (HIdentity (InsertCol a)) = a
9699 reify = notReify
97100 unreify = notReify
98101
99102
100103instance Sql DBType a =>
101− Recontextualize Aggregate Insert (Aggregate (Expr a)) (Insertion a)
104+ Recontextualize Aggregate Insert (Aggregate (Expr a)) (Insertion 'Required a)
102105
103106
104−instance Sql DBType a => Recontextualize Expr Insert (Expr a) (Insertion a)
107+instance Sql DBType a => Recontextualize Expr Insert (Expr a) (Insertion 'Required a)
105108
106109
107110instance Sql DBType a =>
108− Recontextualize Result Insert (Identity a) (Insertion a)
111+ Recontextualize Result Insert (Identity a) (Insertion 'Required a)
109112
110113
111114instance Sql DBType a =>
112− Recontextualize Insert Aggregate (Insertion a) (Aggregate (Expr a))
115+ Recontextualize Insert Aggregate (Insertion 'Required a) (Aggregate (Expr a))
113116
114117
115−instance Sql DBType a => Recontextualize Insert Expr (Insertion a) (Expr a)
118+instance Sql DBType a => Recontextualize Insert Expr (Insertion 'Required a) (Expr a)
116119
117120
118121instance Sql DBType a =>
119− Recontextualize Insert Result (Insertion a) (Identity a)
122+ Recontextualize Insert Result (Insertion 'Required a) (Identity a)
120123
121124
122−instance Sql DBType a => Recontextualize Insert Insert (Insertion a) (Insertion a)
125+instance Sql DBType a => Recontextualize Insert Insert (Insertion 'Required a) (Insertion 'Required a)
123126
124127
125−instance Sql DBType a => Recontextualize Insert Name (Insertion a) (Name a)
128+instance Sql DBType a => Recontextualize Insert Name (Insertion 'Required a) (Name a)
126129
127130
128−instance Sql DBType a => Recontextualize Name Insert (Name a) (Insertion a)
131+instance Sql DBType a => Recontextualize Name Insert (Name a) (Insertion 'Required a)
129132
130133
131134instance Labelable Insert where
132− labeler = \case
133− RequiredInsert a -> RequiredInsert a
134− OptionalInsert ma -> OptionalInsert ma
135−
136− unlabeler = \case
137− RequiredInsert a -> RequiredInsert a
138− OptionalInsert ma -> OptionalInsert ma
135+ labeler (InsertCol a) = InsertCol a
136+ unlabeler (InsertCol a) = InsertCol a
139137
140138
141139instance Nullifiable Insert where
142− encodeTag = RequiredInsert . expr
143− decodeTag (RequiredInsert a) = fromExpr a
140+ encodeTag = InsertCol . Insertion . expr
141+
142+ decodeTag (InsertCol (Insertion a)) = fromExpr a
144143
145144 nullifier Tag {expr} test SSpec {nullity} = \case
146− RequiredInsert a ->
147− RequiredInsert $ runTag nullity condition a
148− OptionalInsert ma ->
149− OptionalInsert $ runTag nullity condition <$> ma
145+ InsertCol Default -> InsertCol Default
146+ InsertCol (Insertion a) ->
147+ InsertCol $ Insertion $ runTag nullity condition a
150148 where
151149 condition = test expr
152150
153151 unnullifier SSpec {nullity} = \case
154− RequiredInsert a -> RequiredInsert $ unnull nullity a
155− OptionalInsert ma -> OptionalInsert $ unnull nullity <$> ma
152+ InsertCol Default -> InsertCol Default
153+ InsertCol (Insertion a) -> InsertCol $ Insertion $ unnull nullity a
156154
157155 {-# INLINABLE encodeTag #-}
158156 {-# INLINABLE decodeTag #-}