1 package Data::Query::ExprHelpers;
4 use Data::Query::Constants;
9 perl_scalar_value perl_operator Literal Identifier compose intersperse
13 sub intersperse { my $i = shift; my @i = map +($_, $i), @_; pop @i; @i }
15 sub perl_scalar_value {
18 subtype => { Perl => 'Scalar' },
20 $_[1] ? (value_meta => $_[1]) : ()
28 operator => { Perl => $op },
34 Join => [ qw(left right on outer) ],
35 Alias => [ qw(to from) ],
36 Operator => [ qw(operator args) ],
37 Select => [ qw(select from) ],
38 Where => [ qw(where from) ],
39 Order => [ qw(by reverse nulls from) ],
40 Group => [ qw(by from) ],
41 Delete => [ qw(where target) ],
42 Update => [ qw(set where target) ],
43 Insert => [ qw(names values target returning) ],
44 Slice => [ qw(offset limit from) ],
60 ($_[1] ? (values => $_[1]) : ())
66 type => DQ_IDENTIFIER,
71 foreach my $name (values %Data::Query::Constants::CONST) {
73 my $sub = "is_${name}";
75 my $dq = @_ ? $_[0] : $_;
76 $dq->{type} and $dq->{type} eq $name
79 if (my @map = @{$map{$name}||[]}) {
81 my $dq = { type => $name };
83 $dq->{$map[$_]} = $_[$_] if defined $_[$_];
86 if (my $optional = $_[$#map+1]) {
87 unless(ref $optional eq 'HASH') {
89 Carp::croak("Not a hashreference");
91 @{$dq}{keys %$optional} = values %$optional;
100 sub is_Having { is_Where($_[0]) and is_Group($_[0]->{from}) }
102 push @EXPORT, 'is_Having';
106 require Scalar::Util;
107 my $type = Scalar::Util::reftype($code);
108 unless($type and $type eq 'CODE') {
110 Carp::croak("Not a subroutine reference");
114 return shift unless @_ > 1;
119 local(*{$caller."::a"}) = \my $a;
120 local(*{$caller."::b"}) = \my $b;
123 foreach (reverse @_) {
132 my ($cb_map, @queue) = @_;
133 while (my $node = shift @queue) {
134 if ($node->{type} and my $cb = $cb_map->{$node->{type}}) {
138 grep ref($_) eq 'HASH',
139 map +(ref($_) eq 'ARRAY' ? @$_ : $_),
140 @{$node}{grep !/\./, keys %$node};