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

Jifty commits jifty-commit at lists.jifty.org
Wed Feb 25 15:31:47 EST 2009


Author: ruz
Date: Wed Feb 25 15:31:46 2009
New Revision: 6462

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

Log:
* add support for explicit joins with sub-joins, no correct implementation for SQLite

Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Handle.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Handle.pm	(original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Handle.pm	Wed Feb 25 15:31:46 2009
@@ -963,7 +963,7 @@
 
     } else {
         $meta->{'alias_string'} = " JOIN " . $args{'table2'} . " $alias ";
-        $meta->{'type'}         = 'NORMAL';
+        $meta->{'type'}         = 'CROSS';
     }
     $meta->{'depends_on'}       = [ $args{'alias1'} ];
     $meta->{'is_distinct'}      = $args{'is_distinct'};
@@ -982,6 +982,65 @@
     return ($alias);
 }
 
+sub _explicit_joins {
+    my $self = shift;
+    my %args = (
+        collection => undef,
+        chain      => undef,
+        add_main   => 1,
+        @_
+    );
+    my $collection = $args{'collection'};
+
+    my @chain = @{ $args{'chain'} };
+
+    my $join_clause = '';
+    if ( $args{'add_main'} ) {
+        $join_clause .= $collection->table . " main";
+    }
+    else {
+        my $meta = $collection->{'joins'}{ shift @chain };
+        die "boo ". Data::Dumper::Dumper($meta) if $meta->{'criteria'};
+        $join_clause .= $meta->{'table'} .' '. $meta->{'alias'};
+    }
+
+    foreach my $alias ( @chain ) {
+        my $meta = undef;
+        if ( ref $alias ) {
+            $meta = $alias;
+            my $clause = $self->_explicit_joins( collection => $collection, chain => $alias->{'chain'}, add_main => 0 );
+            $meta->{'alias_string'} = " LEFT JOIN ( $clause )";
+        } else {
+            $meta = $collection->{'joins'}{ $alias };
+        }
+
+        my $aggregator = $meta->{'entry_aggregator'} || 'AND';
+        my @tmp = map {
+            ref($_)
+                ? $_->{'column'} . ' '
+                . $_->{'operator'} . ' '
+                . $_->{'value'}
+                : $_
+        } map {
+            ( '(', @$_, ')', $aggregator )
+        } values %{ $meta->{'criteria'} };
+
+        # delete last aggregator
+        pop @tmp;
+        my $on_clause = CORE::join ' ', @tmp;
+
+        my $type = uc $meta->{'type'};
+        if ( !$on_clause && $type eq 'CROSS' ) {
+            $join_clause .= ' CROSS';
+        }
+        $join_clause .= $meta->{'alias_string'};
+
+        $join_clause .= ' ON '. $on_clause if $on_clause;
+    }
+
+    return $join_clause;
+}
+
 # this code is all hacky and evil. but people desperately want _something_ and I'm
 # super tired. refactoring gratefully appreciated.
 
@@ -991,6 +1050,9 @@
 
     $self->_optimize_joins( collection => $collection );
 
+    return $self->_explicit_joins( collection => $collection, chain => $collection->{'explicit_joins_order'} )
+        if $collection->{'explicit_joins_order'};
+
     my @cross = grep { lc $_->{type} eq "cross" }
         values %{ $collection->{'joins'} };
     my $join_clause = ( $collection->table . " main" )
@@ -1084,7 +1146,7 @@
             );
 
         $joins->{$join}{'alias_string'} =~ s/^\s*LEFT\s+/ /i;
-        $joins->{$join}{'type'} = 'NORMAL';
+        $joins->{$join}{'type'} = 'CROSS';
     }
 
 }


More information about the Jifty-commit mailing list