@@ -461,6 +461,127 @@ func TestArray_DeleteFragments(t *testing.T) {
461461 require .Equal (t , int8 (10 ), bounds [1 ])
462462}
463463
464+ func TestDeleteFragments (t * testing.T ) {
465+ // Create an array with domain [1, 10].
466+ // Create fragments [1,2] [3,4] [5,6] [7,8] [9,10]
467+ // Delete the first 2 fragments and verify the non empty domain is [5, 10]
468+
469+ // create an array and write 5 fragments
470+ array , err := newTestArray (t )
471+ require .NoError (t , err )
472+
473+ testStarted := time .Now ()
474+ var fragmentCreatedAt []time.Time
475+
476+ context , err := NewContext (nil )
477+ require .NoError (t , err )
478+ require .NoError (t , array .Open (TILEDB_WRITE ))
479+ for i := 1 ; i <= 10 ; i += 2 {
480+ time .Sleep (100 * time .Millisecond ) // give fragments some time distance
481+
482+ query , err := NewQuery (context , array )
483+ require .NoError (t , err )
484+ require .NotNil (t , query )
485+
486+ err = query .AddRangeByName ("dim1" , int32 (i ), int32 (i + 1 ))
487+ require .NoError (t , err )
488+ _ , err = query .SetBuffer ("a1" , []int32 {int32 (i ), int32 (i + 1 )})
489+ _ , _ , err = query .SetBufferVar ("a2" , []uint64 {0 , 1 }, []byte ("aa" ))
490+ require .NoError (t , err )
491+
492+ err = query .Submit ()
493+ require .NoError (t , err )
494+
495+ status , err := query .Status ()
496+ require .NoError (t , err )
497+ assert .Equal (t , TILEDB_COMPLETED , status )
498+
499+ fragmentCreatedAt = append (fragmentCreatedAt , time .Now ())
500+ }
501+ err = array .Close ()
502+ require .NoError (t , err )
503+
504+ // delete the first two fragments
505+ uri , err := array .URI ()
506+ require .NoError (t , err )
507+ err = DeleteFragments (context , uri , uint64 (testStarted .UnixMilli ()), uint64 (fragmentCreatedAt [1 ].UnixMilli ()))
508+ require .NoError (t , err )
509+
510+ // verify deletion
511+ err = array .Open (TILEDB_READ )
512+ require .NoError (t , err )
513+ domain , _ , err := array .NonEmptyDomainFromName ("dim1" )
514+ require .NoError (t , err )
515+ bounds := domain .Bounds .([]int8 )
516+ require .Equal (t , int8 (5 ), bounds [0 ])
517+ require .Equal (t , int8 (10 ), bounds [1 ])
518+ }
519+
520+ func TestDeleteFragmentsList (t * testing.T ) {
521+ // Create an array with domain [1, 10].
522+ // Create fragments [1,2] [3,4] [5,6] [7,8] [9,10]
523+ // Delete the first 2 fragments and verify the others
524+
525+ // create an array and write 5 fragments
526+ array , err := newTestArray (t )
527+ require .NoError (t , err )
528+
529+ context , err := NewContext (nil )
530+ require .NoError (t , err )
531+ err = array .Open (TILEDB_WRITE )
532+ require .NoError (t , err )
533+ for i := 1 ; i <= 10 ; i += 2 {
534+ time .Sleep (100 * time .Millisecond )
535+
536+ query , err := NewQuery (context , array )
537+ require .NoError (t , err )
538+ require .NotNil (t , query )
539+
540+ err = query .AddRangeByName ("dim1" , int32 (i ), int32 (i + 1 ))
541+ require .NoError (t , err )
542+ _ , err = query .SetBuffer ("a1" , []int32 {int32 (i ), int32 (i + 1 )})
543+ _ , _ , err = query .SetBufferVar ("a2" , []uint64 {0 , 1 }, []byte ("aa" ))
544+ require .NoError (t , err )
545+
546+ err = query .Submit ()
547+ require .NoError (t , err )
548+
549+ status , err := query .Status ()
550+ require .NoError (t , err )
551+ assert .Equal (t , TILEDB_COMPLETED , status )
552+ }
553+ err = array .Close ()
554+ require .NoError (t , err )
555+
556+ uri , err := array .URI ()
557+ require .NoError (t , err )
558+
559+ getFragments := func () []string {
560+ var fragmentURIs []string
561+ fragmentInfo , err := NewFragmentInfo (context , uri )
562+ require .NoError (t , err )
563+ err = fragmentInfo .Load ()
564+ require .NoError (t , err )
565+ fragmentNum , err := fragmentInfo .GetFragmentNum ()
566+ require .NoError (t , err )
567+ for i := uint32 (0 ); i < fragmentNum ; i ++ {
568+ uri , err := fragmentInfo .GetFragmentURI (i )
569+ require .NoError (t , err )
570+ fragmentURIs = append (fragmentURIs , uri )
571+ }
572+ return fragmentURIs
573+ }
574+ fragmentURIsInitial := getFragments ()
575+
576+ // delete the first two fragments
577+ err = DeleteFragmentsList (context , uri , fragmentURIsInitial [0 :2 ])
578+ require .NoError (t , err )
579+
580+ // verify deletion
581+ fragmentURIsAfter := getFragments ()
582+ require .ElementsMatch (t , fragmentURIsInitial [2 :], fragmentURIsAfter )
583+ }
584+
464585func newTestArray (t * testing.T ) (* Array , error ) {
465586 // Create configuration
466587 config , err := NewConfig ()
0 commit comments