From 496b6c8ef447aa16442d7cf82a014847cd0ee77f Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Wed, 14 May 2008 17:09:43 -0500 Subject: [PATCH] bugfix - fix 'not' operator in NoZebra Corrected bug that prevented the 'not' operator from working consistently - i.e., a search of 'mice not men' would not always work. Also added test cases for NoZebra, so far focusing on NZanalyse and adding and deleting bibs. A couple of the test cases are currently known to fail and therefore are marked TODO. The tests in question are to verify that rows in nozebra are removed if no bib is linked to the relevant word. However, it looks like such rows are retained, just with nozebra.biblionubmers set to ''. Is there any reason to keep these rows? Signed-off-by: Joshua Ferraro --- C4/Search.pm | 2 +- t/lib/KohaTest/Search/NoZebra.pm | 233 +++++++++++++++++++++++++++++++ 2 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 t/lib/KohaTest/Search/NoZebra.pm diff --git a/C4/Search.pm b/C4/Search.pm index d8a7c613f9..b9ed475e27 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -1783,7 +1783,7 @@ sub NZoperatorOR{ } sub NZoperatorNOT{ - my ($rightresult, $leftresult)=@_; + my ($leftresult, $rightresult)=@_; my @leftresult = split /;/, $leftresult; diff --git a/t/lib/KohaTest/Search/NoZebra.pm b/t/lib/KohaTest/Search/NoZebra.pm new file mode 100644 index 0000000000..3b1aee13cf --- /dev/null +++ b/t/lib/KohaTest/Search/NoZebra.pm @@ -0,0 +1,233 @@ +package KohaTest::Search::NoZebra; +use base qw( KohaTest::Search ); + +use strict; +use warnings; + +use Test::More; + +use MARC::Record; + +use C4::Search; +use C4::Biblio; +use C4::Context; + +=head2 STARTUP METHODS + +These get run once, before the main test methods in this module + +=cut + +=head3 startup_50_init_nozebra + +Turn on NoZebra mode, for now, assumes and requires +that the test database has started out using Zebra. + +=cut + +sub startup_50_init_nozebra : Test( startup => 3 ) { + my $using_nozebra = C4::Context->preference('NoZebra'); + ok(!$using_nozebra, "starting out using Zebra"); + my $dbh = C4::Context->dbh; + $dbh->do("UPDATE systempreferences SET value=1 WHERE variable='NoZebra'"); + $dbh->do("UPDATE systempreferences SET value=0 WHERE variable in ('QueryFuzzy','QueryWeightFields','QueryStemming')"); + $using_nozebra = C4::Context->preference('NoZebra'); + ok($using_nozebra, "switched to NoZebra"); + + my $sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra"); + $sth->execute; + my ($count) = $sth->fetchrow_array; + $sth->finish; + cmp_ok($count, '==', 0, "NoZebra index starts off empty"); +} + +sub startup_51_add_bibs : Test( startup => 2 ) { + my $self = shift; + + my $bib1 = MARC::Record->new(); + $bib1->leader(' nam a22 7a 4500'); + $bib1->append_fields( + MARC::Field->new('010', ' ', ' ', a => 'lccn001'), + MARC::Field->new('020', ' ', ' ', a => 'isbn001'), + MARC::Field->new('022', ' ', ' ', a => 'issn001'), + MARC::Field->new('100', ' ', ' ', a => 'Cat, Felix T.'), + MARC::Field->new('245', ' ', ' ', a => 'Of mice and men :', b=> 'a history'), + ); + my $bib2 = MARC::Record->new(); + $bib2->leader(' nam a22 7a 4500'); + $bib2->append_fields( + MARC::Field->new('010', ' ', ' ', a => 'lccn002'), + MARC::Field->new('020', ' ', ' ', a => 'isbn002'), + MARC::Field->new('022', ' ', ' ', a => 'issn002'), + MARC::Field->new('100', ' ', ' ', a => 'Dog, Rover T.'), + MARC::Field->new('245', ' ', ' ', a => 'Of mice and men :', b=> 'a digression'), + ); + + my $dbh = C4::Context->dbh; + my $count_sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra"); + my $count; + my ($bib1_bibnum, $bib1_bibitemnum) = AddBiblio($bib1, ''); + $count_sth->execute; + ($count) = $count_sth->fetchrow_array; + cmp_ok($count, '==', 14, "correct number of new words indexed"); # tokens + biblionumber + __RAW__ + + my ($bib2_bibnum, $bib2_bibitemnum) = AddBiblio($bib2, ''); + $count_sth->execute; + ($count) = $count_sth->fetchrow_array; + cmp_ok($count, '==', 22, "correct number of new words indexed"); # tokens + biblionumber + __RAW__ + + push @{ $self->{nozebra_test_bibs} }, $bib1_bibnum, $bib2_bibnum; +} + +=head2 TEST METHODS + +Standard test methods + +=cut + +sub basic_searches_via_nzanalyze : Test( 28 ) { + my $self = shift; + my ($bib1_bibnum, $bib2_bibnum) = @{ $self->{nozebra_test_bibs} }; + + my $results = C4::Search::NZanalyse('foobar'); + ok(!defined($results), "no hits on 'foobar'"); + + $results = C4::Search::NZanalyse('dog'); + my ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 1, "one hit on 'dog'"); + is($bib2_bibnum, $bibnumbers[0], "correct hit on 'dog'"); + + $results = C4::Search::NZanalyse('au=dog'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 1, "one hit on 'au=dog'"); + is($bib2_bibnum, $bibnumbers[0], "correct hit on 'au=dog'"); + + $results = C4::Search::NZanalyse('isbn=dog'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 0, "zero hits on 'isbn=dog'"); + + $results = C4::Search::NZanalyse('cat'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 1, "one hit on 'cat'"); + is($bib1_bibnum, $bibnumbers[0], "correct hit on 'cat'"); + + $results = C4::Search::NZanalyse('cat and dog'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 0, "zero hits on 'cat and dog'"); + + $results = C4::Search::NZanalyse('cat or dog'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 2, "two hits on 'cat or dog'"); + is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'cat or dog'"); + + $results = C4::Search::NZanalyse('mice and men'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 2, "two hits on 'mice and men'"); + is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'mice and men'"); + + $results = C4::Search::NZanalyse('title=digression or issn=issn001'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 2, "two hits on 'title=digression or issn=issn001'"); + is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'title=digression or issn=issn001'"); + + $results = C4::Search::NZanalyse('title=digression and issn=issn002'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 1, "two hits on 'title=digression and issn=issn002'"); + is($bib2_bibnum, $bibnumbers[0], "correct hit on 'title=digression and issn=issn002'"); + + $results = C4::Search::NZanalyse('mice not men'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 0, "zero hits on 'mice not men'"); + + $results = C4::Search::NZanalyse('mice not dog'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 1, "one hit on 'mice not dog'"); + is($bib1_bibnum, $bibnumbers[0], "correct hit on 'mice not dog'"); + + $results = C4::Search::NZanalyse('isbn > a'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 2, "two hits on 'isbn > a'"); + is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'isbn > a'"); + + $results = C4::Search::NZanalyse('isbn < z'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 2, "two hits on 'isbn < z'"); + is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'isbn < z'"); + + $results = C4::Search::NZanalyse('isbn > isbn001'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 1, "one hit on 'isbn > isbn001'"); + is($bib2_bibnum, $bibnumbers[0], "correct hit on 'isbn > isbn001'"); + + $results = C4::Search::NZanalyse('isbn>=isbn001'); + ($hits, @bibnumbers) = parse_nzanalyse($results); + cmp_ok($hits, '==', 2, "two hits on 'isbn>=isbn001'"); + is_deeply([ sort @bibnumbers ], [ sort($bib1_bibnum, $bib2_bibnum) ], "correct hits on 'isbn>=isbn001'"); +} + +sub parse_nzanalyse { + my $results = shift; + my @bibnumbers = (); + if (defined $results) { + # NZanalyze currently has a funky way of returning results - + # it does not guarantee that a biblionumber occurs only + # once in the results string. Hence we must remove + # duplicates, like NZorder (inefficently) does + my %hash; + @bibnumbers = grep { ++$hash{$_} == 1 } map { my @f = split /,/, $_; $f[0]; } split /;/, $results; + } + return scalar(@bibnumbers), @bibnumbers; +} + +=head2 SHUTDOWN METHODS + +These get run once, after all of the main tests methods in this module + +=cut + +sub shutdown_49_remove_bibs : Test( shutdown => 4 ) { + my $self = shift; + my ($bib1_bibnum, $bib2_bibnum) = @{ $self->{nozebra_test_bibs} }; + + my $dbh = C4::Context->dbh; + my $count_sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra"); + my $count; + + my $error = DelBiblio($bib2_bibnum); + ok(!defined($error), "deleted bib $bib2_bibnum"); + $count_sth->execute; + ($count) = $count_sth->fetchrow_array; + TODO: { local $TODO = 'nothing actually gets deleted from nozebra currently'; + cmp_ok($count, '==', 14, "correct number of words indexed after bib $bib2_bibnum deleted"); + } + + $error = DelBiblio($bib1_bibnum); + ok(!defined($error), "deleted bib $bib1_bibnum"); + $count_sth->execute; + ($count) = $count_sth->fetchrow_array; + TODO: { local $TODO = 'nothing actually gets deleted from nozebra currently'; + cmp_ok($count, '==', 0, "no entries left in nozebra after bib $bib1_bibnum deleted"); + } + + delete $self->{nozebra_test_bibs}; +} + +sub shutdown_50_init_nozebra : Test( shutdown => 3 ) { + my $using_nozebra = C4::Context->preference('NoZebra'); + ok($using_nozebra, "still in NoZebra mode"); + my $dbh = C4::Context->dbh; + $dbh->do("UPDATE systempreferences SET value=0 WHERE variable='NoZebra'"); + $dbh->do("UPDATE systempreferences SET value=1 WHERE variable in ('QueryFuzzy','QueryWeightFields','QueryStemming')"); + $using_nozebra = C4::Context->preference('NoZebra'); + ok(!$using_nozebra, "switched to Zebra"); + + # FIXME + $dbh->do("DELETE FROM nozebra"); + my $sth = $dbh->prepare("SELECT COUNT(*) FROM nozebra"); + $sth->execute; + my ($count) = $sth->fetchrow_array; + $sth->finish; + cmp_ok($count, '==', 0, "NoZebra index finishes up empty"); +} + +1; -- 2.39.5