... | ... |
@@ -1,3 +1,5 @@ |
1 |
+0.1712 |
|
2 |
+ - you can set any string as separator |
|
1 | 3 |
0.1711 |
2 | 4 |
- renamed EXPERIMENTAL available_type_name to available_typename |
3 | 5 |
- renamed EXPERIMENTAL available_data_type to available_datatype |
... | ... |
@@ -54,6 +54,7 @@ has [qw/connector dsn password quote user/], |
54 | 54 |
query_builder => sub { DBIx::Custom::QueryBuilder->new(dbi => shift) }, |
55 | 55 |
result_class => 'DBIx::Custom::Result', |
56 | 56 |
safety_character => '\w', |
57 |
+ separator => '.', |
|
57 | 58 |
stash => sub { {} }, |
58 | 59 |
tag_parse => 1; |
59 | 60 |
|
... | ... |
@@ -875,22 +876,6 @@ sub select { |
875 | 876 |
return $result; |
876 | 877 |
} |
877 | 878 |
|
878 |
-sub separator { |
|
879 |
- my $self = shift; |
|
880 |
- |
|
881 |
- if (@_) { |
|
882 |
- my $separator = $_[0] || ''; |
|
883 |
- croak qq{Separator must be "." or "__" or "-" } . _subname |
|
884 |
- unless $separator eq '.' || $separator eq '__' |
|
885 |
- || $separator eq '-'; |
|
886 |
- |
|
887 |
- $self->{separator} = $separator; |
|
888 |
- |
|
889 |
- return $self; |
|
890 |
- } |
|
891 |
- return $self->{separator} ||= '.'; |
|
892 |
-} |
|
893 |
- |
|
894 | 879 |
sub setup_model { |
895 | 880 |
my $self = shift; |
896 | 881 |
|
... | ... |
@@ -1984,6 +1969,14 @@ Result class, default to L<DBIx::Custom::Result>. |
1984 | 1969 |
Regex of safety character for table and column name, default to '\w'. |
1985 | 1970 |
Note that you don't have to specify like '[\w]'. |
1986 | 1971 |
|
1972 |
+=head2 C<separator> |
|
1973 |
+ |
|
1974 |
+ my $separator = $self->separator; |
|
1975 |
+ $dbi = $self->separator($separator); |
|
1976 |
+ |
|
1977 |
+Separator whichi join table and column. |
|
1978 |
+This is used by C<column> and C<mycolumn> method. |
|
1979 |
+ |
|
1987 | 1980 |
=head2 C<tag_parse> |
1988 | 1981 |
|
1989 | 1982 |
my $tag_parse = $dbi->tag_parse(0); |
... | ... |
@@ -2038,7 +2031,7 @@ Create column clause. The follwoing column clause is created. |
2038 | 2031 |
book.author as "book.author", |
2039 | 2032 |
book.title as "book.title" |
2040 | 2033 |
|
2041 |
-You can change separator by C<separator> method. |
|
2034 |
+You can change separator by C<separator> attribute. |
|
2042 | 2035 |
|
2043 | 2036 |
# Separator is double underbar |
2044 | 2037 |
$dbi->separator('__'); |
... | ... |
@@ -133,7 +133,7 @@ use MyDBI1; |
133 | 133 |
sub connect { |
134 | 134 |
my $self = shift->SUPER::connect(@_); |
135 | 135 |
|
136 |
- $self->include_model('MyModel8')->setup_model; |
|
136 |
+ $self->include_model('MyModel8'); |
|
137 | 137 |
|
138 | 138 |
return $self; |
139 | 139 |
} |
... | ... |
@@ -2174,6 +2174,60 @@ is($dbi->select(table => 'table1')->one->{key2}, 2); |
2174 | 2174 |
eval { $dbi->insert_param({";" => 1}) }; |
2175 | 2175 |
like($@, qr/not safety/); |
2176 | 2176 |
|
2177 |
+test 'mycolumn'; |
|
2178 |
+$dbi = MyDBI8->connect; |
|
2179 |
+eval { $dbi->execute('drop table table1') }; |
|
2180 |
+eval { $dbi->execute('drop table table2') }; |
|
2181 |
+$dbi->execute($create_table1); |
|
2182 |
+$dbi->execute($create_table2); |
|
2183 |
+$dbi->setup_model; |
|
2184 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
2185 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 3}); |
|
2186 |
+$model = $dbi->model('table1'); |
|
2187 |
+$result = $model->select_at( |
|
2188 |
+ column => [ |
|
2189 |
+ $model->mycolumn, |
|
2190 |
+ $model->column('table2') |
|
2191 |
+ ] |
|
2192 |
+); |
|
2193 |
+is_deeply($result->one, |
|
2194 |
+ {key1 => 1, key2 => 2, 'table2.key1' => 1, 'table2.key3' => 3}); |
|
2195 |
+ |
|
2196 |
+$result = $model->select_at( |
|
2197 |
+ column => [ |
|
2198 |
+ $model->mycolumn(['key1']), |
|
2199 |
+ $model->column(table2 => ['key1']) |
|
2200 |
+ ] |
|
2201 |
+); |
|
2202 |
+is_deeply($result->one, |
|
2203 |
+ {key1 => 1, 'table2.key1' => 1}); |
|
2204 |
+$result = $model->select_at( |
|
2205 |
+ column => [ |
|
2206 |
+ $model->mycolumn(['key1']), |
|
2207 |
+ {table2 => ['key1']} |
|
2208 |
+ ] |
|
2209 |
+); |
|
2210 |
+is_deeply($result->one, |
|
2211 |
+ {key1 => 1, 'table2.key1' => 1}); |
|
2212 |
+ |
|
2213 |
+$result = $model->select_at( |
|
2214 |
+ column => [ |
|
2215 |
+ $model->mycolumn(['key1']), |
|
2216 |
+ ['table2.key1', as => 'table2.key1'] |
|
2217 |
+ ] |
|
2218 |
+); |
|
2219 |
+is_deeply($result->one, |
|
2220 |
+ {key1 => 1, 'table2.key1' => 1}); |
|
2221 |
+ |
|
2222 |
+$result = $model->select_at( |
|
2223 |
+ column => [ |
|
2224 |
+ $model->mycolumn(['key1']), |
|
2225 |
+ ['table2.key1' => 'table2.key1'] |
|
2226 |
+ ] |
|
2227 |
+); |
|
2228 |
+is_deeply($result->one, |
|
2229 |
+ {key1 => 1, 'table2.key1' => 1}); |
|
2230 |
+ |
|
2177 | 2231 |
|
2178 | 2232 |
|
2179 | 2233 |
|
... | ... |
@@ -196,215 +196,11 @@ my $binary; |
196 | 196 |
# Prepare table |
197 | 197 |
$dbi = DBIx::Custom->connect; |
198 | 198 |
|
199 |
-test 'join'; |
|
200 |
-$dbi = DBIx::Custom->connect; |
|
201 |
-eval { $dbi->execute('drop table table1') }; |
|
202 |
-$dbi->execute($create_table1); |
|
203 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
204 |
-$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4}); |
|
205 |
-$dbi->execute($create_table2); |
|
206 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
207 |
-$dbi->execute('create table table3 (key3 int, key4 int);'); |
|
208 |
-$dbi->insert(table => 'table3', param => {key3 => 5, key4 => 4}); |
|
209 |
-$rows = $dbi->select( |
|
210 |
- table => 'table1', |
|
211 |
- column => 'table1.key1 as table1_key1, table2.key1 as table2_key1, key2, key3', |
|
212 |
- where => {'table1.key2' => 2}, |
|
213 |
- join => ['left outer join table2 on table1.key1 = table2.key1'] |
|
214 |
-)->all; |
|
215 |
-is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}]); |
|
216 |
- |
|
217 |
-$rows = $dbi->select( |
|
218 |
- table => 'table1', |
|
219 |
- where => {'key1' => 1}, |
|
220 |
- join => ['left outer join table2 on table1.key1 = table2.key1'] |
|
221 |
-)->all; |
|
222 |
-is_deeply($rows, [{key1 => 1, key2 => 2}]); |
|
223 |
- |
|
224 |
-eval { |
|
225 |
- $rows = $dbi->select( |
|
226 |
- table => 'table1', |
|
227 |
- column => 'table1.key1 as table1_key1, table2.key1 as table2_key1, key2, key3', |
|
228 |
- where => {'table1.key2' => 2}, |
|
229 |
- join => {'table1.key1' => 'table2.key1'} |
|
230 |
- ); |
|
231 |
-}; |
|
232 |
-like ($@, qr/array/); |
|
233 |
- |
|
234 |
-$rows = $dbi->select( |
|
235 |
- table => 'table1', |
|
236 |
- where => {'key1' => 1}, |
|
237 |
- join => ['left outer join table2 on table1.key1 = table2.key1', |
|
238 |
- 'left outer join table3 on table2.key3 = table3.key3'] |
|
239 |
-)->all; |
|
240 |
-is_deeply($rows, [{key1 => 1, key2 => 2}]); |
|
241 |
- |
|
242 |
-$rows = $dbi->select( |
|
243 |
- column => 'table3.key4 as table3__key4', |
|
244 |
- table => 'table1', |
|
245 |
- where => {'table1.key1' => 1}, |
|
246 |
- join => ['left outer join table2 on table1.key1 = table2.key1', |
|
247 |
- 'left outer join table3 on table2.key3 = table3.key3'] |
|
248 |
-)->all; |
|
249 |
-is_deeply($rows, [{table3__key4 => 4}]); |
|
250 |
- |
|
251 |
-$rows = $dbi->select( |
|
252 |
- column => 'table1.key1 as table1__key1', |
|
253 |
- table => 'table1', |
|
254 |
- where => {'table3.key4' => 4}, |
|
255 |
- join => ['left outer join table2 on table1.key1 = table2.key1', |
|
256 |
- 'left outer join table3 on table2.key3 = table3.key3'] |
|
257 |
-)->all; |
|
258 |
-is_deeply($rows, [{table1__key1 => 1}]); |
|
259 |
- |
|
260 |
-$dbi = DBIx::Custom->connect; |
|
261 |
-$dbi->quote('"'); |
|
262 |
-eval { $dbi->execute('drop table table1') }; |
|
263 |
-$dbi->execute($create_table1); |
|
264 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
265 |
-$dbi->execute($create_table2); |
|
266 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
267 |
-$rows = $dbi->select( |
|
268 |
- table => 'table1', |
|
269 |
- column => '"table1"."key1" as "table1_key1", "table2"."key1" as "table2_key1", "key2", "key3"', |
|
270 |
- where => {'table1.key2' => 2}, |
|
271 |
- join => ['left outer join "table2" on "table1"."key1" = "table2"."key1"'], |
|
272 |
-)->all; |
|
273 |
-is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}], |
|
274 |
- 'quote'); |
|
275 |
- |
|
276 |
- |
|
277 |
-$dbi = DBIx::Custom->connect; |
|
278 |
-eval { $dbi->execute('drop table table1') }; |
|
279 |
-$dbi->execute($create_table1); |
|
280 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
281 |
-$sql = <<"EOS"; |
|
282 |
-left outer join ( |
|
283 |
- select * from table1 as t1 |
|
284 |
- where t1.key2 = ( |
|
285 |
- select max(t2.key2) from table1 as t2 |
|
286 |
- where t1.key1 = t2.key1 |
|
287 |
- ) |
|
288 |
-) as latest_table1 on table1.key1 = latest_table1.key1 |
|
289 |
-EOS |
|
290 |
-$join = [$sql]; |
|
291 |
-$rows = $dbi->select( |
|
292 |
- table => 'table1', |
|
293 |
- column => 'latest_table1.key1 as latest_table1__key1', |
|
294 |
- join => $join |
|
295 |
-)->all; |
|
296 |
-is_deeply($rows, [{latest_table1__key1 => 1}]); |
|
297 |
- |
|
298 |
-$dbi = DBIx::Custom->connect; |
|
299 |
-eval { $dbi->execute('drop table table1') }; |
|
300 |
-eval { $dbi->execute('drop table table2') }; |
|
301 |
-$dbi->execute($create_table1); |
|
302 |
-$dbi->execute($create_table2); |
|
303 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
304 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
|
305 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
306 |
-$result = $dbi->select( |
|
307 |
- table => 'table1', |
|
308 |
- join => [ |
|
309 |
- "left outer join table2 on table2.key2 = '4' and table1.key1 = table2.key1" |
|
310 |
- ] |
|
311 |
-); |
|
312 |
-is_deeply($result->all, [{key1 => 1, key2 => 2}]); |
|
313 |
-$result = $dbi->select( |
|
314 |
- table => 'table1', |
|
315 |
- column => [{table2 => ['key3']}], |
|
316 |
- join => [ |
|
317 |
- "left outer join table2 on table2.key3 = '4' and table1.key1 = table2.key1" |
|
318 |
- ] |
|
319 |
-); |
|
320 |
-is_deeply($result->all, [{'table2.key3' => 4}]); |
|
321 |
-$result = $dbi->select( |
|
322 |
- table => 'table1', |
|
323 |
- column => [{table2 => ['key3']}], |
|
324 |
- join => [ |
|
325 |
- "left outer join table2 on table1.key1 = table2.key1 and table2.key3 = '4'" |
|
326 |
- ] |
|
327 |
-); |
|
328 |
-is_deeply($result->all, [{'table2.key3' => 4}]); |
|
329 |
- |
|
330 |
-$dbi = DBIx::Custom->connect; |
|
331 |
-eval { $dbi->execute('drop table table1') }; |
|
332 |
-eval { $dbi->execute('drop table table2') }; |
|
333 |
-$dbi->execute($create_table1); |
|
334 |
-$dbi->execute($create_table2); |
|
335 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
336 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
|
337 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
338 |
-$result = $dbi->select( |
|
339 |
- table => 'table1', |
|
340 |
- column => [{table2 => ['key3']}], |
|
341 |
- join => [ |
|
342 |
- { |
|
343 |
- clause => "left outer join table2 on table2.key3 = '4' and table1.key1 = table2.key1", |
|
344 |
- table => ['table1', 'table2'] |
|
345 |
- } |
|
346 |
- ] |
|
347 |
-); |
|
348 |
-is_deeply($result->all, [{'table2.key3' => 4}]); |
|
349 |
- |
|
350 |
-test 'mycolumn'; |
|
351 |
-$dbi = MyDBI8->connect; |
|
352 |
-eval { $dbi->execute('drop table table1') }; |
|
353 |
-eval { $dbi->execute('drop table table2') }; |
|
354 |
-$dbi->execute($create_table1); |
|
355 |
-$dbi->execute($create_table2); |
|
356 |
-$dbi->setup_model; |
|
357 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
358 |
-$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 3}); |
|
359 |
-$model = $dbi->model('table1'); |
|
360 |
-$result = $model->select_at( |
|
361 |
- column => [ |
|
362 |
- $model->mycolumn, |
|
363 |
- $model->column('table2') |
|
364 |
- ] |
|
365 |
-); |
|
366 |
-is_deeply($result->one, |
|
367 |
- {key1 => 1, key2 => 2, 'table2.key1' => 1, 'table2.key3' => 3}); |
|
368 |
- |
|
369 |
-$result = $model->select_at( |
|
370 |
- column => [ |
|
371 |
- $model->mycolumn(['key1']), |
|
372 |
- $model->column(table2 => ['key1']) |
|
373 |
- ] |
|
374 |
-); |
|
375 |
-is_deeply($result->one, |
|
376 |
- {key1 => 1, 'table2.key1' => 1}); |
|
377 |
-$result = $model->select_at( |
|
378 |
- column => [ |
|
379 |
- $model->mycolumn(['key1']), |
|
380 |
- {table2 => ['key1']} |
|
381 |
- ] |
|
382 |
-); |
|
383 |
-is_deeply($result->one, |
|
384 |
- {key1 => 1, 'table2.key1' => 1}); |
|
385 |
- |
|
386 |
-$result = $model->select_at( |
|
387 |
- column => [ |
|
388 |
- $model->mycolumn(['key1']), |
|
389 |
- ['table2.key1', as => 'table2.key1'] |
|
390 |
- ] |
|
391 |
-); |
|
392 |
-is_deeply($result->one, |
|
393 |
- {key1 => 1, 'table2.key1' => 1}); |
|
394 |
- |
|
395 |
-$result = $model->select_at( |
|
396 |
- column => [ |
|
397 |
- $model->mycolumn(['key1']), |
|
398 |
- ['table2.key1' => 'table2.key1'] |
|
399 |
- ] |
|
400 |
-); |
|
401 |
-is_deeply($result->one, |
|
402 |
- {key1 => 1, 'table2.key1' => 1}); |
|
403 |
- |
|
404 | 199 |
test 'dbi method from model'; |
405 | 200 |
$dbi = MyDBI9->connect; |
406 | 201 |
eval { $dbi->execute('drop table table1') }; |
407 | 202 |
$dbi->execute($create_table1); |
203 |
+$dbi->setup_model; |
|
408 | 204 |
$model = $dbi->model('table1'); |
409 | 205 |
eval{$model->execute('select * from table1')}; |
410 | 206 |
ok(!$@); |
... | ... |
@@ -413,6 +209,7 @@ test 'column table option'; |
413 | 209 |
$dbi = MyDBI9->connect; |
414 | 210 |
eval { $dbi->execute('drop table table1') }; |
415 | 211 |
$dbi->execute($create_table1); |
212 |
+eval { $dbi->execute('drop table table2') }; |
|
416 | 213 |
$dbi->execute($create_table2); |
417 | 214 |
$dbi->setup_model; |
418 | 215 |
$dbi->execute('insert into table1 (key1, key2) values (1, 2);'); |
... | ... |
@@ -447,75 +244,6 @@ $result = $model->select( |
447 | 244 |
is_deeply($result->one, |
448 | 245 |
{'table2_alias-key1' => 1, 'table2_alias-key3' => 4}); |
449 | 246 |
|
450 |
-test 'type option'; # DEPRECATED! |
|
451 |
-$dbi = DBIx::Custom->connect( |
|
452 |
- dbi_option => { |
|
453 |
- $DBD::SQLite::VERSION > 1.26 ? (sqlite_unicode => 1) : (unicode => 1) |
|
454 |
- } |
|
455 |
-); |
|
456 |
-$binary = pack("I3", 1, 2, 3); |
|
457 |
-eval { $dbi->execute('drop table table1') }; |
|
458 |
-$dbi->execute('create table table1(key1, key2)'); |
|
459 |
-$dbi->insert(table => 'table1', param => {key1 => $binary, key2 => 'あ'}, type => [key1 => DBI::SQL_BLOB]); |
|
460 |
-$result = $dbi->select(table => 'table1'); |
|
461 |
-$row = $result->one; |
|
462 |
-is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
463 |
-$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
464 |
-$row = $result->one; |
|
465 |
-is($row->{key1_length}, length $binary); |
|
466 |
- |
|
467 |
-$dbi->insert(table => 'table1', param => {key1 => $binary, key2 => 'あ'}, type => [['key1'] => DBI::SQL_BLOB]); |
|
468 |
-$result = $dbi->select(table => 'table1'); |
|
469 |
-$row = $result->one; |
|
470 |
-is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
471 |
-$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
472 |
-$row = $result->one; |
|
473 |
-is($row->{key1_length}, length $binary); |
|
474 |
- |
|
475 |
- |
|
476 |
-test 'bind_type option'; |
|
477 |
-$dbi = DBIx::Custom->connect( |
|
478 |
- dbi_option => { |
|
479 |
- $DBD::SQLite::VERSION > 1.26 ? (sqlite_unicode => 1) : (unicode => 1) |
|
480 |
- } |
|
481 |
-); |
|
482 |
-$binary = pack("I3", 1, 2, 3); |
|
483 |
-eval { $dbi->execute('drop table table1') }; |
|
484 |
-$dbi->execute('create table table1(key1, key2)'); |
|
485 |
-$dbi->insert(table => 'table1', param => {key1 => $binary, key2 => 'あ'}, bind_type => [key1 => DBI::SQL_BLOB]); |
|
486 |
-$result = $dbi->select(table => 'table1'); |
|
487 |
-$row = $result->one; |
|
488 |
-is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
489 |
-$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
490 |
-$row = $result->one; |
|
491 |
-is($row->{key1_length}, length $binary); |
|
492 |
- |
|
493 |
-$dbi->insert(table => 'table1', param => {key1 => $binary, key2 => 'あ'}, bind_type => [['key1'] => DBI::SQL_BLOB]); |
|
494 |
-$result = $dbi->select(table => 'table1'); |
|
495 |
-$row = $result->one; |
|
496 |
-is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
497 |
-$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
498 |
-$row = $result->one; |
|
499 |
-is($row->{key1_length}, length $binary); |
|
500 |
- |
|
501 |
-test 'model type attribute'; |
|
502 |
-$dbi = DBIx::Custom->connect( |
|
503 |
- dbi_option => { |
|
504 |
- $DBD::SQLite::VERSION > 1.26 ? (sqlite_unicode => 1) : (unicode => 1) |
|
505 |
- } |
|
506 |
-); |
|
507 |
-$binary = pack("I3", 1, 2, 3); |
|
508 |
-eval { $dbi->execute('drop table table1') }; |
|
509 |
-$dbi->execute('create table table1(key1, key2)'); |
|
510 |
-$model = $dbi->create_model(table => 'table1', bind_type => [key1 => DBI::SQL_BLOB]); |
|
511 |
-$model->insert(param => {key1 => $binary, key2 => 'あ'}); |
|
512 |
-$result = $dbi->select(table => 'table1'); |
|
513 |
-$row = $result->one; |
|
514 |
-is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
515 |
-$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
516 |
-$row = $result->one; |
|
517 |
-is($row->{key1_length}, length $binary); |
|
518 |
- |
|
519 | 247 |
test 'create_model'; |
520 | 248 |
$dbi = DBIx::Custom->connect; |
521 | 249 |
eval { $dbi->execute('drop table table1') }; |
... | ... |
@@ -586,6 +314,7 @@ eval { $dbi->execute('drop table table1') }; |
586 | 314 |
$dbi->execute($create_table1); |
587 | 315 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
588 | 316 |
$dbi->insert(table => 'table1', param => {key1 => 2, key2 => 3}); |
317 |
+eval { $dbi->execute('drop table table2') }; |
|
589 | 318 |
$dbi->execute($create_table2); |
590 | 319 |
$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
591 | 320 |
$dbi->insert(table => 'table2', param => {key1 => 2, key3 => 5}); |
... | ... |
@@ -1043,18 +772,6 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
1043 | 772 |
$rows = $dbi->select(prefix => 'key1,', column => 'key2', table => 'table1')->all; |
1044 | 773 |
is_deeply($rows, [{key1 => 1, key2 => 2}], "table"); |
1045 | 774 |
|
1046 |
- |
|
1047 |
-test 'separator'; |
|
1048 |
-$dbi = DBIx::Custom->connect; |
|
1049 |
-is($dbi->separator, '.'); |
|
1050 |
-$dbi->separator('-'); |
|
1051 |
-is($dbi->separator, '-'); |
|
1052 |
-$dbi->separator('__'); |
|
1053 |
-is($dbi->separator, '__'); |
|
1054 |
-eval { $dbi->separator('?') }; |
|
1055 |
-like($@, qr/Separator/); |
|
1056 |
- |
|
1057 |
- |
|
1058 | 775 |
test 'map_param'; |
1059 | 776 |
$dbi = DBIx::Custom->connect; |
1060 | 777 |
$param = $dbi->map_param( |
... | ... |
@@ -1519,6 +1236,157 @@ like($@, qr/unexpected "{"/, "error : 2"); |
1519 | 1236 |
|
1520 | 1237 |
|
1521 | 1238 |
### a little complex test |
1239 |
+test 'join'; |
|
1240 |
+$dbi = DBIx::Custom->connect; |
|
1241 |
+eval { $dbi->execute('drop table table1') }; |
|
1242 |
+$dbi->execute($create_table1); |
|
1243 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
1244 |
+$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4}); |
|
1245 |
+$dbi->execute($create_table2); |
|
1246 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
1247 |
+$dbi->execute('create table table3 (key3 int, key4 int);'); |
|
1248 |
+$dbi->insert(table => 'table3', param => {key3 => 5, key4 => 4}); |
|
1249 |
+$rows = $dbi->select( |
|
1250 |
+ table => 'table1', |
|
1251 |
+ column => 'table1.key1 as table1_key1, table2.key1 as table2_key1, key2, key3', |
|
1252 |
+ where => {'table1.key2' => 2}, |
|
1253 |
+ join => ['left outer join table2 on table1.key1 = table2.key1'] |
|
1254 |
+)->all; |
|
1255 |
+is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}]); |
|
1256 |
+ |
|
1257 |
+$rows = $dbi->select( |
|
1258 |
+ table => 'table1', |
|
1259 |
+ where => {'key1' => 1}, |
|
1260 |
+ join => ['left outer join table2 on table1.key1 = table2.key1'] |
|
1261 |
+)->all; |
|
1262 |
+is_deeply($rows, [{key1 => 1, key2 => 2}]); |
|
1263 |
+ |
|
1264 |
+eval { |
|
1265 |
+ $rows = $dbi->select( |
|
1266 |
+ table => 'table1', |
|
1267 |
+ column => 'table1.key1 as table1_key1, table2.key1 as table2_key1, key2, key3', |
|
1268 |
+ where => {'table1.key2' => 2}, |
|
1269 |
+ join => {'table1.key1' => 'table2.key1'} |
|
1270 |
+ ); |
|
1271 |
+}; |
|
1272 |
+like ($@, qr/array/); |
|
1273 |
+ |
|
1274 |
+$rows = $dbi->select( |
|
1275 |
+ table => 'table1', |
|
1276 |
+ where => {'key1' => 1}, |
|
1277 |
+ join => ['left outer join table2 on table1.key1 = table2.key1', |
|
1278 |
+ 'left outer join table3 on table2.key3 = table3.key3'] |
|
1279 |
+)->all; |
|
1280 |
+is_deeply($rows, [{key1 => 1, key2 => 2}]); |
|
1281 |
+ |
|
1282 |
+$rows = $dbi->select( |
|
1283 |
+ column => 'table3.key4 as table3__key4', |
|
1284 |
+ table => 'table1', |
|
1285 |
+ where => {'table1.key1' => 1}, |
|
1286 |
+ join => ['left outer join table2 on table1.key1 = table2.key1', |
|
1287 |
+ 'left outer join table3 on table2.key3 = table3.key3'] |
|
1288 |
+)->all; |
|
1289 |
+is_deeply($rows, [{table3__key4 => 4}]); |
|
1290 |
+ |
|
1291 |
+$rows = $dbi->select( |
|
1292 |
+ column => 'table1.key1 as table1__key1', |
|
1293 |
+ table => 'table1', |
|
1294 |
+ where => {'table3.key4' => 4}, |
|
1295 |
+ join => ['left outer join table2 on table1.key1 = table2.key1', |
|
1296 |
+ 'left outer join table3 on table2.key3 = table3.key3'] |
|
1297 |
+)->all; |
|
1298 |
+is_deeply($rows, [{table1__key1 => 1}]); |
|
1299 |
+ |
|
1300 |
+$dbi = DBIx::Custom->connect; |
|
1301 |
+$dbi->quote('"'); |
|
1302 |
+eval { $dbi->execute('drop table table1') }; |
|
1303 |
+$dbi->execute($create_table1); |
|
1304 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
1305 |
+$dbi->execute($create_table2); |
|
1306 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
1307 |
+$rows = $dbi->select( |
|
1308 |
+ table => 'table1', |
|
1309 |
+ column => '"table1"."key1" as "table1_key1", "table2"."key1" as "table2_key1", "key2", "key3"', |
|
1310 |
+ where => {'table1.key2' => 2}, |
|
1311 |
+ join => ['left outer join "table2" on "table1"."key1" = "table2"."key1"'], |
|
1312 |
+)->all; |
|
1313 |
+is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}], |
|
1314 |
+ 'quote'); |
|
1315 |
+ |
|
1316 |
+ |
|
1317 |
+$dbi = DBIx::Custom->connect; |
|
1318 |
+eval { $dbi->execute('drop table table1') }; |
|
1319 |
+$dbi->execute($create_table1); |
|
1320 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
1321 |
+$sql = <<"EOS"; |
|
1322 |
+left outer join ( |
|
1323 |
+ select * from table1 as t1 |
|
1324 |
+ where t1.key2 = ( |
|
1325 |
+ select max(t2.key2) from table1 as t2 |
|
1326 |
+ where t1.key1 = t2.key1 |
|
1327 |
+ ) |
|
1328 |
+) as latest_table1 on table1.key1 = latest_table1.key1 |
|
1329 |
+EOS |
|
1330 |
+$join = [$sql]; |
|
1331 |
+$rows = $dbi->select( |
|
1332 |
+ table => 'table1', |
|
1333 |
+ column => 'latest_table1.key1 as latest_table1__key1', |
|
1334 |
+ join => $join |
|
1335 |
+)->all; |
|
1336 |
+is_deeply($rows, [{latest_table1__key1 => 1}]); |
|
1337 |
+ |
|
1338 |
+$dbi = DBIx::Custom->connect; |
|
1339 |
+eval { $dbi->execute('drop table table1') }; |
|
1340 |
+eval { $dbi->execute('drop table table2') }; |
|
1341 |
+$dbi->execute($create_table1); |
|
1342 |
+$dbi->execute($create_table2); |
|
1343 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
1344 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
|
1345 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
1346 |
+$result = $dbi->select( |
|
1347 |
+ table => 'table1', |
|
1348 |
+ join => [ |
|
1349 |
+ "left outer join table2 on table2.key2 = '4' and table1.key1 = table2.key1" |
|
1350 |
+ ] |
|
1351 |
+); |
|
1352 |
+is_deeply($result->all, [{key1 => 1, key2 => 2}]); |
|
1353 |
+$result = $dbi->select( |
|
1354 |
+ table => 'table1', |
|
1355 |
+ column => [{table2 => ['key3']}], |
|
1356 |
+ join => [ |
|
1357 |
+ "left outer join table2 on table2.key3 = '4' and table1.key1 = table2.key1" |
|
1358 |
+ ] |
|
1359 |
+); |
|
1360 |
+is_deeply($result->all, [{'table2.key3' => 4}]); |
|
1361 |
+$result = $dbi->select( |
|
1362 |
+ table => 'table1', |
|
1363 |
+ column => [{table2 => ['key3']}], |
|
1364 |
+ join => [ |
|
1365 |
+ "left outer join table2 on table1.key1 = table2.key1 and table2.key3 = '4'" |
|
1366 |
+ ] |
|
1367 |
+); |
|
1368 |
+is_deeply($result->all, [{'table2.key3' => 4}]); |
|
1369 |
+ |
|
1370 |
+$dbi = DBIx::Custom->connect; |
|
1371 |
+eval { $dbi->execute('drop table table1') }; |
|
1372 |
+eval { $dbi->execute('drop table table2') }; |
|
1373 |
+$dbi->execute($create_table1); |
|
1374 |
+$dbi->execute($create_table2); |
|
1375 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
1376 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 4}); |
|
1377 |
+$dbi->insert(table => 'table2', param => {key1 => 1, key3 => 5}); |
|
1378 |
+$result = $dbi->select( |
|
1379 |
+ table => 'table1', |
|
1380 |
+ column => [{table2 => ['key3']}], |
|
1381 |
+ join => [ |
|
1382 |
+ { |
|
1383 |
+ clause => "left outer join table2 on table2.key3 = '4' and table1.key1 = table2.key1", |
|
1384 |
+ table => ['table1', 'table2'] |
|
1385 |
+ } |
|
1386 |
+ ] |
|
1387 |
+); |
|
1388 |
+is_deeply($result->all, [{'table2.key3' => 4}]); |
|
1389 |
+ |
|
1522 | 1390 |
|
1523 | 1391 |
test 'update_param'; |
1524 | 1392 |
$dbi = DBIx::Custom->connect; |