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;
}
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;
}
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 {