[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