Ambrosia
view release on metacpan or search on metacpan
benchmark/Ambrosia/DataProvider.b view on Meta::CPAN
#!/usr/bin/perl -w
use warnings;
use strict;
use lib qw(lib t);
use Benchmark;
use Ambrosia::DataProvider;
my $confDS = {
DBI => [
{
engine_name => 'mysql',
source_name => 'Employee',
user => 'root',
password => '',
engine_params => 'database=test;host=localhost;',
additional_params => { AutoCommit => 0, RaiseError => 1, LongTruncOk => 1 },
additional_action => sub { my $dbh = shift; $dbh->do('SET NAMES utf8')},
},
]
};
instance Ambrosia::DataProvider(test => $confDS);
Ambrosia::DataProvider::assign 'test';
my $d = storage()->driver('DBI', 'Employee');
my $dbh = $d->handler();
$dbh->do(q~DROP TABLE IF EXISTS `tClient`~);
$dbh->do(<<CREATE_TABLE);
CREATE TABLE `tClient` (
`Client_Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`LastName` varchar(32) NOT NULL,
`FirstName` varchar(32) NOT NULL,
`MiddleName` varchar(32) NOT NULL,
`Age` tinyint(4) NOT NULL,
PRIMARY KEY (`Client_Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
CREATE_TABLE
$d->save_transaction();
my $NUM_ITER = 1000;
# my $q = $d->reset()
# ->source('tClient')
# ->select()
# ->what(qw/LastName FirstName MiddleName Age/)
# ->predicate(['Client_Id', '<=', 30],['Client_Id', '>', $NUM_ITER-10])
# ->next();
#exit;
my $count = 0;
sub insert
{
my $i = shift;
$d->reset()
->source('tClient')
->insert()
->what(qw/LastName FirstName MiddleName Age/)
->execute('LastName'.$i, 'FirstName'.$i, 'MiddleName'.$i, 20+$i);
$d->save_transaction();
}
sub createSQL
{
$d->reset()
->source('tClient')
->select()
->what(qw/LastName FirstName MiddleName Age/)
->predicate(['Age', '<=', 30],['Age', '>', $NUM_ITER])
;#->order_by('Age');
}
sub select
{
my $q = $d->reset()
->source('tClient')
->select()
->what(qw/LastName FirstName MiddleName Age/)
->predicate(['Age', '<=', 30],['Age', '>', $NUM_ITER])
;#->order_by('Age');
while( my $r = $q->next() )
{
$count++;
}
$d->save_transaction();
}
sub selectIndex
{
my $q = $d->reset()
->source('tClient')
->select()
->what(qw/LastName FirstName MiddleName Age/)
->predicate(['Client_Id', '<=', 30],['Client_Id', '>', $NUM_ITER-10])
;#->order_by('Age');
while( my $r = $q->next() )
{
$count++;
}
$d->save_transaction();
}
sub selectIndex2
{
my $q = $d->reset()
->source('tClient')
->select()
->what(qw/LastName FirstName MiddleName Age/)
->predicate('Client_Id', '=', 30)
;#->order_by('Age');
while( my $r = $q->next() )
{
$count++;
}
$d->save_transaction();
}
sub dbi
{
my $r = $d->handler->selectall_arrayref(q~
SELECT
`tClient`.`LastName` AS tClient_LastName,
`tClient`.`FirstName` AS tClient_FirstName,
`tClient`.`MiddleName` AS tClient_MiddleName,
`tClient`.`Age` AS tClient_Age
FROM `tClient`
WHERE (`tClient`.`Client_Id` <= '30' OR `tClient`.`Client_Id` > '990')
~, { Slice => {} });
$d->save_transaction();
}
my $i = 1;
timethese($NUM_ITER, {
'insert' => sub { insert($i++) },
});
timethese($NUM_ITER*10, {
'createSQL' => \&createSQL,
});
print "\n";
timethese($NUM_ITER, {
'select' => \&select,
});
print "rows count=$count\n\n"; $count=0;
timethese($NUM_ITER, {
'selectIndex' => \&selectIndex,
'dbi' => \&dbi,
});
print "rows count=$count\n\n"; $count=0;
timethese($NUM_ITER, {
'selectIndex2' => \&selectIndex2,
});
print "rows count=$count\n"; $count=0;
$dbh->do(q~DROP TABLE IF EXISTS `tClient`~);
( run in 1.422 second using v1.01-cache-2.11-cpan-5837b0d9d2c )