[Jifty-commit] r5055 - in Jifty-DBI/branches/tisql: lib/Jifty/DBI
Jifty commits
jifty-commit at lists.jifty.org
Tue Feb 5 23:02:43 EST 2008
Author: ruz
Date: Tue Feb 5 23:02:43 2008
New Revision: 5055
Modified:
Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm
Jifty-DBI/branches/tisql/t/tisql/basics.t
Log:
* cahnge syntax to '.xxx.yyy ...' the same as 'main.xxx.yyy ...'
* simple and brute force implementation of "from .xxx.yyy as y1, y1.ttt as t1 where"
Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm (original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm Tue Feb 5 23:02:43 2008
@@ -8,20 +8,45 @@
use Regexp::Common qw(delimited);
my $re_delim = qr{$RE{delimited}{-delim=>qq{\'\"}}};
my $re_field = qr{[a-zA-Z][a-zA-Z0-9_]*};
-my $re_column = qr{$re_field(?:\.$re_field)*};
+my $re_column = qr{\.?$re_field(?:\.$re_field)*};
my $re_sql_op_bin = qr{!?=|<>|>=?|<=?|(?:NOT )?LIKE}i;
my $re_sql_op_un = qr{IS (?:NOT )?NULL}i;
my $re_value = qr{$re_delim|[0-9.]+};
+my $re_op_positive = qr/^(?:=|IS|LIKE)$/i;
+my $re_op_negative = qr/^(?:!=|<>|IS NOT|NOT LIKE)$/i;
+my %invert_op = (
+ '=' => '!=',
+ '!=' => '=',
+ '<>' => '=',
+ 'is' => 'IS NOT',
+ 'is not' => 'IS',
+ 'like' => 'NOT LIKE',
+ 'not like' => 'LIKE',
+ '>' => '<=',
+ '>=' => '<',
+ '<' => '>=',
+ '<=' => '>',
+);
+
sub parse_query {
my $self = shift;
my $string = shift;
+ my @pre_joins;
+ if ( $string =~ s/^\s*FROM\s+($re_column\s+AS\s+$re_field(?:\s*,\s*$re_column\s+AS\s+$re_field)*)\s+WHERE\s+//i ) {
+ @pre_joins = map [split /\s+AS\s+/i, $_], split /,/, $1;
+ }
+ my %aliases = ();
+ foreach my $join ( @pre_joins ) {
+ $aliases{ $join->[1] } = $self->find_column( $join->[0], \%aliases );
+ }
+
my $query_tree = $self->as_array(
$string,
- operand_cb => sub { return $self->split_condition( $_[0] ) },
+ operand_cb => sub { return $self->split_condition( $_[0], \%aliases ) },
);
- #use Data::Dumper; warn Dumper( $query_tree );
+ use Data::Dumper; warn Dumper( $query_tree );
$self->apply_query_tree( $query_tree );
return $query_tree;
}
@@ -124,9 +149,10 @@
sub split_condition {
my $self = shift;
my $string = shift;
+ my $aliases = shift;
if ( $string =~ /^($re_column)\s*($re_sql_op_bin)\s*($re_value)$/o ) {
- my ($lhs, $op, $rhs) = ($self->find_column($1), $2, $3);
+ my ($lhs, $op, $rhs) = ($self->find_column($1, $aliases), $2, $3);
if ( $rhs =~ /^$re_delim$/ ) {
$rhs =~ s/^["']//g;
$rhs =~ s/["']$//g;
@@ -134,12 +160,12 @@
return { lhs => $lhs, op => $op, rhs => $rhs };
}
elsif ( $string =~ /^($re_column)\s*($re_sql_op_un)$/o ) {
- my ($lhs, $op, $rhs) = ($self->find_column($1), $2, $3);
+ my ($lhs, $op, $rhs) = ($self->find_column($1, $aliases), $2, $3);
($op, $rhs) = split /\s*(?=null)/i, $op;
return { lhs => $lhs, op => $op, rhs => $rhs };
}
elsif ( $string =~ /^($re_column)\s*($re_sql_op_bin)\s*($re_column)$/o ) {
- return { lhs => $self->find_column($1), op => $2, rhs => $self->find_column($3) };
+ return { lhs => $self->find_column($1, $aliases), op => $2, rhs => $self->find_column($3, $aliases) };
}
else {
die "$string is not a tisql condition";
@@ -149,11 +175,19 @@
sub find_column {
my $self = shift;
my $string = shift;
+ my $aliases = shift;
my @res;
- my @names = split /\./, $string;
- my $item = $self->{'collection'}->new_item;
+ my ($start_from, @names) = split /\./, $string;
+ my $item;
+ unless ( $start_from ) {
+ $item = $self->{'collection'}->new_item;
+ } else {
+ $item = $aliases->{ $start_from }->[-1]->refers_to->new( handle => $self->{'collection'}->_handle ) || die "$start_from alias is not defined";
+ push @res, @{ $aliases->{ $start_from } };
+ use Data::Dumper; print Dumper($item);
+ }
while ( my $name = shift @names ) {
my $column = $item->column( $name );
die "$item has no column '$name'" unless $column;
@@ -180,8 +214,4 @@
return \@res;
}
-
-
-
-
1;
Modified: Jifty-DBI/branches/tisql/t/tisql/basics.t
==============================================================================
--- Jifty-DBI/branches/tisql/t/tisql/basics.t (original)
+++ Jifty-DBI/branches/tisql/t/tisql/basics.t Tue Feb 5 23:02:43 2008
@@ -9,11 +9,13 @@
BEGIN { require "t/utils.pl" }
our (@available_drivers);
-use constant TESTS_PER_DRIVER => 2;
+use constant TESTS_PER_DRIVER => 6;
my $total = scalar(@available_drivers) * TESTS_PER_DRIVER;
plan tests => $total;
+use Data::Dumper;
+
foreach my $d ( @available_drivers ) {
SKIP: {
unless( has_schema( 'TestApp', $d ) ) {
@@ -41,21 +43,25 @@
my $users_obj = $clean_obj->clone;
is_deeply( $users_obj, $clean_obj, 'after Clone looks the same');
- $users_obj->tisql('login = "ivan" OR ( login like "au%" AND login not like "%n%" )');
+ $users_obj->tisql('.login = "ivan" OR ( .login like "au%" AND .login not like "%n%" )');
diag $users_obj->build_select_query;
$users_obj->clean_slate;
- $users_obj->tisql('gm.grp.name = "Support"');
+ $users_obj->tisql('.gm.grp.name = "Support"');
diag $users_obj->build_select_query;
- use Data::Dumper;
diag Dumper( $users_obj->items_array_ref );
$users_obj->clean_slate;
- $users_obj->tisql('gm.grp is null');
+ $users_obj->tisql('from .gm.grp as g1 where g1.name = "Support" or g1.name = "Developers"');
diag $users_obj->build_select_query;
- use Data::Dumper;
diag Dumper( $users_obj->items_array_ref );
+# $users_obj->clean_slate;
+# $users_obj->tisql('.gm.grp is null');
+# diag $users_obj->build_select_query;
+# use Data::Dumper;
+# diag Dumper( $users_obj->items_array_ref );
+
cleanup_schema( 'TestApp', $handle );
}} # SKIP, foreach blocks
More information about the Jifty-commit
mailing list