Bug 20596: Join authority queries together with OR

This patch joins authority queries together with OR like Elasticsearch.

To the best of the author's knowledge, this code only gets triggered
when using record matching rules, but there may be other situations
where it's used.

Authority search in cataloguing plugins use a different path, and
authority search in authority home doesn't allow multiple queries,
so they'll never trigger this OR joining of queries.

Test plan:
0. Apply patch and koha-plack --restart kohadev
1. Create a record matching rule with the following:
Matching rule code: NID
Description: NormdatenID
Match threshold: 100
Record type: Authority record
Search index: Any
Score: 101
Tag: 035
Subfields: a
Offset: 0
Length: 0
Normalization rule: None

Click "Remove this match check"

2. Stage gnd.xml (from BZ 20596 attachments)
- Choose "MARCXML" for "Format"
- Choose "Authority" for "Record type"
- Choose "NID" for "Record matching rule"
- Click "Stage for import"
3. Note the job gets to "100% Finished"
(Before this patch, it would say "0% Failed")

4. View the batch
5. Import the record
6. Repeat steps 2-4 and note that the record matching rule
worked

7. Go to http://localhost:8081/cgi-bin/koha/authorities/authorities-home.pl
8. Search for "e"
9. Note that the search works

10. Go to http://localhost:8081/cgi-bin/koha/cataloguing/addbiblio.pl?frameworkcode=
11. Click tab 6
12. Click on the tag editor next to "a Personal Name"
13. Type "e" into each box and click "Search"
14. Note that the search works

Signed-off-by: Jan Kissig <jan.kissig@th-wildau.de>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
David Cook 2022-12-14 04:58:41 +00:00 committed by Tomas Cohen Arazi
parent 7502f520a4
commit b2a23149bd
No known key found for this signature in database
GPG Key ID: 0A272EA1B2F3C15F
1 changed files with 17 additions and 1 deletions

View File

@ -207,9 +207,25 @@ sub SearchAuthorities {
}
##Add how many queries generated
if (defined $query && $query=~/\S+/){
#NOTE: This code path is used by authority search in cataloguing plugins...
#FIXME: This does not quite work the way the author probably intended.
#It creates a ($query prefix) AND (query 1) AND (query 2) structure instead of
#($query prefix) AND (query 1 AND query 2)
$query= $and x $attr_cnt . $query . (defined $q2 ? $q2 : '');
} else {
$query= $q2;
#NOTE: This code path is used by authority search in authority home and record matching rules...
my $op_prefix = '';
#NOTE: Without the following code, multiple queries will never be joined together
#with a Boolean operator.
if ($attr_cnt > 1){
#NOTE: We always need 1 less operator than we have operands,
#so long as there is more than 1 operand
my $or_cnt = $attr_cnt - 1;
#NOTE: We hard-code OR here because that's what Elasticsearch does
$op_prefix = ' @or ' x $or_cnt;
#NOTE: This evaluates to a logical structure like (query 1) OR (query 2) OR (query 3)
}
$query= $op_prefix . $q2;
}
## Adding order
#$query=' @or @attr 7=2 @attr 1=Heading 0 @or @attr 7=1 @attr 1=Heading 1'.$query if ($sortby eq "HeadingDsc");