6b2cbefc31affb6eefab22b1f420699ccb3f520b
[dbsrgits/Data-Query.git] / lib / Data / Query / ExprHelpers.pm
1 package Data::Query::ExprHelpers;
2
3 use strictures 1;
4 use Data::Query::Constants;
5
6 use base qw(Exporter);
7
8 our @EXPORT = qw(perl_scalar_value perl_operator Literal Identifier);
9
10 sub perl_scalar_value {
11   +{
12     type => DQ_VALUE,
13     subtype => { Perl => 'Scalar' },
14     value => $_[0],
15     $_[1] ? (value_meta => $_[1]) : ()
16   }
17 }
18
19 sub perl_operator {
20   my ($op, @args) = @_;
21   +{
22     type => DQ_OPERATOR,
23     operator => { Perl => $op },
24     args => \@args
25   }
26 }
27
28 my %map = (
29   Join => [ qw(left right on outer) ],
30   Alias => [ qw(to from) ],
31   Operator => [ qw(operator args) ],
32   Select => [ qw(select from) ],
33   Where => [ qw(where from) ],
34   Order => [ qw(by reverse from) ],
35   Group => [ qw(by from) ],
36   Delete => [ qw(where target) ],
37   Update => [ qw(set where target) ],
38   Insert => [ qw(names values target returning) ],
39   Slice => [ qw(offset limit from) ],
40 );
41
42 sub Literal {
43   if (ref($_[0])) {
44     return +{
45       type => DQ_LITERAL,
46       parts => @{$_[0]},
47     };
48   }
49   return +{
50     type => DQ_LITERAL,
51     literal => $_[0],
52     ($_[1] ? (values => $_[1]) : ())
53   };
54 }
55
56 sub Identifier {
57   return +{
58     type => DQ_IDENTIFIER,
59     elements => [ @_ ],
60   };
61 }
62
63 foreach my $name (values %Data::Query::Constants::CONST) {
64   no strict 'refs';
65   my $sub = "is_${name}";
66   *$sub = sub {
67     my $dq = $_[0]||$_;
68     $dq->{type} eq $name
69   };
70   push @EXPORT, $sub;
71   if ($map{$name}) {
72     my @map = @{$map{$name}};
73     *$name = sub {
74       my $dq = { type => $name };
75       foreach (0..$#_) {
76         $dq->{$map[$_]} = $_[$_] if defined $_[$_];
77       }
78       return $dq;
79     };
80     push @EXPORT, $name;
81   }
82 }
83
84 1;