The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use DBI;
use Benchmark qw/cmpthese timethese/;

my $dbh = DBI->connect("dbi:SQLite:dbname=../share/wnjpn-1.1.db", '', '', {
    RaiseError     => 1,
    PrintError     => 0,
    AutoCommit     => 0,
    sqlite_unicode => 1,
});


cmpthese(
    timethese(-1, {
        'synset1' => sub { Synset1('相撲', 'jpn') },
        'synset2' => sub { Synset2('相撲', 'jpn') },
        'synset3' => sub { Synset3('相撲', 'jpn') },
    })
);


sub Synset1
{
    my ($word, $lang) = @_;

    my $sth
        = $dbh->prepare
        (
            'SELECT synset FROM word LEFT JOIN sense ON word.wordid = sense.wordid
              WHERE lemma      = ?
                AND sense.lang = ?'
        );

    $sth->execute($word, $lang);

    my (@synsets, $synset);

    $sth->bind_columns( \($synset) );

    while ($sth->fetchrow_arrayref)
    {
        push(@synsets, $synset);
    }

    Carp::carp "Synset: there are no synsets for $word in $lang" unless scalar @synsets;

    return @synsets;
}


sub Synset2
{
    my ($word, $lang) = @_;

    my $sth
        = $dbh->prepare
        (
            'SELECT synset FROM word LEFT JOIN sense ON word.wordid = sense.wordid
              WHERE lemma      = ?
                AND sense.lang = ?'
        );

    $sth->execute($word, $lang);

    my @synsets = map {$_->[0]} @{$sth->fetchall_arrayref};

    Carp::carp "Synset: there are no synsets for $word in $lang" unless scalar @synsets;

    return @synsets;
}


sub Synset3
{
    my ($word, $lang) = @_;

    my $sth
        = $dbh->prepare
        (
            'SELECT synset FROM word LEFT JOIN sense ON word.wordid = sense.wordid
              WHERE lemma      = ?
                AND sense.lang = ?'
        );

    $sth->execute($word, $lang);

    my @synsets;

    while (my $row = $sth->fetchrow_arrayref)
    {
        my $synset = $row->[0];
        push(@synsets, $synset);
    }

    Carp::carp "Synset: there are no synsets for $word in $lang" unless scalar @synsets;

    return @synsets;
}