DBIx-DataModel
view release on metacpan or search on metacpan
t/v1_DBIx-DataModel.t view on Meta::CPAN
[qw/1 1bis/],
];
$hashref = HR->join(qw/Employee activities/)->select(
-resultAs => [hashref => qw/emp_id foo/],
);
is_deeply($hashref, {1 => {1 => {emp_id => 1, foo => 1},
'1bis' => {emp_id => 1, foo => '1bis'}},
2 => {2 => {emp_id => 2, foo => 2}}},
'resultAs => [hashref => @cols]');
$dbh->{mock_clear_history} = 1;
$dbh->{mock_add_resultset} = [ [qw/emp_id act_id/],
[qw/1 1/],
[qw/2 2/],
[qw/1 1bis/],
];
SKIP: {
skip "THINK: semantics of ->primary_key for a join", 1;
$hashref = HR->join(qw/Employee activities/)->select(
-resultAs => 'hashref'
);
is_deeply($hashref, {1 => {1 => {emp_id => 1, act_id => 1},
'1bis' => {emp_id => 1, act_id => '1bis'}},
2 => {2 => {emp_id => 2, act_id => 2}}},
'resultAs => "hashref"');
};
# subquery
my $subquery = HR::Employee->select(
-columns => 'emp_id',
-where => {d_birth => {-between => [1950, 1980]}},
-resultAs => 'subquery',
);
$act = HR::Activity->select(-where => {emp_id => {-not_in => $subquery}});
sqlLike('SELECT * FROM T_Activity WHERE emp_id NOT IN '
. '(SELECT emp_id FROM T_Employee WHERE d_birth BETWEEN ? AND ?)',
[1950, 1980],
'subquery');
# plain insertion using arrayref syntax
my ($bach_id, $berlioz_id, $monteverdi_id) =
HR::Employee->insert([qw/ firstname lastname /],
[qw/ Johann Bach /],
[qw/ Hector Berlioz /],
[qw/ Claudio Monteverdi /]);
my $insert_sql = 'INSERT INTO T_Employee (firstname, lastname) VALUES (?, ?)';
sqlLike($insert_sql, [qw/ Johann Bach /],
$insert_sql, [qw/ Hector Berlioz /],
$insert_sql, [qw/ Claudio Monteverdi /],
'insert with arrayref syntax');
# insertion into related class
$emp->insert_into_activities({d_begin =>'2000-01-01', d_end => '2000-02-02'});
sqlLike('INSERT INTO T_Activity (d_begin, d_end, emp_id) ' .
'VALUES (?, ?, ?)', ['2000-01-01', '2000-02-02', 999],
'add_to_activities');
# test cascaded inserts
my $tree = {firstname => "Johann Sebastian",
lastname => "Bach",
activities => [{d_begin => '01.01.1707',
d_end => '01.07.1720',
dpt_code => 'Maria-Barbara'},
{d_begin => '01.12.1721',
d_end => '18.07.1750',
dpt_code => 'Anna-Magdalena'}]};
my $emp_id = HR::Employee->insert(dclone($tree));
my $sql_insert_activity = 'INSERT INTO T_Activity (d_begin, d_end, '
. 'dpt_code, emp_id) VALUES (?, ?, ?, ?)';
sqlLike('INSERT INTO T_Employee (firstname, lastname) VALUES (?, ?)',
["Johann Sebastian", "Bach"],
$sql_insert_activity,
['1707-01-01', '1720-07-01', 'Maria-Barbara', $emp_id],
$sql_insert_activity,
['1721-12-01', '1750-07-18', 'Anna-Magdalena', $emp_id],
"cascaded insert");
# test the -returning => {} option
$dbh->{mock_start_insert_id} = 10;
$result = HR::Employee->insert(dclone($tree), -returning => {});
my $expected = { emp_id => 10,
activities => [{act_id => 11}, {act_id => 12}]};
is_deeply($result, $expected, "results from -returning => {}");
# insert with literal SQL
$emp_id = HR::Employee->insert({
birthdate => \["TO_DATE(?, 'DD.MM.YYYY')", "10.09.1659"],
firstname => "Henry",
lastname => "Purcell",
});
sqlLike( q[INSERT INTO T_Employee (birthdate, firstname, lastname) ]
.q[VALUES (TO_DATE(?, 'DD.MM.YYYY'), ?, ?)],
["10.09.1659", "Henry", "Purcell"],
"insert with SQL function");
HR::MyView->select({c3 => 22});
sqlLike('SELECT DISTINCT column1 AS c1, t2.column2 AS c2 ' .
'FROM Table1 AS t1 LEFT OUTER JOIN Table2 AS t2 '.
'ON t1.fk=t2.pk ' .
'WHERE (c1 = ? AND c2 LIKE ? AND c3 = ?)',
['foo', 'bar%', 22], 'HR::MyView');
my $view = HR->join(qw/Employee activities department/);
$view->select("lastname, dpt_name", {gender => 'F'});
sqlLike('SELECT lastname, dpt_name ' .
'FROM T_Employee LEFT OUTER JOIN T_Activity ' .
'ON T_Employee.emp_id=T_Activity.emp_id ' .
'LEFT OUTER JOIN T_Department ' .
'ON T_Activity.dpt_id=T_Department.dpt_id ' .
'WHERE (gender = ?)',
['F'], 'join');
my $view2 = HR->join(qw/Employee <=> activities => department/);
$view2->select("lastname, dpt_name", {gender => 'F'});
sqlLike('SELECT lastname, dpt_name ' .
'FROM T_Employee INNER JOIN T_Activity ' .
'ON T_Employee.emp_id=T_Activity.emp_id ' .
'LEFT OUTER JOIN T_Department ' .
'ON T_Activity.dpt_id=T_Department.dpt_id ' .
'WHERE (gender = ?)', ['F'], 'join with explicit roles');
my $view3 = HR->join(qw/Activity employee department/);
$view3->select("lastname, dpt_name", {gender => 'F'});
sqlLike('SELECT lastname, dpt_name ' .
'FROM T_Activity INNER JOIN T_Employee ' .
'ON T_Activity.emp_id=T_Employee.emp_id ' .
'INNER JOIN T_Department ' .
'ON T_Activity.dpt_id=T_Department.dpt_id ' .
( run in 0.377 second using v1.01-cache-2.11-cpan-39bf76dae61 )