Commit | Line | Data |
9c8fc055 |
1 | use strictures 1; |
515523bc |
2 | use Data::Query::ExprBuilder::Identifier; |
2cf0bb42 |
3 | use Data::Query::Constants qw( |
4 | DQ_SELECT DQ_IDENTIFIER DQ_OPERATOR DQ_VALUE DQ_ALIAS |
5 | ); |
9c8fc055 |
6 | use Data::Query::ExprHelpers qw(perl_scalar_value identifier); |
515523bc |
7 | |
8 | sub expr (&) { |
2cf0bb42 |
9 | _run_expr($_[0])->{expr}; |
515523bc |
10 | } |
11 | |
2cf0bb42 |
12 | sub _run_expr { |
515523bc |
13 | local $_ = Data::Query::ExprBuilder::Identifier->new({ |
9c8fc055 |
14 | expr => identifier() |
515523bc |
15 | }); |
2cf0bb42 |
16 | $_[0]->(); |
515523bc |
17 | } |
18 | |
9c8fc055 |
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($_) } |
2cf0bb42 |
29 | ), _run_expr(shift); |
9c8fc055 |
30 | my @final; |
31 | while (@select) { |
32 | my $e = shift @select; |
bdb576cb |
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 | ); |
9c8fc055 |
42 | } |
43 | |
44 | return +{ |
45 | expr => { |
46 | type => DQ_SELECT, |
47 | select => \@final |
48 | }, |
2cf0bb42 |
49 | @_ ? (from => $_[0]->{expr}) : () |
9c8fc055 |
50 | }; |
51 | } |
52 | |
2cf0bb42 |
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 | |
515523bc |
71 | 1; |