1 package Data::Query::ExprDeclare;
4 use Data::Query::ExprBuilder::Identifier;
5 use Data::Query::ExprHelpers;
6 use Data::Query::Constants;
11 our @EXPORT = qw(expr SELECT AS FROM BY JOIN ON LEFT WHERE ORDER GROUP);
14 _run_expr($_[0])->{expr};
18 local $_ = Data::Query::ExprBuilder::Identifier->new({
25 if ($_[0]->$_isa('Data::Query::ExprBuilder')) {
27 } elsif (ref($_[0])) {
30 perl_scalar_value($_[0]);
36 (bless(\$as, 'LIES::AS'), @_);
40 my @select = map _value($_), _run_expr(shift);
43 my $e = shift @select;
45 (ref($select[0]) eq 'LIES::AS'
46 ? Alias(${shift(@select)}, $e)
51 return Select(\@final, $_[0]);
57 my @from = _run_expr(shift);
59 if (@from == 2 and ref($from[1]) eq 'LIES::AS') {
60 Alias(${$from[1]}, _value($from[0]))
61 } elsif (@from == 1) {
65 while (is_Join($_[0])) {
66 $from_dq = { %{+shift}, left => $from_dq };
68 if (is_Where($_[0])) {
69 $from_dq = Where(shift->{where}, $from_dq);
75 my ($join, @rest) = @_;
76 die "LEFT used as modifier on non-join ${join}"
77 unless is_Join($join);
78 return +{ %$join, outer => 'LEFT' }, @rest;
82 my $join = FROM(\&{+shift});
84 if ($_[0]->$_isa('LIES::ON')) {
90 Join(undef, $join, $on), @_;
94 my $on = _value(_run_expr(shift));
95 return bless(\$on, 'LIES::ON'), @_;
100 return Where(_value(_run_expr($w))), @_;