Ambrosia
view release on metacpan or search on metacpan
lib/Ambrosia/QL.pm view on Meta::CPAN
use Ambrosia::core::Nil;
use Ambrosia::Meta;
#=rem
#
#driver: иÑÑоÑник даннÑÑ
:
# - ARRAY;
# - Ambrosia::QL;
# - клаÑÑ Ñ ÐºÐ¾ÑоÑго Ñеализован меÑод CQL().
#
#__variable: ÑодеÑÐ¶Ð¸Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑеменнÑÑ Ð² коÑоÑой ÑазмеÑен обÑекÑ;
#__predicate: ÑÑÑлка на ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿ÑовеÑÑÐµÑ ÑооÑвеÑÑÑвие полÑÑенного обÑекÑа Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑловиÑ;
#__select: ÑÑÑлка на ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоделаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¿Ð¾Ð»ÑÑенного обÑекÑа;
#__join: ÑÑÑлка на ÑодиÑелÑ
#
#=cut
#
class sealed {
public => [qw/driver source/],
private => [qw/__variable __predicate __on __select __join __join_kw __limit __skip/],
};
our $VERSION = 0.010;
sub new :Private
{
}
sub _TRUE { 1 }
sub from(&)
{
my $proto = shift;
my $class = ref $proto || $proto;
return $class->SUPER::new(
source => shift,
driver => new Ambrosia::core::Nil(),
__variable => shift || \my $tmp,
__predicate => \&_TRUE,
__on => \&_TRUE,
__limit => 0,
__skip => 0,
);
}
sub in
{
my $self = shift;
my $driver = shift;
if ( eval { $driver->isa('Ambrosia::DataProvider::BaseDriver') } )
{
$self->driver = $driver;
$self->driver->reset()->source($self->source);
}
else
{
throw Ambrosia::error::Exception 'QL: bad driver: ' . $driver;
}
return $self;
}
sub what
{
my $self = shift;
$self->driver->what(@_);
return $self;
}
sub predicate
{
my $self = shift;
if(ref $_[0] eq 'CODE')
{
$self->__limit = 1;
my $p = $_[0];
my $old = $self->__predicate;
$self->__predicate = sub { $old->(@_) && $p->(@_) }
}
else
{
$self->driver->predicate(@_);
}
return $self;
}
sub uniq
{
my $self = shift;
$self->driver->uniq(@_);
return $self;
}
sub order_by
{
my $self = shift;
$self->driver->order_by(@_);
return $self;
}
sub join
{
my $self = shift;
my ($kw, $driver, $source);
if ( scalar @_ == 1 )
{
$kw = 'INNER';
$driver = $self->driver->clone;
$source = $driver->get_source();
}
elsif ( scalar @_ == 2 )
{
$kw = shift || 'INNER';
$driver = $self->driver->clone;
( run in 0.645 second using v1.01-cache-2.11-cpan-ceb78f64989 )