74adb47e4d153628d650e5e52d22e7833f040acb
[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, my $res = { expr => $e->{expr} };
34     if (ref($select[0]) eq 'LIES::AS') {
35       $res->{name} = identifier(${shift @select});
36     }
37   }
38       
39   return +{
40     expr => {
41       type => DQ_SELECT,
42       select => \@final
43     },
44     @_ ? (from => $_[0]->{expr}) : ()
45   };
46 }
47
48 sub BY (&;@) { @_ }
49
50 sub FROM (&;@) {
51   my @from = _run_expr(shift);
52   if (@from == 2 and ref($from[1]) eq 'LIES::AS') {
53     return +{
54       expr => {
55         type => DQ_ALIAS,
56         source => $from[0],
57         alias => identifier(${$from[1]}),
58       }
59     };
60   } elsif (@from == 1) {
61     return { expr => $from[0] };
62   }
63   die "Huh?"
64 }
65
66 1;