[Rt-commit] r10731 - rt/branches/3.7-RTIR-RELENG/lib/RT
ruz at bestpractical.com
ruz at bestpractical.com
Tue Feb 5 16:20:57 EST 2008
Author: ruz
Date: Tue Feb 5 16:20:45 2008
New Revision: 10731
Modified:
rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm
Log:
* fix searches by link
* replace queries with more robust variants when search uses OR
Modified: rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm
==============================================================================
--- rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm (original)
+++ rt/branches/3.7-RTIR-RELENG/lib/RT/Tickets_Overlay.pm Tue Feb 5 16:20:45 2008
@@ -338,6 +338,11 @@
my $meta = $FIELD_METADATA{$field};
die "Invalid Operator $op for $field" unless $op =~ /^(=|!=|IS|IS NOT)$/io;
+ my $is_negative = 0;
+ if ( $op eq '!=' || $op =~ /\bNOT\b/i ) {
+ $is_negative = 1;
+ }
+
my $direction = $meta->[1] || '';
my ($matchfield, $linkfield) = ('', '');
if ( $direction eq 'To' ) {
@@ -348,6 +353,15 @@
}
elsif ( $direction ) {
die "Invalid link direction '$direction' for $field\n";
+ } else {
+ $sb->_OpenParen;
+ $sb->_LinkLimit( 'LinkedTo', $op, $value, @rest );
+ $sb->_LinkLimit(
+ 'LinkedFrom', $op, $value, @rest,
+ ENTRYAGGREGATOR => $is_negative? 'OR': 'AND'
+ );
+ $sb->_CloseParen;
+ return;
}
my ($is_local, $is_null) = (1, 0);
@@ -360,12 +374,6 @@
}
$matchfield = "Local$matchfield" if $is_local;
- my $is_negative = 0;
- if ( $op eq '!=' ) {
- $is_negative = 1;
- $op = '=';
- }
-
#For doing a left join to find "unlinked tickets" we want to generate a query that looks like this
# SELECT main.* FROM Tickets main
# LEFT JOIN Links Links_1 ON ( (Links_1.Type = 'MemberOf')
@@ -395,7 +403,7 @@
QUOTEVALUE => 0,
);
}
- elsif ( $is_negative ) {
+ else {
my $linkalias = $sb->Join(
TYPE => 'LEFT',
ALIAS1 => 'main',
@@ -412,83 +420,18 @@
$sb->SUPER::Limit(
LEFTJOIN => $linkalias,
FIELD => $matchfield,
- OPERATOR => $op,
+ OPERATOR => '=',
VALUE => $value,
);
$sb->_SQLLimit(
@rest,
ALIAS => $linkalias,
FIELD => $matchfield,
- OPERATOR => 'IS',
+ OPERATOR => $is_negative? 'IS': 'IS NOT',
VALUE => 'NULL',
QUOTEVALUE => 0,
);
}
- else {
- my $linkalias = $sb->NewAlias('Links');
- $sb->_OpenParen;
-
- $sb->_SQLLimit(
- @rest,
- ALIAS => $linkalias,
- FIELD => 'Type',
- OPERATOR => '=',
- VALUE => $meta->[2],
- ) if $meta->[2];
-
- $sb->_OpenParen;
- if ( $direction ) {
- $sb->_SQLLimit(
- ALIAS => $linkalias,
- FIELD => 'Local' . $linkfield,
- OPERATOR => '=',
- VALUE => 'main.id',
- QUOTEVALUE => 0,
- ENTRYAGGREGATOR => 'AND',
- );
- $sb->_SQLLimit(
- ALIAS => $linkalias,
- FIELD => $matchfield,
- OPERATOR => '=',
- VALUE => $value,
- ENTRYAGGREGATOR => 'AND',
- );
- } else {
- $sb->_OpenParen;
- $sb->_SQLLimit(
- ALIAS => $linkalias,
- FIELD => 'LocalBase',
- VALUE => 'main.id',
- QUOTEVALUE => 0,
- ENTRYAGGREGATOR => 'AND',
- );
- $sb->_SQLLimit(
- ALIAS => $linkalias,
- FIELD => $matchfield .'Target',
- VALUE => $value,
- ENTRYAGGREGATOR => 'AND',
- );
- $sb->_CloseParen;
-
- $sb->_OpenParen;
- $sb->_SQLLimit(
- ALIAS => $linkalias,
- FIELD => 'LocalTarget',
- VALUE => 'main.id',
- QUOTEVALUE => 0,
- ENTRYAGGREGATOR => 'OR',
- );
- $sb->_SQLLimit(
- ALIAS => $linkalias,
- FIELD => $matchfield .'Base',
- VALUE => $value,
- ENTRYAGGREGATOR => 'AND',
- );
- $sb->_CloseParen;
- }
- $sb->_CloseParen;
- $sb->_CloseParen;
- }
}
=head2 _DateLimit
More information about the Rt-commit
mailing list