Convert (in)equality with undef to (not) defined/IS NOT NULL ops
[dbsrgits/Data-Query.git] / lib / Data / Query / ExprBuilder.pm
CommitLineData
9ee33178 1package Data::Query::ExprBuilder;
2
3use strictures 1;
b616bc41 4use Scalar::Util ();
12e6eab8 5use Data::Query::ExprHelpers qw(perl_scalar_value perl_operator);
b616bc41 6
7use overload (
c3633a0e 8 # unary operators
9 (map {
10 my $op = $_;
11 $op => sub {
12 Data::Query::ExprBuilder->new({
12e6eab8 13 expr => perl_operator($op => $_[0]->{expr})
c3633a0e 14 });
15 }
16 } qw(! neg)),
7e599929 17 # binary operators
b616bc41 18 (map {
7e599929 19 my ($overload, $as) = ref($_) ? @$_ : ($_, $_);
20 $overload => sub {
b616bc41 21 Data::Query::ExprBuilder->new({
12e6eab8 22 expr => perl_operator(
23 $as,
b616bc41 24 map {
25 (Scalar::Util::blessed($_)
26 && $_->isa('Data::Query::ExprBuilder'))
27 ? $_->{expr}
12e6eab8 28 : perl_scalar_value($_)
c3633a0e 29 # we're called with ($left, $right, 0) or ($right, $left, 1)
b616bc41 30 } $_[2] ? @_[1,0] : @_[0,1]
12e6eab8 31 )
b616bc41 32 });
33 }
7e599929 34 }
b01a3688 35 qw(+ - * / % ** << >> . < > lt le gt ge ),
7e599929 36
37 # since 'and' and 'or' aren't operators we borrow the bitwise ops
38 [ '&' => 'and' ], [ '|' => 'or' ],
39 ),
b01a3688 40
41 # equality operators (need undef maping)
42 (map {
43 my ($overload, $as) = ref($_) ? @$_ : ($_, $_);
44 $overload => sub {
45 Data::Query::ExprBuilder->new({
46 expr => grep(!defined, @_[0,1])
47 ? (map { $overload =~ /==|eq/ ? perl_operator(not => $_) : $_ }
48 perl_operator(defined => map { defined($_) ? $_->{expr} : () } @_[0,1]))
49 : perl_operator(
50 $as,
51 map {
52 (Scalar::Util::blessed($_)
53 && $_->isa('Data::Query::ExprBuilder'))
54 ? $_->{expr}
55 : perl_scalar_value($_)
56 # we're called with ($left, $right, 0) or ($right, $left, 1)
57 } $_[2] ? @_[1,0] : @_[0,1]
58 )
59 });
60 }
61 }
62 qw(== != eq ne)
63
64 ),
7e599929 65 # unsupported
9e0200bc 66 (map {
67 my $op = $_;
68 $op => sub { die "Can't use operator $op on a ".ref($_[0]) }
7e599929 69 } qw(<=> cmp x ^ ~)
9e0200bc 70 ),
8e97944c 71 fallback => 1,
b616bc41 72);
9ee33178 73
74sub new {
75 bless({ %{$_[1]} }, (ref($_[0])||$_[0]));
76}
77
781;