package Xmldoom::Criteria::Literal;
use Xmldoom::Object;
use DBIx::Romani::Query::SQL::Literal;
use strict;
sub new
{
my $class = shift;
my $value = shift;
my $self = {
value => $value,
};
bless $self, $class;
return $self;
}
sub get_value
{
my ($self, $database, $lval) = @_;
# create the actual object when dealing with an unknown.
if ( ref($self->{value}) and $self->{value}->isa('Xmldoom::Criteria::UnknownObject') )
{
my $object = $database->get_object( $lval->get_object_name() );
my $prop = $object->get_property( $lval->get_property_name() );
$self->{value} = $self->{value}->create_object( $database, $prop->get_object_name() );
}
return $self->{value};
}
sub get_query_lval
{
my ($self, $database) = @_;
die "Literal cannot be used as an lval";
}
sub get_query_rval
{
my ($self, $database, $lval) = @_;
my $value = $self->get_value( $database, $lval );
if ( $lval->isa( 'Xmldoom::Criteria::Property' ) )
{
my $object = $database->get_object( $lval->get_object_name() );
my $prop = $object->get_property( $lval->get_property_name() );
# here we "cast" the literal into the correct type
return $prop->get_query_rval( $value );
}
else
{
return [ DBIx::Romani::Query::SQL::Literal->new( $value ) ];
}
}
sub get_tables
{
# literals don't have any tables!
return [ ];
}
sub clone
{
my $self = shift;
return Xmldoom::Criteria::Literal->new( $self->get_value() );
}
1;