# special operators
$opt{special_ops} ||= [];
- # regexes are applied in order, thus push after user-defines
- push @{$opt{special_ops}}, @BUILTIN_SPECIAL_OPS;
-
if ($class->isa('DBIx::Class::SQLMaker')) {
$opt{warn_once_on_nest} = 1;
$opt{disable_old_special_ops} = 1;
$opt{expand_unary} = {};
$opt{expand} = {
- -not => '_expand_not',
- -bool => '_expand_bool',
- -and => '_expand_op_andor',
- -or => '_expand_op_andor',
- -nest => '_expand_nest',
- -bind => sub { shift; +{ @_ } },
- -in => '_expand_in',
- -not_in => '_expand_in',
- -row => sub {
- my ($self, $node, $args) = @_;
- +{ $node => [ map $self->expand_expr($_), @$args ] };
- },
- -between => '_expand_between',
- -not_between => '_expand_between',
- -op => sub {
- my ($self, $node, $args) = @_;
- my ($op, @opargs) = @$args;
- +{ $node => [ $op, map $self->expand_expr($_), @opargs ] };
- },
- (map +($_ => '_expand_op_is'), ('-is', '-is_not')),
- -ident => '_expand_ident',
- -value => '_expand_value',
+ not => '_expand_not',
+ bool => '_expand_bool',
+ and => '_expand_op_andor',
+ or => '_expand_op_andor',
+ nest => '_expand_nest',
+ bind => '_expand_bind',
+ in => '_expand_in',
+ not_in => '_expand_in',
+ row => '_expand_row',
+ between => '_expand_between',
+ not_between => '_expand_between',
+ op => '_expand_op',
+ (map +($_ => '_expand_op_is'), ('is', 'is_not')),
+ ident => '_expand_ident',
+ value => '_expand_value',
};
$opt{expand_op} = {
};
$opt{render} = {
- (map +("-$_", "_render_$_"), qw(op func bind ident literal row)),
+ (map +($_, "_render_$_"), qw(op func bind ident literal row)),
%{$opt{render}||{}}
};
my ($self, $aqt) = @_;
my ($k, $v, @rest) = %$aqt;
die "No" if @rest;
+ die "Also no" unless $k =~ s/^-//;
if (my $meth = $self->{render}{$k}) {
return $self->$meth($v);
}
belch 'Use of [and|or|nest]_N modifiers is deprecated and will be removed in SQLA v2.0. '
. "You probably wanted ...-and => [ $key => COND1, $key => COND2 ... ]";
}
- if (my $exp = $self->{expand}{$key}) {
- return $self->$exp($key, $value);
- }
- return $self->_expand_expr_hashpair($key, $value);
+ return $self->_expand_hashpair($key, $value);
}
if (ref($expr) eq 'ARRAY') {
my $logic = '-'.lc($self->{logic});
return +{ -literal => $literal };
}
if (!ref($expr) or Scalar::Util::blessed($expr)) {
- return $self->_expand_expr_scalar($expr);
+ return $self->_expand_scalar($expr);
}
die "notreached";
}
-sub _expand_expr_hashpair {
+sub _expand_hashpair {
my ($self, $k, $v) = @_;
unless (defined($k) and length($k)) {
if (defined($k) and my $literal = is_literal_value($v)) {
puke "Supplying an empty left hand side argument is not supported";
}
if ($k =~ /^-/) {
- return $self->_expand_expr_hashpair_op($k, $v);
+ return $self->_expand_hashpair_op($k, $v);
}
- return $self->_expand_expr_hashpair_ident($k, $v);
+ return $self->_expand_hashpair_ident($k, $v);
}
-sub _expand_expr_hashpair_ident {
+sub _expand_hashpair_ident {
my ($self, $k, $v) = @_;
local our $Cur_Col_Meta = $k;
# undef needs to be re-sent with cmp to achieve IS/IS NOT NULL
if (is_undef_value($v)) {
- return $self->_expand_expr_hashpair_cmp($k => undef);
+ return $self->_expand_hashpair_cmp($k => undef);
}
# scalars and objects get expanded as whatever requested or values
if (!ref($v) or Scalar::Util::blessed($v)) {
- return $self->_expand_expr_hashpair_scalar($k, $v);
+ return $self->_expand_hashpair_scalar($k, $v);
}
# single key hashref is a hashtriple
if (ref($v) eq 'HASH') {
- return $self->_expand_expr_hashtriple($k, %$v);
+ return $self->_expand_hashtriple($k, %$v);
}
# arrayref needs re-engineering over the elements
die "notreached";
}
-sub _expand_expr_scalar {
+sub _expand_scalar {
my ($self, $expr) = @_;
return $self->_expand_expr({ (our $Default_Scalar_To) => $expr });
}
-sub _expand_expr_hashpair_scalar {
+sub _expand_hashpair_scalar {
my ($self, $k, $v) = @_;
- return $self->_expand_expr_hashpair_cmp(
- $k, $self->_expand_expr_scalar($v),
+ return $self->_expand_hashpair_cmp(
+ $k, $self->_expand_scalar($v),
);
}
-sub _expand_expr_hashpair_op {
+sub _expand_hashpair_op {
my ($self, $k, $v) = @_;
$self->_assert_pass_injection_guard($k =~ /\A-(.*)\Z/s);
my $op = $self->_normalize_op($k);
+ if (my $exp = $self->{expand}{$op}) {
+ return $self->$exp($k, $v);
+ }
+
# Ops prefixed with -not_ get converted
if (my ($rest) = $op =~/^not_(.*)$/) {
if (
(our $Expand_Depth) == 1
- and $self->{disable_old_special_ops}
- and List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}}
+ and (
+ List::Util::first { $op =~ $_->{regex} } @{$self->{special_ops}}
+ or (
+ $self->{disable_old_special_ops}
+ and List::Util::first { $op =~ $_->{regex} } @BUILTIN_SPECIAL_OPS
+ )
+ )
) {
puke "Illegal use of top-level '-$op'"
}
# an explicit node type is currently assumed to be expanded (this is almost
# certainly wrong and there should be expansion anyway)
- if ($self->{render}{$k}) {
+ if ($self->{render}{$op}) {
return { $k => $v };
}
die "notreached";
}
-sub _expand_expr_hashpair_cmp {
+sub _expand_hashpair_cmp {
my ($self, $k, $v) = @_;
- $self->_expand_expr_hashtriple($k, $self->{cmp}, $v);
+ $self->_expand_hashtriple($k, $self->{cmp}, $v);
}
-sub _expand_expr_hashtriple {
+sub _expand_hashtriple {
my ($self, $k, $vk, $vv) = @_;
my $ik = $self->_expand_ident(-ident => $k);
"unexpected operator '%s' with undef operand",
) ? 'is' : 'is not');
- return $self->_expand_expr_hashpair($k => { $is, undef });
+ return $self->_expand_hashpair($k => { $is, undef });
}
local our $Cur_Col_Meta = $k;
return +{ -op => [
sub _expand_ident {
my ($self, $op, $body, $k) = @_;
- return $self->_expand_expr_hashpair_cmp(
+ return $self->_expand_hashpair_cmp(
$k, { -ident => $body }
) if defined($k);
unless (defined($body) or (ref($body) and ref($body) eq 'ARRAY')) {
}
sub _expand_value {
- return $_[0]->_expand_expr_hashpair_cmp(
+ return $_[0]->_expand_hashpair_cmp(
$_[3], { -value => $_[2] },
) if defined($_[3]);
+{ -bind => [ our $Cur_Col_Meta, $_[2] ] };
+{ -op => [ 'not', $_[0]->_expand_expr($_[2]) ] };
}
+sub _expand_row {
+ my ($self, $node, $args) = @_;
+ +{ $node => [ map $self->expand_expr($_), @$args ] };
+}
+
+sub _expand_op {
+ my ($self, $node, $args) = @_;
+ my ($op, @opargs) = @$args;
+ +{ $node => [ $op, map $self->expand_expr($_), @opargs ] };
+}
+
sub _expand_bool {
my ($self, undef, $v) = @_;
if (ref($v)) {
return $self->_expand_expr($v);
}
+sub _expand_bind {
+ my ($self, $op, $bind) = @_;
+ return { $op => $bind };
+}
+
sub _recurse_where {
my ($self, $where, $logic) = @_;
return +{ -op => [ ',', @exp ] };
};
- local @{$self->{expand}}{qw(-asc -desc)} = (($expander) x 2);
+ local @{$self->{expand}}{qw(asc desc)} = (($expander) x 2);
return $self->$expander(undef, $arg);
}