1 package Data::Query::ExprDeclare;
4 use Data::Query::ExprBuilder::Identifier;
5 use Data::Query::ExprHelpers;
6 use Data::Query::Constants;
12 expr SELECT AS FROM BY JOIN ON LEFT WHERE ORDER GROUP DESC
16 _run_expr($_[0])->{expr};
20 local $_ = Data::Query::ExprBuilder::Identifier->new({
27 if ($_[0]->$_isa('Data::Query::ExprBuilder')) {
29 } elsif (ref($_[0])) {
32 perl_scalar_value($_[0]);
38 (bless(\$as, 'LIES::AS'), @_);
42 my @select = map _value($_), _run_expr(shift);
45 my $e = shift @select;
47 (ref($select[0]) eq 'LIES::AS'
48 ? Alias(${shift(@select)}, $e)
53 return Select(\@final, $_[0]);
59 my @from = _run_expr(shift);
61 if (@from == 2 and ref($from[1]) eq 'LIES::AS') {
62 Alias(${$from[1]}, _value($from[0]))
63 } elsif (@from == 1) {
67 while (is_Join($_[0])) {
68 $from_dq = { %{+shift}, left => $from_dq };
70 if (is_Where($_[0])) {
71 my $where = shift->{where};
72 if (is_Select($from_dq)) {
73 $from_dq = Select($from_dq->{select}, Where($where, $from_dq->{from}));
75 $from_dq = Where($where, $from_dq);
78 while (is_Order($_[0])) {
80 $from_dq = Order($order->{by}, $order->{reverse}, $from_dq);
86 my ($join, @rest) = @_;
87 die "LEFT used as modifier on non-join ${join}"
88 unless is_Join($join);
89 return +{ %$join, outer => 'LEFT' }, @rest;
93 my $join = FROM(\&{+shift});
95 if ($_[0]->$_isa('LIES::ON')) {
101 Join(undef, $join, $on), @_;
105 my $on = _value(_run_expr(shift));
106 return bless(\$on, 'LIES::ON'), @_;
111 return Where(_value(_run_expr($w))), @_;
114 sub DESC { bless({}, 'LIES::DESC'), @_ }
117 my @order = map _value($_), _run_expr(shift);
119 if ($_[0]->$_isa('LIES::DESC')) {
125 return compose { Order($b, $reverse, $a) } @order, undef;