1 package OpenSRF::DOM::Element::searchCriterium;
2 use base 'OpenSRF::DOM::Element';
3 use OpenSRF::DOM::Element::searchTargetValue;
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);
14 return @nodes if (wantarray);
22 my $column = $self->getAttribute('property');
23 my $cmp = lc($self->getAttribute('comparison'));
25 my $value = [ map { ($_->getAttribute('value')) } $self->childNodes ];
27 if ($cmp eq '=' || $cmp eq '==' || $cmp eq 'eq' || $cmp eq 'is') {
29 if (!$value || lc($value) eq 'null') {
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') {
38 if (!$value || lc($value) eq 'null') {
39 warn "Can not compare NULL";
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') {
46 if (!$value || lc($value) eq 'null') {
47 warn "Can not compare NULL";
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') {
54 if (!$value || lc($value) eq 'null') {
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 '@@') {
63 if (!$value || lc($value) eq 'null') {
64 warn "Can not compare NULL";
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') {
71 if (!$value || lc($value) eq 'null') {
72 warn "Can not compare NULL";
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') {
81 if (!ref($value) || lc($value) eq 'null') {
82 warn "Can not check 'betweenness' of NULL";
84 if (ref($value) and ref($value) =~ /ARRAY/o) {
85 $value = "(\$text\$$$value[0]\$text\$ AND \$text\$$$value[-1]\$text\$)";
87 } elsif ($cmp eq 'not between') {
89 if (!ref($value) || lc($value) eq 'null') {
90 warn "Can not check 'betweenness' of NULL";
92 if (ref($value) and ref($value) =~ /ARRAY/o) {
93 $value = "(\$text\$$$value[0]\$text\$ AND \$text\$$$value[-1]\$text\$)";
95 } elsif ($cmp eq 'in' || $cmp eq 'any' || $cmp eq 'some') {
97 if (!ref($value) || lc($value) eq 'null') {
98 warn "Can not check 'inness' of NULL";
100 if (ref($value) and ref($value) =~ /ARRAY/o) {
101 $value = '($text$'.join('$text$,$text$', @$value).'$text$)';
103 } elsif ($cmp eq 'not in' || $cmp eq 'not any' || $cmp eq 'not some') {
105 if (!ref($value) || lc($value) eq 'null') {
106 warn "Can not check 'inness' of NULL";
108 if (ref($value) and ref($value) =~ /ARRAY/o) {
109 $value = '($text$'.join('$text$,$text$', @$value).'$text$)';
113 return join(' ', ($column, $cmp, $value));