blob: faeda7340febcc445e3706503ccda131eb76bdea [file] [log] [blame]
Akron4763ea62016-11-02 19:36:18 +01001use Test::More;
2use strict;
3use warnings;
4use Data::Dumper;
5
6use_ok('Krawfish::Koral');
Akron8231ca72017-06-16 16:08:32 +02007# use_ok('Krawfish::Index');
Akron4763ea62016-11-02 19:36:18 +01008
Akron8231ca72017-06-16 16:08:32 +02009# my $index = Krawfish::Index->new;
Akron4763ea62016-11-02 19:36:18 +010010
Akron8231ca72017-06-16 16:08:32 +020011# ok(defined $index->add('t/data/doc1.jsonld'), 'Add new document');
Akron4763ea62016-11-02 19:36:18 +010012
13my $koral = Krawfish::Koral->new;
14
15my $builder = $koral->query_builder;
16
Akron8231ca72017-06-16 16:08:32 +020017
18# [Der]
Akron4763ea62016-11-02 19:36:18 +010019my $query = $builder->token('Der');
Akron704ec062017-07-24 15:46:21 +020020is($query->min_span, 1, 'Span length');
21is($query->max_span, 1, 'Span length');
Akron4763ea62016-11-02 19:36:18 +010022ok(!$query->is_any, 'Isn\'t any');
23ok(!$query->is_optional, 'Isn\'t optional');
24ok(!$query->is_null, 'Isn\'t null');
25ok(!$query->is_negative, 'Isn\'t negative');
26ok(!$query->is_extended, 'Isn\'t extended');
27is($query->to_string, '[Der]', 'Stringification');
Akron8231ca72017-06-16 16:08:32 +020028ok($query = $query->normalize, 'Normalization');
29is($query->to_string, 'Der', 'Stringification');
Akron06eb4d32016-11-11 14:05:52 +010030
Akron4763ea62016-11-02 19:36:18 +010031
Akron8231ca72017-06-16 16:08:32 +020032# []
Akron4763ea62016-11-02 19:36:18 +010033$query = $builder->token;
Akron704ec062017-07-24 15:46:21 +020034is($query->min_span, 1, 'Span length');
35is($query->max_span, 1, 'Span length');
Akron4763ea62016-11-02 19:36:18 +010036ok($query->is_any, 'Is any');
37ok(!$query->is_optional, 'Isn\'t optional');
38ok(!$query->is_null, 'Isn\'t null');
39ok(!$query->is_negative, 'Isn\'t negative');
40ok(!$query->is_extended, 'Isn\'t extended');
41is($query->to_string, '[]', 'Stringification');
Akron8231ca72017-06-16 16:08:32 +020042ok($query = $query->normalize, 'Normalization');
43is($query->to_string, '[]', 'Stringification');
Akron4763ea62016-11-02 19:36:18 +010044
Akronce10cb42017-06-14 01:12:40 +020045
Akron8231ca72017-06-16 16:08:32 +020046# a|!a -> 1
47$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +020048 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +020049 $builder->term('a'),
50 $builder->term_neg('a')
51 )
52);
Akron704ec062017-07-24 15:46:21 +020053is($query->min_span, 1, 'Span length');
54is($query->max_span, 1, 'Span length');
Akron8231ca72017-06-16 16:08:32 +020055is($query->to_string, '[!a|a]', 'Stringification');
56ok($query = $query->normalize, 'Normalization');
57is($query->to_string, '[]', 'Stringification');
58
59
60# a&!a -> 0
Akronc048b182017-06-13 01:29:03 +020061$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +020062 $builder->bool_and(
Akronc048b182017-06-13 01:29:03 +020063 $builder->term('a'),
64 $builder->term_neg('a')
65 )
66);
Akron704ec062017-07-24 15:46:21 +020067is($query->min_span, 1, 'Span length');
68is($query->max_span, 1, 'Span length');
Akron8231ca72017-06-16 16:08:32 +020069is($query->to_string, '[!a&a]', 'Stringification');
Akronc048b182017-06-13 01:29:03 +020070ok($query = $query->normalize, 'Normalization');
71is($query->to_string, '[0]', 'Stringification');
72
73
Akron8231ca72017-06-16 16:08:32 +020074# a|!a -> 1
Akronc048b182017-06-13 01:29:03 +020075$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +020076 $builder->bool_and(
77 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +020078 $builder->term('a'),
79 $builder->term_neg('a')
80 ),
81 $builder->term('c')
Akronce10cb42017-06-14 01:12:40 +020082 )
83);
Akron704ec062017-07-24 15:46:21 +020084is($query->min_span, 1, 'Span length');
85is($query->max_span, 1, 'Span length');
Akron8231ca72017-06-16 16:08:32 +020086is($query->to_string, '[(!a|a)&c]', 'Stringification');
Akronce10cb42017-06-14 01:12:40 +020087ok($query = $query->normalize, 'Normalization');
Akron8231ca72017-06-16 16:08:32 +020088is($query->to_string, 'c', 'Stringification');
Akronce10cb42017-06-14 01:12:40 +020089
90
Akron8231ca72017-06-16 16:08:32 +020091# a&!a -> 0
Akron704ec062017-07-24 15:46:21 +020092is($query->min_span, 1, 'Span length');
93is($query->max_span, 1, 'Span length');
Akronce10cb42017-06-14 01:12:40 +020094$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +020095 $builder->bool_or(
96 $builder->bool_and(
Akronc048b182017-06-13 01:29:03 +020097 $builder->term('a'),
98 $builder->term_neg('a')
99 ),
Akronc048b182017-06-13 01:29:03 +0200100 $builder->term('c')
101 )
102);
Akron8231ca72017-06-16 16:08:32 +0200103
104is($query->to_string, '[(!a&a)|c]', 'Stringification');
105ok($query = $query->normalize, 'Normalization');
106is($query->to_string, 'c', 'Stringification');
Akronc048b182017-06-13 01:29:03 +0200107
Akron4763ea62016-11-02 19:36:18 +0100108
Akron8231ca72017-06-16 16:08:32 +0200109# a & a -> a
110$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200111 $builder->bool_and(
Akron8231ca72017-06-16 16:08:32 +0200112 $builder->term('c'),
113 $builder->term('a'),
114 $builder->term('c')
115 )
116);
Akron704ec062017-07-24 15:46:21 +0200117is($query->min_span, 1, 'Span length');
118is($query->max_span, 1, 'Span length');
Akron8231ca72017-06-16 16:08:32 +0200119is($query->to_string, '[a&c&c]', 'Stringification');
120ok($query = $query->normalize, 'Normalization');
121is($query->to_string, 'a&c', 'Stringification');
122
123
Akronc5529372017-06-21 15:56:18 +0200124# (a|b) & (b|a) -> (a|b)
125$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200126 $builder->bool_and(
127 $builder->bool_or(
Akronc5529372017-06-21 15:56:18 +0200128 $builder->term('a'),
129 $builder->term('b')
130 ),
Akronb945c572017-07-23 14:55:00 +0200131 $builder->bool_or(
Akronc5529372017-06-21 15:56:18 +0200132 $builder->term('b'),
133 $builder->term('a')
134 )
135 )
136);
Akron704ec062017-07-24 15:46:21 +0200137is($query->min_span, 1, 'Span length');
138is($query->max_span, 1, 'Span length');
Akronc5529372017-06-21 15:56:18 +0200139is($query->to_string, '[(a|b)&(a|b)]', 'Stringification');
140ok($query = $query->normalize, 'Normalization');
141is($query->to_string, 'a|b', 'Stringification');
142
143
Akron8231ca72017-06-16 16:08:32 +0200144# a | a -> a
145$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200146 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +0200147 $builder->term('c'),
148 $builder->term('a'),
149 $builder->term('c')
150 )
151);
152
153is($query->to_string, '[a|c|c]', 'Stringification');
154ok($query = $query->normalize, 'Normalization');
155is($query->to_string, 'a|c', 'Stringification');
156
157
158# a & (a | b) -> a
159$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200160 $builder->bool_and(
Akron8231ca72017-06-16 16:08:32 +0200161 $builder->term('a'),
Akronb945c572017-07-23 14:55:00 +0200162 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +0200163 $builder->term('a'),
164 $builder->term('b')
165 )
166 )
167);
168
169is($query->to_string, '[a&(a|b)]', 'Stringification');
170ok($query = $query->normalize, 'Normalization');
171is($query->to_string, 'a', 'Stringification');
172
173
Akronc5529372017-06-21 15:56:18 +0200174
175# (a&b) | (b&a) -> (a&b)
176$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200177 $builder->bool_or(
178 $builder->bool_and(
Akronc5529372017-06-21 15:56:18 +0200179 $builder->term('a'),
180 $builder->term('b')
181 ),
Akronb945c572017-07-23 14:55:00 +0200182 $builder->bool_and(
Akronc5529372017-06-21 15:56:18 +0200183 $builder->term('b'),
184 $builder->term('a')
185 )
186 )
187);
188
189is($query->to_string, '[(a&b)|(a&b)]', 'Stringification');
190ok($query = $query->normalize, 'Normalization');
191is($query->to_string, 'a&b', 'Stringification');
192
193
194
Akron8231ca72017-06-16 16:08:32 +0200195# a | (a & b) -> a
196$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200197 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +0200198 $builder->term('a'),
Akronb945c572017-07-23 14:55:00 +0200199 $builder->bool_and(
Akron8231ca72017-06-16 16:08:32 +0200200 $builder->term('a'),
201 $builder->term('b')
202 )
203 )
204);
205
206is($query->to_string, '[a|(a&b)]', 'Stringification');
207ok($query = $query->normalize, 'Normalization');
208is($query->to_string, 'a', 'Stringification');
209
210
211# complex
212# a & !a -> 0
213$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200214 $builder->bool_and(
215 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +0200216 $builder->term('a'),
217 $builder->term('b')
218 ),
Akronb945c572017-07-23 14:55:00 +0200219 $builder->bool_or(
Akron8231ca72017-06-16 16:08:32 +0200220 $builder->term('b'),
221 $builder->term('a')
222 )->toggle_negative
223 )
224);
225
226is($query->to_string, '[(!(a|b))&(a|b)]', 'Stringification');
227ok($query = $query->normalize, 'Normalization');
228is($query->to_string, '[0]', 'Stringification');
229
230
231# complex
232# a | !a -> 1
233$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200234 $builder->bool_or(
235 $builder->bool_and(
Akron8231ca72017-06-16 16:08:32 +0200236 $builder->term('a'),
237 $builder->term('b')
238 ),
Akronb945c572017-07-23 14:55:00 +0200239 $builder->bool_and(
Akron8231ca72017-06-16 16:08:32 +0200240 $builder->term('b'),
241 $builder->term('a')
242 )->toggle_negative
243 )
244);
245
246is($query->to_string, '[(!(a&b))|(a&b)]', 'Stringification');
247ok($query = $query->normalize, 'Normalization');
248is($query->to_string, '[]', 'Stringification');
249
250
Akronc5529372017-06-21 15:56:18 +0200251# (a&!b)|(b&c)
252$query = $builder->token(
Akronb945c572017-07-23 14:55:00 +0200253 $builder->bool_or(
254 $builder->bool_and('aa', $builder->term_neg('bb')),
255 $builder->bool_and('bb', 'cc')
Akronc5529372017-06-21 15:56:18 +0200256 )
257);
258is($query->to_string, '[(!bb&aa)|(bb&cc)]', 'Stringification');
259ok($query = $query->normalize, 'Normalization');
260is($query->to_string, '(bb&cc)|excl(32:aa,bb)', 'Stringification');
261
262
263
Akron8231ca72017-06-16 16:08:32 +0200264
265done_testing;
266__END__