| # 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 => 9; |
| use Storable qw( freeze thaw ); |
| use Lucy::Test; |
| use Lucy::Test::TestUtils qw( create_index ); |
| |
| my $best_match = 'x a b c d a b c d'; |
| |
| my @docs = ( |
| 1 .. 20, |
| 'a b c a b c a b c d', |
| 'a b c d x x a', |
| 'a c b d', 'a x x x b x x x c x x x x x x d x', |
| $best_match, 'a' .. 'z', |
| ); |
| |
| my $folder = create_index(@docs); |
| my $searcher = Lucy::Search::IndexSearcher->new( index => $folder ); |
| |
| my $phrase_query = Lucy::Search::PhraseQuery->new( |
| field => 'content', |
| terms => [], |
| ); |
| is( $phrase_query->to_string, 'content:""', "empty PhraseQuery to_string" ); |
| $phrase_query = Lucy::Search::PhraseQuery->new( |
| field => 'content', |
| terms => [qw( a b c d )], |
| ); |
| is( $phrase_query->to_string, 'content:"a b c d"', "to_string" ); |
| |
| my $hits = $searcher->hits( query => $phrase_query ); |
| is( $hits->total_hits, 3, "correct number of hits" ); |
| my $first_hit = $hits->next; |
| is( $first_hit->{content}, $best_match, 'best match appears first' ); |
| |
| my $second_hit = $hits->next; |
| ok( $first_hit->get_score > $second_hit->get_score, |
| "best match scores higher: " |
| . $first_hit->get_score . " > " |
| . $second_hit->get_score |
| ); |
| |
| $phrase_query = Lucy::Search::PhraseQuery->new( |
| field => 'content', |
| terms => [qw( c a )], |
| ); |
| $hits = $searcher->hits( query => $phrase_query ); |
| is( $hits->total_hits, 1, 'avoid underflow when subtracting offset' ); |
| |
| # "a b c" |
| $phrase_query = Lucy::Search::PhraseQuery->new( |
| field => 'content', |
| terms => [qw( a b c )], |
| ); |
| $hits = $searcher->hits( query => $phrase_query ); |
| is( $hits->total_hits, 3, 'offset starting from zero' ); |
| |
| my $frozen = freeze($phrase_query); |
| my $thawed = thaw($frozen); |
| $hits = $searcher->hits( query => $thawed ); |
| is( $hits->total_hits, 3, 'freeze/thaw' ); |
| |
| my $phrase_compiler = $phrase_query->make_compiler( searcher => $searcher ); |
| $frozen = freeze($phrase_compiler); |
| $thawed = thaw($frozen); |
| ok( $phrase_compiler->equals($thawed), "freeze/thaw compiler" ); |