13 my ($self, $data) = @_;
14 my $class = ref($self) || $self;
15 return bless(\$data, $class);
18 sub _op_num_eq { shift->_binop('==', @_) };
19 sub _op_num_gt { shift->_binop('>', @_) };
22 my ($self, $op, $rhs) = @_;
26 (ref $rhs ? ${$rhs} : [ -value, $rhs ]),
33 our $AUTOLOAD =~ s/.*:://;
34 return I::E->new([ -name, $AUTOLOAD ]);
46 use Data::Dump qw(dump);
47 use Scalar::Util qw(blessed);
51 blessed($un) && $un->isa('E')
54 ? [ map { _une($_) } @$un ]
59 local $_ = bless(\do { my $x }, 'I');
60 map { _une($_) } $_[0]->();
64 map { ref($_) eq 'ARRAY' ? [ -alias, $_->[1], $_->[0] ] : $_ } @_
67 sub expr (&) { _run_e(@_) }
69 my ($name, $code, @in) = @_;
70 warn "eek: ${\dump @in}" if @in > 1;
71 [ $name, _run_e($code), @in ];
74 my ($name, $code, @in) = @_;
82 sub ORDER_BY (&;@) { _do(-order_by, @_) }
83 sub SELECT (&;@) { _dolist('-select', @_); }
84 sub JOIN (&;@) { _do('-join', shift, [ -list => _aliasify @{+shift} ], @_) }
85 sub WHERE (&;@) { _do(-where, @_) }
86 sub GROUP_BY (&;@) { _dolist(-group_by, @_); }
87 sub sum { E->new([ -sum, _une(shift) ]); }
89 #warn dump(expr { $_->one == $_->two });
91 ORDER_BY { $_->aggregates->total }
92 SELECT { $_->users->name, $_->aggregates->total }
93 JOIN { $_->users->id == $_->aggregates->recipient_id }
95 [ users => expr { $_->users } ],
98 SELECT { $_->recipient_id, [ total => sum($_->commission) ] }
99 WHERE { sum($_->commission) > 500 }
100 GROUP_BY { $_->recipient_id }
101 WHERE { $_->entry_date > '2007-01-01' }
102 expr { $_->commissions }
109 ORDER_BY { $_->aggregates->total }
110 SELECT { $_->users->name, $_->aggregates->total }
111 JOIN { $_->users->id == $_->aggregates->recipient_id }
113 [ users => expr { $_->users } ],
116 SELECT { $_->recipient_id, [ total => sum($_->commission) ] }
117 WHERE { sum($_->commission) > 500 }
118 GROUP_BY { $_->recipient_id }
119 WHERE { $_->entry_date > '2007-01-01' }
120 expr { $_->commissions }
127 ORDER_BY { $_->aggregates->total }
128 SELECT { $_->users->name, $_->aggregates->total }
129 WHERE { $_->aggregates->total > 500 }
130 JOIN { $_->users->id == $_->aggregates->recipient_id }
132 [ users => expr { $_->users } ],
135 SELECT { $_->recipient_id, [ total => sum($_->commission) ] }
136 GROUP_BY { $_->recipient_id }
137 WHERE { $_->entry_date > '2007-01-01' }
138 expr { $_->commissions }