File Coverage

blib/lib/LINQ/Database/Util.pm
Criterion Covered Total %
statement 58 94 61.7
branch 17 56 32.1
condition 5 10 50.0
subroutine 13 24 54.1
pod 0 2 0.0
total 93 186 50.5


line stmt bran cond sub pod time code
1 1     1   26 use 5.008003;
  1         4  
2 1     1   5 use strict;
  1         2  
  1         19  
3 1     1   5 use warnings;
  1         2  
  1         85  
4              
5             package LINQ::Database::Util;
6              
7             our $AUTHORITY = 'cpan:TOBYINK';
8             our $VERSION = '0.000_001';
9              
10 1     1   9 use Scalar::Util qw( blessed );
  1         2  
  1         1482  
11              
12             sub selection_to_sql {
13 2     2 0 6 my ( $selection, $name_quoter ) = ( shift, @_ );
14            
15 2 50       7 return unless blessed( $selection );
16 2 50       11 return unless $selection->isa( 'LINQ::FieldSet::Selection' );
17 2 50       37 return if $selection->seen_asterisk;
18            
19             $name_quoter ||= sub {
20 2     2   4 my $name = shift;
21 2         10 return sprintf( '"%s"', quotemeta( $name ) );
22 2   100     58 };
23            
24 2         4 my @cols;
25 2         3 for my $field ( @{ $selection->fields } ) {
  2         36  
26 4         1826 my $orig_name = $field->value;
27 4         78 my $aliased = $field->name;
28 4 50       21 return if ref( $orig_name );
29             # uncoverable branch true
30 4 50       12 return if !defined( $aliased );
31            
32 4         7 push @cols, $name_quoter->( $orig_name );
33             } #/ for my $field ( @{ $self...})
34            
35 2         56 return join( q[, ], @cols );
36             } #/ sub _sql_selection
37              
38             sub assertion_to_sql {
39 1     1 0 3 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
40            
41 1 50       4 return unless blessed( $assertion );
42            
43             $name_quoter ||= sub {
44 1     1   6 my $name = shift;
45 1         6 return sprintf( '"%s"', quotemeta( $name ) );
46 1   50     9 };
47            
48             $value_quoter ||= sub {
49 1     1   6 my $name = shift;
50 1         5 return sprintf( '"%s"', quotemeta( $name ) );
51 1   50     6 };
52            
53 1 50       16 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 1         3 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 1     1   3 my ( $assertion, $name_quoter, $value_quoter ) = ( @_ );
100            
101 1         2 my @fields;
102 1         2 for my $field ( @{ $assertion->fields } ) {
  1         21  
103 1 50       40 my $field_sql = _assertion_to_sql_FIELD( $field, $name_quoter, $value_quoter )
104             or return;
105 1         7 push @fields, "($field_sql)";
106             }
107            
108 1         9 join " AND ", @fields;
109             }
110              
111             sub _assertion_to_sql_FIELD {
112 1     1   3 my ( $field, $name_quoter, $value_quoter ) = ( @_ );
113            
114 1 50       18 return if ref( $field->value );
115 1         18 my $result;
116            
117 1 50       23 if ( exists $field->params->{is} ) {
    0          
    0          
    0          
118 1         11 $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 1 50       7 return unless defined $result;
131            
132 1 50       19 if ( exists $field->params->{nix} ) {
133 0         0 return "NOT ($result)";
134             }
135            
136 1         28 return $result;
137             }
138              
139             sub _assertion_to_sql_FIELD_IS {
140 1     1   2 my ( $field, $name_quoter, $value_quoter ) = ( @_ );
141            
142 1   50     17 my $cmp = $field->params->{cmp} || '==';
143 1 50       10 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 1 50   2   18 : sub { $_[0] };
  2         23  
150            
151             return sprintf(
152             '%s %s %s',
153             $wrapper->( $name_quoter->( $field->value ) ),
154             $cmp,
155 1         23 $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;