summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Search
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla/Search')
-rw-r--r--Bugzilla/Search/Clause.pm20
-rw-r--r--Bugzilla/Search/Condition.pm12
2 files changed, 26 insertions, 6 deletions
diff --git a/Bugzilla/Search/Clause.pm b/Bugzilla/Search/Clause.pm
index e31bfdd40..aa87842af 100644
--- a/Bugzilla/Search/Clause.pm
+++ b/Bugzilla/Search/Clause.pm
@@ -21,10 +21,18 @@
package Bugzilla::Search::Clause;
use strict;
+
+use Bugzilla::Error;
use Bugzilla::Search::Condition qw(condition);
+use Bugzilla::Util qw(trick_taint);
sub new {
my ($class, $joiner) = @_;
+ if ($joiner and $joiner ne 'OR' and $joiner ne 'AND') {
+ ThrowCodeError('search_invalid_joiner', { joiner => $joiner });
+ }
+ # This will go into SQL directly so needs to be untainted.
+ trick_taint($joiner) if $joiner;
bless { joiner => $joiner || 'AND' }, $class;
}
@@ -41,12 +49,14 @@ sub has_children {
return scalar(@{ $self->children }) > 0 ? 1 : 0;
}
-sub has_conditions {
+sub has_valid_conditions {
my ($self) = @_;
my $children = $self->children;
- return 1 if grep { $_->isa('Bugzilla::Search::Condition') } @$children;
+ return 1 if grep { $_->isa('Bugzilla::Search::Condition')
+ && $_->translated } @$children;
foreach my $child (@$children) {
- return 1 if $child->has_conditions;
+ next if $child->isa('Bugzilla::Search::Condition');
+ return 1 if $child->has_valid_conditions;
}
return 0;
}
@@ -69,7 +79,7 @@ sub add {
sub negate {
my ($self, $value) = @_;
if (@_ == 2) {
- $self->{negate} = $value;
+ $self->{negate} = $value ? 1 : 0;
}
return $self->{negate};
}
@@ -90,7 +100,7 @@ sub as_string {
my ($self) = @_;
my @strings;
foreach my $child (@{ $self->children }) {
- next if $child->isa(__PACKAGE__) && !$child->has_conditions;
+ next if $child->isa(__PACKAGE__) && !$child->has_valid_conditions;
next if $child->isa('Bugzilla::Search::Condition')
&& !$child->translated;
diff --git a/Bugzilla/Search/Condition.pm b/Bugzilla/Search/Condition.pm
index db20e7f3b..8fe05f065 100644
--- a/Bugzilla/Search/Condition.pm
+++ b/Bugzilla/Search/Condition.pm
@@ -50,7 +50,17 @@ sub translated {
sub as_string {
my ($self) = @_;
- return $self->translated->{term};
+ my $term = $self->translated->{term};
+ $term = "NOT( $term )" if $term && $self->negate;
+ return $term;
+}
+
+sub negate {
+ my ($self, $value) = @_;
+ if (@_ == 2) {
+ $self->{negate} = $value ? 1 : 0;
+ }
+ return $self->{negate};
}
###########################