X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract.pm;h=682139d568a89e16b646bb83de34b1238ab919cc;hb=07070f1a6db1e1eb4bcac0dbe74b82f8b003cd27;hp=ea1a50877587e5adc3ba96c3d5ae2bf353fafa88;hpb=a93e8a872753661e7501b4c6f5ffa1f7c9481f2b;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract.pm b/lib/SQL/Abstract.pm index ea1a508..682139d 100644 --- a/lib/SQL/Abstract.pm +++ b/lib/SQL/Abstract.pm @@ -2,6 +2,7 @@ package SQL::Abstract; # see doc at end of file use strict; use warnings; +use Module::Runtime (); use Carp (); use List::Util (); use Scalar::Util (); @@ -239,6 +240,13 @@ sub new { ',' => '_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; } @@ -543,7 +551,9 @@ sub render_expr { 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; } @@ -1085,9 +1095,11 @@ sub _render_func { 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), + ')' + ), ); } @@ -1161,9 +1173,11 @@ sub _render_op_in { return $self->join_query_parts(' ', $lhs, $self->format_keyword($op), - '(', - $self->join_query_parts(', ', @rhs), - ')' + $self->join_query_parts(' ', + '(', + $self->join_query_parts(', ', @rhs), + ')' + ), ); } @@ -1171,8 +1185,8 @@ sub _render_op_andor { 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), ')' ); } @@ -1196,7 +1210,7 @@ sub join_query_parts { : ((ref($_) eq 'ARRAY') ? $_ : [ $_ ]) ), @parts; return [ - join($join, map $_->[0], @final), + $self->{join_sql_parts}->($join, map $_->[0], @final), (map @{$_}[1..$#$_], @final), ]; } @@ -1313,7 +1327,9 @@ sub _order_by_chunks { 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 {