Bug 9239: Introduce QueryParser driver for PQF
[koha.git] / Koha / QueryParser / Driver / PQF / query_plan / node.pm
1 package Koha::QueryParser::Driver::PQF::query_plan::node;
2 use base 'OpenILS::QueryParser::query_plan::node';
3
4 use strict;
5 use warnings;
6
7 =head2 Koha::QueryParser::Driver::PQF::query_plan::node::target_syntax
8
9     my $pqf = $node->target_syntax($server);
10
11 Transforms an OpenILS::QueryParser::query_plan::node object into PQF. Do not use directly.
12
13 =cut
14
15 sub target_syntax {
16     my ($self, $server) = @_;
17     my $pqf = '';
18     my $atom_content;
19     my $atom_count = 0;
20     my @fields = ();
21     my $fieldobj;
22     my $relbump;
23
24     if (scalar(@{$self->fields})) {
25         foreach my $field (@{$self->fields}) {
26             $fieldobj = $self->plan->QueryParser->bib1_mapping_by_name('field', $self->classname, $field, $server);
27             $relbump = $self->plan->QueryParser->bib1_mapping_by_name('relevance_bump', $self->classname, $field, $server);
28             if ($relbump) {
29                 $fieldobj->{'attr_string'} .= ' ' . $relbump->{'attr_string'};
30             }
31             push @fields, $fieldobj unless ($field eq $self->classname && scalar @fields);
32         }
33     } else {
34         $fieldobj = $self->plan->QueryParser->bib1_mapping_by_name('field', $self->classname, $self->classname, $server);
35         my $relbumps = $self->plan->QueryParser->bib1_mapping_by_name('relevance_bump', $self->classname, '', $server);
36         push @fields, $fieldobj;
37         if ($relbumps) {
38             foreach my $field (keys %$relbumps) {
39                 $relbump = $relbumps->{$field};
40                 $fieldobj = $self->plan->QueryParser->bib1_mapping_by_name('field', $relbump->{'classname'}, $relbump->{'field'}, $server);
41                 $fieldobj->{'attr_string'} ||= '';
42                 $fieldobj->{'attr_string'} .= ' ' . $relbump->{$server}{'attr_string'} if $relbump->{$server}{'attr_string'};
43                 push @fields, $fieldobj;
44             }
45         }
46     }
47
48     if (@{$self->phrases}) {
49         foreach my $phrase (@{$self->phrases}) {
50             if ($phrase) {
51                 $pqf .= ' @or ' x (scalar(@fields) - 1);
52                 foreach my $attributes (@fields) {
53                     $pqf .= $attributes->{'attr_string'} . ($attributes->{'4'} ? '' : ' @attr 4=1') . ' "' . $phrase . '" ';
54                 }
55                 $atom_count++;
56             }
57         }
58     } else {
59         foreach my $atom (@{$self->query_atoms}) {
60             if (ref($atom)) {
61                 $atom_content = $atom->target_syntax($server);
62                 if ($atom_content) {
63                     $pqf .= ' @or ' x (scalar(@fields) - 1);
64                     foreach my $attributes (@fields) {
65                         $pqf .= $attributes->{'attr_string'} . ($attributes->{'4'} ? '' : ' @attr 4=6 ') . $atom_content . ' ';
66                     }
67                     $atom_count++;
68                 }
69             }
70         }
71     }
72     $pqf = (OpenILS::QueryParser::_util::default_joiner eq '|' ? ' @or ' : ' @and ') x ($atom_count - 1) . $pqf;
73     return ($self->negate ? '@not @attr 1=_ALLRECORDS @attr 2=103 "" ' : '') . $pqf;
74 }
75
76 1;