#
sub _prune_unused_joins {
my $self = shift;
- my ($from, $select, $where, $attrs, $ignore_multiplication) = @_;
+ my ($from, $select, $where, $attrs) = @_;
return $from unless $self->_use_join_optimizer;
# a grouped set will not be affected by amount of rows. Thus any
# {multiplying} joins can go
delete $aliastypes->{multiplying}
- if $ignore_multiplication or $attrs->{group_by};
+ if $attrs->{_force_prune_multiplying_joins} or $attrs->{group_by};
my @newfrom = $from->[0]; # FROM head is always present
local $self->{_use_join_optimizer} = 1;
# throw away multijoins since we def. do not care about those inside the subquery
- my $inner_from = $self->_prune_unused_joins ($from, $inner_select, $where, $inner_attrs, 'ignore_multiplication');
+ my $inner_from = $self->_prune_unused_joins ($from, $inner_select, $where, {
+ %$inner_attrs, _force_prune_multiplying_joins => 1
+ });
my $inner_aliastypes =
$self->_resolve_aliastypes_from_select_args( $inner_from, $inner_select, $where, $inner_attrs );
# skip ourselves
next if $chunk =~ $own_re;
- my $is_desc = $chunk =~ s/\sDESC$//i;
- $chunk =~ s/\sASC$//i;
+ ($chunk, my $is_desc) = $sql_maker->_split_order_chunk($chunk);
# maybe our own unqualified column
my $ord_bit = (
my ($self, $ident) = @_;
my $alias2source = {};
- my $rs_alias;
# the reason this is so contrived is that $ident may be a {from}
# structure, specifying multiple tables to join
if ( blessed $ident && $ident->isa("DBIx::Class::ResultSource") ) {
# this is compat mode for insert/update/delete which do not deal with aliases
$alias2source->{me} = $ident;
- $rs_alias = 'me';
}
elsif (ref $ident eq 'ARRAY') {
my $tabinfo;
if (ref $_ eq 'HASH') {
$tabinfo = $_;
- $rs_alias = $tabinfo->{-alias};
}
if (ref $_ eq 'ARRAY' and ref $_->[0] eq 'HASH') {
$tabinfo = $_->[0];
}
}
- return ($alias2source, $rs_alias);
+ return $alias2source;
}
# Takes $ident, \@column_names
# for all sources
sub _resolve_column_info {
my ($self, $ident, $colnames) = @_;
- my ($alias2src, $root_alias) = $self->_resolve_ident_sources($ident);
+ my $alias2src = $self->_resolve_ident_sources($ident);
my (%seen_cols, @auto_colnames);
my @chunks;
for ($sql_maker->_order_by_chunks ($order_by) ) {
my $chunk = ref $_ ? [ @$_ ] : [ $_ ];
- $chunk->[0] =~ s/\s+ (?: ASC|DESC ) \s* $//ix;
+ ($chunk->[0]) = $sql_maker->_split_order_chunk($chunk->[0]);
# order criteria may have come back pre-quoted (literals and whatnot)
# this is fragile, but the best we can currently do