sanify alias/SELECT list rendering
[dbsrgits/Data-Query.git] / t / expr.include
1 use strictures 1;
2 use Data::Query::ExprBuilder::Identifier;
3 use Data::Query::Constants qw(
4   DQ_SELECT DQ_IDENTIFIER DQ_OPERATOR DQ_VALUE DQ_ALIAS
5 );
6 use Data::Query::ExprHelpers qw(perl_scalar_value identifier);
7
8 sub expr (&) {
9   _run_expr($_[0])->{expr};
10 }
11
12 sub _run_expr {
13   local $_ = Data::Query::ExprBuilder::Identifier->new({
14     expr => identifier()
15   });
16   $_[0]->();
17 }
18
19 sub AS {
20   my $as = shift;
21   (bless(\$as, 'LIES::AS'), @_);
22 }
23
24 sub SELECT (&;@) {
25   my @select = map +(
26     ref()
27       ? $_
28       : { expr => perl_scalar_value($_) }
29   ), _run_expr(shift);
30   my @final;
31   while (@select) {
32     my $e = shift @select;
33     push @final,
34       (ref($select[0]) eq 'LIES::AS'
35         ? +{
36              type => DQ_ALIAS,
37              alias => $e->{expr},
38              as => ${shift(@select)}
39           }
40         : $e->{expr}
41      );
42   }
43       
44   return +{
45     expr => {
46       type => DQ_SELECT,
47       select => \@final
48     },
49     @_ ? (from => $_[0]->{expr}) : ()
50   };
51 }
52
53 sub BY (&;@) { @_ }
54
55 sub FROM (&;@) {
56   my @from = _run_expr(shift);
57   if (@from == 2 and ref($from[1]) eq 'LIES::AS') {
58     return +{
59       expr => {
60         type => DQ_ALIAS,
61         source => $from[0],
62         alias => identifier(${$from[1]}),
63       }
64     };
65   } elsif (@from == 1) {
66     return { expr => $from[0] };
67   }
68   die "Huh?"
69 }
70
71 1;