blob: c755ad76c9303d6a6ea253cef4cbb4187a5675f8 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
use lib 'buildlib';
use Test::More tests => 2004;
use Lucy::Test::TestUtils qw( create_index );
my $folder = create_index( qw( a b c ), 'c c d' );
my $polyreader = Lucy::Index::IndexReader->open( index => $folder );
my $reader = $polyreader->get_seg_readers->[0];
my $plist_reader = $reader->fetch("Lucy::Index::PostingListReader");
my $plist = $plist_reader->posting_list( field => 'content', term => 'c' );
my ( @docs, @prox, @docs_from_next );
while ( my $doc_id = $plist->next ) {
push @docs_from_next, $doc_id;
my $posting = $plist->get_posting;
push @docs, $posting->get_doc_id;
push @prox, $posting->get_prox;
}
is_deeply( \@docs, [ 3, 4 ], "correct docs after SegPList_Next" );
is_deeply( \@docs_from_next, [ 3, 4 ], "correct docs via SegPList_Next" );
is_deeply( \@prox, [ [0], [ 0, 1 ] ], "correct prox from SegPList_Next" );
$plist->seek('c');
$plist->next;
is( $plist->get_posting->get_doc_id, 3, "seek" );
$folder = Lucy::Store::RAMFolder->new;
my $indexer = Lucy::Index::Indexer->new(
index => $folder,
schema => Lucy::Test::TestSchema->new,
);
for ( 0 .. 100 ) {
my $content = 'a ';
$content .= 'b ' if ( $_ % 2 == 0 );
$content .= 'c ' if ( $_ % 3 == 0 );
$content .= 'd ' if ( $_ % 4 == 0 );
$content .= 'e ' if ( $_ % 5 == 0 );
$indexer->add_doc( { content => $content } );
}
$indexer->commit;
$polyreader = Lucy::Index::IndexReader->open( index => $folder );
$reader = $polyreader->get_seg_readers->[0];
$plist_reader = $reader->fetch("Lucy::Index::PostingListReader");
for my $letter (qw( a b c d e )) {
my $skipping_plist = $plist_reader->posting_list(
field => 'content',
term => $letter,
);
my $plodding_plist = $plist_reader->posting_list(
field => 'content',
term => $letter,
);
# Compare results of advance() to results of next().
for my $target ( 1 .. 100 ) {
$skipping_plist->seek($letter);
$plodding_plist->seek($letter);
my $skipping_doc_id = $skipping_plist->advance($target);
my $plodding_doc_id;
do {
$plodding_doc_id = $plodding_plist->next
or die "shouldn't happen: $target";
} while ( $plodding_plist->get_doc_id < $target );
# Verify that the plists have identical state.
is( $skipping_doc_id, $plodding_doc_id,
"$letter: doc_ids via advance, next are identical" );
is( $skipping_plist->get_doc_id, $plodding_plist->get_doc_id,
"$letter: skip to $target" );
is( $skipping_plist->get_post_stream->tell,
$plodding_plist->get_post_stream->tell,
"$letter: identical filepos for $target"
);
is( $skipping_plist->get_count, $plodding_plist->get_count,
"$letter: identical count for $target" );
}
}