@@ -165,6 +165,51 @@ describe("insert", () => {
165165 assert . equal ( result , 42 ) ;
166166 } ) ;
167167
168+ test ( "with block on insert with unless conflict" , async ( ) => {
169+ // test that the 'bulk inserts with conflict handling' query we show in
170+ // the docs works in the query builder
171+ // https://docs.geldata.com/reference/using/js/querybuilder#handling-conflicts-in-bulk-inserts
172+ const query = e . params (
173+ {
174+ movies : e . array (
175+ e . tuple ( {
176+ title : e . str ,
177+ directors : e . array ( e . str ) ,
178+ } ) ,
179+ ) ,
180+ } ,
181+ ( $ ) => {
182+ const directors = e . for (
183+ e . op ( "distinct" , e . array_unpack ( e . array_unpack ( $ . movies ) . directors ) ) ,
184+ ( director_name ) =>
185+ e
186+ . insert ( e . Director , { name : director_name } )
187+ . unlessConflict ( ( d ) => ( { on : d . name , else : d } ) ) ,
188+ ) ;
189+
190+ return e . with (
191+ [ directors ] ,
192+ e . for ( e . array_unpack ( $ . movies ) , ( movie ) =>
193+ e
194+ . insert ( e . Movie , {
195+ title : movie . title ,
196+ directors : e . select ( directors , ( director ) => ( {
197+ filter : e . op (
198+ director . name ,
199+ "in" ,
200+ e . array_unpack ( movie . directors ) ,
201+ ) ,
202+ } ) ) ,
203+ } )
204+ . unlessConflict ( ( m ) => ( { on : m . title , else : m } ) ) ,
205+ ) ,
206+ ) ;
207+ } ,
208+ ) ;
209+
210+ await query . run ( client , { movies : [ ] } ) ;
211+ } ) ;
212+
168213 test ( "nested insert" , async ( ) => {
169214 const q1 = e . insert ( e . Villain , {
170215 name : e . str ( "villain" ) ,
0 commit comments