File Coverage

blib/lib/LINQ/Database/Util.pm
Criterion Covered Total %
statement 58 94 61.7
branch 23 56 42.8
condition 7 10 70.0
subroutine 13 24 54.1
pod 0 2 0.0
total 101 186 54.8


line stmt bran cond sub pod time code
1 1     1   26 use 5.008003;
  1         4  
2 1     1   6 use strict;
  1         2  
  1         19  
3 1     1   5 use warnings;
  1         1  
  1         67  
4              
5             package LINQ::Database::Util;
6              
7             our $AUTHORITY = 'cpan:TOBYINK';
8             our $VERSION = '0.000_002';
9              
10 1     1   7 use Scalar::Util qw( blessed );
  1         2  
  1         1460  
11              
12             sub selection_to_sql {
13 6     6 0 14 my ( $selection, $name_quoter ) = ( shift, @_ );
14            
15 6 50       21 return unless blessed( $selection );
16 6 50       26 return unless $selection->isa( 'LINQ::FieldSet::Selection' );
17 6 50       99 return if $selection->seen_asterisk;
18            
19             $name_quoter ||= sub {
20 4     4   7 my $name = shift;
21 4         19 return sprintf( '"%s"', quotemeta( $name ) );
22 6   100     161 };
23            
24 6         10 my @cols;
25 6         9 for my $field ( @{ $selection->fields } ) {
  6         99  
26 8         1950 my $orig_name = $field->value;
27 8         146 my $aliased = $field->name;
28 8 50       41 return if ref( $orig_name );
29             # uncoverable branch true
30 8 50       19 return if !defined( $aliased );
31            
32 8         20 push @cols, $name_quoter->( $orig_name );
33             } #/ for my $field ( @{ $self...})
34            
35 6         124 return join( q[, ], @cols );
36             } #/ sub _sql_selection
37              
38             sub assertion_to_sql {
39 5     5 0 13 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
40            
41 5 50       17 return unless blessed( $assertion );
42            
43             $name_quoter ||= sub {
44 2     2   11 my $name = shift;
45 2         11 return sprintf( '"%s"', quotemeta( $name ) );
46 5   100     29 };
47            
48             $value_quoter ||= sub {
49 2     2   10 my $name = shift;
50 2         8 return sprintf( '"%s"', quotemeta( $name ) );
51 5   100     20 };
52            
53 5 50       50 if ( $assertion->isa( 'LINQ::FieldSet::Assertion::AND' ) ) {
    50          
    50          
    50          
54 0         0 return _assertion_to_sql_AND( $assertion, $name_quoter, $value_quoter );
55             }
56             elsif ( $assertion->isa( 'LINQ::FieldSet::Assertion::OR' ) ) {
57 0         0 return _assertion_to_sql_OR( $assertion, $name_quoter, $value_quoter );
58             }
59             elsif ( $assertion->isa( 'LINQ::FieldSet::Assertion::NOT' ) ) {
60 0         0 return _assertion_to_sql_NOT( $assertion, $name_quoter, $value_quoter );
61             }
62             elsif ( $assertion->isa( 'LINQ::FieldSet::Assertion' ) ) {
63 5         14 return _assertion_to_sql_FIELDSET( $assertion, $name_quoter, $value_quoter );
64             }
65             }
66              
67             sub _assertion_to_sql_AND {
68 0     0   0 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
69            
70 0 0       0 my $left = assertion_to_sql( $assertion->left, $name_quoter, $value_quoter )
71             or return;
72 0 0       0 my $right = assertion_to_sql( $assertion->right, $name_quoter, $value_quoter )
73             or return;
74            
75 0         0 return "($left) AND ($right)";
76             }
77              
78             sub _assertion_to_sql_OR {
79 0     0   0 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
80            
81 0 0       0 my $left = assertion_to_sql( $assertion->left, $name_quoter, $value_quoter )
82             or return;
83 0 0       0 my $right = assertion_to_sql( $assertion->right, $name_quoter, $value_quoter )
84             or return;
85            
86 0         0 return "($left) OR ($right)";
87             }
88              
89             sub _assertion_to_sql_NOT {
90 0     0   0 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
91            
92 0 0       0 my $left = assertion_to_sql( $assertion->left, $name_quoter, $value_quoter )
93             or return;
94            
95 0         0 return "NOT ($left)";
96             }
97              
98             sub _assertion_to_sql_FIELDSET {
99 5     5   10 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
100            
101 5         10 my @fields;
102 5         7 for my $field ( @{ $assertion->fields } ) {
  5         88  
103 5 100       141 my $field_sql = _assertion_to_sql_FIELD( $field, $name_quoter, $value_quoter )
104             or return;
105 4         13 push @fields, "($field_sql)";
106             }
107            
108 4         25 join " AND ", @fields;
109             }
110              
111             sub _assertion_to_sql_FIELD {
112 5     5   12 my ( $field, $name_quoter, $value_quoter ) = ( @_ );
113            
114 5 50       223 return if ref( $field->value );
115 5         36 my $result;
116            
117 5 100       89 if ( exists $field->params->{is} ) {
    50          
    50          
    50          
118 4         66 $result = _assertion_to_sql_FIELD_IS( @_ );
119             }
120             elsif ( exists $field->params->{in} ) {
121 0         0 $result = _assertion_to_sql_FIELD_IN( @_ );
122             }
123             elsif ( exists $field->params->{like} ) {
124 0         0 $result = _assertion_to_sql_FIELD_LIKE( @_ );
125             }
126             elsif ( exists $field->params->{to} ) {
127 0         0 $result = _assertion_to_sql_FIELD_TO( @_ );
128             }
129            
130 5 100       81 return unless defined $result;
131            
132 4 50       66 if ( exists $field->params->{nix} ) {
133 0         0 return "NOT ($result)";
134             }
135            
136 4         27 return $result;
137             }
138              
139             sub _assertion_to_sql_FIELD_IS {
140 4     4   8 my ( $field, $name_quoter, $value_quoter ) = ( @_ );
141            
142 4   50     73 my $cmp = $field->params->{cmp} || '==';
143 4 50       35 if ( $cmp eq '!=' ) {
144 0         0 $cmp = '<>'; # SQL syntax <> Perl syntax
145             }
146            
147             my $wrapper = $field->params->{nocase}
148 0     0   0 ? sub { sprintf( 'LOWER(%s)', $_[0] ) }
149 4 50   8   63 : sub { $_[0] };
  8         197  
150            
151             return sprintf(
152             '%s %s %s',
153             $wrapper->( $name_quoter->( $field->value ) ),
154             $cmp,
155 4         85 $wrapper->( $value_quoter->( $field->params->{is} ) ),
156             );
157             }
158              
159             sub _assertion_to_sql_FIELD_IN {
160 0     0     my ( $field, $name_quoter, $value_quoter ) = ( @_ );
161            
162             return sprintf(
163             '%s IN (%s)',
164             $name_quoter->( $field->value ),
165             join(
166             q[, ],
167 0           map $value_quoter->( $_ ), @{ $field->params->{to} },
  0            
168             ),
169             );
170             }
171              
172             sub _assertion_to_sql_FIELD_LIKE {
173 0     0     my ( $field, $name_quoter, $value_quoter ) = ( @_ );
174            
175             my $wrapper = $field->params->{nocase}
176 0     0     ? sub { sprintf( 'LOWER(%s)', $_[0] ) }
177 0 0   0     : sub { $_[0] };
  0            
178            
179             return sprintf(
180             '%s LIKE %s',
181             $wrapper->( $name_quoter->( $field->value ) ),
182 0           $wrapper->( $value_quoter->( $field->params->{like} ) ),
183             );
184             }
185              
186             sub _assertion_to_sql_FIELD_TO {
187 0     0     my ( $field, $name_quoter, $value_quoter ) = ( @_ );
188            
189 0   0       my $cmp = $field->params->{cmp} || '==';
190 0 0         if ( $cmp eq '!=' ) {
191 0           $cmp = '<>'; # SQL syntax <> Perl syntax
192             }
193            
194             my $wrapper = $field->params->{nocase}
195 0     0     ? sub { sprintf( 'LOWER(%s)', $_[0] ) }
196 0 0   0     : sub { $_[0] };
  0            
197            
198             return sprintf(
199             '%s %s %s',
200             $wrapper->( $name_quoter->( $field->value ) ),
201             $cmp,
202 0           $wrapper->( $name_quoter->( $field->params->{to} ) ),
203             );
204             }
205              
206             1;