@@ -142,3 +142,153 @@ func (s *WriterTestSuite) testDeleteStaleAll(ctx context.Context) {
142142 require .EqualValuesf (s .t , rowsPerRecord , TotalRows (readRecords ), "unexpected amount of items after second delete stale" )
143143 require .Emptyf (s .t , RecordsDiff (table .ToArrowSchema (), readRecords , []arrow.Record {nullRecord }), "record differs" )
144144}
145+
146+ func (s * WriterTestSuite ) testDeleteRecordBasic (ctx context.Context ) {
147+ tableName := s .tableNameForTest ("delete_all_rows" )
148+ syncTime := time .Now ().UTC ().Truncate (s .genDatOptions .TimePrecision ).
149+ Truncate (time .Microsecond ) // https://github.com/golang/go/issues/41087
150+ table := & schema.Table {
151+ Name : tableName ,
152+ Columns : schema.ColumnList {
153+ schema.Column {Name : "id" , Type : arrow .PrimitiveTypes .Int64 , PrimaryKey : true , NotNull : true },
154+ schema .CqSourceNameColumn ,
155+ schema .CqSyncTimeColumn ,
156+ },
157+ }
158+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteMigrateTable {Table : table }), "failed to create table" )
159+ const sourceName = "source-test"
160+
161+ bldr := array .NewRecordBuilder (memory .DefaultAllocator , table .ToArrowSchema ())
162+ bldr .Field (0 ).(* array.Int64Builder ).Append (0 )
163+ bldr .Field (1 ).(* array.StringBuilder ).Append (sourceName )
164+ bldr .Field (2 ).(* array.TimestampBuilder ).AppendTime (syncTime )
165+ record1 := bldr .NewRecord ()
166+
167+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteInsert {Record : record1 }), "failed to insert record" )
168+ record1 = s .handleNulls (record1 ) // we process nulls after writing
169+
170+ records , err := s .plugin .readAll (ctx , table )
171+ require .NoErrorf (s .t , err , "failed to read" )
172+ require .EqualValuesf (s .t , 1 , TotalRows (records ), "unexpected amount of items" )
173+
174+ // create value for delete statement but nothing will be deleted because ID value isn't present
175+ bldrDeleteNoMatch := array .NewRecordBuilder (memory .DefaultAllocator , (& schema.Table {
176+ Name : tableName ,
177+ Columns : schema.ColumnList {
178+ schema.Column {Name : "id" , Type : arrow .PrimitiveTypes .Int64 },
179+ },
180+ }).ToArrowSchema ())
181+ bldrDeleteNoMatch .Field (0 ).(* array.Int64Builder ).Append (1 )
182+ deleteValue := bldrDeleteNoMatch .NewRecord ()
183+
184+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteDeleteRecord {
185+ DeleteRecord : message.DeleteRecord {
186+ TableName : table .Name ,
187+ WhereClause : message.PredicateGroups {
188+ {
189+ GroupingType : "AND" ,
190+ Predicates : []message.Predicate {
191+ {
192+ Operator : "eq" ,
193+ Column : "id" ,
194+ Record : deleteValue ,
195+ },
196+ },
197+ },
198+ },
199+ },
200+ }), "failed to delete record no match" )
201+
202+ records , err = s .plugin .readAll (ctx , table )
203+ require .NoErrorf (s .t , err , "failed to read after delete with no match" )
204+ require .EqualValuesf (s .t , 1 , TotalRows (records ), "unexpected amount of items after delete with no match" )
205+ require .Emptyf (s .t , RecordsDiff (table .ToArrowSchema (), records , []arrow.Record {record1 }), "record differs after delete with no match" )
206+
207+ // create value for delete statement will be delete One record
208+ bldrDeleteMatch := array .NewRecordBuilder (memory .DefaultAllocator , (& schema.Table {
209+ Name : tableName ,
210+ Columns : schema.ColumnList {
211+ schema.Column {Name : "id" , Type : arrow .PrimitiveTypes .Int64 },
212+ },
213+ }).ToArrowSchema ())
214+ bldrDeleteMatch .Field (0 ).(* array.Int64Builder ).Append (0 )
215+ deleteValue = bldrDeleteMatch .NewRecord ()
216+
217+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteDeleteRecord {
218+ DeleteRecord : message.DeleteRecord {
219+ TableName : table .Name ,
220+ WhereClause : message.PredicateGroups {
221+ {
222+ GroupingType : "AND" ,
223+ Predicates : []message.Predicate {
224+ {
225+ Operator : "eq" ,
226+ Column : "id" ,
227+ Record : deleteValue ,
228+ },
229+ },
230+ },
231+ },
232+ },
233+ }), "failed to delete record no match" )
234+
235+ records , err = s .plugin .readAll (ctx , table )
236+ require .NoErrorf (s .t , err , "failed to read after delete with match" )
237+ require .EqualValuesf (s .t , 0 , TotalRows (records ), "unexpected amount of items after delete with match" )
238+ }
239+
240+ func (s * WriterTestSuite ) testDeleteAllRecords (ctx context.Context ) {
241+ tableName := s .tableNameForTest ("delete_all_records" )
242+ syncTime := time .Now ().UTC ().Truncate (s .genDatOptions .TimePrecision ).
243+ Truncate (time .Microsecond ) // https://github.com/golang/go/issues/41087
244+ table := & schema.Table {
245+ Name : tableName ,
246+ Columns : schema.ColumnList {
247+ schema.Column {Name : "id" , Type : arrow .PrimitiveTypes .Int64 , PrimaryKey : true , NotNull : true },
248+ schema .CqSourceNameColumn ,
249+ schema .CqSyncTimeColumn ,
250+ },
251+ }
252+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteMigrateTable {Table : table }), "failed to create table" )
253+ const sourceName = "source-test"
254+
255+ bldr := array .NewRecordBuilder (memory .DefaultAllocator , table .ToArrowSchema ())
256+ bldr .Field (0 ).(* array.Int64Builder ).Append (0 )
257+ bldr .Field (1 ).(* array.StringBuilder ).Append (sourceName )
258+ bldr .Field (2 ).(* array.TimestampBuilder ).AppendTime (syncTime )
259+ record1 := bldr .NewRecord ()
260+
261+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteInsert {Record : record1 }), "failed to insert record" )
262+
263+ records , err := s .plugin .readAll (ctx , table )
264+ require .NoErrorf (s .t , err , "failed to read" )
265+ require .EqualValuesf (s .t , 1 , TotalRows (records ), "unexpected amount of items" )
266+
267+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteDeleteRecord {
268+ DeleteRecord : message.DeleteRecord {
269+ TableName : table .Name ,
270+ },
271+ }), "failed to delete records" )
272+
273+ records , err = s .plugin .readAll (ctx , table )
274+ require .NoErrorf (s .t , err , "failed to read after delete all records" )
275+ require .EqualValuesf (s .t , 0 , TotalRows (records ), "unexpected amount of items after delete stale" )
276+
277+ bldr .Field (0 ).(* array.Int64Builder ).Append (1 )
278+ bldr .Field (1 ).(* array.StringBuilder ).Append (sourceName )
279+ bldr .Field (2 ).(* array.TimestampBuilder ).AppendTime (syncTime .Add (time .Second ))
280+ record2 := bldr .NewRecord ()
281+
282+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteInsert {Record : record2 }), "failed to insert second record" )
283+
284+ require .NoErrorf (s .t , s .plugin .writeOne (ctx , & message.WriteDeleteRecord {
285+ DeleteRecord : message.DeleteRecord {
286+ TableName : table .Name ,
287+ },
288+ }), "failed to delete records second time" )
289+
290+ records , err = s .plugin .readAll (ctx , table )
291+ require .NoErrorf (s .t , err , "failed to read second time" )
292+ sortRecords (table , records , "id" )
293+ require .EqualValuesf (s .t , 0 , TotalRows (records ), "unexpected amount of items second time" )
294+ }
0 commit comments