__PACKAGE__->mk_group_accessors('simple' => qw/_ordered_columns
_columns _primaries _unique_constraints name resultset_attributes
- schema from _relationships column_info_from_storage source_info/);
+ schema from _relationships column_info_from_storage source_info
+ source_name/);
-__PACKAGE__->mk_group_accessors('inherited' => qw/resultset_class
+__PACKAGE__->mk_group_accessors('component_class' => qw/resultset_class
result_class/);
-__PACKAGE__->mk_group_ro_accessors('simple' => qw/source_name/);
-
=head1 NAME
DBIx::Class::ResultSource - Result source object
will attempt to retrieve the name of the sequence from the database
automatically.
-=item extras
+=item extra
This is used by L<DBIx::Class::Schema/deploy> and L<SQL::Translator>
-to add extra non-generic data to the column. For example: C<< extras
+to add extra non-generic data to the column. For example: C<< extra
=> { unsigned => 1} >> is used by the MySQL producer to set an integer
column to unsigned. For more details, see
L<SQL::Translator::Producer::MySQL>.
return $self;
}
-*add_column = \&add_columns;
+sub add_column { shift->add_columns(@_); } # DO NOT CHANGE THIS TO GLOB
=head2 has_column
$self->_ordered_columns(\@remaining);
}
-*remove_column = \&remove_columns;
+sub remove_column { shift->remove_columns(@_); } # DO NOT CHANGE THIS TO GLOB
=head2 set_primary_key
=cut
sub resolve_join {
- my ($self, $join, $alias, $seen) = @_;
+ my ($self, $join, $alias, $seen, $force_left) = @_;
$seen ||= {};
+ $force_left ||= { force => 0 };
if (ref $join eq 'ARRAY') {
return map { $self->resolve_join($_, $alias, $seen) } @$join;
} elsif (ref $join eq 'HASH') {
return
map {
my $as = ($seen->{$_} ? $_.'_'.($seen->{$_}+1) : $_);
- ($self->resolve_join($_, $alias, $seen),
- $self->related_source($_)->resolve_join($join->{$_}, $as, $seen));
+ local $force_left->{force};
+ (
+ $self->resolve_join($_, $alias, $seen, $force_left),
+ $self->related_source($_)->resolve_join(
+ $join->{$_}, $as, $seen, $force_left
+ )
+ );
} keys %$join;
} elsif (ref $join) {
$self->throw_exception("No idea how to resolve join reftype ".ref $join);
my $as = ($count > 1 ? "${join}_${count}" : $join);
my $rel_info = $self->relationship_info($join);
$self->throw_exception("No such relationship ${join}") unless $rel_info;
- my $type = $rel_info->{attrs}{join_type} || '';
+ my $type;
+ if ($force_left->{force}) {
+ $type = 'left';
+ } else {
+ $type = $rel_info->{attrs}{join_type} || '';
+ $force_left->{force} = 1 if lc($type) eq 'left';
+ }
return [ { $as => $self->related_source($join)->from,
-join_type => $type },
$self->resolve_condition($rel_info->{cond}, $as, $alias) ];
#warn %ret;
} elsif (!defined $for) { # undef, i.e. "no object"
$ret{$k} = undef;
+ } elsif (ref $as eq 'HASH') { # reverse hashref
+ $ret{$v} = $as->{$k};
} elsif (ref $as) { # reverse object
$ret{$v} = $as->get_column($k);
} elsif (!defined $as) { # undef, i.e. "no reverse object"
$self->throw_exception(
"Can't prefetch has_many ${pre} (join cond too complex)")
unless ref($rel_info->{cond}) eq 'HASH';
+ #my @col = map { (/^self\.(.+)$/ ? ("${as_prefix}.$1") : ()); }
+ # values %{$rel_info->{cond}};
+ $collapse->{".${as_prefix}${pre}"} = [ $rel_source->primary_columns ];
+ # action at a distance. prepending the '.' allows simpler code
+ # in ResultSet->_collapse_result
my @key = map { (/^foreign\.(.+)$/ ? ($1) : ()); }
keys %{$rel_info->{cond}};
- $collapse->{"${as_prefix}${pre}"} = \@key;
my @ord = (ref($rel_info->{attrs}{order_by}) eq 'ARRAY'
? @{$rel_info->{attrs}{order_by}}
: (defined $rel_info->{attrs}{order_by}
) if scalar @_;
return $self->resultset_class->new(
- $self, $self->{resultset_attributes}
+ $self,
+ {
+ %{$self->{resultset_attributes}},
+ %{$self->schema->default_resultset_attributes}
+ },
);
}
=cut
+1;