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;
}
if ($k =~ /^-./) {
return $self->_expand_hashpair_op($k, $v);
} elsif ($k =~ /^[^\w]/i) {
- my ($lhs, @rhs) = @$v;
+ my ($lhs, @rhs) = ref($v) eq 'ARRAY' ? @$v : $v;
return $self->_expand_op(
-op, [ $k, $self->expand_expr($lhs, -ident), @rhs ]
);
my $op = $self->_normalize_op($k);
- if (my $exp = $self->{expand}{$op}) {
- return $self->$exp($op, $v);
- }
-
- # Ops prefixed with -not_ get converted
-
- if (my ($rest) = $op =~/^not_(.*)$/) {
- return +{ -op => [
- 'not',
- $self->_expand_expr({ "-${rest}", $v })
- ] };
- }
-
{ # Old SQLA compat
my $op = join(' ', split '_', $op);
) {
puke "Illegal use of top-level '-$op'"
}
+ }
+
+ if (my $exp = $self->{expand}{$op}) {
+ return $self->$exp($op, $v);
+ }
+
+ # Ops prefixed with -not_ get converted
+
+ if (my ($rest) = $op =~/^not_(.*)$/) {
+ return +{ -op => [
+ 'not',
+ $self->_expand_expr({ "-${rest}", $v })
+ ] };
+ }
+
+ { # Old SQLA compat
# the old unary op system means we should touch nothing and let it work
+ my $op = join(' ', split '_', $op);
+
if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{unary_ops}}) {
return { -op => [ $op, $v ] };
}
if (ref($vv) eq 'ARRAY') {
my @raw = @$vv;
my $logic = (defined($raw[0]) and $raw[0] =~ /^-(and|or)$/i)
- ? (shift(@raw), $1) : 'or';
+ ? (shift(@raw), lc $1) : 'or';
my @values = map +{ $vk => $_ }, @raw;
if (
$op =~ $self->{inequality_op}
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), ')'
+ my $inner = $self->_render_op_multop($op, $args);
+ return undef unless defined($inner->[0]) and length($inner->[0]);
+ return $self->join_query_parts(' ',
+ '(', $inner, ')'
);
}
: ((ref($_) eq 'ARRAY') ? $_ : [ $_ ])
), @parts;
return [
- join($join, map $_->[0], @final),
+ $self->{join_sql_parts}->($join, grep defined, 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 {