use strict;
use warnings;
use Test::More tests => 9;
BEGIN {
use_ok('KinoSearch1::Store::RAMInvIndex');
use_ok('KinoSearch1::InvIndexer');
use_ok('KinoSearch1::Index::SegTermEnum');
use_ok('KinoSearch1::Index::CompoundFileReader');
use_ok('KinoSearch1::Index::FieldInfos');
}
my $invindex = KinoSearch1::Store::RAMInvIndex->new;
my $invindexer = KinoSearch1::InvIndexer->new(
invindex => $invindex,
create => 1,
);
$invindexer->spec_field( name => 'a' );
$invindexer->spec_field( name => 'b' );
$invindexer->spec_field( name => 'c' );
my @animals = qw( cat dog tick );
for my $animal (@animals) {
my $doc = $invindexer->new_doc;
$doc->set_value( $_ => $animal ) for qw( a b c );
$invindexer->add_doc($doc);
}
$invindexer->finish;
my $cfs_reader = KinoSearch1::Index::CompoundFileReader->new(
invindex => $invindex,
seg_name => '_1',
);
my $finfos = KinoSearch1::Index::FieldInfos->new;
$finfos->read_infos( $cfs_reader->open_instream('_1.fnm') );
my $enum = KinoSearch1::Index::SegTermEnum->new(
finfos => $finfos,
instream => $cfs_reader->open_instream('_1.tis'),
);
my @fields;
my @texts;
my ( $pointer, $position, $termstring, $tinfo );
while ( $enum->next ) {
my $ts = $enum->get_termstring;
my $term = KinoSearch1::Index::Term->new_from_string( $ts, $finfos );
push @fields, $term->get_field;
push @texts, $term->get_text;
if ( $term->get_text eq 'tick' and $term->get_field eq 'b' ) {
$pointer = $enum->_get_instream->tell;
$position = $enum->_get_position;
$termstring = $enum->get_termstring;
$tinfo = $enum->get_term_info;
}
}
is_deeply( \@fields, [qw( a a a b b b c c c )], "correct fields" );
my @correct_texts = (@animals) x 3;
is_deeply( \@texts, \@correct_texts, "correct terms" );
$enum->seek( $pointer, $position, $termstring, $tinfo );
$enum->next;
my $ts = $enum->get_termstring;
my $term = KinoSearch1::Index::Term->new_from_string( $ts, $finfos );
is( $term->get_text, 'cat', "enum seeks to correct term (ptr)" );
is( $term->get_field, 'c', "enum seeks to correct term (field)" );