package Tangram::Expr::Coll::FromMany; use strict; use vars qw(@ISA); @ISA = qw( Tangram::Expr::Coll ); sub includes { my ($self, $item) = @_; my ($coll, $memdef) = @$self; my $schema = $coll->{storage}{schema}; my $coll_tid = $coll->root_table; my $link_tid = Tangram::Expr::TableAlias->new; my $coll_col = $memdef->{coll}; my $item_col = $memdef->{item}; my $objects = Set::Object->new ( $coll, Tangram::Expr::LinkTable->new($memdef->{table}, $link_tid) ); my $target; if (ref $item) { if ($item->isa('Tangram::Expr::QueryObject')) { $target = 't' . $item->object->root_table . '.' . $schema->{sql}{id_col}; $objects->insert( $item->object ); } else { $target = $coll->{storage}->export_object($item) or die "'$item' is not a persistent object"; } } else { $target = $item; } Tangram::Expr::Filter->new ( expr => "t$link_tid.$coll_col = t$coll_tid.$schema->{sql}{id_col} AND t$link_tid.$item_col = $target", tight => 100, objects => $objects, link_tid => $link_tid # for Sequence prefetch ); } sub includes_or { my ($self, @items) = @_; my ($coll, $memdef) = @$self; my $schema = $coll->{storage}{schema}; my $coll_tid = $coll->root_table; my $link_tid = Tangram::Expr::TableAlias->new; my $coll_col = $memdef->{coll}; my $item_col = $memdef->{item}; my $objects = Set::Object->new ($coll, Tangram::Expr::LinkTable->new($memdef->{table}, $link_tid) ); my @targets; foreach my $item (@items) { if (ref $item) { if ($item->isa('Tangram::Expr::QueryObject')) { push @targets, ('t' . $item->object->root_table.'.' . $schema->{sql}{id_col}); $objects->insert( $item->object ); } else { push @targets, ($coll->{storage}->export_object($item) or die "'$item' is not a persistent object" ); } } else { push @targets, $item; } } my $joined_targets = join(',', @targets); Tangram::Expr::Filter->new ( expr => "t$link_tid.$coll_col = t$coll_tid.$schema->{sql}{id_col} AND t$link_tid.$item_col IN ($joined_targets)", tight => 100, objects => $objects, link_tid => $link_tid # for Sequence prefetch ); } use overload '<' => \&includes, fallback => 1;