use strict; use warnings; use lib 'buildlib'; use Test::More tests => 12; BEGIN { use_ok('KinoSearch1::Index::DelDocs') } use KinoSearch1::Test::TestUtils qw( create_index ); my $invindex = create_index( 'a' .. 'e' ); my $deldocs = KinoSearch1::Index::DelDocs->new(); $deldocs->read_deldocs( $invindex, "_1.del" ); $deldocs->set(3); $deldocs->set(3); my @deleted_or_not = map { $deldocs->get($_) } 0 .. 4; is_deeply( \@deleted_or_not, [ '', '', '', 1, '' ], "set works" ); is( $deldocs->get_num_deletions, 1, "set increments num_deletions, once" ); my $doc_map = $deldocs->generate_doc_map( 5, 0 ); my $correct_doc_map = pack( 'i*', 0, 1, 2, -1, 3 ); is( $$doc_map, $correct_doc_map, "doc map maps around deleted docs" ); $doc_map = $deldocs->generate_doc_map( 5, 100 ); is( $doc_map->get(4), 103, "doc map handles offset correctly" ); is( $doc_map->get(3), undef, "doc_map handled deletions correctly" ); is( $doc_map->get(6), undef, "doc_map returns undef for out of range" ); $deldocs->clear(3); $deldocs->clear(3); $deldocs->clear(3); is( $deldocs->get_num_deletions, 0, "clear decrements num_deletions, once" ); $deldocs->set(2); $deldocs->set(1); $deldocs->write_deldocs( $invindex, "_1.del", 8 ); $deldocs = KinoSearch1::Index::DelDocs->new(); $deldocs->read_deldocs( $invindex, "_1.del" ); @deleted_or_not = map { $deldocs->get($_) } 0 .. 7; is_deeply( \@deleted_or_not, [ '', 1, 1, '', '', '', '', '' ], "write_deldocs and read_deldocs save/recover deletions correctly" ); is( $deldocs->get_num_deletions, 2, "write_deldocs and read_deldocs save/recover num_deletions correctly" ); is( $deldocs->get_capacity, 8, "write_deldocs wrote correct number of bytes" ); $deldocs->write_deldocs( $invindex, "_1.del", 8 ); ok( $invindex->file_exists("_1.del"), "overwrite existing deletions file" );