use List::Util 'first';
use Scalar::Util 'blessed';
use Sub::Name 'subname';
+use Data::Query::ExprHelpers;
use namespace::clean;
#
# generate sql chunks
my $to_scan = {
restricting => [
- $sql_maker->_recurse_where ($where),
- $sql_maker->_parse_rs_attrs ({ having => $attrs->{having} }),
+ ($where
+ ? ($sql_maker->_recurse_where($where))[0]
+ : ()
+ ),
+ ($attrs->{having}
+ ? ($sql_maker->_recurse_where($attrs->{having}))[0]
+ : ()
+ ),
],
grouping => [
- $sql_maker->_parse_rs_attrs ({ group_by => $attrs->{group_by} }),
+ ($attrs->{group_by}
+ ? ($sql_maker->_render_sqla(group_by => $attrs->{group_by}))[0]
+ : (),
+ )
],
joining => [
$sql_maker->_recurse_from (
),
],
selecting => [
- $sql_maker->_recurse_fields ($select),
+ scalar $sql_maker->_render_sqla(select_select => $select),
],
ordering => [
map { $_->[0] } $self->_extract_order_criteria ($attrs->{order_by}, $sql_maker),
],
};
+ # local is not enough - need to ensure the inner objects get rebuilt
+ # with the original quoting setup (or lack thereof)
+ $sql_maker->clear_renderer;
+ $sql_maker->clear_converter;
+
# throw away empty chunks
$_ = [ map { $_ || () } @$_ ] for values %$to_scan;
sub _extract_order_criteria {
my ($self, $order_by, $sql_maker) = @_;
+ $sql_maker ||= $self->sql_maker;
+
+ my $order_dq = $sql_maker->converter->_order_by_to_dq($order_by);
+
+ my @by;
+ while (is_Literal($order_dq)) {
+ push @by, $order_dq->{by};
+ $order_dq = $order_dq->{from};
+ }
+
+ return map { [ $sql_maker->_render_dq($_) ] } @by;
+
my $parser = sub {
my ($sql_maker, $order_by, $orig_quote_chars) = @_;