Jifty-DBI
view release on metacpan or search on metacpan
t/02searches_joins.t view on Meta::CPAN
ok( !$users_obj->_is_joined, "new object isn't joined");
my $alias = $users_obj->new_alias( 'user_to_groups' );
ok( $alias, "new alias" );
is($users_obj->join(
type => 'LEFT',
column1 => 'id',
alias2 => $alias,
column2 => 'user_id' ),
$alias, "joined table"
);
$users_obj->limit( alias => $alias, column => 'id', operator => 'IS', value => 'NULL' );
ok( $users_obj->build_select_query =~ /LEFT JOIN/, 'LJ is not optimized away');
is( $users_obj->count, 1, "user is not member of any group" );
}
diag "main <- alias <- join" if $ENV{'TEST_VERBOSE'};
{
# The join depends on the alias, we should build joins with correct order.
$users_obj->clean_slate;
is_deeply( $users_obj, $clean_obj, 'after clean_slate looks like new object');
ok( !$users_obj->_is_joined, "new object isn't joined");
my $alias = $users_obj->new_alias( 'user_to_groups' );
ok( $alias, "new alias" );
ok( $users_obj->_is_joined, "object with aliases is joined");
$users_obj->limit( column => 'id', value => "$alias.user_id", quote_value => 0);
ok( my $groups_alias = $users_obj->join(
alias1 => $alias,
column1 => 'group_id',
table2 => 'groups',
column2 => 'id',
),
"joined table"
);
$users_obj->limit( alias => $groups_alias, column => 'name', value => 'Developers' );
#diag $users_obj->build_select_query;
is( $users_obj->count, 3, "three members" );
}
diag "main <- alias <- join into main" if $ENV{'TEST_VERBOSE'};
{
# DBs' parsers don't like: FROM X, Y JOIN C ON C.f = X.f
$users_obj->clean_slate;
is_deeply( $users_obj, $clean_obj, 'after clean_slate looks like new object');
ok( !$users_obj->_is_joined, "new object isn't joined");
ok( my $groups_alias = $users_obj->new_alias( 'groups' ), "new alias" );
ok( my $g2u_alias = $users_obj->join(
alias1 => 'main',
column1 => 'id',
table2 => 'user_to_groups',
column2 => 'user_id',
),
"joined table"
);
$users_obj->limit( alias => $g2u_alias, column => 'group_id', value => "$groups_alias.id", quote_value => 0);
$users_obj->limit( alias => $groups_alias, column => 'name', value => 'Developers' );
#diag $users_obj->build_select_query;
is( $users_obj->count, 3, "three members" );
}
diag "cascaded LEFT JOIN optimization" if $ENV{'TEST_VERBOSE'};
{
$users_obj->clean_slate;
is_deeply( $users_obj, $clean_obj, 'after clean_slate looks like new object');
ok( !$users_obj->_is_joined, "new object isn't joined");
my $alias = $users_obj->join(
type => 'LEFT',
column1 => 'id',
table2 => 'user_to_groups',
column2 => 'user_id'
);
ok( $alias, "Join returns alias" );
$alias = $users_obj->join(
type => 'LEFT',
alias1 => $alias,
column1 => 'group_id',
table2 => 'groups',
column2 => 'id'
);
$users_obj->limit( alias => $alias, column => 'id', operator => 'IS NOT', value => 'NULL' );
if ( $d eq 'mysql' && $handle->database_version =~ /^[34]/ ) {
ok( $users_obj->build_select_query !~ /LEFT JOIN/, 'both LJs are optimized away');
} else {
ok( 1, 'mysql >= 5.0 dont need this optimization' );
}
is( $users_obj->count, 3, "users whos is memebers of at least one group" );
}
diag "LEFT JOIN optimization and OR clause" if $ENV{'TEST_VERBOSE'};
{
$users_obj->clean_slate;
is_deeply( $users_obj, $clean_obj, 'after clean_slate looks like new object');
ok( !$users_obj->_is_joined, "new object isn't joined");
my $alias = $users_obj->join(
type => 'LEFT',
column1 => 'id',
table2 => 'user_to_groups',
column2 => 'user_id'
);
$users_obj->open_paren('my_clause');
$users_obj->limit(
subclause => 'my_clause',
alias => $alias,
column => 'id',
operator => 'IS NOT',
value => 'NULL'
);
$users_obj->limit(
subclause => 'my_clause',
entry_aggregator => 'OR',
column => 'id',
value => 3
);
$users_obj->close_paren('my_clause');
ok( $users_obj->build_select_query =~ /LEFT JOIN/, 'LJ is not optimized away');
is( $users_obj->count, 4, "all users" );
}
cleanup_schema( 'TestApp', $handle );
}} # SKIP, foreach blocks
( run in 1.529 second using v1.01-cache-2.11-cpan-364913b4093 )