#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 61;
use File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../lib";
use lib File::Basename::dirname(__FILE__)."/../..";
use URT; # dummy namespace
# Turn this on for debugging
#$ENV{UR_DBI_MONITOR_SQL}=1;
my $dbh = URT::DataSource::SomeSQLite->get_default_handle;
ok($dbh, "got a db handle");
&create_db_tables($dbh);
my $load_count = 0;
ok(URT::Parent->create_subscription(
method => 'load',
callback => sub {$load_count++}),
'Created a subscription for load');
my $query_count = 0;
my $query_text = '';
ok(URT::DataSource::SomeSQLite->create_subscription(
method => 'query',
callback => sub {$query_text = $_[0]; $query_count++}),
'Created a subscription for query');
$load_count = 0;
$query_count = 0;
my @o = URT::Parent->get(name => [1,2,3,4,5]);
is(scalar(@o), 5, 'get() returned the correct number of items with an in clause');
is($load_count, 5, 'loaded 5 objects');
is($query_count, 1, '1 query was generated');
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => [1,2,3,4,5]);
is(scalar(@o), 5, 'get() returned the correct number of items with the same in clause');
is($load_count, 0, 'loaded 0 new objects');
is($query_count, 0, 'no query was generated');
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => [2,3,4]);
is(scalar(@o), 3, 'get() returned the correct number of items with a subset in clause');
is($load_count, 0, 'loaded 0 new objects');
#is($query_count, 0, 'no query was generated (known broken)');
foreach my $id ( 1 .. 5 ) {
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => $id);
is(scalar(@o), 1, 'get() returned 1 item with a single id');
is($load_count, 0, 'no new objects were loaded');
is($query_count, 0, 'no new queries were done');
}
$load_count = 0;
$query_count = 0;
# Note that it's probably not worth it for the query system to remove 4 and 5
# before it constructs the SQL query
@o = URT::Parent->get(name => [4,5,6,7]);
is(scalar(@o), 4, 'get() returned the correct number of items with another in clause');
is($load_count, 2, '2 new objects were loaded');
is($query_count, 1, '1 new query was done');
# FIXME - subscriptions for 'query' doesn't pass along the SQL to the callback
#ok($query_text !~ m/4,5,6,7/, q(Generated query does not mention "('4','5','6','7')"));
#ok($query_text =~ m/6,7/, q(Generated query does mention "('6','7')"));
$load_count = 0;
$query_count = 0;
my $iter = URT::Parent->create_iterator(name => [5,7,2,99,102], is_cool => 1);
ok($iter, 'Created iterator with an in-clause');
ok($iter->next, 'Pull an object off the iterator');
is($load_count, 0, 'loaded 0 new objects');
is($query_count, 1, 'made 1 query');
$iter = undef;
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => [5,7,2,99,102], is_cool => 1);
is(scalar(@o), 3, 'get() returned the correct number of items with in clause containing some non-matching values');
is($load_count, 0, 'loaded 0 new objects');
is($query_count, 1, 'made 1 query');
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => 102, is_cool => 1,);
is(scalar(@o), 0, 'get() correctly returns nothing for a non-matching name that was in the previous in-clause');
is($load_count, 0, 'loaded 0 new objects');
is($query_count, 0, 'no query was generated');
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => 99, is_cool => 1,);
is(scalar(@o), 0, 'get() correctly returns nothing for another non-matching name that was in the previous in-clause');
is($load_count, 0, 'loaded 0 new objects');
is($query_count, 0, 'no query was generated');
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => 5);
is(scalar(@o), 1, 'got one object by name that was in the previous in-clause');
is($load_count, 0, 'loaded 0 new objects');
is($query_count, 0, 'no query was generated');
$load_count = 0;
$query_count = 0;
@o = URT::Parent->get(name => 99);
is(scalar(@o), 1, 'There was one with name 99');
is($load_count, 1, 'loaded 0 new objects');
is($query_count, 1, 'no query was generated');
unlink(URT::DataSource::SomeSQLite->server); # Remove the DB file from /tmp/
sub create_db_tables {
my $dbh = shift;
ok($dbh->do('create table PARENT_TABLE
( parent_id int NOT NULL PRIMARY KEY, name varchar, is_cool integer)'),
'created parent table');
ok(UR::Object::Type->define(
class_name => 'URT::Parent',
table_name => 'PARENT_TABLE',
id_by => [
'parent_id' => { is => 'NUMBER' },
],
has => [
'name' => { is => 'STRING' },
is_cool => { is => 'NUMBER' },
],
data_source => 'URT::DataSource::SomeSQLite',
),
"Created class for Parent");
my $sth = $dbh->prepare('insert into parent_table (parent_id, name, is_cool) values (?,?,?)');
ok($sth,'insert statement prepared');
foreach my $n ( 1 .. 10 ) {
ok($sth->execute($n,$n,1), "inserted parent ID $n");
}
$sth->execute(99,99,0); # item 99 is not cool
}