2900bd14dc
Since the most expressive query language supported by Zebra is PQF, this patch adds a PQF driver for QueryParser which will translate QueryParser queries into standard PQF (guided by mappings which have been written to match Koha's existing Zebra configuration) which can then be sent to Zebra. This driver, Koha::QueryParser::Driver::PQF(::*) extends the OpenILS::QueryParser(::*) class(es), so as to preserve maximum interoperability between the various users of the QueryParser driver. Initially, search syntax is as follows: * AND operator: && * OR operator: || * GROUPING operators: ( ) Fields can mostly be searched using the ccl prefixes they have now. The exception is the various date limits which are searched with a syntax like this: pubdate(2008) For sorting, you can simply add #title-sort-az (etc.) to your query. Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz> Signed-off-by: Elliott Davis <elliott@bywatersolions.com> Test Passed successfully after installing missing dep for Test::Deep Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de> Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
95 lines
4.5 KiB
Perl
95 lines
4.5 KiB
Perl
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Test::More;
|
|
use Test::Deep;
|
|
use Module::Load::Conditional qw(can_load);
|
|
|
|
BEGIN {
|
|
use_ok( 'Koha::QueryParser::Driver::PQF' );
|
|
}
|
|
|
|
my $QParser = Koha::QueryParser::Driver::PQF->new();
|
|
|
|
ok(defined $QParser, 'Successfully created empty QP object');
|
|
ok($QParser->load_config('./etc/searchengine/queryparser.yaml'), 'Loaded QP config');
|
|
|
|
is($QParser->search_class_count, 4, 'Initialized 4 search classes');
|
|
is (scalar(@{$QParser->search_fields()->{'keyword'}}), 107, "Correct number of search fields for 'keyword' class");
|
|
|
|
is($QParser->target_syntax('biblioserver', 'smith'), '@or @or @attr 1=1016 @attr 4=6 "smith" @attr 9=20 @attr 2=102 @attr 4=6 "smith" @attr 9=34 @attr 2=102 @attr 4=6 "smith"', 'super simple keyword query');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith'), '@attr 1=1003 @attr 4=6 "smith"', 'simple author query');
|
|
is($QParser->target_syntax('biblioserver', 'keyword|publisher:smith'), '@attr 1=1018 @attr 4=6 "smith"', 'fielded publisher query');
|
|
is($QParser->target_syntax('biblioserver', 'ti:"little engine that could"'), '@attr 1=4 @attr 4=1 "little engine that could"', 'phrase query');
|
|
is($QParser->target_syntax('biblioserver', 'keyword|titlekw:smith'), '@attr 1=4 @attr 9=20 @attr 2=102 @attr 4=6 "smith"', 'relevance-bumped query');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith && johnson'), '@and @attr 1=1003 @attr 4=6 "smith" @attr 1=1003 @attr 4=6 "johnson"', 'query with boolean &&');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(-2008)'), '@and @attr 1=1003 @attr 4=6 "smith" @attr 4=4 @attr 1=pubdate @attr 2=2 "2008"', 'keyword search with pubdate limited to -2008');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(2008-)'), '@and @attr 1=1003 @attr 4=6 "smith" @attr 4=4 @attr 1=pubdate @attr 2=4 "2008"', 'keyword search with pubdate limited to 2008-');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(2008)'), '@and @attr 1=1003 @attr 4=6 "smith" @attr 4=4 @attr 1=pubdate "2008"', 'keyword search with pubdate limited to 2008');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith pubdate(1980,2008)'), '@and @attr 1=1003 @attr 4=6 "smith" @or @attr 4=4 @attr 1=pubdate "1980" @attr 4=4 @attr 1=pubdate "2008"', 'keyword search with pubdate limited to 1980, 2008');
|
|
is($QParser->target_syntax('biblioserver', 'au:smith #acqdate_dsc'), '@or @attr 1=32 @attr 7=1 0 @attr 1=1003 @attr 4=6 "smith"', 'keyword search sorted by acqdate descending');
|
|
is($QParser->bib1_mapping_by_attr('field', 'biblioserver', {'1' => '1004'})->{'field'}, 'personal', 'retrieve field by attr');
|
|
is($QParser->bib1_mapping_by_attr_string('field', 'biblioserver', '@attr 1=1004')->{'field'}, 'personal', 'retrieve field by attrstring');
|
|
|
|
is ($QParser->clear_all_mappings, $QParser, 'clear all mappings returns self');
|
|
is ($QParser->clear_all_configuration, $QParser, 'clear all configuration returns self');
|
|
is (scalar(keys(%{$QParser->search_fields})), 0, "All mapping erased");
|
|
|
|
$QParser->add_bib1_field_map('author' => 'personal' => 'biblioserver' => { '1' => '1004' } );
|
|
$QParser->add_bib1_modifier_map('relevance' => 'biblioserver' => { '2' => '102' } );
|
|
my $desired_config = {
|
|
'field_mappings' => {
|
|
'author' => {
|
|
'personal' => {
|
|
'aliases' => [
|
|
'personal'
|
|
],
|
|
'bib1_mapping' => {
|
|
'biblioserver' => {
|
|
'1' => '1004'
|
|
}
|
|
},
|
|
'enabled' => '1',
|
|
'index' => 'personal',
|
|
'label' => 'Personal'
|
|
}
|
|
}
|
|
},
|
|
'filter_mappings' => {},
|
|
'modifier_mappings' => {
|
|
'relevance' => {
|
|
'bib1_mapping' => {
|
|
'biblioserver' => {
|
|
'2' => '102'
|
|
}
|
|
},
|
|
'enabled' => 1,
|
|
'label' => 'Relevance'
|
|
}
|
|
},
|
|
'relevance_bumps' => {}
|
|
};
|
|
|
|
SKIP: {
|
|
my $got_config;
|
|
skip 'YAML is unavailable', 2 unless can_load('modules' => { 'YAML::Any' => undef });
|
|
$got_config = YAML::Any::Load($QParser->serialize_mappings());
|
|
ok(ref $got_config, 'serialized YAML valid');
|
|
is_deeply($got_config, $desired_config, 'Mappings serialized correctly to YAML');
|
|
|
|
skip 'JSON is unavailable', 2 unless can_load('modules' => { 'JSON' => undef });
|
|
undef $got_config;
|
|
eval {
|
|
$got_config = JSON::from_json($QParser->serialize_mappings('json'));
|
|
};
|
|
is($@, '', 'serialized JSON valid');
|
|
is_deeply($got_config, $desired_config, 'Mappings serialized correctly to JSON');
|
|
}
|
|
|
|
$QParser->clear_all_mappings;
|
|
is($QParser->TEST_SETUP, $QParser, 'TEST_SETUP returns self');
|
|
is($QParser->search_class_count, 4, 'Initialized 4 search classes in test setup');
|
|
|
|
done_testing();
|