[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