forked from Koha-Community/Koha
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQueryParser.t
136 lines (108 loc) · 4.96 KB
/
QueryParser.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/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'}}), 111, "Correct number of search fields for 'keyword' class");
# Set keyword search as the default
$QParser->default_search_class('keyword');
my $kwd_search = q/@attr 1=1016 @attr 4=6/;
my $weight1 = q/@attr 2=102 @attr 9=20 @attr 4=6/;
my $weight2 = q/@attr 2=102 @attr 9=34 @attr 4=6/;
like( $QParser->target_syntax('biblioserver', 'smith'),
qr/\@or \@or $kwd_search "smith" ($weight1 "smith" $weight2 "smith"|$weight2 "smith" $weight1 "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 2=102 @attr 9=20 @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 && ti:johnson'),
'@and @attr 1=1003 @attr 4=6 "smith" @attr 1=4 @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 1=31 @attr 4=4 @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 1=31 @attr 4=4 @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 1=31 @attr 4=4 "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 1=31 @attr 4=4 "1980" @attr 1=31 @attr 4=4 "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' => [ ],
'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();