diff options
author | Frédéric Buclin <LpSolit@gmail.com> | 2013-09-16 17:06:22 +0200 |
---|---|---|
committer | Frédéric Buclin <LpSolit@gmail.com> | 2013-09-16 17:06:22 +0200 |
commit | e09c1e75bee8b09414e90ca0795875110c056540 (patch) | |
tree | 764ad5e8ccb2ce3c222568257a3fdc67c7aae912 | |
parent | Bug 911509: SOAP::Lite 1.0 no longer includes XMLRPC::Lite (diff) | |
download | bugzilla-e09c1e75bee8b09414e90ca0795875110c056540.tar.gz bugzilla-e09c1e75bee8b09414e90ca0795875110c056540.tar.bz2 bugzilla-e09c1e75bee8b09414e90ca0795875110c056540.zip |
Bug 785565: Search by change history between two dates doesn't give expected result
r/a=glob
-rw-r--r-- | Bugzilla/Search.pm | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index fba6ea07d..b2c703e5b 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -1477,6 +1477,8 @@ sub _special_parse_chfield { @fields = map { $_ eq '[Bug creation]' ? 'creation_ts' : $_ } @fields; + return undef unless ($date_from ne '' || $date_to ne '' || $value_to ne ''); + my $clause = new Bugzilla::Search::Clause(); # It is always safe and useful to push delta_ts into the charts @@ -1498,44 +1500,21 @@ sub _special_parse_chfield { $clause->add('delta_ts', 'lessthaneq', $date_to); } - # Basically, we construct the chart like: - # - # (added_for_field1 = value OR added_for_field2 = value) - # AND (date_field1_changed >= date_from OR date_field2_changed >= date_from) - # AND (date_field1_changed <= date_to OR date_field2_changed <= date_to) - # - # Theoretically, all we *really* would need to do is look for the field id - # in the bugs_activity table, because we've already limited the search - # by delta_ts above, but there's no chart to do that, so we check the - # change date of the fields. - - if ($value_to ne '') { - my $value_clause = new Bugzilla::Search::Clause('OR'); - foreach my $field (@fields) { - $value_clause->add($field, 'changedto', $value_to); - } - $clause->add($value_clause); - } + # chfieldto is supposed to be a relative date or a date of the form + # YYYY-MM-DD, i.e. without the time appended to it. We append the + # time ourselves so that the end date is correctly taken into account. + $date_to .= ' 23:59:59' if $date_to =~ /^\d{4}-\d{1,2}-\d{1,2}$/; - if ($date_from ne '') { - my $from_clause = new Bugzilla::Search::Clause('OR'); - foreach my $field (@fields) { - $from_clause->add($field, 'changedafter', $date_from); - } - $clause->add($from_clause); - } - if ($date_to ne '') { - # chfieldto is supposed to be a relative date or a date of the form - # YYYY-MM-DD, i.e. without the time appended to it. We append the - # time ourselves so that the end date is correctly taken into account. - $date_to .= ' 23:59:59' if $date_to =~ /^\d{4}-\d{1,2}-\d{1,2}$/; + my $join_clause = new Bugzilla::Search::Clause('OR'); - my $to_clause = new Bugzilla::Search::Clause('OR'); - foreach my $field (@fields) { - $to_clause->add($field, 'changedbefore', $date_to); - } - $clause->add($to_clause); + foreach my $field (@fields) { + my $sub_clause = new Bugzilla::Search::ClauseGroup(); + $sub_clause->add(condition($field, 'changedto', $value_to)) if $value_to ne ''; + $sub_clause->add(condition($field, 'changedafter', $date_from)) if $date_from ne ''; + $sub_clause->add(condition($field, 'changedbefore', $date_to)) if $date_to ne ''; + $join_clause->add($sub_clause); } + $clause->add($join_clause); return @{$clause->children} ? $clause : undef; } |