Initial revision
[OpenSRF.git] / src / perlmods / OpenSRF / DOM / Element / searchCriterium.pm
1 package OpenSRF::DOM::Element::searchCriterium;
2 use base 'OpenSRF::DOM::Element';
3 use OpenSRF::DOM::Element::searchTargetValue;
4
5 sub new {
6         my $class = shift;
7         my @nodes;
8         my @args = @_;
9         while (scalar(@args)) {
10                 my ($attr,$cmp,$val) = (shift(@args),shift(@args),shift(@args),shift(@args));
11                 push @nodes, $class->SUPER::new(property => $attr, comparison => $cmp);
12                 $nodes[-1]->appendChild( $_ ) for OpenSRF::DOM::Element::searchTargetValue->new($val);
13         }
14         return @nodes if (wantarray);
15         return $nodes[0];
16 }
17
18 sub toSQL {
19         my $self = shift;
20         my %args = @_;
21
22         my $column = $self->getAttribute('property');
23         my $cmp = lc($self->getAttribute('comparison'));
24
25         my $value = [ map { ($_->getAttribute('value')) } $self->childNodes ];
26
27         if ($cmp eq '=' || $cmp eq '==' || $cmp eq 'eq' || $cmp eq 'is') {
28                 $cmp = '=';
29                 if (!$value || lc($value) eq 'null') {
30                         $cmp = 'IS';
31                         $value = 'NULL';
32                 }
33                 ($value = $value->[0]) =~ s/'/''/gmso;
34                 $value =~ s/\\/\\\\/gmso;
35                 $value = "'$value'" unless $args{no_quote};
36         } elsif ($cmp eq '>' || $cmp eq 'gt' || $cmp eq 'over' || $cmp eq 'after') {
37                 $cmp = '>';
38                 if (!$value || lc($value) eq 'null') {
39                         warn "Can not compare NULL";
40                 }
41                 ($value = $value->[0]) =~ s/'/''/gmso;
42                 $value =~ s/\\/\\\\/gmso;
43                 $value = "'$value'" unless $args{no_quote};
44         } elsif ($cmp eq '<' || $cmp eq 'lt' || $cmp eq 'under' || $cmp eq 'before') {
45                 $cmp = '<';
46                 if (!$value || lc($value) eq 'null') {
47                         warn "Can not compare NULL";
48                 }
49                 ($value = $value->[0]) =~ s/'/''/gmso;
50                 $value =~ s/\\/\\\\/gmso;
51                 $value = "'$value'" unless $args{no_quote};
52         } elsif ($cmp eq '!=' || $cmp eq '<>' || $cmp eq 'ne' || $cmp eq 'not') {
53                 $cmp = '<>';
54                 if (!$value || lc($value) eq 'null') {
55                         $cmp = 'IS NOT';
56                         $value = 'NULL';
57                 }
58                 ($value = $value->[0]) =~ s/'/''/gmso;
59                 $value =~ s/\\/\\\\/gmso;
60                 $value = "'$value'" unless $args{no_quote};
61         } elsif (lc($cmp) eq 'fts' || $cmp eq 'tsearch' || $cmp eq '@@') {
62                 $cmp = '@@';
63                 if (!$value || lc($value) eq 'null') {
64                         warn "Can not compare NULL";
65                 }
66                 ($value = $value->[0]) =~ s/'/''/gmso;
67                 $value =~ s/\\/\\\\/gmso;
68                 $value = "to_tsquery('$value')";
69         } elsif ($cmp eq 'like' || $cmp eq 'contains' || $cmp eq 'has') {
70                 $cmp = 'LIKE';
71                 if (!$value || lc($value) eq 'null') {
72                         warn "Can not compare NULL";
73                 }
74                 ($value = $value->[0]) =~ s/'/''/gmso;
75                 $value =~ s/\\/\\\\/gmso;
76                 $value =~ s/%/\\%/gmso;
77                 $value =~ s/_/\\_/gmso;
78                 $value = "'\%$value\%'";
79         } elsif ($cmp eq 'between') {
80                 $cmp = 'BETWEEN';
81                 if (!ref($value) || lc($value) eq 'null') {
82                         warn "Can not check 'betweenness' of NULL";
83                 }
84                 if (ref($value) and ref($value) =~ /ARRAY/o) {
85                         $value = "(\$text\$$$value[0]\$text\$ AND \$text\$$$value[-1]\$text\$)";
86                 }
87         } elsif ($cmp eq 'not between') {
88                 $cmp = 'NOT BETWEEN';
89                 if (!ref($value) || lc($value) eq 'null') {
90                         warn "Can not check 'betweenness' of NULL";
91                 }
92                 if (ref($value) and ref($value) =~ /ARRAY/o) {
93                         $value = "(\$text\$$$value[0]\$text\$ AND \$text\$$$value[-1]\$text\$)";
94                 }
95         } elsif ($cmp eq 'in' || $cmp eq 'any' || $cmp eq 'some') {
96                 $cmp = 'IN';
97                 if (!ref($value) || lc($value) eq 'null') {
98                         warn "Can not check 'inness' of NULL";
99                 }
100                 if (ref($value) and ref($value) =~ /ARRAY/o) {
101                         $value = '($text$'.join('$text$,$text$', @$value).'$text$)';
102                 }
103         } elsif ($cmp eq 'not in' || $cmp eq 'not any' || $cmp eq 'not some') {
104                 $cmp = 'NOT IN';
105                 if (!ref($value) || lc($value) eq 'null') {
106                         warn "Can not check 'inness' of NULL";
107                 }
108                 if (ref($value) and ref($value) =~ /ARRAY/o) {
109                         $value = '($text$'.join('$text$,$text$', @$value).'$text$)';
110                 }
111         }
112
113         return join(' ', ($column, $cmp, $value));
114 }
115
116 1;