[rt-commit] r304 - rt/branches/rt-3.1/lib/RT
jesse at fsck.com
jesse at fsck.com
Sun Dec 14 23:32:26 EST 2003
Author: jesse
Date: 2003-12-13 23:18:58 -0500 (Sat, 13 Dec 2003)
New Revision: 304
Modified:
rt/branches/rt-3.1/lib/RT/Tickets_Overlay_SQL.pm
Log:
TicketSQL parser additions. first cut of "SELECT" functionality
Modified: rt/branches/rt-3.1/lib/RT/Tickets_Overlay_SQL.pm
===================================================================
--- rt/branches/rt-3.1/lib/RT/Tickets_Overlay_SQL.pm 2003-12-13 00:30:00 UTC (rev 303)
+++ rt/branches/rt-3.1/lib/RT/Tickets_Overlay_SQL.pm 2003-12-14 04:18:58 UTC (rev 304)
@@ -115,10 +115,16 @@
use constant OP => 4;
use constant PAREN => 8;
use constant KEYWORD => 16;
-my @tokens = qw[VALUE AGGREG OP PAREN KEYWORD];
+use constant SELECT => 32;
+use constant WHERE => 64;
+use constant COLUMN => 128;
+my @tokens = qw[VALUE AGGREG OP PAREN KEYWORD SELECT WHERE COLUMN];
my $re_aggreg = qr[(?i:AND|OR)];
+my $re_select = qr[(?i:SELECT)];
+my $re_where = qr[(?i:WHERE)];
my $re_value = qr[$RE{delimited}{-delim=>qq{\'\"}}|\d+];
+my $re_column = qr[$RE{delimited}{-delim=>qq{\'\"}}|\d+];
my $re_keyword = qr[$RE{delimited}{-delim=>qq{\'\"}}|(?:\{|\}|\w|\.)+];
my $re_op = qr[=|!=|>=|<=|>|<|(?i:IS NOT)|(?i:IS)|(?i:NOT LIKE)|(?i:LIKE)]; # long to short
my $re_paren = qr'\(|\)';
@@ -157,7 +163,7 @@
sub _parser {
my ($self,$string) = @_;
- my $want = KEYWORD | PAREN;
+ my $want = SELECT | KEYWORD | PAREN;
my $last = undef;
my $depth = 0;
@@ -169,8 +175,15 @@
# because it has spaces in it. otherwise "NOT LIKE" might be parsed
# as a keyword or value.
+
+
+
+
while ($string =~ /(
- $re_aggreg
+ $re_select
+ |$re_where
+ |$re_column
+ |$re_aggreg
|$re_op
|$re_keyword
|$re_value
@@ -185,7 +198,10 @@
$current = KEYWORD if _match($re_keyword,$val) && ($want & KEYWORD);
$current = AGGREG if _match($re_aggreg,$val);
$current = PAREN if _match($re_paren,$val);
+ $current = COLUMN if _match($re_column,$val) && ($want & COLUMN);
+ $current = SELECT if _match($re_select,$val);
+
unless ($current && $want & $current) {
# Error
# FIXME: I will only print out the highest $want value
@@ -209,6 +225,19 @@
$want = KEYWORD | PAREN | AGGREG;
}
+ elsif ($current & SELECT ) {
+ $want = COLUMN | WHERE;
+ }
+
+ elsif ($current & COLUMN ) {
+ push @{$self->{'columns_to_display'}}, $val;
+ $want = COLUMN | WHERE;
+
+ }
+ elsif ($current & WHERE ) {
+ $want = KEYWORD | PAREN;
+
+ }
elsif ( $current & AGGREG ) {
$ea = $val;
$want = KEYWORD | PAREN;
@@ -395,7 +424,7 @@
$self->{'must_redo_search'} = 1;
$self->{'RecalcTicketLimits'} = 0;
- return (1,"Good Query");
+ return (1,loc("Valid Query"));
}
More information about the Rt-commit
mailing list