Database-Join

 view release on metacpan or  search on metacpan

t/distinct-mandatory.t  view on Meta::CPAN

use strict;
use warnings;

use Test::More;
use Test::Exception;

BEGIN {
	eval { require DBD::SQLite; require Database::Abstraction };
	plan skip_all => 'DBD::SQLite and Database::Abstraction required' if $@;
	plan tests => 45;
}

use lib 't/lib';
use DBI;
use File::Temp qw(tempdir);
use Database::Join;

# ---------------------------------------------------------------------------
# Inline minimal DAs (no file fixtures needed)
# ---------------------------------------------------------------------------

package MinimalDA;
use parent -norequire, 'Database::Abstraction';
sub new {
	my ($class, %args) = @_;
	return bless { _cols => $args{cols}, _rows => $args{rows} }, $class;
}
sub columns { return $_[0]->{_cols} }
sub schema  { return {} }
sub updated { return undef }
sub set_logger { return $_[0] }
sub selectall_arrayref {
	my ($self, $crit) = @_;
	$crit //= {};
	my @rows = @{ $self->{_rows} };
	for my $col (keys %{$crit}) {
		my $val = $crit->{$col};
		if (!ref $val) {
			@rows = grep { defined $_->{$col} && $_->{$col} eq $val } @rows;
		} elsif (ref $val eq 'HASH') {
			for my $op (keys %{$val}) {
				my $v = $val->{$op};
				if    ($op eq '=')  { @rows = grep { defined $_->{$col} && $_->{$col} eq  $v } @rows }
				elsif ($op eq '!=') { @rows = grep { defined $_->{$col} && $_->{$col} ne  $v } @rows }
				elsif ($op eq '>')  { @rows = grep { defined $_->{$col} && $_->{$col} >   $v } @rows }
				elsif ($op eq '<')  { @rows = grep { defined $_->{$col} && $_->{$col} <   $v } @rows }
				elsif ($op eq '>=') { @rows = grep { defined $_->{$col} && $_->{$col} >=  $v } @rows }
				elsif ($op eq '<=') { @rows = grep { defined $_->{$col} && $_->{$col} <=  $v } @rows }
			}
		}
	}
	return \@rows;
}

package main;

# ---------------------------------------------------------------------------
# Fixtures
#
#   left:   entry | region | tier
#     r1     West   gold
#     r2     East   silver
#     r3     West   silver
#     r4     East   gold
#     r5     West   bronze
#
#   right:  entry | score
#     r1      90
#     r2      70
#     r3      85
#     r4      60
#     r5      50
# ---------------------------------------------------------------------------

my $left = MinimalDA->new(
	cols => [qw(entry region tier)],
	rows => [
		{ entry => 'r1', region => 'West', tier => 'gold'   },
		{ entry => 'r2', region => 'East', tier => 'silver' },
		{ entry => 'r3', region => 'West', tier => 'silver' },
		{ entry => 'r4', region => 'East', tier => 'gold'   },
		{ entry => 'r5', region => 'West', tier => 'bronze' },
	],
);

my $right = MinimalDA->new(
	cols => [qw(entry score)],
	rows => [
		{ entry => 'r1', score => 90 },
		{ entry => 'r2', score => 70 },



( run in 0.562 second using v1.01-cache-2.11-cpan-7da0f45c409 )