#!/usr/bin/perl -w
package Local::Romani::Query::Select;
use base qw(Test::Class);
use DBIx::Romani::Query::Select;
use DBIx::Romani::Query::Comparison;
use DBIx::Romani::Query::SQL::Generate;
use DBIx::Romani::Query::SQL::Column;
use DBIx::Romani::Query::SQL::TTT::Function;
use DBIx::Romani::Query::SQL::TTT::Keyword;
use DBIx::Romani::Query::SQL::TTT::Join;
use DBIx::Romani::Query::Function::Count;
use DBIx::Romani::Driver::sqlite;
use Test::More;
use strict;
use Data::Dumper;
# utility function makes SQL out of whatever
sub generate_sql { return DBIx::Romani::Driver::sqlite->new()->generate_sql( @_ ) };
=pod example
=cut
sub querySelect1 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT column_name FROM table_name');
}
=pod example
=cut
sub querySelect2 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new("table_name", "column_name"), "alias_name" );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT table_name.column_name AS alias_name FROM table_name');
}
=pod example
=cut
sub querySelect3 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
my $count_func = DBIx::Romani::Query::SQL::TTT::Function->new( "COUNT" );
my $ttt_join = DBIx::Romani::Query::SQL::TTT::Join->new();
$ttt_join->add( DBIx::Romani::Query::SQL::TTT::Keyword->new('DISTINCT') );
$ttt_join->add( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
$count_func->add( $ttt_join );
$query->add_result({ value => $count_func, as => "count" });
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT COUNT(DISTINCT column_name) AS count FROM table_name');
}
=pod example
=cut
sub querySelect4 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
my $count_func = DBIx::Romani::Query::Function::Count->new( "COUNT" );
$count_func->set_distinct( 1 );
$count_func->add( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
$query->add_result({ value => $count_func, as => "count" });
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT COUNT(DISTINCT column_name) AS count FROM table_name');
}
=pod example
=cut
sub querySelect5 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
my $where = DBIx::Romani::Query::Comparison->new( $DBIx::Romani::Query::Comparison::EQUAL );
$where->add( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
$where->add( DBIx::Romani::Query::SQL::Literal->new( "123" ) );
$query->set_where( $where );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, "SELECT column_name FROM table_name WHERE column_name = '123'");
}
=pod example
=cut
sub querySelect6 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
$query->add_group_by( DBIx::Romani::Query::SQL::Column->new( undef, "column2" ) );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT column_name FROM table_name GROUP BY column2');
}
=pod example
=cut
sub querySelect7 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
$query->add_order_by( DBIx::Romani::Query::SQL::Column->new( undef, "column2" ), "asc" );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT column_name FROM table_name ORDER BY column2 ASC');
}
=pod example
=cut
sub querySelect8 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table1" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
my $eq_op = DBIx::Romani::Query::Comparison->new( $DBIx::Romani::Query::Comparison::EQUAL );
$eq_op->add( DBIx::Romani::Query::SQL::Column->new( 'table1', 'key' ) );
$eq_op->add( DBIx::Romani::Query::SQL::Column->new( 'table2', 'table1_key' ) );
$query->set_join({ type => 'inner', table => 'table2', on => $eq_op });
# generate the SQL
my $sql = generate_sql( $query );
is ($sql, 'SELECT column_name FROM table1 INNER JOIN table2 ON table1.key = table2.table1_key');
}
=pod example
=cut
sub querySelect9 : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
$query->set_limit( 10, 20 );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT column_name FROM table_name LIMIT 10 OFFSET 20');
}
=pod example
=cut
sub querySelectDistinct : Test(1)
{
my $query = DBIx::Romani::Query::Select->new();
$query->set_distinct( 1 );
$query->add_from( "table_name" );
$query->add_result( DBIx::Romani::Query::SQL::Column->new( undef, "column_name" ) );
# generate the SQL
my $sql = generate_sql( $query );
is ( $sql, 'SELECT DISTINCT column_name FROM table_name');
}
1;