use strict;
use warnings;
+use Module::Runtime ();
use Carp ();
use List::Util ();
use Scalar::Util ();
',' => '_render_op_multop',
};
+ if ($opt{lazy_join_sql_parts}) {
+ my $mod = Module::Runtime::use_module('SQL::Abstract::Parts');
+ $opt{join_sql_parts} ||= sub { $mod->new(@_) };
+ }
+
+ $opt{join_sql_parts} ||= sub { join $_[0], @_[1..$#_] };
+
return bless \%opt, $class;
}
map {
my ($k, $set) = @$_;
$set = { -bind => $_ } unless defined $set;
- +{ -op => [ '=', $self->_expand_ident(-ident => $k), $set ] };
+ +{ -op => [ '=', { -ident => $k }, $set ] };
}
map {
my $k = $_;
sub _normalize_op {
my ($self, $raw) = @_;
- s/^-(?=.)//, s/\s+/_/g for my $op = lc $raw;
+ my $op = lc $raw;
+ return $op if grep $_->{$op}, @{$self}{qw(is_op expand_op render_op)};
+ s/^-(?=.)//, s/\s+/_/g for $op;
$op;
}
}
puke "Supplying an empty left hand side argument is not supported";
}
- if ($k =~ /^-/) {
+ if ($k =~ /^-./) {
return $self->_expand_hashpair_op($k, $v);
} elsif ($k =~ /^[^\w]/i) {
my ($lhs, @rhs) = @$v;
sub _expand_hashtriple {
my ($self, $k, $vk, $vv) = @_;
- my $ik = $self->_expand_ident(-ident => $k);
+ my $ik = $self->_expand_expr({ -ident => $k });
my $op = $self->_normalize_op($vk);
$self->_assert_pass_injection_guard($op);
sub _expand_func {
my ($self, undef, $args) = @_;
my ($func, @args) = @$args;
- return { -func => [ $func, map $self->expand_expr($_), @args ] };
+ return +{ -func => [ $func, map $self->expand_expr($_), @args ] };
}
sub _expand_ident {
return $self->_expand_expr($v);
}
puke "-bool => undef not supported" unless defined($v);
- return $self->_expand_ident(-ident => $v);
+ return $self->_expand_expr({ -ident => $v });
}
sub _expand_op_andor {
my ($func, @args) = @$rest;
return $self->join_query_parts('',
$self->_sqlcase($func),
- '(',
- $self->join_query_parts(', ', @args),
- ')'
+ $self->join_query_parts('',
+ '(',
+ $self->join_query_parts(', ', @args),
+ ')'
+ ),
);
}
return $self->join_query_parts(' ',
$lhs,
$self->format_keyword($op),
- '(',
- $self->join_query_parts(', ', @rhs),
- ')'
+ $self->join_query_parts(' ',
+ '(',
+ $self->join_query_parts(', ', @rhs),
+ ')'
+ ),
);
}
my ($self, $op, $args) = @_;
return undef unless @$args;
return $self->join_query_parts('', $args->[0]) if @$args == 1;
- return $self->join_query_parts(
- ' ' => '(', $self->_render_op_multop($op, $args), ')'
+ return $self->join_query_parts(' ',
+ '(', $self->_render_op_multop($op, $args), ')'
);
}
: ((ref($_) eq 'ARRAY') ? $_ : [ $_ ])
), @parts;
return [
- join($join, map $_->[0], @final),
+ $self->{join_sql_parts}->($join, map $_->[0], @final),
(map @{$_}[1..$#$_], @final),
];
}
return () unless defined(my $expanded = $self->_expand_order_by($arg));
- return $self->_chunkify_order_by($expanded);
+ my @res = $self->_chunkify_order_by($expanded);
+ (ref() ? $_->[0] : $_) .= '' for @res;
+ return @res;
}
sub _chunkify_order_by {