File Coverage

lib/SQL/QueryBuilder/Flex/Exp.pm
Criterion Covered Total %
statement 47 74 63.5
branch 9 22 40.9
condition 1 2 50.0
subroutine 9 14 64.2
pod 0 11 0.0
total 66 123 53.6


line stmt bran cond sub pod time code
1             package SQL::QueryBuilder::Flex::Exp;
2              
3 24     24   283 use strict;
  24         42  
  24         734  
4 24     24   253 use warnings;
  24         44  
  24         704  
5 24     24   124 use base 'SQL::QueryBuilder::Flex::Statement';
  24         43  
  24         13132  
6              
7             sub new {
8 6     6 0 17 my ($class, @options) = @_;
9 6         40 my $self = $class->SUPER::new(
10             _childs => [],
11             @options,
12             );
13 6         29 return $self;
14             }
15              
16             sub is_empty {
17 5     5 0 9 my ($self) = @_;
18 5 50       7 return scalar(@{ $self->{_childs} }) ? 0 : 1;
  5         36  
19             }
20              
21             sub or {
22 7     7 0 16 my ($self, $exp, @params) = @_;
23              
24             # Create instance if this method has been called directly
25 7 50       34 if (!ref $self) {
26 0         0 $self = __PACKAGE__->new;
27             }
28              
29 7         10 push @{ $self->{_childs} }, [ 'OR', $exp, @params ];
  7         21  
30 7         71 return $self;
31             }
32              
33             sub or_exp {
34 0     0 0 0 my ($self) = @_;
35 0         0 my $new_exp = __PACKAGE__->new(parent => $self);
36 0         0 push @{ $self->{_childs} }, [ 'OR', $new_exp ];
  0         0  
37 0         0 return $new_exp;
38             }
39              
40             sub or_in {
41 0     0 0 0 my ($self, $name, @params) = @_;
42              
43 0 0       0 unless (scalar @params) {
44 0         0 return $self->or('0');
45             }
46              
47 0         0 my $exp = $name .' IN('. join(',', ('?') x @params) .')';
48              
49 0         0 return $self->or($exp, @params);
50             }
51              
52             sub or_not_in {
53 0     0 0 0 my ($self, $name, @params) = @_;
54              
55 0 0       0 unless (scalar @params) {
56 0         0 return $self->or('1');
57             }
58              
59 0         0 my $exp = $name .' NOT IN('. join(',', ('?') x @params) .')';
60              
61 0         0 return $self->or($exp, @params);
62             }
63              
64             sub and {
65 4     4 0 8 my ($self, $exp, @params) = @_;
66              
67             # Create instance if this method has been called directly
68 4 50       14 if (!ref $self) {
69 0         0 $self = __PACKAGE__->new;
70             }
71              
72 4         7 push @{ $self->{_childs} }, [ 'AND', $exp, @params ];
  4         13  
73 4         43 return $self;
74             }
75              
76             sub and_exp {
77 1     1 0 3 my ($self) = @_;
78 1         5 my $new_exp = __PACKAGE__->new(parent => $self);
79 1         4 push @{ $self->{_childs} }, [ 'AND', $new_exp ];
  1         9  
80 1         6 return $new_exp;
81             }
82              
83             sub and_in {
84 0     0 0 0 my ($self, $name, @params) = @_;
85              
86 0 0       0 unless (scalar @params) {
87 0         0 return $self->and('0');
88             }
89              
90 0         0 my $exp = $name .' IN('. join(',', ('?') x @params) .')';
91              
92 0         0 return $self->and($exp, @params);
93             }
94              
95             sub and_not_in {
96 0     0 0 0 my ($self, $name, @params) = @_;
97              
98 0 0       0 unless (scalar @params) {
99 0         0 return $self->and('1');
100             }
101              
102 0         0 my $exp = $name .' NOT IN('. join(',', ('?') x @params) .')';
103              
104 0         0 return $self->and($exp, @params);
105             }
106              
107             sub do_build {
108 6     6 0 52 my ($self, $writer, $indent) = @_;
109              
110 6   50     27 $indent ||= 0;
111              
112 6         12 my $is_first = 1;
113 6         9 foreach my $child (@{ $self->{_childs} }) {
  6         17  
114 12         32 my ($op, $exp, @params) = @$child;
115 12 100       26 if (ref $exp) {
116 1 50       3 next if $exp->is_empty();
117 1 50       4 my $str = $is_first ? '(' : join(' ', $op, '(');
118 1         4 $writer->write($str, $indent);
119 1         6 $exp->build($writer, $indent + 1);
120 1         3 $writer->write(')', $indent);
121             }
122             else {
123 11 100       34 my $str = $is_first ? $exp : join(' ', $op, $exp);
124 11         31 $writer->write($str, $indent);
125 11         41 $writer->add_params(@params);
126             }
127 12         28 undef $is_first;
128             }
129              
130 6         18 return;
131             }
132              
133             1;