(map +($_ => '_render_unop_postfix'),
'is_null', 'is_not_null', 'asc', 'desc',
),
- (not => '_render_op_not'),
+ (not => '_render_unop_paren'),
(map +($_ => '_render_op_andor'), qw(and or)),
',' => '_render_op_multop',
};
}
sub _expand_in {
- my ($self, $raw, $vv, $k) = @_;
+ my ($self, $op, $vv, $k) = @_;
$k = shift @{$vv = [ @$vv ]} unless defined $k;
- my $op = $self->_normalize_op($raw);
if (my $literal = is_literal_value($vv)) {
my ($sql, @bind) = @$literal;
my $opened_sql = $self->_open_outer_paren($sql);
my $op = join(' ', split '_', $op);
- my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}};
- if ($us and @args > 1) {
+ my $ss = List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}};
+ if ($ss and @args > 1) {
puke "Special op '${op}' requires first value to be identifier"
unless my ($ident) = map $_->{-ident}, grep ref($_) eq 'HASH', $args[0];
my $k = join(($self->{name_sep}||'.'), @$ident);
local our $Expand_Depth = 1;
- return $self->${\($us->{handler})}($k, $op, $args[1]);
+ return $self->${\($ss->{handler})}($k, $op, $args[1]);
}
if (my $us = List::Util::first { $op =~ $_->{regex} } @{$self->{unary_ops}}) {
return $self->${\($us->{handler})}($op, $args[0]);
}
-
+ if ($ss) {
+ return $self->_render_unop_paren($op, \@args);
+ }
}
if (@args == 1) {
return $self->_render_unop_prefix($op, \@args);
my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$args;
return '' unless @parts;
return @{$parts[0]} if @parts == 1;
- my ($sql, @bind) = $self->_render_op_multop($op, $args);
+ my ($sql, @bind) = $self->_join_parts(' '.$self->_sqlcase($op).' ', @parts);
return '( '.$sql.' )', @bind;
}
my @parts = grep length($_->[0]), map [ $self->render_aqt($_) ], @$args;
return '' unless @parts;
return @{$parts[0]} if @parts == 1;
- my ($final_sql) = join(
- ($op eq ',' ? '' : ' ').$self->_sqlcase(join ' ', split '_', $op).' ',
- map $_->[0], @parts
- );
+ my $join = ($op eq ','
+ ? ', '
+ : ' '.$self->_sqlcase(join ' ', split '_', $op).' '
+ );
+ return $self->_join_parts($join, @parts);
+}
+
+sub _join_parts {
+ my ($self, $join, @parts) = @_;
return (
- $final_sql,
+ join($join, map $_->[0], @parts),
map @{$_}[1..$#$_], @parts
);
}
-sub _render_op_not {
+
+sub _render_unop_paren {
my ($self, $op, $v) = @_;
my ($sql, @bind) = $self->_render_unop_prefix($op, $v);
return "(${sql})", @bind;