when cloning objects using L<DBIx::Class::Row/copy>. It is also used by
L<DBIx::Class::Schema/deploy>.
+=item is_numeric
+
+Set this to a true or false value (not C<undef>) to explicitly specify
+if this column contains numeric data. This controls how set_column
+decides whether to consider a column dirty after an update: if
+C<is_numeric> is true a numeric comparison C<< != >> will take place
+instead of the usual C<eq>
+
+If not specified the storage class will attempt to figure this out on
+first access to the column, based on the column C<data_type>. The
+result will be cached in this attribute.
+
=item is_foreign_key
Set this to a true value for a column that contains a key from a
}
return unless $f_source; # Can't test rel without f_source
- eval { $self->_resolve_join($rel, 'me') };
+ eval { $self->_resolve_join($rel, 'me', {}) };
if ($@) { # If the resolve failed, back out and re-throw the error
delete $rels{$rel}; #
# Returns the {from} structure used to express JOIN conditions
sub _resolve_join {
- my ($self, $join, $alias, $seen, $force_left, $jpath) = @_;
+ my ($self, $join, $alias, $seen, $jpath, $force_left) = @_;
# we need a supplied one, because we do in-place modifications, no returns
$self->throw_exception ('You must supply a seen hashref as the 3rd argument to _resolve_join')
unless $seen;
- $force_left ||= { force => 0 };
-
# This isn't quite right, we should actually dive into $seen and reconstruct
# the entire path (the reference entry point would be the join conditional
# with depth == current_depth - 1. At this point however nothing depends on
# having the entire path, transcending related_resultset, so just leave it
# as is, hairy enough already.
- $jpath ||= [];
+ $jpath ||= [];
if (ref $join eq 'ARRAY') {
return
map {
- local $force_left->{force} = $force_left->{force};
- $self->_resolve_join($_, $alias, $seen, $force_left, [@$jpath]);
+ $self->_resolve_join($_, $alias, $seen, [@$jpath], $force_left);
} @$join;
} elsif (ref $join eq 'HASH') {
return
my $as = ($seen->{$_} ? join ('_', $_, $seen->{$_} + 1) : $_); # the actual seen value will be incremented below
local $force_left->{force} = $force_left->{force};
(
- $self->_resolve_join($_, $alias, $seen, $force_left, [@$jpath]),
+ $self->_resolve_join($_, $alias, $seen, [@$jpath], $force_left),
$self->related_source($_)->_resolve_join(
- $join->{$_}, $as, $seen, $force_left, [@$jpath, $_]
+ $join->{$_}, $as, $seen, [@$jpath, $_], $force_left
)
);
} keys %$join;
$self->throw_exception("No idea how to resolve join reftype ".ref $join);
} else {
+ return() unless defined $join;
+
my $count = ++$seen->{$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;
- if ($force_left->{force}) {
+ if ($force_left) {
$type = 'left';
} else {
$type = $rel_info->{attrs}{join_type} || '';
- $force_left->{force} = 1 if lc($type) eq 'left';
+ $force_left = 1 if lc($type) eq 'left';
}
my $rel_src = $self->related_source($join);
return [ { $as => $rel_src->from,
- -result_source => $rel_src,
+ -source_handle => $rel_src->handle,
-join_type => $type,
-join_path => [@$jpath, $join],
-alias => $as,