Lines 23-29
use Test::Warn;
Link Here
|
23 |
use t::lib::Mocks; |
23 |
use t::lib::Mocks; |
24 |
use t::lib::TestBuilder; |
24 |
use t::lib::TestBuilder; |
25 |
use Test::NoWarnings; |
25 |
use Test::NoWarnings; |
26 |
use Test::More tests => 9; |
26 |
use Test::More tests => 10; |
27 |
|
27 |
|
28 |
use List::Util qw( all ); |
28 |
use List::Util qw( all ); |
29 |
|
29 |
|
Lines 271-277
subtest 'build_query tests' => sub {
Link Here
|
271 |
|
271 |
|
272 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
272 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
273 |
is( |
273 |
is( |
274 |
$query->{query}{query_string}{query}, |
274 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
275 |
"(donald duck)", |
275 |
"(donald duck)", |
276 |
"query not altered if QueryAutoTruncate disabled" |
276 |
"query not altered if QueryAutoTruncate disabled" |
277 |
); |
277 |
); |
Lines 282-302
subtest 'build_query tests' => sub {
Link Here
|
282 |
|
282 |
|
283 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['kw,phr'] ); |
283 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['kw,phr'] ); |
284 |
is( |
284 |
is( |
285 |
$query->{query}{query_string}{query}, |
285 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
286 |
'("donald duck")', |
286 |
'("donald duck")', |
287 |
"keyword as phrase correctly quotes search term and strips index" |
287 |
"keyword as phrase correctly quotes search term and strips index" |
288 |
); |
288 |
); |
289 |
|
289 |
|
290 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
290 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
291 |
is( |
291 |
is( |
292 |
$query->{query}{query_string}{query}, |
292 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
293 |
'(title:(donald duck))', |
293 |
'(title:(donald duck))', |
294 |
'multiple words in a query term are enclosed in parenthesis' |
294 |
'multiple words in a query term are enclosed in parenthesis' |
295 |
); |
295 |
); |
296 |
|
296 |
|
297 |
( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
297 |
( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
298 |
is( |
298 |
is( |
299 |
$query->{query}{query_string}{query}, |
299 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
300 |
'(title:(donald duck)) AND (author:disney)', |
300 |
'(title:(donald duck)) AND (author:disney)', |
301 |
'multiple query terms are enclosed in parenthesis while a single one is not' |
301 |
'multiple query terms are enclosed in parenthesis while a single one is not' |
302 |
); |
302 |
); |
Lines 309-343
subtest 'build_query tests' => sub {
Link Here
|
309 |
|
309 |
|
310 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019'], ['yr,st-year'] ); |
310 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019'], ['yr,st-year'] ); |
311 |
is( |
311 |
is( |
312 |
$query->{query}{query_string}{query}, |
312 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
313 |
'(date-of-publication:2019)', |
313 |
'(date-of-publication:2019)', |
314 |
'Year in an st-year search is handled properly' |
314 |
'Year in an st-year search is handled properly' |
315 |
); |
315 |
); |
316 |
|
316 |
|
317 |
( undef, $query ) = $qb->build_query_compat( undef, ['2018-2019'], ['yr,st-year'] ); |
317 |
( undef, $query ) = $qb->build_query_compat( undef, ['2018-2019'], ['yr,st-year'] ); |
318 |
is( |
318 |
is( |
319 |
$query->{query}{query_string}{query}, |
319 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
320 |
'(date-of-publication:[2018 TO 2019])', |
320 |
'(date-of-publication:[2018 TO 2019])', |
321 |
'Year range in an st-year search is handled properly' |
321 |
'Year range in an st-year search is handled properly' |
322 |
); |
322 |
); |
323 |
|
323 |
|
324 |
( undef, $query ) = $qb->build_query_compat( undef, ['-2019'], ['yr,st-year'] ); |
324 |
( undef, $query ) = $qb->build_query_compat( undef, ['-2019'], ['yr,st-year'] ); |
325 |
is( |
325 |
is( |
326 |
$query->{query}{query_string}{query}, |
326 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
327 |
'(date-of-publication:[* TO 2019])', |
327 |
'(date-of-publication:[* TO 2019])', |
328 |
'Open start year in year range of an st-year search is handled properly' |
328 |
'Open start year in year range of an st-year search is handled properly' |
329 |
); |
329 |
); |
330 |
|
330 |
|
331 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'] ); |
331 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'] ); |
332 |
is( |
332 |
is( |
333 |
$query->{query}{query_string}{query}, |
333 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
334 |
'(date-of-publication:[2019 TO *])', |
334 |
'(date-of-publication:[2019 TO *])', |
335 |
'Open end year in year range of an st-year search is handled properly' |
335 |
'Open end year in year range of an st-year search is handled properly' |
336 |
); |
336 |
); |
337 |
|
337 |
|
338 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], ['yr,st-numeric=-2019'] ); |
338 |
( undef, $query ) = $qb->build_query_compat( undef, ['2019-'], ['yr,st-year'], ['yr,st-numeric=-2019'] ); |
339 |
is( |
339 |
is( |
340 |
$query->{query}{query_string}{query}, |
340 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
341 |
'(date-of-publication:[2019 TO *]) AND date-of-publication:[* TO 2019]', |
341 |
'(date-of-publication:[2019 TO *]) AND date-of-publication:[* TO 2019]', |
342 |
'Open end year in year range of an st-year search is handled properly' |
342 |
'Open end year in year range of an st-year search is handled properly' |
343 |
); |
343 |
); |
Lines 347-353
subtest 'build_query tests' => sub {
Link Here
|
347 |
[ 'yr,st-numeric:-2019', 'yr,st-numeric:2005', 'yr,st-numeric:1984-2022' ] |
347 |
[ 'yr,st-numeric:-2019', 'yr,st-numeric:2005', 'yr,st-numeric:1984-2022' ] |
348 |
); |
348 |
); |
349 |
is( |
349 |
is( |
350 |
$query->{query}{query_string}{query}, |
350 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
351 |
'(date-of-publication:[2019 TO *]) AND (date-of-publication:[* TO 2019]) AND (date-of-publication:2005) AND (date-of-publication:[1984 TO 2022])', |
351 |
'(date-of-publication:[2019 TO *]) AND (date-of-publication:[* TO 2019]) AND (date-of-publication:2005) AND (date-of-publication:[1984 TO 2022])', |
352 |
'Limit on year search is handled properly when colon used' |
352 |
'Limit on year search is handled properly when colon used' |
353 |
); |
353 |
); |
Lines 357-363
subtest 'build_query tests' => sub {
Link Here
|
357 |
|
357 |
|
358 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
358 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'] ); |
359 |
is( |
359 |
is( |
360 |
$query->{query}{query_string}{query}, |
360 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
361 |
"(donald* duck*)", |
361 |
"(donald* duck*)", |
362 |
"simple query is auto truncated when QueryAutoTruncate enabled" |
362 |
"simple query is auto truncated when QueryAutoTruncate enabled" |
363 |
); |
363 |
); |
Lines 368-409
subtest 'build_query tests' => sub {
Link Here
|
368 |
['donald or duck and mickey not mouse'] |
368 |
['donald or duck and mickey not mouse'] |
369 |
); |
369 |
); |
370 |
is( |
370 |
is( |
371 |
$query->{query}{query_string}{query}, |
371 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
372 |
"(donald* or duck* and mickey* not mouse*)", |
372 |
"(donald* or duck* and mickey* not mouse*)", |
373 |
"reserved words are not affected by QueryAutoTruncate" |
373 |
"reserved words are not affected by QueryAutoTruncate" |
374 |
); |
374 |
); |
375 |
|
375 |
|
376 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald* duck*'] ); |
376 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald* duck*'] ); |
377 |
is( |
377 |
is( |
378 |
$query->{query}{query_string}{query}, |
378 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
379 |
"(donald* duck*)", |
379 |
"(donald* duck*)", |
380 |
"query with '*' is unaltered when QueryAutoTruncate is enabled" |
380 |
"query with '*' is unaltered when QueryAutoTruncate is enabled" |
381 |
); |
381 |
); |
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 |
"individual words are all truncated and stopwords ignored" |
387 |
"individual words are all truncated and stopwords ignored" |
388 |
); |
388 |
); |
389 |
|
389 |
|
390 |
( undef, $query ) = $qb->build_query_compat( undef, ['*'] ); |
390 |
( undef, $query ) = $qb->build_query_compat( undef, ['*'] ); |
391 |
is( |
391 |
is( |
392 |
$query->{query}{query_string}{query}, |
392 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
393 |
"(*)", |
393 |
"(*)", |
394 |
"query of just '*' is unaltered when QueryAutoTruncate is enabled" |
394 |
"query of just '*' is unaltered when QueryAutoTruncate is enabled" |
395 |
); |
395 |
); |
396 |
|
396 |
|
397 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck"'], undef, ['available'] ); |
397 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck"'], undef, ['available'] ); |
398 |
is( |
398 |
is( |
399 |
$query->{query}{query_string}{query}, |
399 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
400 |
'("donald duck") AND available:true', |
400 |
'("donald duck") AND available:true', |
401 |
"query with quotes is unaltered when QueryAutoTruncate is enabled" |
401 |
"query with quotes is unaltered when QueryAutoTruncate is enabled" |
402 |
); |
402 |
); |
403 |
|
403 |
|
404 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck" and "the mouse"'] ); |
404 |
( undef, $query ) = $qb->build_query_compat( undef, ['"donald duck" and "the mouse"'] ); |
405 |
is( |
405 |
is( |
406 |
$query->{query}{query_string}{query}, |
406 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
407 |
'("donald duck" and "the mouse")', |
407 |
'("donald duck" and "the mouse")', |
408 |
"all quoted strings are unaltered if more than one in query" |
408 |
"all quoted strings are unaltered if more than one in query" |
409 |
); |
409 |
); |
Lines 413-447
subtest 'build_query tests' => sub {
Link Here
|
413 |
|
413 |
|
414 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
414 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
415 |
is( |
415 |
is( |
416 |
$query->{query}{query_string}{query}, |
416 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
417 |
'(barcode:123456*)', |
417 |
'(barcode:123456*)', |
418 |
"query of specific field is truncated" |
418 |
"query of specific field is truncated" |
419 |
); |
419 |
); |
420 |
|
420 |
|
421 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:"donald"'] ); |
421 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:"donald"'] ); |
422 |
is( |
422 |
is( |
423 |
$query->{query}{query_string}{query}, |
423 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
424 |
'(personal-name:"donald")', |
424 |
'(personal-name:"donald")', |
425 |
"query of specific field including hyphen and quoted is not truncated, field name is converted to lower case" |
425 |
"query of specific field including hyphen and quoted is not truncated, field name is converted to lower case" |
426 |
); |
426 |
); |
427 |
|
427 |
|
428 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:donald'] ); |
428 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name:donald'] ); |
429 |
is( |
429 |
is( |
430 |
$query->{query}{query_string}{query}, |
430 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
431 |
'(personal-name:donald*)', |
431 |
'(personal-name:donald*)', |
432 |
"query of specific field including hyphen and not quoted is truncated, field name is converted to lower case" |
432 |
"query of specific field including hyphen and not quoted is truncated, field name is converted to lower case" |
433 |
); |
433 |
); |
434 |
|
434 |
|
435 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:donald'] ); |
435 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:donald'] ); |
436 |
is( |
436 |
is( |
437 |
$query->{query}{query_string}{query}, |
437 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
438 |
'(personal-name.raw:donald*)', |
438 |
'(personal-name.raw:donald*)', |
439 |
"query of specific field including period and not quoted is truncated, field name is converted to lower case" |
439 |
"query of specific field including period and not quoted is truncated, field name is converted to lower case" |
440 |
); |
440 |
); |
441 |
|
441 |
|
442 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:"donald"'] ); |
442 |
( undef, $query ) = $qb->build_query_compat( undef, ['Personal-name.raw:"donald"'] ); |
443 |
is( |
443 |
is( |
444 |
$query->{query}{query_string}{query}, |
444 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
445 |
'(personal-name.raw:"donald")', |
445 |
'(personal-name.raw:"donald")', |
446 |
"query of specific field including period and quoted is not truncated, field name is converted to lower case" |
446 |
"query of specific field including period and quoted is not truncated, field name is converted to lower case" |
447 |
); |
447 |
); |
Lines 451-471
subtest 'build_query tests' => sub {
Link Here
|
451 |
|
451 |
|
452 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
452 |
( undef, $query ) = $qb->build_query_compat( undef, ['barcode:123456'] ); |
453 |
is( |
453 |
is( |
454 |
$query->{query}{query_string}{query}, |
454 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
455 |
'(barcode:123456)', |
455 |
'(barcode:123456)', |
456 |
"query of specific field excluded by ESPreventAutoTruncate is not truncated" |
456 |
"query of specific field excluded by ESPreventAutoTruncate is not truncated" |
457 |
); |
457 |
); |
458 |
|
458 |
|
459 |
( undef, $query ) = $qb->build_query_compat( undef, ['Local-number:123456'] ); |
459 |
( undef, $query ) = $qb->build_query_compat( undef, ['Local-number:123456'] ); |
460 |
is( |
460 |
is( |
461 |
$query->{query}{query_string}{query}, |
461 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
462 |
'(local-number:123456)', |
462 |
'(local-number:123456)', |
463 |
"query of identifier is not truncated even if QueryAutoTruncate is set" |
463 |
"query of identifier is not truncated even if QueryAutoTruncate is set" |
464 |
); |
464 |
); |
465 |
|
465 |
|
466 |
( undef, $query ) = $qb->build_query_compat( undef, ['onloan:true'] ); |
466 |
( undef, $query ) = $qb->build_query_compat( undef, ['onloan:true'] ); |
467 |
is( |
467 |
is( |
468 |
$query->{query}{query_string}{query}, |
468 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
469 |
'(onloan:true)', |
469 |
'(onloan:true)', |
470 |
"query of boolean type field is not truncated even if QueryAutoTruncate is set" |
470 |
"query of boolean type field is not truncated even if QueryAutoTruncate is set" |
471 |
); |
471 |
); |
Lines 479-485
subtest 'build_query tests' => sub {
Link Here
|
479 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
479 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
480 |
); |
480 |
); |
481 |
is( |
481 |
is( |
482 |
$query->{query}{query_string}{query}, |
482 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
483 |
'(First* title* subtitle* some* subtitle* Authors* Name. Second* title* Third* title* Second* Author*)', |
483 |
'(First* title* subtitle* some* subtitle* Authors* Name. Second* title* Third* title* Second* Author*)', |
484 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed" |
484 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed" |
485 |
); |
485 |
); |
Lines 490-503
subtest 'build_query tests' => sub {
Link Here
|
490 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
490 |
['First title ; subtitle : some & subtitle / Authors Name. Second title ; Third title / Second Author'] |
491 |
); |
491 |
); |
492 |
is( |
492 |
is( |
493 |
$query->{query}{query_string}{query}, |
493 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
494 |
'(First* title* subtitle* some* subtitle* / Authors* Name. Second* title* ; Third* title* / Second* Author*)', |
494 |
'(First* title* subtitle* some* subtitle* / Authors* Name. Second* title* ; Third* title* / Second* Author*)', |
495 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed, RE saved" |
495 |
"ISBD punctuation and problematic characters surrounded by spaces properly removed, RE saved" |
496 |
); |
496 |
); |
497 |
( undef, $query ) = |
497 |
( undef, $query ) = |
498 |
$qb->build_query_compat( undef, ['Lorem / ipsum dolor / sit ; / amet'] ); |
498 |
$qb->build_query_compat( undef, ['Lorem / ipsum dolor / sit ; / amet'] ); |
499 |
is( |
499 |
is( |
500 |
$query->{query}{query_string}{query}, |
500 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
501 |
'(Lorem* / ipsum* dolor* / sit* amet*)', |
501 |
'(Lorem* / ipsum* dolor* / sit* amet*)', |
502 |
"RE saved, last odd unescaped slash preceded by a semicolon removed" |
502 |
"RE saved, last odd unescaped slash preceded by a semicolon removed" |
503 |
); |
503 |
); |
Lines 506-519
subtest 'build_query tests' => sub {
Link Here
|
506 |
( undef, $query ) = |
506 |
( undef, $query ) = |
507 |
$qb->build_query_compat( undef, ['Lorem \/ ipsum dolor \/ sit ; \/ amet'] ); |
507 |
$qb->build_query_compat( undef, ['Lorem \/ ipsum dolor \/ sit ; \/ amet'] ); |
508 |
is( |
508 |
is( |
509 |
$query->{query}{query_string}{query}, |
509 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
510 |
'(Lorem* ipsum* dolor* sit* amet*)', |
510 |
'(Lorem* ipsum* dolor* sit* amet*)', |
511 |
"Escaped slashes (also preceded by another punctuation followed by a space) removed" |
511 |
"Escaped slashes (also preceded by another punctuation followed by a space) removed" |
512 |
); |
512 |
); |
513 |
( undef, $query ) = |
513 |
( undef, $query ) = |
514 |
$qb->build_query_compat( undef, ['comma , period . equal = hyphen - slash / escaped_slash \/'] ); |
514 |
$qb->build_query_compat( undef, ['comma , period . equal = hyphen - slash / escaped_slash \/'] ); |
515 |
is( |
515 |
is( |
516 |
$query->{query}{query_string}{query}, |
516 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
517 |
'(comma* period* equal* hyphen* slash* escaped_slash* \/)', |
517 |
'(comma* period* equal* hyphen* slash* escaped_slash* \/)', |
518 |
"Other problematic characters surrounded by spaces properly removed" |
518 |
"Other problematic characters surrounded by spaces properly removed" |
519 |
); |
519 |
); |
Lines 521-527
subtest 'build_query tests' => sub {
Link Here
|
521 |
( undef, $query ) = |
521 |
( undef, $query ) = |
522 |
$qb->build_query_compat( undef, [' &;,:=-/ // \/\/ /&&&==&& ::-:: '] ); |
522 |
$qb->build_query_compat( undef, [' &;,:=-/ // \/\/ /&&&==&& ::-:: '] ); |
523 |
is( |
523 |
is( |
524 |
$query->{query}{query_string}{query}, |
524 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
525 |
'()', |
525 |
'()', |
526 |
"Repeated problematic characters surrounded by spaces removed" |
526 |
"Repeated problematic characters surrounded by spaces removed" |
527 |
); |
527 |
); |
Lines 533-539
subtest 'build_query tests' => sub {
Link Here
|
533 |
] |
533 |
] |
534 |
); |
534 |
); |
535 |
is( |
535 |
is( |
536 |
$query->{query}{query_string}{query}, |
536 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
537 |
'(&* amp& semicolon; ;colonsemi* full* full* comma, ,comma* dot. .dot* equal* equal* hyphen- -hypen* slash\/ \/slash*)', |
537 |
'(&* amp& semicolon; ;colonsemi* full* full* comma, ,comma* dot. .dot* equal* equal* hyphen- -hypen* slash\/ \/slash*)', |
538 |
"ISBD punctuation and problematic characters not removed when not surrounded by spaces." |
538 |
"ISBD punctuation and problematic characters not removed when not surrounded by spaces." |
539 |
); |
539 |
); |
Lines 548-554
subtest 'build_query tests' => sub {
Link Here
|
548 |
|
548 |
|
549 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
549 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
550 |
is( |
550 |
is( |
551 |
$query->{query}{query_string}{query}, |
551 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
552 |
'(isbn:"9780141930848")', |
552 |
'(isbn:"9780141930848")', |
553 |
"nb query transformed into isbn search field" |
553 |
"nb query transformed into isbn search field" |
554 |
); |
554 |
); |
Lines 558-599
subtest 'build_query tests' => sub {
Link Here
|
558 |
|
558 |
|
559 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
559 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848"'] ); |
560 |
is( |
560 |
is( |
561 |
$query->{query}{query_string}{query}, |
561 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
562 |
'(isbn-all:"9780141930848")', |
562 |
'(isbn-all:"9780141930848")', |
563 |
"nb query transformed into isbn-all search field" |
563 |
"nb query transformed into isbn-all search field" |
564 |
); |
564 |
); |
565 |
|
565 |
|
566 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848" ns:"1089-6891"'] ); |
566 |
( undef, $query ) = $qb->build_query_compat( undef, ['nb:"9780141930848" ns:"1089-6891"'] ); |
567 |
is( |
567 |
is( |
568 |
$query->{query}{query_string}{query}, |
568 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
569 |
'(isbn-all:"9780141930848" issn-all:"1089-6891")', |
569 |
'(isbn-all:"9780141930848" issn-all:"1089-6891")', |
570 |
"nb and ns query transformed into isbn-all and issn-all search field" |
570 |
"nb and ns query transformed into isbn-all and issn-all search field" |
571 |
); |
571 |
); |
572 |
|
572 |
|
573 |
( undef, $query ) = $qb->build_query_compat( undef, ['J.R.R'] ); |
573 |
( undef, $query ) = $qb->build_query_compat( undef, ['J.R.R'] ); |
574 |
is( |
574 |
is( |
575 |
$query->{query}{query_string}{query}, |
575 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
576 |
'(J.R.R*)', |
576 |
'(J.R.R*)', |
577 |
"query including period is truncated but not split at periods" |
577 |
"query including period is truncated but not split at periods" |
578 |
); |
578 |
); |
579 |
|
579 |
|
580 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'] ); |
580 |
( undef, $query ) = $qb->build_query_compat( undef, ['title:"donald duck"'] ); |
581 |
is( |
581 |
is( |
582 |
$query->{query}{query_string}{query}, |
582 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
583 |
'(title:"donald duck")', |
583 |
'(title:"donald duck")', |
584 |
"query of specific field is not truncated when surrounded by quotes" |
584 |
"query of specific field is not truncated when surrounded by quotes" |
585 |
); |
585 |
); |
586 |
|
586 |
|
587 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
587 |
( undef, $query ) = $qb->build_query_compat( undef, ['donald duck'], ['title'] ); |
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 |
'words of a multi-word term are properly truncated' |
591 |
'words of a multi-word term are properly truncated' |
592 |
); |
592 |
); |
593 |
|
593 |
|
594 |
( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
594 |
( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
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:disney*)', |
597 |
'(title:(donald* duck*)) AND (author:disney*)', |
598 |
'words of a multi-word term and single-word term are properly truncated' |
598 |
'words of a multi-word term and single-word term are properly truncated' |
599 |
); |
599 |
); |
Lines 601-607
subtest 'build_query tests' => sub {
Link Here
|
601 |
( undef, $query ) = |
601 |
( undef, $query ) = |
602 |
$qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 1 } ); |
602 |
$qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 1 } ); |
603 |
is( |
603 |
is( |
604 |
$query->{query}{query_string}{query}, |
604 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
605 |
'(title:"donald duck") AND suppress:false', |
605 |
'(title:"donald duck") AND suppress:false', |
606 |
"query of specific field is added AND suppress:false" |
606 |
"query of specific field is added AND suppress:false" |
607 |
); |
607 |
); |
Lines 609-615
subtest 'build_query tests' => sub {
Link Here
|
609 |
( undef, $query, $simple_query, $query_cgi, $query_desc ) = |
609 |
( undef, $query, $simple_query, $query_cgi, $query_desc ) = |
610 |
$qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 0 } ); |
610 |
$qb->build_query_compat( undef, ['title:"donald duck"'], undef, undef, undef, undef, undef, { suppress => 0 } ); |
611 |
is( |
611 |
is( |
612 |
$query->{query}{query_string}{query}, |
612 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
613 |
'(title:"donald duck")', |
613 |
'(title:"donald duck")', |
614 |
"query of specific field is not added AND suppress:0" |
614 |
"query of specific field is not added AND suppress:0" |
615 |
); |
615 |
); |
Lines 617-623
subtest 'build_query tests' => sub {
Link Here
|
617 |
( undef, $query ) = |
617 |
( undef, $query ) = |
618 |
$qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan'] ); |
618 |
$qb->build_query_compat( ['AND'], ['title:"donald duck"'], undef, ['author:Dillinger Escaplan'] ); |
619 |
is( |
619 |
is( |
620 |
$query->{query}{query_string}{query}, |
620 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
621 |
'(title:"donald duck") AND author:("Dillinger Escaplan")', |
621 |
'(title:"donald duck") AND author:("Dillinger Escaplan")', |
622 |
"Simple query with limit term quoted in parentheses" |
622 |
"Simple query with limit term quoted in parentheses" |
623 |
); |
623 |
); |
Lines 627-633
subtest 'build_query tests' => sub {
Link Here
|
627 |
[ 'author:Dillinger Escaplan', 'itype:BOOK' ] |
627 |
[ 'author:Dillinger Escaplan', 'itype:BOOK' ] |
628 |
); |
628 |
); |
629 |
is( |
629 |
is( |
630 |
$query->{query}{query_string}{query}, |
630 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
631 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND (itype:("BOOK"))', |
631 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND (itype:("BOOK"))', |
632 |
"Simple query with each limit's term quoted in parentheses" |
632 |
"Simple query with each limit's term quoted in parentheses" |
633 |
); |
633 |
); |
Lines 639-645
subtest 'build_query tests' => sub {
Link Here
|
639 |
[ 'author:Dillinger Escaplan', 'mc-itype,phr:BOOK', 'mc-itype,phr:CD' ] |
639 |
[ 'author:Dillinger Escaplan', 'mc-itype,phr:BOOK', 'mc-itype,phr:CD' ] |
640 |
); |
640 |
); |
641 |
is( |
641 |
is( |
642 |
$query->{query}{query_string}{query}, |
642 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
643 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND itype:(("BOOK") OR ("CD"))', |
643 |
'(title:"donald duck") AND (author:("Dillinger Escaplan")) AND itype:(("BOOK") OR ("CD"))', |
644 |
"Limits quoted correctly when passed as phrase" |
644 |
"Limits quoted correctly when passed as phrase" |
645 |
); |
645 |
); |
Lines 649-662
subtest 'build_query tests' => sub {
Link Here
|
649 |
['itype:BOOK'] |
649 |
['itype:BOOK'] |
650 |
); |
650 |
); |
651 |
is( |
651 |
is( |
652 |
$query->{query}{query_string}{query}, |
652 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
653 |
'((title:"donald duck") OR (author:"Dillinger Escaplan")) AND itype:("BOOK")', |
653 |
'((title:"donald duck") OR (author:"Dillinger Escaplan")) AND itype:("BOOK")', |
654 |
"OR query with limit" |
654 |
"OR query with limit" |
655 |
); |
655 |
); |
656 |
|
656 |
|
657 |
( undef, $query ) = $qb->build_query_compat( undef, undef, undef, ['itype:BOOK'] ); |
657 |
( undef, $query ) = $qb->build_query_compat( undef, undef, undef, ['itype:BOOK'] ); |
658 |
is( |
658 |
is( |
659 |
$query->{query}{query_string}{query}, |
659 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
660 |
'itype:("BOOK")', |
660 |
'itype:("BOOK")', |
661 |
"Limit only" |
661 |
"Limit only" |
662 |
); |
662 |
); |
Lines 724-730
subtest 'build_query tests' => sub {
Link Here
|
724 |
['acqdate,st-date-normalized= - '] |
724 |
['acqdate,st-date-normalized= - '] |
725 |
); |
725 |
); |
726 |
is( |
726 |
is( |
727 |
$query->{query}{query_string}{query}, |
727 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
728 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO *]', |
728 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO *]', |
729 |
'If no date all date-of-acquisition are selected' |
729 |
'If no date all date-of-acquisition are selected' |
730 |
); |
730 |
); |
Lines 734-740
subtest 'build_query tests' => sub {
Link Here
|
734 |
['acqdate,st-date-normalized=2024-08-01 - '] |
734 |
['acqdate,st-date-normalized=2024-08-01 - '] |
735 |
); |
735 |
); |
736 |
is( |
736 |
is( |
737 |
$query->{query}{query_string}{query}, |
737 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
738 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO *]', |
738 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO *]', |
739 |
'Open start date in date range of an st-date-normalized search is handled properly' |
739 |
'Open start date in date range of an st-date-normalized search is handled properly' |
740 |
); |
740 |
); |
Lines 744-750
subtest 'build_query tests' => sub {
Link Here
|
744 |
['acqdate,st-date-normalized= - 2024-08-30'] |
744 |
['acqdate,st-date-normalized= - 2024-08-30'] |
745 |
); |
745 |
); |
746 |
is( |
746 |
is( |
747 |
$query->{query}{query_string}{query}, |
747 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
748 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO 2024-08-30]', |
748 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[* TO 2024-08-30]', |
749 |
'Open end date in date range of an st-date-normalized search is handled properly' |
749 |
'Open end date in date range of an st-date-normalized search is handled properly' |
750 |
); |
750 |
); |
Lines 754-760
subtest 'build_query tests' => sub {
Link Here
|
754 |
['acqdate,st-date-normalized=2024-08-01 - 2024-08-30'] |
754 |
['acqdate,st-date-normalized=2024-08-01 - 2024-08-30'] |
755 |
); |
755 |
); |
756 |
is( |
756 |
is( |
757 |
$query->{query}{query_string}{query}, |
757 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
758 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO 2024-08-30]', |
758 |
'(barcode:barcode123123) AND date-of-acquisition.raw:[2024-08-01 TO 2024-08-30]', |
759 |
'Date range in an st-date-normalized search is handled properly' |
759 |
'Date range in an st-date-normalized search is handled properly' |
760 |
); |
760 |
); |
Lines 900-906
subtest 'build_query with weighted fields tests' => sub {
Link Here
|
900 |
undef, undef, undef, { weighted_fields => 1 } |
900 |
undef, undef, undef, { weighted_fields => 1 } |
901 |
); |
901 |
); |
902 |
|
902 |
|
903 |
my $fields = $query->{query}{query_string}{fields}; |
903 |
my $fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
904 |
|
904 |
|
905 |
is( @{$fields}, 2, 'Search field with no searchable mappings has been excluded' ); |
905 |
is( @{$fields}, 2, 'Search field with no searchable mappings has been excluded' ); |
906 |
|
906 |
|
Lines 915-921
subtest 'build_query with weighted fields tests' => sub {
Link Here
|
915 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 } |
915 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 } |
916 |
); |
916 |
); |
917 |
|
917 |
|
918 |
$fields = $query->{query}{query_string}{fields}; |
918 |
$fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
919 |
|
919 |
|
920 |
is_deeply( |
920 |
is_deeply( |
921 |
$fields, |
921 |
$fields, |
Lines 928-941
subtest 'build_query with weighted fields tests' => sub {
Link Here
|
928 |
undef, ['title:"donald duck"'], undef, undef, |
928 |
undef, ['title:"donald duck"'], undef, undef, |
929 |
undef, undef, undef, { weighted_fields => 1 } |
929 |
undef, undef, undef, { weighted_fields => 1 } |
930 |
); |
930 |
); |
931 |
$fields = $query->{query}{query_string}{fields}; |
931 |
$fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
932 |
is_deeply( [ sort @$fields ], [ 'heading', 'headingmain' ], 'Authorities fields retrieve for authorities index' ); |
932 |
is_deeply( [ sort @$fields ], [ 'heading', 'headingmain' ], 'Authorities fields retrieve for authorities index' ); |
933 |
|
933 |
|
934 |
( undef, $query ) = $qb->build_query_compat( |
934 |
( undef, $query ) = $qb->build_query_compat( |
935 |
undef, ['title:"donald duck"'], undef, undef, |
935 |
undef, ['title:"donald duck"'], undef, undef, |
936 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 } |
936 |
undef, undef, undef, { weighted_fields => 1, is_opac => 1 } |
937 |
); |
937 |
); |
938 |
$fields = $query->{query}{query_string}{fields}; |
938 |
$fields = $query->{query}{bool}{must}[0]{query_string}{fields}; |
939 |
is_deeply( $fields, ['headingmain'], 'Only opac authorities fields retrieved for authorities index is is_opac' ); |
939 |
is_deeply( $fields, ['headingmain'], 'Only opac authorities fields retrieved for authorities index is is_opac' ); |
940 |
|
940 |
|
941 |
}; |
941 |
}; |
Lines 1169-1172
subtest "_sort_field() tests" => sub {
Link Here
|
1169 |
); |
1169 |
); |
1170 |
}; |
1170 |
}; |
1171 |
|
1171 |
|
|
|
1172 |
subtest "_build_field_match_boost_query() tests" => sub { |
1173 |
plan tests => 10; |
1174 |
|
1175 |
my $qb; |
1176 |
|
1177 |
ok( |
1178 |
$qb = Koha::SearchEngine::Elasticsearch::QueryBuilder->new( { 'index' => 'biblios' } ), |
1179 |
'Creating new query builder object for biblios' |
1180 |
); |
1181 |
|
1182 |
my $field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => [], operands => [] } ); |
1183 |
|
1184 |
is_deeply( |
1185 |
$field_match_boost_query, |
1186 |
[], |
1187 |
'Empty array is returned when no indexes or operands passed' |
1188 |
); |
1189 |
$field_match_boost_query = $qb->_build_field_match_boost_query(); |
1190 |
|
1191 |
is_deeply( |
1192 |
$field_match_boost_query, |
1193 |
[], |
1194 |
'Empty array is returned when no parameters passed' |
1195 |
); |
1196 |
|
1197 |
my @indexes = ( 'kw', 'subject', 'title' ); |
1198 |
my @operands; |
1199 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1200 |
is_deeply( |
1201 |
$field_match_boost_query, |
1202 |
[], |
1203 |
'Empty array is returned when no parameters passed' |
1204 |
); |
1205 |
|
1206 |
push @operands, "turkey"; |
1207 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1208 |
is_deeply( |
1209 |
$field_match_boost_query, |
1210 |
[ { match => { 'title-cover' => { query => 'turkey' } } } ], |
1211 |
'Keyword is converted to title-cover' |
1212 |
); |
1213 |
|
1214 |
push @operands, "gravy"; |
1215 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1216 |
is_deeply( |
1217 |
$field_match_boost_query, |
1218 |
[ |
1219 |
{ match => { 'title-cover' => { query => 'turkey' } } }, |
1220 |
{ match => { 'subject' => { query => 'gravy' } } } |
1221 |
], |
1222 |
'Subject is not converted' |
1223 |
); |
1224 |
|
1225 |
push @operands, "mashed"; |
1226 |
$field_match_boost_query = $qb->_build_field_match_boost_query( { indexes => \@indexes, operands => \@operands } ); |
1227 |
is_deeply( |
1228 |
$field_match_boost_query, |
1229 |
[ |
1230 |
{ match => { 'title-cover' => { query => 'turkey' } } }, |
1231 |
{ match => { 'subject' => { query => 'gravy' } } }, |
1232 |
{ match => { 'title-cover' => { query => 'mashed' } } }, |
1233 |
], |
1234 |
'Title is not converted to title-cover' |
1235 |
); |
1236 |
|
1237 |
t::lib::Mocks::mock_preference( 'ESBoostFieldMatch', '0' ); |
1238 |
t::lib::Mocks::mock_preference( 'QueryAutoTruncate', '1' ); |
1239 |
my ( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
1240 |
is( |
1241 |
$query->{query}{bool}{must}[0]{query_string}{query}, |
1242 |
'(title:(donald* duck*)) AND (author:disney*)', |
1243 |
'words of a multi-word term and single-word term are properly truncated' |
1244 |
); |
1245 |
is( |
1246 |
$query->{query}{bool}{should}, |
1247 |
undef, |
1248 |
'No should query added for boosting' |
1249 |
); |
1250 |
|
1251 |
t::lib::Mocks::mock_preference( 'ESBoostFieldMatch', '1' ); |
1252 |
( undef, $query ) = $qb->build_query_compat( ['AND'], [ 'donald duck', 'disney' ], [ 'title', 'author' ] ); |
1253 |
is_deeply( |
1254 |
$query->{query}{bool}{should}, |
1255 |
[ |
1256 |
{ match => { 'title-cover' => { query => 'donald duck' } } }, |
1257 |
{ match => { 'author' => { query => 'disney' } } } |
1258 |
], |
1259 |
'SHould query is correctly added' |
1260 |
); |
1261 |
|
1262 |
}; |
1263 |
|
1172 |
$schema->storage->txn_rollback; |
1264 |
$schema->storage->txn_rollback; |
1173 |
- |
|
|