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

Jifty commits jifty-commit at lists.jifty.org
Sat Aug 16 15:04:25 EDT 2008


Author: ruz
Date: Sat Aug 16 15:04:17 2008
New Revision: 5737

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

Log:
* get rid of chain array, use just column

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	Sat Aug 16 15:04:17 2008
@@ -142,14 +142,14 @@
             leftjoin         => $join,
             entry_aggregator => $ea,
             alias            => $self->resolve_join( $condition->{'lhs'} ),
-            column           => $condition->{'lhs'}{'chain'}[-1]->name,
+            column           => $condition->{'lhs'}{'column'}->name,
             operator         => $op,
         );
         if ( ref $condition->{'rhs'} ) {
             $limit{'quote_value'} = 0;
             $limit{'value'} =
                 $self->resolve_join( $condition->{'rhs'} )
-                .'.'. $condition->{'rhs'}{'chain'}[-1]->name;
+                .'.'. $condition->{'rhs'}{'column'}->name;
         } else {
             $limit{'value'} = $condition->{'rhs'};
         }
@@ -162,14 +162,14 @@
         my %limit = (
             subclause        => 'tisql',
             alias            => $self->resolve_join( $condition->{'lhs'} ),
-            column           => $condition->{'lhs'}{'chain'}[-1]->name,
+            column           => $condition->{'lhs'}{'column'}->name,
             operator         => $op,
         );
         if ( ref $condition->{'rhs'} ) {
             $limit{'quote_value'} = 0;
             $limit{'value'} =
                 $self->resolve_join( $condition->{'rhs'} )
-                .'.'. $condition->{'rhs'}{'chain'}[-1]->name;
+                .'.'. $condition->{'rhs'}{'column'}->name;
         } else {
             $limit{'value'} = $condition->{'rhs'};
         }
