use DBIx::Class::ResultSetColumn;
use base qw/DBIx::Class/;
-use Data::Dumper; $Data::Dumper::Indent = 1;
-
__PACKAGE__->load_components(qw/AccessorGroup/);
__PACKAGE__->mk_group_accessors('simple' => qw/result_source result_class/);
result_source => $source,
result_class => $attrs->{result_class} || $source->result_class,
cond => $attrs->{where},
-# from => $attrs->{from},
-# collapse => $collapse,
count => undef,
pager => undef,
attrs => $attrs
"search_related: result source '" . $self->result_source->name .
"' has no such relationship $rel")
unless $rel_obj;
-
- my $join_count = $self->{attrs}{_parent_seen_join}{$rel};
- my $alias = $join_count ? join('_', $rel, $join_count+1) : $rel;
-
- my $rs = $self->search(undef, { join => $rel });
- my ($from,$seen) = $rs->_resolve_from;
+ my ($from,$seen) = $self->_resolve_from($rel);
+
+ my $join_count = $seen->{$rel};
+ my $alias = ($join_count > 1 ? join('_', $rel, $join_count) : $rel);
+
$self->result_source->schema->resultset($rel_obj->{class})->search_rs(
undef, {
+ %{$self->{attrs}||{}},
+ join => undef,
+ prefetch => undef,
select => undef,
as => undef,
alias => $alias,
where => $self->{cond},
- _parent_from => $from,
- _parent_seen_join => $seen,
+ seen_join => $seen,
+ from => $from,
});
};
}
+sub _resolve_from {
+ my ($self, $extra_join) = @_;
+ my $source = $self->result_source;
+ my $attrs = $self->{attrs};
+
+ my $from = $attrs->{from}
+ || [ { $attrs->{alias} => $source->from } ];
+
+ my $seen = { %{$attrs->{seen_join}||{}} };
+
+ my $join = ($attrs->{join}
+ ? [ $attrs->{join}, $extra_join ]
+ : $extra_join);
+ push(@{$from},
+ $source->resolve_join($join, $attrs->{alias}, $seen)
+ );
+
+ return ($from,$seen);
+}
+
sub _resolved_attrs {
my $self = shift;
return $self->{_attrs} if $self->{_attrs};
my $source = $self->{result_source};
my $alias = $attrs->{alias};
- # XXX - lose storable dclone
- my $record_filter = delete $attrs->{record_filter};
- #$attrs = Storable::dclone($attrs || {}); # { %{ $attrs || {} } };
-
- $attrs->{record_filter} = $record_filter if $record_filter;
-
$attrs->{columns} ||= delete $attrs->{cols} if exists $attrs->{cols};
if ($attrs->{columns}) {
delete $attrs->{as};
} elsif (!$attrs->{select}) {
- $attrs->{columns} = [ $self->{result_source}->columns ];
+ $attrs->{columns} = [ $source->columns ];
}
$attrs->{select} ||= [
}
$attrs->{from} ||= [ { 'me' => $source->from } ];
- if ($attrs->{_parent_from}) {
- push @{$attrs->{from}}, @{$attrs->{_parent_from}};
- }
if (exists $attrs->{join} || exists $attrs->{prefetch}) {
-
my $join = delete $attrs->{join} || {};
if (defined $attrs->{prefetch}) {
);
}
- push(@{$attrs->{from}},
- $source->resolve_join($join, $alias, { %{$self->{_parent_seen_join}||{}} })
- );
+ $attrs->{from} = # have to copy here to avoid corrupting the original
+ [
+ @{$attrs->{from}},
+ $source->resolve_join($join, $alias, { %{$attrs->{seen_join}||{}} })
+ ];
}
$attrs->{group_by} ||= $attrs->{select} if delete $attrs->{distinct};
foreach my $p (ref $prefetch eq 'ARRAY' ? @$prefetch : ($prefetch)) {
# bring joins back to level of current class
my @prefetch = $source->resolve_prefetch(
- $p, $alias, { %{$attrs->{_parent_seen_join}||{}} }, \@pre_order, $collapse
+ $p, $alias, { %{$attrs->{seen_join}||{}} }, \@pre_order, $collapse
);
push(@{$attrs->{select}}, map { $_->[0] } @prefetch);
push(@{$attrs->{as}}, map { $_->[1] } @prefetch);
return $self->{_attrs} = $attrs;
}
-sub _resolve_from {
- my ($self) = @_;
- my $source = $self->result_source;
- my $attrs = $self->{attrs};
-
- my $from = $attrs->{_parent_from} || [];
-# || [ { $attrs->{alias} => $source->from } ];
-
- my $seen = { %{$attrs->{_parent_seen_join}||{}} };
-
- if ($attrs->{join}) {
- push(@{$from},
- $source->resolve_join($attrs->{join}, $attrs->{alias}, $seen)
- );
- }
-
- return ($from,$seen);
-}
-
sub _merge_attr {
my ($self, $a, $b) = @_;
return $b unless $a;