Author: spadkins
Date: Fri Nov 14 13:02:55 2008
New Revision: 12072

Added:
   p5ee/trunk/App-Repository/t/DBI-select-limit.t   (contents, props changed)

Log:
Passes all required functional tests for Oracle

Added: p5ee/trunk/App-Repository/t/DBI-select-limit.t
==============================================================================
--- (empty file)
+++ p5ee/trunk/App-Repository/t/DBI-select-limit.t      Fri Nov 14 13:02:55 2008
@@ -0,0 +1,397 @@
+#!/usr/local/bin/perl -w
+
+use App::Options (
+    options => [qw(dbdriver dbclass dbhost dbname dbuser dbpass)],
+    option => {
+        dbclass  => { default => "App::Repository::MySQL", },
+        dbdriver => { default => "mysql", },
+        dbhost   => { default => "localhost", },
+        dbname   => { default => "test", },
+        dbuser   => { default => "", },
+        dbpass   => { default => "", },
+        id       => { description => "The number of the test to run", },
+    },
+);
+
+use Test::More qw(no_plan);
+use lib "../App-Context/lib";
+use lib "../../App-Context/lib";
+use lib "lib";
+use lib "../lib";
+use lib ".";
+use lib "t";
+
+use App;
+use App::Repository;
+use RepositoryTestUtils qw(create_table_test_person drop_table_test_person 
populate_table_test_person);
+use strict;
+
+my $dbtype = $App::options{dbtype} || "mysql";
+
+if (!$App::options{dbuser}) {
+    ok(1, "No dbuser given. Tests assumed OK. (add dbuser=xxx and dbpass=yyy 
to app.conf in 't' directory)");
+    exit(0);
+}
+
+my $context = App->context(
+    conf_file => "",
+    conf => {
+        Repository => {
+            default => {
+                class => $App::options{dbclass},
+                dbdriver => $App::options{dbdriver},
+                dbhost => $App::options{dbhost},
+                dbname => $App::options{dbname},
+                dbuser => $App::options{dbuser},
+                dbpass => $App::options{dbpass},
+                table => {
+                    test_person => {
+                        primary_key => ["person_id"],
+                        alias => "p",
+                        column => {
+                            gender => {
+                                alias => "gnd",
+                            },
+                        },
+                    },
+                },
+                default_date_format => "YYYY-MM-DD HH24:MI:SS",
+            },
+        },
+    },
+    debug_sql => $App::options{debug_sql},
+    trace => $App::options{trace},
+);
+
+my $rep = $context->repository();
+&drop_table_test_person($rep);
+&create_table_test_person($rep);
+&populate_table_test_person($rep);
+
+sub check_select {
+    my ($sql, $expected_rows, $id0, $idn, $msg, $debug) = @_;
+
+    my ($rows, $reprows);
+    eval {
+        $rows = $rep->_do($sql);
+    };
+    is($@,"","$msg : sql executed ok");
+    if ($debug) {
+        print $sql;
+        print "ROWS [", ($#$rows + 1), "]\n";
+        foreach my $row (@$rows) {
+            print "ROW [", join("|", @$row), "]\n";
+        }
+    }
+
+    if (defined $expected_rows) {
+        is(($#$rows + 1), $expected_rows, "$msg : nrows=$expected_rows (from 
raw select)");
+    }
+
+    if (defined $id0) {
+        if ($#$rows == -1) {
+            ok(0, "$msg : no rows when searching for a starting ID");
+        }
+        else {
+            is($rows->[0][0], $id0, "$msg : first row id was $id0");
+        }
+    }
+
+    if (defined $idn) {
+        if ($#$rows == -1) {
+            ok(0, "$msg : no rows when searching for a final ID");
+        }
+        else {
+            is($rows->[$#$rows][0], $idn, "$msg : last row id was $idn");
+        }
+    }
+}
+
+# &test_get_rows($expect_sql,0,"_mk_select_joined_sql(): 1 col, no 
params","test_person",{},"age");
+sub test_get_rows {
+    my ($expected_sql, $nrows, $id0, $idn, $msg, $table, $params, $cols, 
$options) = @_;
+
+    my ($rows, $sql);
+    eval {
+        $rows = $rep->get_rows($table, $params, $cols, $options);
+    };
+    is($@,"","$msg : get_rows() ok");
+    $sql = $rep->{sql};
+    is($sql, $expected_sql, "$msg : get_rows() sql ok");
+    is($#$rows + 1, $nrows, "$msg : nrows=$nrows (from get_rows())") if 
(defined $nrows);
+
+    if (defined $id0) {
+        if ($#$rows == -1) {
+            ok(0, "$msg : no rows when searching for a starting ID");
+        }
+        else {
+            is($rows->[0][0], $id0, "$msg : first row id was $id0");
+        }
+    }
+
+    if (defined $idn) {
+        if ($#$rows == -1) {
+            ok(0, "$msg : no rows when searching for a final ID");
+        }
+        else {
+            is($rows->[$#$rows][0], $idn, "$msg : last row id was $idn");
+        }
+    }
+}
+
+my ($sql, $expect_sql);
+my @options = (
+    { startrow => 1,     endrow => 1, nrows => 1, id0 => 1,     idn => 1,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 1",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 1",
+      mysql_suffix_0 => "\nlimit 1",
+      mysql_suffix_1 => "\nlimit 1",
+    },
+    { startrow => 2,     endrow => 2, nrows => 1, id0 => 2,     idn => 2,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 2) where 
x_rownum >= 2",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 2",
+      mysql_suffix_0 => "\nlimit 1 offset 1",
+      mysql_suffix_1 => "\nlimit 2",
+    },
+    { startrow => 3,     endrow => 3, nrows => 1, id0 => 3,     idn => 3,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 3) where 
x_rownum >= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 3",
+      mysql_suffix_0 => "\nlimit 1 offset 2",
+      mysql_suffix_1 => "\nlimit 3",
+    },
+    { startrow => 3, nrows => 5, id0 => 3,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a) where x_rownum >= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "\nlimit 999999999 offset 2",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 3,     endrow => 2, nrows => 0, id0 => undef, idn => undef,
+      oracle_where_0 => "\nwhere rownum <= 0", oracle_prefix_0 => "", 
oracle_suffix_0 => "",
+      oracle_where_1 => "\nwhere rownum <= 0", oracle_prefix_1 => "", 
oracle_suffix_1 => "",
+      mysql_suffix_0 => "\nlimit 0",
+      mysql_suffix_1 => "\nlimit 0",
+    },
+    {                    endrow => 3, nrows => 3, id0 => 1,     idn => 3,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 3",
+      mysql_suffix_0 => "\nlimit 3",
+      mysql_suffix_1 => "\nlimit 3",
+    },
+    { startrow => 0,     endrow => 3, nrows => 3, id0 => 1,     idn => 3,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 3",
+      mysql_suffix_0 => "\nlimit 3",
+      mysql_suffix_1 => "\nlimit 3",
+    },
+    { startrow => 1,     endrow => 3, nrows => 3, id0 => 1,     idn => 3,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 3",
+      mysql_suffix_0 => "\nlimit 3",
+      mysql_suffix_0 => "\nlimit 3",
+      mysql_suffix_1 => "\nlimit 3",
+    },
+    { startrow => 2,     endrow => 3, nrows => 2, id0 => 2,     idn => 3,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 3) where 
x_rownum >= 2",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 3",
+      mysql_suffix_0 => "\nlimit 2 offset 1",
+      mysql_suffix_1 => "\nlimit 3",
+    },
+    {                    endrow => 7, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 7",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 7",
+      mysql_suffix_0 => "\nlimit 7",
+      mysql_suffix_1 => "\nlimit 7",
+    },
+    { startrow => 0,     endrow => 7, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 7",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 7",
+      mysql_suffix_0 => "\nlimit 7",
+      mysql_suffix_1 => "\nlimit 7",
+    },
+    { startrow => 1,     endrow => 7, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 7",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 7",
+      mysql_suffix_0 => "\nlimit 7",
+      mysql_suffix_1 => "\nlimit 7",
+    },
+    { startrow => 3,     endrow => 7, nrows => 5, id0 => 3,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 7) where 
x_rownum >= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 7",
+      mysql_suffix_0 => "\nlimit 5 offset 2",
+      mysql_suffix_1 => "\nlimit 7",
+    },
+    { startrow => 7,     endrow => 7, nrows => 1, id0 => 7,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 7) where 
x_rownum >= 7",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 7",
+      mysql_suffix_0 => "\nlimit 1 offset 6",
+      mysql_suffix_1 => "\nlimit 7",
+    },
+    {                    endrow => 8, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 8",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 8",
+      mysql_suffix_0 => "\nlimit 8",
+      mysql_suffix_1 => "\nlimit 8",
+    },
+    { startrow => 0,     endrow => 8, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 8",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 8",
+      mysql_suffix_0 => "\nlimit 8",
+      mysql_suffix_1 => "\nlimit 8",
+    },
+    { startrow => 1,     endrow => 8, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select a.* from\n(", 
oracle_suffix_0 => "\n) a where rownum <= 8",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 8",
+      mysql_suffix_0 => "\nlimit 8",
+      mysql_suffix_1 => "\nlimit 8",
+    },
+    { startrow => 3,     endrow => 8, nrows => 5, id0 => 3,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 8) where 
x_rownum >= 3",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 8",
+      mysql_suffix_0 => "\nlimit 6 offset 2",
+      mysql_suffix_1 => "\nlimit 8",
+    },
+    { startrow => 7,     endrow => 8, nrows => 1, id0 => 7,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "select * from (select a.*, 
rownum x_rownum from\n(", oracle_suffix_0 => "\n) a where rownum <= 8) where 
x_rownum >= 7",
+      oracle_where_1 => "", oracle_prefix_1 => "select a.* from\n(", 
oracle_suffix_1 => "\n) a where rownum <= 8",
+      mysql_suffix_0 => "\nlimit 2 offset 6",
+      mysql_suffix_1 => "\nlimit 8",
+    },
+    { startrow => 0,     endrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => undef, endrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 0,     endrow => undef, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => undef, endrow => undef, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    {                    endrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    {
+      nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 1,     endrow => undef, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 1, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 1,     endrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 0,     endrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+    { startrow => 0,     endrow => 0, nrows => 7, id0 => 1,     idn => 7,
+      oracle_where_0 => "", oracle_prefix_0 => "", oracle_suffix_0 => "",
+      oracle_where_1 => "", oracle_prefix_1 => "", oracle_suffix_1 => "",
+      mysql_suffix_0 => "",
+      mysql_suffix_1 => "",
+    },
+);
+
+{
+    my $expect_sql_template = <<EOF;
+PREFIXselect
+   person_id
+from test_personWHERE
+order by
+   person_idSUFFIX
+EOF
+    my ($options, $nrows, $id0, $idn, $msg, $swo_str, $value);
+    my $id = $App::options{id};
+    my ($select_nrows, $select_id0, $select_idn);
+    for (my $swo = 0; $swo <= 1; $swo++) {
+        $rep->{select_without_offset} = $swo;
+        $swo_str = $swo ? " (without offset)" : " (with offset)";
+        for (my $i = 0; $i <= $#options; $i++) {
+            next if (defined $id && $i != $id);
+            last if (!ref($options[$i]));
+            $options = { order_by => [ "person_id" ] };
+            $options->{startrow} = $options[$i]{startrow} if (exists 
$options[$i]{startrow});
+            $options->{endrow}   = $options[$i]{endrow}   if (exists 
$options[$i]{endrow});
+            $id0 = $options[$i]{id0};
+            $idn = $options[$i]{idn};
+
+            $expect_sql = $expect_sql_template;
+            #$expect_sql =~ s/\n$//;
+            $value = (exists $options[$i]{"${dbtype}_prefix_${swo}"}) ? 
$options[$i]{"${dbtype}_prefix_${swo}"} : $options[$i]{"${dbtype}_prefix"};
+            $expect_sql =~ s/PREFIX/$value/;
+            $value = (exists $options[$i]{"${dbtype}_where_${swo}"}) ? 
$options[$i]{"${dbtype}_where_${swo}"} : $options[$i]{"${dbtype}_where"};
+            $expect_sql =~ s/WHERE/$value/;
+            $value = (exists $options[$i]{"${dbtype}_suffix_${swo}"}) ? 
$options[$i]{"${dbtype}_suffix_${swo}"} : $options[$i]{"${dbtype}_suffix"};
+            $expect_sql =~ s/SUFFIX/$value/;
+
+            $msg = "limit/offset [$i] startrow=[$options->{startrow}] 
endrow=[$options->{endrow}]$swo_str";
+            if (defined $id0 && defined $idn) {
+                $select_nrows = $swo ? $idn : ($idn - $id0 + 1);
+                $select_id0   = $swo ? 1    : $id0;
+                $select_idn   = $idn;
+            }
+            else {
+                $select_nrows = undef;
+                $select_id0   = undef;
+                $select_idn   = undef;
+            }
+
+            $sql = 
$rep->_mk_select_sql("test_person",{},["person_id"],$options);
+            is($sql, $expect_sql, "limit/offset [$i] 
startrow=[$options->{startrow}] endrow=[$options->{endrow}]$swo_str : 
_mk_select_sql() sql ok");
+            &check_select($sql,$select_nrows,$select_id0,$select_idn,$msg);
+
+            $expect_sql =~ s/test_person/test_person p/;
+            $expect_sql =~ s/person_id/p.person_id/g;
+
+            $sql = 
$rep->_mk_select_joined_sql("test_person",{},["person_id"],$options);
+            is($sql, $expect_sql, "limit/offset [$i] 
startrow=[$options->{startrow}] endrow=[$options->{endrow}]$swo_str : 
_mk_select_joined_sql() sql ok");
+            &check_select($sql,$select_nrows,$select_id0,$select_idn,$msg);
+
+            $nrows = $options[$i]{nrows};
+            $nrows = 0 if (!defined $nrows);
+            
&test_get_rows($expect_sql,$nrows,$id0,$idn,$msg,"test_person",{},["person_id"],$options);
+        }
+    }
+}
+
+exit 0;
+

Reply via email to