@@ -195,82 +195,60 @@
 sub resolve_join {
     my $self = shift;
     my $meta = shift;
+    my $resolve_last = shift;
 
-    return $meta->{'sql_alias'} if $meta->{'sql_alias'};
+    return $meta->{'sql_alias'}
+        if $meta->{'sql_alias'} && $resolve_last;
 
     my $collection = $self->{'collection'};
 
-    my ($last_alias) = ('main');
+    my ($prev_alias) = ('main');
     if ( my $prev = $meta->{'previous'} ) {
-        $last_alias = $self->resolve_join( $prev );
+        $prev_alias = $self->resolve_join( $prev, 'resolve_last' );
     }
+    return $prev_alias unless $resolve_last;
 
-    my @chain = @{ $meta->{'chain'} };
-    if ( @chain == 1 && !$chain[0]->virtual ) {
-        return $last_alias;
-    }
-
-    while( my $column = shift @chain ) {
-        my $name = $column->name;
-
-        return $last_alias unless @chain;
-
-        my $classname = $column->refers_to;
-        unless ( $classname ) {
-            die "column '$name' is not a reference when there are still items in the chain"
-                if @chain;
-            return $last_alias;
-        }
-
-        if ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Collection' ) ) {
-            my $item = $classname->new( handle => $collection->_handle )->new_item;
-            my $right_alias;
-            if ( my $tisql = $column->tisql ) {
-                $right_alias = $self->resolve_tisql_join(
-                    chain      => $meta->{'previous'},
-                    alias      => $last_alias,
-                    collection => $collection,
-                    column     => $column,
-                );
-            } else {
-                $right_alias = $collection->new_alias( $item );
-                $collection->join(
-                    subclause => 'tisql',
-                    type    => 'left',
-                    alias1  => $last_alias,
-                    column1 => 'id',
-                    alias2  => $right_alias,
-                    column2 => $column->by || 'id',
-                );
-            }
-            $last_alias = $right_alias;
-        }
-        elsif ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Record' ) ) {
-            my $item = $classname->new( handle => $collection->_handle );
-            my $right_alias = $collection->new_alias( $item );
+    my $res;
+    my $column = $meta->{'column'};
+    my $refers = $meta->{'refers_to'};
+    if ( UNIVERSAL::isa( $refers, 'Jifty::DBI::Collection' ) ) {
+        my $item = $refers->new_item;
+        if ( my $tisql = $column->tisql ) {
+            $res = $self->resolve_tisql_join(
+                chain      => $meta->{'previous'},
+                alias      => $prev_alias,
+                collection => $collection,
+                column     => $column,
+            );
+        } else {
+            $res = $collection->new_alias( $item );
             $collection->join(
                 subclause => 'tisql',
                 type    => 'left',
-                alias1  => $last_alias,
-                column1 => $name,
-                alias2  => $right_alias,
+                alias1  => $prev_alias,
+                column1 => 'id',
+                alias2  => $res,
                 column2 => $column->by || 'id',
             );
-            $last_alias = $right_alias;
-        }
-        else {
-            die "Column '$name' refers to '$classname' which is not record or collection";
         }
-
-        $meta->{'previous'} = {
-            chain     => [$column],
-            previous  => $meta->{'previous'},
-            string    => ($meta->{'previous'}? $meta->{'previous'}{'string'} : '') .'.'. $name,
-            sql_alias => $last_alias,
-        };
-        $meta->{'chain'} = [ @chain ];
     }
-    return $meta->{'sql_alias'} = $last_alias;
+    elsif ( UNIVERSAL::isa( $refers, 'Jifty::DBI::Record' ) ) {
+        $res = $collection->new_alias( $refers );
+        $collection->join(
+            subclause => 'tisql',
+            type    => 'left',
+            alias1  => $prev_alias,
+            column1 => $column->name,
+            alias2  => $res,
+            column2 => $column->by || 'id',
+        );
+    }
+    else { 
+        die "Column '". $column->name ."' refers to '"
+            . (ref($refers) || $refers)
+            ."' that is not record or collection";
+    }
+    return $res;
 }
 
 sub resolve_tisql_join {
@@ -280,9 +258,8 @@
     my $collection = $args{'collection'};
 
     my $query = $args{'column'}->tisql;
-    my $right_alias = $collection->new_alias(
-        $args{'column'}->refers_to->new( handle => $collection->_handle )->new_item
-    );
+    my $refers_to = $args{'column'}->refers_to->new( handle => $collection->_handle );
+    my $right_alias = $collection->new_alias( $refers_to->new_item );
 
     my $tree = $self->as_array(
         $query,
@@ -292,8 +269,9 @@
                 {
                     '' => $args{'chain'},
                     $args{'column'}->name => { 
-                        chain => [ $args{'column'} ],
-                        string => '',
+                        column    => $args{'column'},
+                        refers_to => $refers_to,
+                        string    => '',
                         sql_alias => $right_alias,
                     } 
                 },
@@ -321,14 +299,14 @@
             $rhs =~ s/["']$//g;
         }
         die "Last column in '". $lhs->{'string'} ."' is virtual and can not be used in condition '$string'" 
-            if $lhs->{'chain'}[-1]->virtual;
+            if $lhs->{'column'}->virtual;
         return { string => $string, prefix => $prefix, lhs => $lhs, op => $op, rhs => $rhs };
     }
     elsif ( $string =~ /^($re_column)\s*($re_sql_op_un)$/o ) {
         my ($lhs, $op, $rhs) = ($cb->($1), $2, $3);
         ($op, $rhs) = split /\s*(?=null)/i, $op;
         die "Last column in '". $lhs->{'string'} ."' is virtual and can not be used in condition '$string'" 
-            if $lhs->{'chain'}[-1]->virtual;
+            if $lhs->{'column'}->virtual;
         return { string => $string, lhs => $lhs, op => $op, rhs => $rhs };
     }
     elsif ( $string =~ /^(has(\s+no)?\s+)?($re_column)\s*($re_sql_op_bin)\s*($re_column)$/o ) {
@@ -337,9 +315,9 @@
         $prefix = 'has' if $1;
         $prefix .= ' no' if $2;
         die "Last column in '". $lhs->{'string'} ."' is virtual and can not be used in condition '$string'" 
-            if $lhs->{'chain'}[-1]->virtual;
+            if $lhs->{'column'}->virtual;
         die "Last column in '". $rhs->{'string'} ."' is virtual and can not be used in condition '$string'" 
-            if $rhs->{'chain'}[-1]->virtual;
+            if $rhs->{'column'}->virtual;
         return { string => $string, prefix => $prefix, lhs => $lhs, op => $op, rhs => $rhs };
     }
     elsif ( $string =~ /^has(\s+no)?\s+($re_column)$/o ) {
@@ -356,57 +334,58 @@
     my $aliases = shift;
     my $collection = shift || $self->{'collection'};
 
-    my %res = (
-        string   => $string,
-        previous => undef,
-        chain    => [],
-    );
-
     my ($start_from, @names) = split /\./, $string;
-    my $item;
+    my ($item, $last);
     if ( !$start_from && !$aliases->{''} ) {
         $item = $collection->new_item;
     } else {
-        my $alias = $aliases->{ $start_from || '' }
-            || die "$start_from alias is not declared in from clause";
-        $res{'previous'} = $alias;
-        my $classname = $alias->{'chain'}[-1]->refers_to; # ->new( handle => $collection->_handle );
-        if ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Collection' ) ) {
-            $item = $classname->new( handle => $collection->_handle )->new_item;
-        }
-        elsif ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Record' ) ) {
-            $item = $classname->new( handle => $collection->_handle )
-        }
-        else {
-            die "Column refers to '$classname' which is not record or collection";
+        my $alias = $aliases->{ $start_from }
+            || die "alias '$start_from' is not declared";
+
+        $last = $alias;
+        $item = $alias->{'refers_to'};
+        unless ( $item ) {
+    Test::More::diag Dumper $aliases;
+
+            die "last column in alias '$start_from' is not a reference";
         }
+        $item = $item->new_item if $item->isa('Jifty::DBI::Collection');
     }
+
+    my @done_with = ($start_from);
     while ( my $name = shift @names ) {
         my $column =
             $self->{'additional_columns'}{ref $item}{$name}
             || $item->column( $name );
         die ref($item) ." has no column '$name'" unless $column;
 
-        push @{ $res{'chain'} }, $column;
-        return \%res unless @names;
+        my %res = (
+            string    => join( '.', @done_with, $name ),
+            previous  => $last,
+            column    => $column,
+        );
 
         my $classname = $column->refers_to;
-        unless ( $classname ) {
-            die "column '$name' of ". ref($item) ." is not a reference to record or collection";
+        if ( !$classname && @names ) {
+            die "column '$name' of ". ref($item) ." is not a reference, but used so in '$string'";
         }
+        return \%res unless $classname;
 
         if ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Collection' ) ) {
-            $item = $classname->new( handle => $collection->_handle )->new_item;
+            $res{'refers_to'} = $classname->new( handle => $collection->_handle );
+            $item = $res{'refers_to'}->new_item;
         }
         elsif ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Record' ) ) {
-            $item = $classname->new( handle => $collection->_handle )
+            $res{'refers_to'} = $item = $classname->new( handle => $collection->_handle )
         }
         else {
             die "Column '$name' refers to '$classname' which is not record or collection";
         }
+        $last = \%res;
+        push @done_with, $name;
     }
 
-    return \%res;
+    return $last;
 }
 
 sub filter_conditions_tree {
@@ -464,7 +443,8 @@
     my $aliases = { __record__ => {
         string    => '__record__',
         previous  => undef,
-        chain     => [$column],
+        column    => $column,
+        refers_to => $column->refers_to->new( handle => $self->{'collection'}->_handle ),
         sql_alias => $self->{'collection'}->new_alias( $record ),
     } };
 
@@ -486,7 +466,7 @@
             lhs => {
                 string   => '__record__.id',
                 previous => $aliases->{'__record__'},
-                chain    => [ $record->column('id') ]
+                column   => $record->column('id'),
             },
             op => '=',
             rhs => $record->id || 0,
@@ -513,11 +493,12 @@
             $m = {
                 name     => $name,
                 string   => $new_str,
-                chain    => [ $meta->{'chain'}[0] ],
+                column    => $meta->{'column'},
                 previous => $meta->{'previous'},
             };
             $cache{ $new_str } = $aliases->{ $name } = $m;
         }
+        # XXX: no more chain
         shift @{ $meta->{'chain'} };
         unshift @parts, $m->{'name'};
         $meta->{'previous'} = $m;


More information about the Jifty-commit mailing list