Hash* DefDelWriter_Metadata_IMP(DefaultDeletionsWriter *self) { DefaultDeletionsWriterIVARS *const ivars = DefDelWriter_IVARS(self); DefDelWriter_Metadata_t super_meta = (DefDelWriter_Metadata_t)SUPER_METHOD_PTR(DEFAULTDELETIONSWRITER, LUCY_DefDelWriter_Metadata); Hash *const metadata = super_meta(self); Hash *const files = Hash_new(0); for (uint32_t i = 0, max = VA_Get_Size(ivars->seg_readers); i < max; i++) { SegReader *seg_reader = (SegReader*)VA_Fetch(ivars->seg_readers, i); if (ivars->updated[i]) { BitVector *deldocs = (BitVector*)VA_Fetch(ivars->bit_vecs, i); Segment *segment = SegReader_Get_Segment(seg_reader); Hash *mini_meta = Hash_new(2); Hash_Store_Utf8(mini_meta, "count", 5, (Obj*)Str_newf("%u32", (uint32_t)BitVec_Count(deldocs))); Hash_Store_Utf8(mini_meta, "filename", 8, (Obj*)S_del_filename(self, seg_reader)); Hash_Store(files, (Obj*)Seg_Get_Name(segment), (Obj*)mini_meta); } } Hash_Store_Utf8(metadata, "files", 5, (Obj*)files); return metadata; }
int32_t DefDelWriter_Seg_Del_Count_IMP(DefaultDeletionsWriter *self, String *seg_name) { DefaultDeletionsWriterIVARS *const ivars = DefDelWriter_IVARS(self); Integer *tick = (Integer*)Hash_Fetch(ivars->name_to_tick, seg_name); BitVector *deldocs = tick ? (BitVector*)Vec_Fetch(ivars->bit_vecs, (size_t)Int_Get_Value(tick)) : NULL; return deldocs ? (int32_t)BitVec_Count(deldocs) : 0; }
int32_t DefDelWriter_seg_del_count(DefaultDeletionsWriter *self, const CharBuf *seg_name) { DefaultDeletionsWriterIVARS *const ivars = DefDelWriter_IVARS(self); Integer32 *tick = (Integer32*)Hash_Fetch(ivars->name_to_tick, (Obj*)seg_name); BitVector *deldocs = tick ? (BitVector*)VA_Fetch(ivars->bit_vecs, Int32_Get_Value(tick)) : NULL; return deldocs ? BitVec_Count(deldocs) : 0; }
static void test_Clone(TestBatch *batch) { int i; BitVector *self = BitVec_new(30); BitVector *twin; BitVec_Set(self, 2); BitVec_Set(self, 3); BitVec_Set(self, 10); BitVec_Set(self, 20); twin = BitVec_Clone(self); for (i = 0; i < 50; i++) { if (BitVec_Get(self, i) != BitVec_Get(twin, i)) { break; } } TEST_INT_EQ(batch, i, 50, "Clone"); TEST_INT_EQ(batch, BitVec_Count(twin), 4, "clone Count"); DECREF(self); DECREF(twin); }
static void test_Count(TestBatch *batch) { int i; int shuffled[64]; BitVector *bit_vec = BitVec_new(64); for (i = 0; i < 64; i++) { shuffled[i] = i; } for (i = 0; i < 64; i++) { int shuffle_pos = rand() % 64; int temp = shuffled[shuffle_pos]; shuffled[shuffle_pos] = shuffled[i]; shuffled[i] = temp; } for (i = 0; i < 64; i++) { BitVec_Set(bit_vec, shuffled[i]); if (BitVec_Count(bit_vec) != (uint32_t)(i + 1)) { break; } } TEST_INT_EQ(batch, i, 64, "Count() returns the right number of bits"); DECREF(bit_vec); }
static void test_Clone(TestBatchRunner *runner) { BitVector *self = BitVec_new(30); BitVector *twin; BitVec_Set(self, 2); BitVec_Set(self, 3); BitVec_Set(self, 10); BitVec_Set(self, 20); twin = BitVec_Clone(self); size_t i; for (i = 0; i < 50; i++) { if (BitVec_Get(self, i) != BitVec_Get(twin, i)) { break; } } TEST_UINT_EQ(runner, i, 50, "Clone"); TEST_UINT_EQ(runner, BitVec_Count(twin), 4, "clone Count"); DECREF(self); DECREF(twin); }
static void test_Count(TestBatchRunner *runner) { unsigned shuffled[64]; BitVector *bit_vec = BitVec_new(64); for (unsigned i = 0; i < 64; i++) { shuffled[i] = i; } for (unsigned i = 0; i < 64; i++) { unsigned shuffle_pos = (unsigned)rand() % 64; unsigned temp = shuffled[shuffle_pos]; shuffled[shuffle_pos] = shuffled[i]; shuffled[i] = temp; } unsigned i; for (i = 0; i < 64; i++) { BitVec_Set(bit_vec, shuffled[i]); if (BitVec_Count(bit_vec) != (uint32_t)(i + 1)) { break; } } TEST_UINT_EQ(runner, i, 64, "Count() returns the right number of bits"); DECREF(bit_vec); }
Hash* DefDelWriter_metadata(DefaultDeletionsWriter *self) { DefaultDeletionsWriterIVARS *const ivars = DefDelWriter_IVARS(self); Hash *const metadata = DataWriter_metadata((DataWriter*)self); Hash *const files = Hash_new(0); for (uint32_t i = 0, max = VA_Get_Size(ivars->seg_readers); i < max; i++) { SegReader *seg_reader = (SegReader*)VA_Fetch(ivars->seg_readers, i); if (ivars->updated[i]) { BitVector *deldocs = (BitVector*)VA_Fetch(ivars->bit_vecs, i); Segment *segment = SegReader_Get_Segment(seg_reader); Hash *mini_meta = Hash_new(2); Hash_Store_Str(mini_meta, "count", 5, (Obj*)CB_newf("%u32", (uint32_t)BitVec_Count(deldocs))); Hash_Store_Str(mini_meta, "filename", 8, (Obj*)S_del_filename(self, seg_reader)); Hash_Store(files, (Obj*)Seg_Get_Name(segment), (Obj*)mini_meta); } } Hash_Store_Str(metadata, "files", 5, (Obj*)files); return metadata; }