File Coverage

blib/lib/EntityModel/Query/Insert.pm
Criterion Covered Total %
statement 28 53 52.8
branch 4 10 40.0
condition n/a
subroutine 6 11 54.5
pod 8 8 100.0
total 46 82 56.1


line stmt bran cond sub pod time code
1             package EntityModel::Query::Insert;
2             {
3             $EntityModel::Query::Insert::VERSION = '0.102';
4             }
5             use EntityModel::Class {
6 16         200 _isa => [qw{EntityModel::Query}],
7             'values' => { type => 'array', subclass => 'EntityModel::Query::InsertField' },
8 16     16   85 };
  16         34  
9              
10             =head1 NAME
11              
12             EntityModel::Query::Insert - support for INSERT SQL statement
13              
14             =head1 VERSION
15              
16             version 0.102
17              
18             =head1 SYNOPSIS
19              
20             See L.
21              
22             =head1 DESCRIPTION
23              
24             See L.
25              
26             =cut
27              
28             =head1 METHODS
29              
30             =cut
31              
32             =head2 import
33              
34             Register the parse handling for our 'insert' attribute.
35              
36             =cut
37              
38             sub import {
39 16     16   60 my $class = shift;
40             $class->register(
41             'insert_into' => sub {
42 2     2   5 my $self = shift;
43 2         13 $self->upgradeTo('EntityModel::Query::Insert');
44 2         16 $self->parse_base(
45             @_,
46             method => 'from',
47             type => 'EntityModel::Query::FromTable'
48             );
49             }
50 16         182 );
51             }
52              
53             =head2 type
54              
55             =cut
56              
57 2     2 1 12 sub type { 'insert'; }
58              
59             =head2 parse_values
60              
61             Populate the values for the insert statement.
62              
63             =cut
64              
65             sub parse_values {
66 2     2 1 5 my $self = shift;
67 2         5 my $spec = shift;
68 2         14 foreach my $k (sort keys %$spec) {
69 4         29 $self->parse_base({
70             name => $k,
71             value => $spec->{$k},
72             },
73             method => 'values',
74             type => 'EntityModel::Query::InsertField'
75             );
76             }
77             }
78              
79             =head2 parse_fields
80              
81             Populate the values for the insert statement.
82              
83             =cut
84              
85             sub parse_fields {
86 0     0 1 0 my $self = shift;
87 0         0 my $spec = shift;
88 0         0 foreach my $k (sort keys %$spec) {
89 0         0 $self->parse_base({
90             name => $k,
91             value => $spec->{$k},
92             },
93             method => 'values',
94             type => 'EntityModel::Query::InsertField'
95             );
96             }
97             }
98              
99             =head2 fieldsSQL
100              
101             =cut
102              
103             sub fieldsSQL {
104 0     0 1 0 my $self = shift;
105 0         0 logDebug("We have fields: [%s]", join(',', map { $_->field } $self->values->list));
  0         0  
106 0         0 my $fields = join(', ', grep { defined $_ } map {
  0         0  
107 0         0 $_->asString
108             } $self->values->list);
109 0         0 logDebug("Fields are [%s]", $fields);
110 0 0       0 return unless $fields;
111 0         0 return '(' . $fields . ')';
112             }
113              
114             =head2 valuesSQL
115              
116             =cut
117              
118             sub valuesSQL {
119 0     0 1 0 my $self = shift;
120 0         0 my $sql = join(', ', grep { defined $_ } map {
  0         0  
121 0         0 $_->quotedValue
122             } $self->values->list);
123 0 0       0 return unless $sql;
124 0         0 return 'values (' . $sql . ')';
125             }
126              
127             =head2 keyword_order
128              
129             =cut
130              
131 0     0 1 0 sub keyword_order { qw{type from fields values returning}; }
132              
133             =head2 fromSQL
134              
135             =cut
136              
137             sub fromSQL {
138 0     0 1 0 my $self = shift;
139 0         0 my $from = join(', ', map { $_->asString } $self->from->list);
  0         0  
140 0 0       0 return unless $from;
141 0         0 return $from;
142             }
143              
144             sub inlineSQL {
145 4     4 1 7 my $self = shift;
146 4         83 my $data = [
147             'insert into ',
148 8         94 (map { $_->asString } $self->from->list),
149             ' (',
150 4         20 join(', ', map { $_->name } $self->values->list),
151             ') values ('
152             ];
153 4         39 my @field;
154 4         17 foreach ($self->values->list) {
155 8         75 my $v = $_->value;
156 8 100       54 push @field, ', ' if @field;
157 8         21 push @field, \$v;
158             }
159 4         16 push @$data, @field;
160 4         11 push @$data, ')';
161 4 100       24 if($self->returning->count) {
162 2         24 push @$data, ' returning ';
163 2         8 push @$data, $_->asString for $self->returning->list;
164             }
165 4         302 return $data;
166             }
167              
168             1;
169              
170             __END__