Lines 22-28
use Test::Exception;
Link Here
|
22 |
use Test::Warn; |
22 |
use Test::Warn; |
23 |
use t::lib::Mocks; |
23 |
use t::lib::Mocks; |
24 |
use t::lib::TestBuilder; |
24 |
use t::lib::TestBuilder; |
25 |
use Test::More tests => 8; |
25 |
use Test::More tests => 9; |
26 |
|
26 |
|
27 |
use List::Util qw( all ); |
27 |
use List::Util qw( all ); |
28 |
|
28 |
|
Lines 258-285
subtest 'build_query tests' => sub {
Link Here
|
258 |
|
258 |
|
259 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
259 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
260 |
is( |
260 |
is( |
261 |
$query->{query}{query_string}{query}, |
261 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
262 |
"(donald duck)", |
262 |
"(donald duck)", |
263 |
"query not altered if QueryAutoTruncate disabled" |
263 |
"query not altered if QueryAutoTruncate disabled" |
264 |
); |
264 |
); |
265 |
|
265 |
|
266 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['kw,phr'] ); |
266 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['kw,phr'] ); |
267 |
is( |
267 |
is( |
268 |
$query->{query}{query_string}{query}, |
268 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
269 |
'("donald duck")', |
269 |
'("donald duck")', |
270 |
"keyword as phrase correctly quotes search term and strips index" |
270 |
"keyword as phrase correctly quotes search term and strips index" |
271 |
); |
271 |
); |
272 |
|
272 |
|
273 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
273 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
274 |
is( |
274 |
is( |
275 |
$query->{query}{query_string}{query}, |
275 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
276 |
'(title:(donald duck))', |
276 |
'(title:(donald duck))', |
277 |
'multiple words in a query term are enclosed in parenthesis' |
277 |
'multiple words in a query term are enclosed in parenthesis' |
278 |
); |
278 |
); |
279 |
|
279 |
|
280 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['donald duck', 'disney'], ['title', 'author'] ); |
280 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['donald duck', 'disney'], ['title', 'author'] ); |
281 |
is( |
281 |
is( |
282 |
$query->{query}{query_string}{query}, |
282 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
283 |
'(title:(donald duck)) AND (author:disney)', |
283 |
'(title:(donald duck)) AND (author:disney)', |
284 |
'multiple query terms are enclosed in parenthesis while a single one is not' |
284 |
'multiple query terms are enclosed in parenthesis while a single one is not' |
285 |
); |
285 |
); |
Lines 291-325
subtest 'build_query tests' => sub {
Link Here
|
291 |
|
291 |
|
292 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019'], ['yr,st-year'] ); |
292 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019'], ['yr,st-year'] ); |
293 |
is( |
293 |
is( |
294 |
$query->{query}{query_string}{query}, |
294 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
295 |
'(date-of-publication:2019)', |
295 |
'(date-of-publication:2019)', |
296 |
'Year in an st-year search is handled properly' |
296 |
'Year in an st-year search is handled properly' |
297 |
); |
297 |
); |
298 |
|
298 |
|
299 |
( undef, $query ) = $qb->build_query_compat( undef, ['2018-2019'], ['yr,st-year'] ); |
299 |
( undef, $query ) = $qb->build_query_compat( undef, ['2018-2019'], ['yr,st-year'] ); |
300 |
is( |
300 |
is( |
301 |
$query->{query}{query_string}{query}, |
301 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
302 |
'(date-of-publication:[2018 TO 2019])', |
302 |
'(date-of-publication:[2018 TO 2019])', |
303 |
'Year range in an st-year search is handled properly' |
303 |
'Year range in an st-year search is handled properly' |
304 |
); |
304 |
); |
305 |
|
305 |
|
306 |
( undef, $query ) = $qb->build_query_compat( undef, ['-2019'], ['yr,st-year'] ); |
306 |
( undef, $query ) = $qb->build_query_compat( undef, ['-2019'], ['yr,st-year'] ); |
307 |
is( |
307 |
is( |
308 |
$query->{query}{query_string}{query}, |
308 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
309 |
'(date-of-publication:[* TO 2019])', |
309 |
'(date-of-publication:[* TO 2019])', |
310 |
'Open start year in year range of an st-year search is handled properly' |
310 |
'Open start year in year range of an st-year search is handled properly' |
311 |
); |
311 |
); |
312 |
|
312 |
|
313 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'] ); |
313 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'] ); |
314 |
is( |
314 |
is( |
315 |
$query->{query}{query_string}{query}, |
315 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
316 |
'(date-of-publication:[2019 TO *])', |
316 |
'(date-of-publication:[2019 TO *])', |
317 |
'Open end year in year range of an st-year search is handled properly' |
317 |
'Open end year in year range of an st-year search is handled properly' |
318 |
); |
318 |
); |
319 |
|
319 |
|
320 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], ['yr,st-numeric=-2019'] ); |
320 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], ['yr,st-numeric=-2019'] ); |
321 |
is( |
321 |
is( |
322 |
$query->{query}{query_string}{query}, |
322 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
323 |
'(date-of-publication:[2019 TO *]) AND date-of-publication:[* TO 2019]', |
323 |
'(date-of-publication:[2019 TO *]) AND date-of-publication:[* TO 2019]', |
324 |
'Open end year in year range of an st-year search is handled properly' |
324 |
'Open end year in year range of an st-year search is handled properly' |
325 |
); |
325 |
); |
Lines 327-333
subtest 'build_query tests' => sub {
Link Here
|
327 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], |
327 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], |
328 |
['yr,st-numeric:-2019','yr,st-numeric:2005','yr,st-numeric:1984-2022'] ); |
328 |
['yr,st-numeric:-2019','yr,st-numeric:2005','yr,st-numeric:1984-2022'] ); |
329 |
is( |
329 |
is( |
330 |
$query->{query}{query_string}{query}, |
330 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
331 |
'(date-of-publication:[2019 TO *]) AND (date-of-publication:[* TO 2019]) AND (date-of-publication:2005) AND (date-of-publication:[1984 TO 2022])', |
331 |
'(date-of-publication:[2019 TO *]) AND (date-of-publication:[* TO 2019]) AND (date-of-publication:2005) AND (date-of-publication:[1984 TO 2022])', |
332 |
'Limit on year search is handled properly when colon used' |
332 |
'Limit on year search is handled properly when colon used' |
333 |
); |
333 |
); |
Lines 337-343
subtest 'build_query tests' => sub {
Link Here
|
337 |
|
337 |
|
338 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
338 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
339 |
is( |
339 |
is( |
340 |
$query->{query}{query_string}{query}, |
340 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
341 |
"(donald* duck*)", |
341 |
"(donald* duck*)", |
342 |
"simple query is auto truncated when QueryAutoTruncate enabled" |
342 |
"simple query is auto truncated when QueryAutoTruncate enabled" |
343 |
); |
343 |
); |
Lines 346-380
subtest 'build_query tests' => sub {
Link Here
|
346 |
( undef, $query ) = $qb->build_query_compat( undef, |
346 |
( undef, $query ) = $qb->build_query_compat( undef, |
347 |
['donald or duck and mickey not mouse'] ); |
347 |
['donald or duck and mickey not mouse'] ); |
348 |
is( |
348 |
is( |
349 |
$query->{query}{query_string}{query}, |
349 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
350 |
"(donald* or duck* and mickey* not mouse*)", |
350 |
"(donald* or duck* and mickey* not mouse*)", |
351 |
"reserved words are not affected by QueryAutoTruncate" |
351 |
"reserved words are not affected by QueryAutoTruncate" |
352 |
); |
352 |
); |
353 |
|
353 |
|
354 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald* duck*'] ); |
354 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald* duck*'] ); |
355 |
is( |
355 |
is( |
356 |
$query->{query}{query_string}{query}, |
356 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
357 |
"(donald* duck*)", |
357 |
"(donald* duck*)", |
358 |
"query with '*' is unaltered when QueryAutoTruncate is enabled" |
358 |
"query with '*' is unaltered when QueryAutoTruncate is enabled" |
359 |
); |
359 |
); |
360 |
|
360 |
|
361 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck and the mouse'] ); |
361 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck and the mouse'] ); |
362 |
is( |
362 |
is( |
363 |
$query->{query}{query_string}{query}, |
363 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
364 |
"(donald* duck* and the* mouse*)", |
364 |
"(donald* duck* and the* mouse*)", |
365 |
"individual words are all truncated and stopwords ignored" |
365 |
"individual words are all truncated and stopwords ignored" |
366 |
); |
366 |
); |
367 |
|
367 |
|
368 |
( undef, $query ) = $qb->build_query_compat( undef, ['*'] ); |
368 |
( undef, $query ) = $qb->build_query_compat( undef, ['*'] ); |
369 |
is( |
369 |
is( |
370 |
$query->{query}{query_string}{query}, |
370 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
371 |
"(*)", |
371 |
"(*)", |
372 |
"query of just '*' is unaltered when QueryAutoTruncate is enabled" |
372 |
"query of just '*' is unaltered when QueryAutoTruncate is enabled" |
373 |
); |
373 |
); |
374 |
|
374 |
|
375 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck"'], undef, ['available'] ); |
375 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck"'], undef, ['available'] ); |
376 |
is( |
376 |
is( |
377 |
$query->{query}{query_string}{query}, |
377 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
378 |
'("donald duck") AND available:true', |
378 |
'("donald duck") AND available:true', |
379 |
"query with quotes is unaltered when QueryAutoTruncate is enabled" |
379 |
"query with quotes is unaltered when QueryAutoTruncate is enabled" |
380 |
); |
380 |
); |
Lines 382-388
subtest 'build_query tests' => sub {
Link Here
|
382 |
|
382 |
|
383 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck" and "the mouse"'] ); |
383 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck" and "the mouse"'] ); |
384 |
is( |
384 |
is( |
385 |
$query->{query}{query_string}{query}, |
385 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
386 |
'("donald duck" and "the mouse")', |
386 |
'("donald duck" and "the mouse")', |
387 |
"all quoted strings are unaltered if more than one in query" |
387 |
"all quoted strings are unaltered if more than one in query" |
388 |
); |
388 |
); |
Lines 392-426
subtest 'build_query tests' => sub {
Link Here
|
392 |
|
392 |
|
393 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
393 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
394 |
is( |
394 |
is( |
395 |
$query->{query}{query_string}{query}, |
395 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
396 |
'(barcode:123456*)', |
396 |
'(barcode:123456*)', |
397 |
"query of specific field is truncated" |
397 |
"query of specific field is truncated" |
398 |
); |
398 |
); |
399 |
|
399 |
|
400 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:"donald"'] ); |
400 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:"donald"'] ); |
401 |
is( |
401 |
is( |
402 |
$query->{query}{query_string}{query}, |
402 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
403 |
'(personal-name:"donald")', |
403 |
'(personal-name:"donald")', |
404 |
"query of specific field including hyphen and quoted is not truncated, field name is converted to lower case" |
404 |
"query of specific field including hyphen and quoted is not truncated, field name is converted to lower case" |
405 |
); |
405 |
); |
406 |
|
406 |
|
407 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:donald'] ); |
407 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:donald'] ); |
408 |
is( |
408 |
is( |
409 |
$query->{query}{query_string}{query}, |
409 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
410 |
'(personal-name:donald*)', |
410 |
'(personal-name:donald*)', |
411 |
"query of specific field including hyphen and not quoted is truncated, field name is converted to lower case" |
411 |
"query of specific field including hyphen and not quoted is truncated, field name is converted to lower case" |
412 |
); |
412 |
); |
413 |
|
413 |
|
414 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:donald'] ); |
414 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:donald'] ); |
415 |
is( |
415 |
is( |
416 |
$query->{query}{query_string}{query}, |
416 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
417 |
'(personal-name.raw:donald*)', |
417 |
'(personal-name.raw:donald*)', |
418 |
"query of specific field including period and not quoted is truncated, field name is converted to lower case" |
418 |
"query of specific field including period and not quoted is truncated, field name is converted to lower case" |
419 |
); |
419 |
); |
420 |
|
420 |
|
421 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:"donald"'] ); |
421 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:"donald"'] ); |
422 |
is( |
422 |
is( |
423 |
$query->{query}{query_string}{query}, |
423 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
424 |
'(personal-name.raw:"donald")', |
424 |
'(personal-name.raw:"donald")', |
425 |
"query of specific field including period and quoted is not truncated, field name is converted to lower case" |
425 |
"query of specific field including period and quoted is not truncated, field name is converted to lower case" |
426 |
); |
426 |
); |
Lines 430-450
subtest 'build_query tests' => sub {
Link Here
|
430 |
|
430 |
|
431 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
431 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
432 |
is( |
432 |
is( |
433 |
$query->{query}{query_string}{query}, |
433 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
434 |
'(barcode:123456)', |
434 |
'(barcode:123456)', |
435 |
"query of specific field excluded by ESPreventAutoTruncate is not truncated" |
435 |
"query of specific field excluded by ESPreventAutoTruncate is not truncated" |
436 |
); |
436 |
); |
437 |
|
437 |
|
438 |
( undef, $query ) = $qb->build_query_compat( undef, ['Local-number:123456'] ); |
438 |
( undef, $query ) = $qb->build_query_compat( undef, ['Local-number:123456'] ); |
439 |
is( |
439 |
is( |
440 |
$query->{query}{query_string}{query}, |
440 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
441 |
'(local-number:123456)', |
441 |
'(local-number:123456)', |
442 |
"query of identifier is not truncated even if QueryAutoTruncate is set" |
442 |
"query of identifier is not truncated even if QueryAutoTruncate is set" |
443 |
); |
443 |
); |
444 |
|
444 |
|
445 |
( undef, $query ) = $qb->build_query_compat( undef, ['onloan:true'] ); |
445 |
( undef, $query ) = $qb->build_query_compat( undef, ['onloan:true'] ); |
446 |
is( |
446 |
is( |
447 |
$query->{query}{query_string}{query}, |
447 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
448 |
'(onloan:true)', |
448 |
'(onloan:true)', |
449 |
"query of boolean type field is not truncated even if QueryAutoTruncate is set" |
449 |
"query of boolean type field is not truncated even if QueryAutoTruncate is set" |
450 |
); |
450 |
); |
Lines 458-464
subtest 'build_query tests' => sub {
Link Here
|
458 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
458 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
459 |
); |
459 |
); |
460 |
is( |
460 |
is( |
461 |
$query->{query}{query_string}{query}, |
461 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
462 |
'(First* title* subtitle* some* subtitle* Authors* Name. Second* title* Third* title* Second* Author*)', |
462 |
'(First* title* subtitle* some* subtitle* Authors* Name. Second* title* Third* title* Second* Author*)', |
463 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed" |
463 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed" |
464 |
); |
464 |
); |
Lines 469-482
subtest 'build_query tests' => sub {
Link Here
|
469 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
469 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
470 |
); |
470 |
); |
471 |
is( |
471 |
is( |
472 |
$query->{query}{query_string}{query}, |
472 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
473 |
'(First* title* subtitle* some* subtitle* / Authors* Name. Second* title* ; Third* title* / Second* Author*)', |
473 |
'(First* title* subtitle* some* subtitle* / Authors* Name. Second* title* ; Third* title* / Second* Author*)', |
474 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed, RE saved" |
474 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed, RE saved" |
475 |
); |
475 |
); |
476 |
( undef, $query ) = |
476 |
( undef, $query ) = |
477 |
$qb->build_query_compat( undef, ['Lorem / ipsum dolor / sit ; / amet'] ); |
477 |
$qb->build_query_compat( undef, ['Lorem / ipsum dolor / sit ; / amet'] ); |
478 |
is( |
478 |
is( |
479 |
$query->{query}{query_string}{query}, |
479 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
480 |
'(Lorem* / ipsum* dolor* / sit* amet*)', |
480 |
'(Lorem* / ipsum* dolor* / sit* amet*)', |
481 |
"RE saved, last odd unescaped slash preceded by a semicolon removed" |
481 |
"RE saved, last odd unescaped slash preceded by a semicolon removed" |
482 |
); |
482 |
); |
Lines 485-498
subtest 'build_query tests' => sub {
Link Here
|
485 |
( undef, $query ) = |
485 |
( undef, $query ) = |
486 |
$qb->build_query_compat( undef, ['Lorem \/ ipsum dolor \/ sit ; \/ amet'] ); |
486 |
$qb->build_query_compat( undef, ['Lorem \/ ipsum dolor \/ sit ; \/ amet'] ); |
487 |
is( |
487 |
is( |
488 |
$query->{query}{query_string}{query}, |
488 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
489 |
'(Lorem* ipsum* dolor* sit* amet*)', |
489 |
'(Lorem* ipsum* dolor* sit* amet*)', |
490 |
"Escaped slashes (also preceded by another punctuation followed by a space) removed" |
490 |
"Escaped slashes (also preceded by another punctuation followed by a space) removed" |
491 |
); |
491 |
); |
492 |
( undef, $query ) = |
492 |
( undef, $query ) = |
493 |
$qb->build_query_compat( undef, ['comma , period . equal = hyphen - slash / escaped_slash \/'] ); |
493 |
$qb->build_query_compat( undef, ['comma , period . equal = hyphen - slash / escaped_slash \/'] ); |
494 |
is( |
494 |
is( |
495 |
$query->{query}{query_string}{query}, |
495 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
496 |
'(comma* period* equal* hyphen* slash* escaped_slash* \/)', |
496 |
'(comma* period* equal* hyphen* slash* escaped_slash* \/)', |
497 |
"Other problematic characters surrounded by spaces properly removed" |
497 |
"Other problematic characters surrounded by spaces properly removed" |
498 |
); |
498 |
); |
Lines 500-506
subtest 'build_query tests' => sub {
Link Here
|
500 |
( undef, $query ) = |
500 |
( undef, $query ) = |
501 |
$qb->build_query_compat( undef, [' &;,:=-/ // \/\/ /&&&==&& ::-:: '] ); |
501 |
$qb->build_query_compat( undef, [' &;,:=-/ // \/\/ /&&&==&& ::-:: '] ); |
502 |
is( |
502 |
is( |
503 |
$query->{query}{query_string}{query}, |
503 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
504 |
'()', |
504 |
'()', |
505 |
"Repeated problematic characters surrounded by spaces removed" |
505 |
"Repeated problematic characters surrounded by spaces removed" |
506 |
); |
506 |
); |
Lines 512-518
subtest 'build_query tests' => sub {
Link Here
|
512 |
] |
512 |
] |
513 |
); |
513 |
); |
514 |
is( |
514 |
is( |
515 |
$query->{query}{query_string}{query}, |
515 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
516 |
'(&* amp& semicolon; ;colonsemi* full* full* comma, ,comma* dot. .dot* equal* equal* hyphen- -hypen* slash\/ \/slash*)', |
516 |
'(&* amp& semicolon; ;colonsemi* full* full* comma, ,comma* dot. .dot* equal* equal* hyphen- -hypen* slash\/ \/slash*)', |
517 |
"ISBD punctuation and problematic characters not removed when not surrounded by spaces." |
517 |
"ISBD punctuation and problematic characters not removed when not surrounded by spaces." |
518 |
); |
518 |
); |
Lines 527-533
subtest 'build_query tests' => sub {
Link Here
|
527 |
|
527 |
|
528 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
528 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
529 |
is( |
529 |
is( |
530 |
$query->{query}{query_string}{query}, |
530 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
531 |
'(isbn:"9780141930848")', |
531 |
'(isbn:"9780141930848")', |
532 |
"nb query transformed into isbn search field" |
532 |
"nb query transformed into isbn search field" |
533 |
); |
533 |
); |
Lines 537-606
subtest 'build_query tests' => sub {
Link Here
|
537 |
|
537 |
|
538 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
538 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
539 |
is( |
539 |
is( |
540 |
$query->{query}{query_string}{query}, |
540 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
541 |
'(isbn-all:"9780141930848")', |
541 |
'(isbn-all:"9780141930848")', |
542 |
"nb query transformed into isbn-all search field" |
542 |
"nb query transformed into isbn-all search field" |
543 |
); |
543 |
); |
544 |
|
544 |
|
545 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848" ns:"1089-6891"'] ); |
545 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848" ns:"1089-6891"'] ); |
546 |
is( |
546 |
is( |
547 |
$query->{query}{query_string}{query}, |
547 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
548 |
'(isbn-all:"9780141930848" issn-all:"1089-6891")', |
548 |
'(isbn-all:"9780141930848" issn-all:"1089-6891")', |
549 |
"nb and ns query transformed into isbn-all and issn-all search field" |
549 |
"nb and ns query transformed into isbn-all and issn-all search field" |
550 |
); |
550 |
); |
551 |
|
551 |
|
552 |
( undef, $query ) = $qb->build_query_compat( undef, ['J.R.R'] ); |
552 |
( undef, $query ) = $qb->build_query_compat( undef, ['J.R.R'] ); |
553 |
is( |
553 |
is( |
554 |
$query->{query}{query_string}{query}, |
554 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
555 |
'(J.R.R*)', |
555 |
'(J.R.R*)', |
556 |
"query including period is truncated but not split at periods" |
556 |
"query including period is truncated but not split at periods" |
557 |
); |
557 |
); |
558 |
|
558 |
|
559 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'] ); |
559 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'] ); |
560 |
is( |
560 |
is( |
561 |
$query->{query}{query_string}{query}, |
561 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
562 |
'(title:"donald duck")', |
562 |
'(title:"donald duck")', |
563 |
"query of specific field is not truncated when surrounded by quotes" |
563 |
"query of specific field is not truncated when surrounded by quotes" |
564 |
); |
564 |
); |
565 |
|
565 |
|
566 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
566 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
567 |
is( |
567 |
is( |
568 |
$query->{query}{query_string}{query}, |
568 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
569 |
'(title:(donald* duck*))', |
569 |
'(title:(donald* duck*))', |
570 |
'words of a multi-word term are properly truncated' |
570 |
'words of a multi-word term are properly truncated' |
571 |
); |
571 |
); |
572 |
|
572 |
|
573 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['donald duck', 'disney'], ['title', 'author'] ); |
573 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['donald duck', 'disney'], ['title', 'author'] ); |
574 |
is( |
574 |
is( |
575 |
$query->{query}{query_string}{query}, |
575 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
576 |
'(title:(donald* duck*)) AND (author:disney*)', |
576 |
'(title:(donald* duck*)) AND (author:disney*)', |
577 |
'words of a multi-word term and single-word term are properly truncated' |
577 |
'words of a multi-word term and single-word term are properly truncated' |
578 |
); |
578 |
); |
579 |
|
579 |
|
580 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 1 } ); |
580 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 1 } ); |
581 |
is( |
581 |
is( |
582 |
$query->{query}{query_string}{query}, |
582 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
583 |
'(title:"donald duck") AND suppress:false', |
583 |
'(title:"donald duck") AND suppress:false', |
584 |
"query of specific field is added AND suppress:false" |
584 |
"query of specific field is added AND suppress:false" |
585 |
); |
585 |
); |
586 |
|
586 |
|
587 |
( undef, $query, $simple_query, $query_cgi, $query_desc ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 0 } ); |
587 |
( undef, $query, $simple_query, $query_cgi, $query_desc ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 0 } ); |
588 |
is( |
588 |
is( |
589 |
$query->{query}{query_string}{query}, |
589 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
590 |
'(title:"donald duck")', |
590 |
'(title:"donald duck")', |
591 |
"query of specific field is not added AND suppress:0" |
591 |
"query of specific field is not added AND suppress:0" |
592 |
); |
592 |
); |
593 |
|
593 |
|
594 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan'] ); |
594 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan'] ); |
595 |
is( |
595 |
is( |
596 |
$query->{query}{query_string}{query}, |
596 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
597 |
'(title:"donald duck") AND author:("Dillinger Escaplan")', |
597 |
'(title:"donald duck") AND author:("Dillinger Escaplan")', |
598 |
"Simple query with limit term quoted in parentheses" |
598 |
"Simple query with limit term quoted in parentheses" |
599 |
); |
599 |
); |
600 |
|
600 |
|
601 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan', 'itype:BOOK'] ); |
601 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan', 'itype:BOOK'] ); |
602 |
is( |
602 |
is( |
603 |
$query->{query}{query_string}{query}, |
603 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
604 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND (itype:("BOOK"))', |
604 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND (itype:("BOOK"))', |
605 |
"Simple query with each limit's term quoted in parentheses" |
605 |
"Simple query with each limit's term quoted in parentheses" |
606 |
); |
606 |
); |
Lines 609-629
subtest 'build_query tests' => sub {
Link Here
|
609 |
|
609 |
|
610 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan', 'mc-itype,phr:BOOK', 'mc-itype,phr:CD'] ); |
610 |
( undef, $query ) = $qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan', 'mc-itype,phr:BOOK', 'mc-itype,phr:CD'] ); |
611 |
is( |
611 |
is( |
612 |
$query->{query}{query_string}{query}, |
612 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
613 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND itype:(("BOOK") OR ("CD"))', |
613 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND itype:(("BOOK") OR ("CD"))', |
614 |
"Limits quoted correctly when passed as phrase" |
614 |
"Limits quoted correctly when passed as phrase" |
615 |
); |
615 |
); |
616 |
|
616 |
|
617 |
( undef, $query ) = $qb->build_query_compat( ['OR'], ['title:"donald duck"', 'author:"Dillinger Escaplan"'], undef, ['itype:BOOK'] ); |
617 |
( undef, $query ) = $qb->build_query_compat( ['OR'], ['title:"donald duck"', 'author:"Dillinger Escaplan"'], undef, ['itype:BOOK'] ); |
618 |
is( |
618 |
is( |
619 |
$query->{query}{query_string}{query}, |
619 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
620 |
'((title:"donald duck") OR (author:"Dillinger Escaplan")) AND itype:("BOOK")', |
620 |
'((title:"donald duck") OR (author:"Dillinger Escaplan")) AND itype:("BOOK")', |
621 |
"OR query with limit" |
621 |
"OR query with limit" |
622 |
); |
622 |
); |
623 |
|
623 |
|
624 |
( undef, $query ) = $qb->build_query_compat( undef, undef, undef, ['itype:BOOK'] ); |
624 |
( undef, $query ) = $qb->build_query_compat( undef, undef, undef, ['itype:BOOK'] ); |
625 |
is( |
625 |
is( |
626 |
$query->{query}{query_string}{query}, |
626 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
627 |
'itype:("BOOK")', |
627 |
'itype:("BOOK")', |
628 |
"Limit only" |
628 |
"Limit only" |
629 |
); |
629 |
); |
Lines 676-682
subtest 'build_query tests' => sub {
Link Here
|
676 |
['acqdate,st-date-normalized= - '] |
676 |
['acqdate,st-date-normalized= - '] |
677 |
); |
677 |
); |
678 |
is( |
678 |
is( |
679 |
$query->{query}{query_string}{query}, |
679 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
680 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO *]', |
680 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO *]', |
681 |
'If no date all date-of-acquisition are selected' |
681 |
'If no date all date-of-acquisition are selected' |
682 |
); |
682 |
); |
Lines 686-692
subtest 'build_query tests' => sub {
Link Here
|
686 |
['acqdate,st-date-normalized=2024-08-01 - '] |
686 |
['acqdate,st-date-normalized=2024-08-01 - '] |
687 |
); |
687 |
); |
688 |
is( |
688 |
is( |
689 |
$query->{query}{query_string}{query}, |
689 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
690 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO *]', |
690 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO *]', |
691 |
'Open start date in date range of an st-date-normalized search is handled properly' |
691 |
'Open start date in date range of an st-date-normalized search is handled properly' |
692 |
); |
692 |
); |
Lines 696-702
subtest 'build_query tests' => sub {
Link Here
|
696 |
['acqdate,st-date-normalized= - 2024-08-30'] |
696 |
['acqdate,st-date-normalized= - 2024-08-30'] |
697 |
); |
697 |
); |
698 |
is( |
698 |
is( |
699 |
$query->{query}{query_string}{query}, |
699 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
700 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO 2024-08-30]', |
700 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO 2024-08-30]', |
701 |
'Open end date in date range of an st-date-normalized search is handled properly' |
701 |
'Open end date in date range of an st-date-normalized search is handled properly' |
702 |
); |
702 |
); |
Lines 706-712
subtest 'build_query tests' => sub {
Link Here
|
706 |
['acqdate,st-date-normalized=2024-08-01 - 2024-08-30'] |
706 |
['acqdate,st-date-normalized=2024-08-01 - 2024-08-30'] |
707 |
); |
707 |
); |
708 |
is( |
708 |
is( |
709 |
$query->{query}{query_string}{query}, |
709 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
710 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO 2024-08-30]', |
710 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO 2024-08-30]', |
711 |
'Date range in an st-date-normalized search is handled properly' |
711 |
'Date range in an st-date-normalized search is handled properly' |
712 |
); |
712 |
); |
Lines 828-834
subtest 'build_query with weighted fields tests' => sub {
Link Here
|
828 |
my ( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
828 |
my ( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
829 |
undef, undef, undef, { weighted_fields => 1 }); |
829 |
undef, undef, undef, { weighted_fields => 1 }); |
830 |
|
830 |
|
831 |
my $fields = $query->{query}{query_string}{fields}; |
831 |
my $fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
832 |
|
832 |
|
833 |
is(@{$fields}, 2, 'Search field with no searchable mappings has been excluded'); |
833 |
is(@{$fields}, 2, 'Search field with no searchable mappings has been excluded'); |
834 |
|
834 |
|
Lines 841-847
subtest 'build_query with weighted fields tests' => sub {
Link Here
|
841 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
841 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
842 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 }); |
842 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 }); |
843 |
|
843 |
|
844 |
$fields = $query->{query}{query_string}{fields}; |
844 |
$fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
845 |
|
845 |
|
846 |
is_deeply( |
846 |
is_deeply( |
847 |
$fields, |
847 |
$fields, |
Lines 852-863
subtest 'build_query with weighted fields tests' => sub {
Link Here
|
852 |
$qb = Koha::SearchEngine::Elasticsearch::QueryBuilder->new( { index => 'authorities' } ); |
852 |
$qb = Koha::SearchEngine::Elasticsearch::QueryBuilder->new( { index => 'authorities' } ); |
853 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
853 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
854 |
undef, undef, undef, { weighted_fields => 1 }); |
854 |
undef, undef, undef, { weighted_fields => 1 }); |
855 |
$fields = $query->{query}{query_string}{fields}; |
855 |
$fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
856 |
is_deeply( [sort @$fields], ['heading','headingmain'],'Authorities fields retrieve for authorities index'); |
856 |
is_deeply( [sort @$fields], ['heading','headingmain'],'Authorities fields retrieve for authorities index'); |
857 |
|
857 |
|
858 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
858 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, |
859 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 }); |
859 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 }); |
860 |
$fields = $query->{query}{query_string}{fields}; |
860 |
$fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
861 |
is_deeply($fields,['headingmain'],'Only opac authorities fields retrieved for authorities index is is_opac'); |
861 |
is_deeply($fields,['headingmain'],'Only opac authorities fields retrieved for authorities index is is_opac'); |
862 |
|
862 |
|
863 |
}; |
863 |
}; |
Lines 1041-1044
subtest "_sort_field() tests" => sub {
Link Here
|
1041 |
); |
1041 |
); |
1042 |
}; |
1042 |
}; |
1043 |
|
1043 |
|
|
|
1044 |
subtest "_build_field_match_boost_query() tests" => sub { |
1045 |
plan tests => 10; |
1046 |
|
1047 |
my $qb; |
1048 |
|
1049 |
ok( |
1050 |
$qb = Koha::SearchEngine::Elasticsearch::QueryBuilder->new( { 'index' => 'biblios' } ), |
1051 |
'Creating new query builder object for biblios' |
1052 |
); |
1053 |
|
1054 |
my $field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => [], operands => [] } ); |
1055 |
|
1056 |
is_deeply( |
1057 |
$field_match_boost_query, |
1058 |
[], |
1059 |
'Empty array is returned when no indexes or operands passed' |
1060 |
); |
1061 |
$field_match_boost_query = $qb->_build_field_match_boost_query(); |
1062 |
|
1063 |
is_deeply( |
1064 |
$field_match_boost_query, |
1065 |
[], |
1066 |
'Empty array is returned when no parameters passed' |
1067 |
); |
1068 |
|
1069 |
my @indexes = ( 'kw', 'subject', 'title' ); |
1070 |
my @operands; |
1071 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1072 |
is_deeply( |
1073 |
$field_match_boost_query, |
1074 |
[], |
1075 |
'Empty array is returned when no parameters passed' |
1076 |
); |
1077 |
|
1078 |
push @operands, "turkey"; |
1079 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1080 |
is_deeply( |
1081 |
$field_match_boost_query, |
1082 |
[ { match => { 'title-cover' => { query => 'turkey' } } } ], |
1083 |
'Keyword is converted to title-cover' |
1084 |
); |
1085 |
|
1086 |
push @operands, "gravy"; |
1087 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1088 |
is_deeply( |
1089 |
$field_match_boost_query, |
1090 |
[ |
1091 |
{ match => { 'title-cover' => { query => 'turkey' } } }, |
1092 |
{ match => { 'subject' => { query => 'gravy' } } } |
1093 |
], |
1094 |
'Subject is not converted' |
1095 |
); |
1096 |
|
1097 |
push @operands, "mashed"; |
1098 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1099 |
is_deeply( |
1100 |
$field_match_boost_query, |
1101 |
[ |
1102 |
{ match => { 'title-cover' => { query => 'turkey' } } }, |
1103 |
{ match => { 'subject' => { query => 'gravy' } } }, |
1104 |
{ match => { 'title-cover' => { query => 'mashed' } } }, |
1105 |
], |
1106 |
'Title is not converted to title-cover' |
1107 |
); |
1108 |
|
1109 |
t::lib::Mocks::mock_preference( 'ESBoostFieldMatch', '0' ); |
1110 |
t::lib::Mocks::mock_preference( 'QueryAutoTruncate', '1' ); |
1111 |
my ( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
1112 |
is( |
1113 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
1114 |
'(title:(donald* duck*)) AND (author:disney*)', |
1115 |
'words of a multi-word term and single-word term are properly truncated' |
1116 |
); |
1117 |
is( |
1118 |
$query->{query}{bool}{should}, |
1119 |
undef, |
1120 |
'No should query added for boosting' |
1121 |
); |
1122 |
|
1123 |
t::lib::Mocks::mock_preference( 'ESBoostFieldMatch', '1' ); |
1124 |
( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
1125 |
is_deeply( |
1126 |
$query->{query}{bool}{should}, |
1127 |
[ |
1128 |
{ match => { 'title-cover' => { query => 'donald duck' } } }, |
1129 |
{ match => { 'author' => { query => 'disney' } } } |
1130 |
], |
1131 |
'SHould query is correctly added' |
1132 |
); |
1133 |
|
1134 |
}; |
1135 |
|
1044 |
$schema->storage->txn_rollback; |
1136 |
$schema->storage->txn_rollback; |
1045 |
- |
|
|