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

Jifty commits jifty-commit at lists.jifty.org
Mon Jan 26 05:28:30 EST 2009


Author: ruz
Date: Mon Jan 26 05:28:30 2009
New Revision: 6274

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

Log:
* merge handling of collections and records in resolve_join

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	Mon Jan 26 05:28:30 2009
@@ -84,6 +84,7 @@
     if ( $string =~ s/^\s*FROM\s+($re_alias(?:\s*,\s*$re_alias)*)\s+WHERE\s+//oi ) {
         $tree->{'aliases'}->{ $_->[1] } = $self->find_column( $_->[0], $tree->{'aliases'} )
             foreach map [split /\s+AS\s+/i, $_], split /\s*,\s*/, $1;
+
         while ( my ($name, $meta) = each %{ $tree->{aliases} } ) {
             $meta->{'name'} = $name;
         }
@@ -104,13 +105,13 @@
 }
 
 sub apply_query_tree {
-    my ($self, $current, $join, $ea) = @_;
+    my ($self, $tree, $join, $ea) = @_;
     $ea ||= 'AND';
 
     my $collection = $self->{'collection'};
 
     $collection->open_paren('tisql', $join);
-    foreach my $element ( @$current ) {
+    foreach my $element ( @$tree ) {
         unless ( ref $element ) {
             $ea = $element;
             next;
@@ -268,51 +269,42 @@
     }
     return $prev_alias unless $resolve_last;
 
-    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( $meta );
-        } else {
-            $res = $collection->new_alias( $item );
-            $collection->join(
-                subclause => 'tisql',
-                type    => 'left',
-                alias1  => $prev_alias,
-                column1 => 'id',
-                alias2  => $res,
-                column2 => $column->by || 'id',
-            );
-        }
-    }
-    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 { 
+    $refers = $refers->new_item
+        if UNIVERSAL::isa( $refers, 'Jifty::DBI::Collection' );
+
+    unless ( UNIVERSAL::isa( $refers, 'Jifty::DBI::Record' ) ) { 
         die "Column '". $column->name ."' refers to '"
             . (ref($refers) || $refers)
             ."' that is not record or collection";
     }
+
+    my $res = $collection->new_alias( $refers, 'LEFT' );
+    if ( $column->tisql ) {
+        $self->resolve_tisql_join( $res, $meta );
+    } else {
+        $collection->limit(
+            leftjoin    => $res,
+            subclause   => 'tisql-join',
+            alias       => $prev_alias,
+            column      => $column->virtual? 'id' : $column->name,
+            operator    => '=',
+            quote_value => 0,
+            value       => $res .'.'. ($column->by || 'id')
+        );
+    }
     return $meta->{'sql_alias'} = $res;
 }
 
+    use Data::Dumper; use Carp ();
+
 sub resolve_tisql_join {
     my $self = shift;
+    my $alias = shift;
     my $meta = shift;
-
-    my $alias = $self->{'collection'}->new_alias(
-        $meta->{'refers_to'}->new_item, 'LEFT'
-    );
+    Test::More::diag( Carp::cluck( Dumper($meta) ) );
 
     my $tree = $parser->as_array(
         $meta->{'column'}->tisql,
@@ -449,6 +441,7 @@
     my $collection = shift || $self->{'collection'};
 
     my $meta = $self->parse_column($string);
+
     my $start_from = $meta->{'alias'};
     my ($item, $last);
     if ( !$start_from && !$aliases->{''} ) {


More information about the Jifty-commit mailing list