@@ -260,6 +260,50 @@ TEST_F(BruteForceTest, brute_force_reindexing_same_vector_different_id) {
260260 VecSimIndex_Free (index);
261261}
262262
263+ TEST_F (BruteForceTest, test_delete_swap_block) {
264+ size_t n = 6 ;
265+ size_t k = 5 ;
266+ size_t dim = 2 ;
267+
268+ // This test creates 2 vector blocks with size of 3
269+ // Insert 6 vectors with ascending ids; The vector blocks will look like
270+ // 0 [0, 1, 2]
271+ // 1 [3, 4, 5]
272+ // Delete the id 1 will delete it from the first vector block 0 [0 ,1, 2] and will move id 5
273+ // from block 1 [3, 4, 5] to vector block 0, so our vector blocks will look like 0 [0, 5, 2] 1
274+ // [3, 4]
275+ VecSimParams params{.algo = VecSimAlgo_BF,
276+ .bfParams = BFParams{.type = VecSimType_FLOAT32,
277+ .dim = dim,
278+ .metric = VecSimMetric_L2,
279+ .initialCapacity = 3 ,
280+ .blockSize = 3 }};
281+ VecSimIndex *index = VecSimIndex_New (¶ms);
282+
283+ for (size_t i = 0 ; i < n; i++) {
284+ float f[dim];
285+ for (size_t j = 0 ; j < dim; j++) {
286+ f[j] = (float )i; // i
287+ }
288+ VecSimIndex_AddVector (index, (const void *)f, i);
289+ }
290+ ASSERT_EQ (VecSimIndex_IndexSize (index), n);
291+
292+ // Here the shift should happen.
293+ VecSimIndex_DeleteVector (index, 1 );
294+
295+ float query[] = {0.0 , 0.0 };
296+ auto verify_res = [&](size_t id, float score, size_t index) {
297+ if (index == 0 ) {
298+ ASSERT_EQ (id, index);
299+ } else {
300+ ASSERT_EQ (id, index + 1 );
301+ }
302+ };
303+ runTopKSearchTest (index, query, k, verify_res);
304+ VecSimIndex_Free (index);
305+ }
306+
263307TEST_F (BruteForceTest, sanity_rinsert_1280) {
264308 size_t n = 5 ;
265309 size_t d = 1280 ;
0 commit comments