[Jifty-commit] r5619 - in Jifty-DBI/branches/tisql: lib/Jifty/DBI

Jifty commits jifty-commit at lists.jifty.org
Wed Jul 30 16:34:28 EDT 2008


Author: ruz
Date: Wed Jul 30 16:34:23 2008
New Revision: 5619

Modified:
   Jifty-DBI/branches/tisql/   (props changed)
   Jifty-DBI/branches/tisql/lib/Jifty/DBI/Collection.pm
   Jifty-DBI/branches/tisql/lib/Jifty/DBI/Column.pm
   Jifty-DBI/branches/tisql/lib/Jifty/DBI/Record.pm
   Jifty-DBI/branches/tisql/lib/Jifty/DBI/Schema.pm
   Jifty-DBI/branches/tisql/lib/Jifty/DBI/Tisql.pm

Log:
 r5631 at ruslan-zakirovs-computer:  ruz | 2008-07-31 00:28:48 +0400
 * implement refers_to Collection by tisql => 'tisql join query'


Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Collection.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Collection.pm	(original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Collection.pm	Wed Jul 30 16:34:23 2008
@@ -1243,7 +1243,7 @@
         ? $self->{joins}{ $args{alias} }{class}
         ->new( $self->_new_collection_args )
         : $self;
-    my $column_obj = $class->new_item()->column( $args{column} );
+    my $column_obj = ( $class->isa('Jifty::DBI::Collection')? $class->new_item : $class )->column( $args{column} );
 
     $self->record_class->new(handle => $self->_handle)->_apply_input_filters(
         column    => $column_obj,

Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Column.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Column.pm	(original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Column.pm	Wed Jul 30 16:34:23 2008
@@ -18,7 +18,7 @@
     virtual
     distinct
     sort_order
-    refers_to by
+    refers_to by tisql
     alias_for_column
     aliased_as
     since till

Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Record.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Record.pm	(original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Record.pm	Wed Jul 30 16:34:23 2008
@@ -470,8 +470,13 @@
     }
 
     my $coll = $classname->new( $self->_new_collection_args );
-    $coll->limit( column => $column->by, value => $self->id )
-        if $column->by and $self->id;
+    if ( my $by = $column->by ) {
+        $coll->limit( column => $by, value => $self->id )
+    } elsif ( $column->tisql ) {
+        require Jifty::DBI::Tisql;
+        my $parser = Jifty::DBI::Tisql->new( collection => $coll );
+        $parser->parse_column_reference( record => $self, column => $column );
+    }
     return $coll;
 }
 

Modified: Jifty-DBI/branches/tisql/lib/Jifty/DBI/Schema.pm
==============================================================================
--- Jifty-DBI/branches/tisql/lib/Jifty/DBI/Schema.pm	(original)
+++ Jifty-DBI/branches/tisql/lib/Jifty/DBI/Schema.pm	Wed Jul 30 16:34:23 2008
@@ -333,7 +333,12 @@
         
         # Handle refers_to SomeCollection by 'foo'
         if (ref($refclass) eq 'ARRAY') {
-            $column->by($refclass->[1]);
+            if ( ($refclass->[1]||'') eq 'tisql' && @$refclass == 3 ) {
+                $column->tisql($refclass->[2]);
+            } else {
+                # Assume we refer to the ID column unless told otherwise
+                $column->by($refclass->[1] || 'id');
+            }
             $column->refers_to($refclass = $refclass->[0]);
         }
 
@@ -349,8 +354,6 @@
 
         # A one-to-one or one-to-many relationship is requested
         if ( UNIVERSAL::isa( $refclass, 'Jifty::DBI::Record' ) ) {
-            # Assume we refer to the ID column unless told otherwise
-            $column->by('id') unless $column->by;
 
             # Handle *_id reference columns specially
             if ( $name =~ /(.*)_id$/ ) {
@@ -373,7 +376,6 @@
             }
 
         } elsif ( UNIVERSAL::isa( $refclass, 'Jifty::DBI::Collection' ) ) {
-            $column->by('id') unless $column->by;
             $column->virtual('1');
         } else {
             warn "Error in $from: $refclass neither Record nor Collection. Perhaps it couldn't be loaded?";

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 Jul 30 16:34:23 2008
@@ -255,6 +255,7 @@
     my $self = shift;
     my $string = shift;
     my $aliases = shift;
+    my $collection = shift || $self->{'collection'};
 
     my %res = (
         string   => $string,
@@ -265,30 +266,39 @@
     my ($start_from, @names) = split /\./, $string;
     my $item;
     unless ( $start_from ) {
-        $item = $self->{'collection'}->new_item;
+        $item = $collection->new_item;
     } else {
         my $alias = $aliases->{ $start_from }
             || die "$start_from alias is not declared in from clause";
         $res{'previous'} = $alias;
-        $item = $alias->{'chain'}[-1]->refers_to->new( handle => $self->{'collection'}->_handle );
+        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";
+        }
     }
     while ( my $name = shift @names ) {
         my $column = $item->column( $name );
-        die "$item has no column '$name'" unless $column;
+        die ref($item) ." has no column '$name'" unless $column;
 
         push @{ $res{'chain'} }, $column;
         return \%res unless @names;
 
         my $classname = $column->refers_to;
         unless ( $classname ) {
-            die "column '$name' of $item is not a reference to record or collection";
+            die "column '$name' of ". ref($item) ." is not a reference to record or collection";
         }
 
         if ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Collection' ) ) {
-            $item = $classname->new( handle => $self->{'collection'}->_handle )->new_item;
+            $item = $classname->new( handle => $collection->_handle )->new_item;
         }
         elsif ( UNIVERSAL::isa( $classname, 'Jifty::DBI::Record' ) ) {
-            $item = $classname->new( handle => $self->{'collection'}->_handle )
+            $item = $classname->new( handle => $collection->_handle )
         }
         else {
             die "Column '$name' refers to '$classname' which is not record or collection";
@@ -342,4 +352,49 @@
     }
 }
 
+sub parse_column_reference {
+    my $self = shift;
+    my %args = @_;
+
+    my $record = $args{'record'};
+    my $column = $args{'column'};
+    my $string = $column->tisql;
+
+    my $record_alias = {
+        string    => 'record',
+        previous  => undef,
+        chain     => [$column],
+        sql_alias => $self->{'collection'}->new_alias( $record ),
+    };
+
+    my $tree = {
+        aliases => {
+            record => $record_alias
+        },
+        conditions => undef,
+    };
+
+    $tree->{'conditions'} = $self->as_array(
+        $string,
+        operand_cb => sub { return $self->parse_condition( $_[0], $tree->{'aliases'} ) },
+    );
+    $tree->{'conditions'} = [
+        {
+            lhs => {
+                string => 'record.id',
+                previous => $record_alias,
+                chain => [ $record->column('id') ]
+            },
+            op => '=',
+            rhs => $record->id
+        },
+        'AND',
+        $tree->{'conditions'},
+    ];
+    $self->{'tisql'}{'conditions'} = $tree->{'conditions'};
+    $self->apply_query_tree( $tree );
+
+    return $tree;
+}
+
 1;


More information about the Jifty-commit mailing list