The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

# QDBM_File::InvertedIndex test script

use strict;
use Test::More tests => 36;
use Fcntl;
use File::Path;
use File::Spec;

BEGIN {
    use_ok('QDBM_File');
}

my $class = 'QDBM_File::InvertedIndex';
my $tempdir = "t/db_inverted_index_temp";
mkpath($tempdir);
my $tempfile = File::Spec->catfile($tempdir, "db_inverted_index_test");

END {
    rmtree($tempdir);
}

my $db = $class->new($tempfile, O_RDWR|O_CREAT);
isa_ok($db, $class);

my $uri = "http://invertedtest.tmp/test.txt";

my $doc = $class->create_document($uri);
isa_ok($doc, "QDBM_File::InvertedIndex::Document");

$doc->set_attribute("test_attr", "testing");
is( $doc->get_attribute("test_attr"), "testing" );

my @words = $class->analyze_text("There is more than one way to do it.");

for my $word (@words) {
    my $normal = $class->normalize_word($word);
    $doc->add_word($normal, $word);
}

ok( $db->store_document($doc) );
ok( $db->exists_document_by_uri($uri) );

my $doc2 = $db->get_document_by_uri($uri);
isa_ok($doc2, "QDBM_File::InvertedIndex::Document");

my $doc2_id = $doc2->get_id();

ok($doc2_id);
ok( $db->exists_document_by_id($doc2_id) );
is( $doc2->get_attribute("test_attr"), "testing" );

my $doc2_id2 = $db->get_document_id($uri);
ok($doc2_id2);
is($doc2_id2, $doc2_id);

my @nwords = $doc2->get_normalized_words();
is( scalar(@nwords), 9 );
my @awords = $doc2->get_appearance_words();
is( scalar(@awords), 9 );

my @doc_id = $db->search_document("way", 1);
is( scalar(@doc_id), 1 );
is( $doc_id[0], $doc2_id );

my @doc_id2 = $db->search_document("foo", 1);
is( scalar(@doc_id2), 0 );

is( $db->search_document_count("more"), 1 );

ok( $db->init_iterator() );
my $doc3 = $db->get_next_document();
isa_ok($doc3, "QDBM_File::InvertedIndex::Document");
is( $doc3->get_id(), $doc->get_id() );

my @doc_id3 = $db->query("There | more");
is( scalar(@doc_id3), 1 );
is( $doc_id3[0], $doc->get_id() );

my @doc_id4 = $db->query("There & foo");
is( scalar(@doc_id4), 0 );

ok( $db->sync() );
ok( $db->optimize() );
ok( $db->get_name =~ /db_inverted_index_test/ );
ok( 0 < $db->get_size() );
ok( 0 < $db->count_documents() );
ok( 0 < $db->count_words() );
ok( $db->is_writable() );
ok( !$db->is_fatal_error() );
ok( $db->get_mtime() );

my $uri2 = "http://invertedtest.tmp/test2.txt";
my $doc4 = $class->create_document($uri2);

my @words2 = $class->analyze_text("This is a pen.");

for my $word (@words2) {
    my $normal = $class->normalize_word($word);
    $doc4->add_word($normal, $word);
}

$db->store_document($doc4);
my $doc5 = $db->get_document_by_uri($uri2);
ok($doc5);

my %scores = $db->get_scores($doc5, 4);

is( scalar( keys %scores ), 4 );
is( scalar( values %scores ), 4 );

undef $db;