[Jifty-commit] r5057 - Jifty-DBI/branches/tisql/lib/Jifty/DBI

Jifty commits jifty-commit at lists.jifty.org
Wed Feb 6 11:12:41 EST 2008


Author: ruz
Date: Wed Feb  6 11:12:40 2008
New Revision: 5057

Modified:
   Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm

Log:
* refactor structures a little

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	Wed Feb  6 11:12:40 2008
@@ -10,6 +10,7 @@
 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_alias  = qr{$re_column\s+AS\s+$re_field}i;
 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.]+};
@@ -34,22 +35,24 @@
     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 $tree = {
+        joins => {},
+        conditions => undef,
+    };
+    
+    # parse "FROM..." prefix into $tree->{'joins'}
+    if ( $string =~ s/^\s*FROM\s+($re_alias(?:\s*,\s*$re_alias)*)\s+WHERE\s+//oi ) {
+        $tree->{'joins'}->{ $_->[1] } = $self->find_column( $_->[0], $tree->{'joins'} )
+            foreach map [split /\s+AS\s+/i, $_], split /,/, $1;
     }
 
-    my $query_tree = $self->as_array(
+    $tree->{'conditions'} = $self->as_array(
         $string,
-        operand_cb => sub { return $self->split_condition( $_[0], \%aliases ) },
+        operand_cb => sub { return $self->split_condition( $_[0], $tree->{'joins'} ) },
     );
-    use Data::Dumper; warn Dumper( $query_tree );
-    $self->apply_query_tree( $query_tree );
-    return $query_tree;
+    use Data::Dumper; warn Dumper( $tree->{'conditions'} );
+    $self->apply_query_tree( $tree->{'conditions'} );
+    return $tree;
 }
 
 sub apply_query_tree {


More information about the Jifty-commit mailing list