[Jifty-commit] r6463 - Jifty-DBI/branches/tisql/lib/Jifty/DBI
Jifty commits
jifty-commit at lists.jifty.org
Wed Feb 25 15:33:20 EST 2009
Author: ruz
Date: Wed Feb 25 15:33:19 2009
New Revision: 6463
Modified:
Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm
Log:
* use subjoins for long operations with 'has no' modifier
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 25 15:33:19 2009
@@ -231,7 +231,7 @@
my %limit = (
subclause => 'tisql',
- alias => $self->resolve_join( $condition->{'lhs'} ),
+ alias => $self->resolve_join( $condition->{'lhs'}, use_subjoin => 1 ),
column => $condition->{'lhs'}{'chain'}[-1]{'name'},
operator => $op,
);
@@ -270,14 +270,19 @@
sub resolve_join {
my $self = shift;
my $meta = shift;
+ my %args = (
+ aliases => undef,
+ resolve_last => 0,
+ use_subjoin => 0,
+ @_
+ );
my $aliases = shift || $self->{'aliases'} || {};
- my $resolve_last = shift || 0;
return $meta->{'chain'}[-1]{'sql_alias'}
- if $resolve_last && $meta->{'chain'}[-1]{'sql_alias'};
+ if $args{'resolve_last'} && $meta->{'chain'}[-1]{'sql_alias'};
if ( my $prev = $meta->{'chain'}[-2] ) {
- return $prev->{'sql_alias'} if !$resolve_last && $prev->{'sql_alias'};
+ return $prev->{'sql_alias'} if !$args{'resolve_last'} && $prev->{'sql_alias'};
}
my $collection = $self->{'collection'};
@@ -290,7 +295,7 @@
my $item = $target->{'chain'}[-1]{'refers_to'}
or die "Last column of alias '$alias' is not a reference";
%last = (
- sql_alias => $self->resolve_join( $aliases->{ $alias }, $aliases, 1 ),
+ sql_alias => $self->resolve_join( $aliases->{ $alias }, aliases => $aliases, resolve_last => 1 ),
item => $item,
);
} else {
@@ -301,14 +306,18 @@
}
my @chain = @{ $meta->{'chain'} };
- pop @chain unless $resolve_last;
+ pop @chain unless $args{'resolve_last'};
+
+ my @aliases = ();
while ( my $joint = shift @chain ) {
my $linear = $self->linearize_join( $last{'item'}, $joint->{'name'} );
$linear->[0]{'sql_alias'} = $last{'sql_alias'};
- $_->{'sql_alias'} = $collection->new_alias( $_->{'model'}, 'LEFT' )
- foreach @{$linear}[1 .. @$linear - 1];
+ foreach ( @{$linear}[1 .. @$linear - 1] ) {
+ $_->{'sql_alias'} = $collection->new_alias( $_->{'model'}, 'LEFT' );
+ push @aliases, $_->{'sql_alias'};
+ }
foreach my $table ( @$linear ) {
next unless $table->{'conditions'};
@@ -362,6 +371,19 @@
$last{'sql_alias'} = $joint->{'sql_alias'} = $linear->[-1]{'sql_alias'};
$last{'item'} = $linear->[-1]{'model'};
}
+ if ( !$args{'use_subjoin'} || @aliases < 2 ) {
+ push @{ $collection->{'explicit_joins_order'} ||= [] }, @aliases;
+ } else {
+ push @{ $collection->{'explicit_joins_order'} ||= [] }, {
+ chain => \@aliases,
+ criteria => delete $collection->{'joins'}{$aliases[0]}{'criteria'},
+ };
+ foreach ( @aliases ) {
+ $collection->{'joins'}{ $_ }{'type'} = 'CROSS';
+ $collection->{'joins'}{ $_ }{'alias_string'} =~ s/LEFT //i;
+ }
+ }
+# Test::More::diag( Dumper($meta, $collection, \@aliases) );
return $last{'sql_alias'};
}
More information about the Jifty-commit
mailing list