view Lib/IMPL/ORM.pm @ 43:009aa9ca2e48

merge
author Sergey
date Thu, 07 Jan 2010 15:41:49 +0300
parents 03e58a454b20
children 16ada169ca75
line wrap: on
line source

package IMPL::ORM;
use strict;
use warnings;

use base qw(IMPL::Object);
use IMPL::Class::Property;
use Scalar::Util qw(weaken refaddr);

use IMPL::Exception;

our $Depth = 1; # загружать объект + 1 уровень детей
our $UseProxy = 1;

BEGIN {
    private property _ObjectCache => prop_all;
    private property _MapInstances => prop_all;
    private property _WorkUnit => prop_all;
    public property Schema => prop_all;
}

sub ObjectInfoById {
    my ($this,$oid) = @_;
    
    return $this->_ObjectCache->{$oid};
}

sub ObjectInfo {
    my ($this,$inst) = @_;
    
    die new IMPL::InvalidOperationException("This method can be used only for a reference") unless ref $inst;
    
    return $this->_MapInstances->{refaddr $inst};
}


1;
__END__
=pod
=head1 SYNOPSIS

use IMPL::ORM::Sql;

my $DB = new IMPL::ORM::Sql("connection string");

local $IMPL::ORM::Depth = 1; # load childs only, no more

my $artist = $DB->Lookup( Artist => { name => 'Beatles' } );

my $order = new Order();
$order->AddItem($_) foreach $artist->Albums->List;

$DB->Save($order);

my $label = $artist->Albums->Index(0)->Label;

$DB->Populate($label); #load $label

=head1 DESCRIPTION
=head2 MEMBERS
=level 4
=back
=head2 Variables
=head2 INTERNALS
=head3 Object Representation

Каждый класс отображаемый в источник данных представляется в виде набора
сущностей, каждая из которых представляет состояние базового класса.

Foo         entityFoo
    Bar         entityBar
    Baz         entityBaz

При сохранении виртуальных свойств классов в соответствующих сущностях заводится
два поля - одно под сохранение собственного значения свойства, другое - для
хренеия виртуального значения.

Foo
    public virtual property Name => prop_all, {Type => String};
    
entityFoo
    string m_Name - собственное значение
    string v_Name - вртуальное значение
    
Каждый сохраненный объект в базе имеет собственный идентификатор.
Новые объекты идентификатора не имеют, до тех пор пока они не будут сохранены.

=head3 Object Cache

Для учета объектов, которые присутствуют в источнике данных используется кеш
объектов. Сюда попадают полученные из базы объекты, а также вновь добавленные
объекты.

ObjectInfo => {
    instance => weak ref
    _id => data source dependent id
    state => {persistent|null|new|deleted}
    work_unit => ref to the work unit where object is acting
}

данная структура доступна через две функции ObjectInfoById и ObjectInfo

=head3 Type mapping

Источник данных имеет в себе схему данных, которая определяет набор типов,
хранимых в данном источнике. Есть несколько видов отображения типов:

=level 4

=item 1

Отображение классов, когда класс рассмаривается в иде набора свойств

=item

Отображение классов в одно значение (напрмер строку, данные и т.п.)

=item

Классы, которые на прямую работают с источником данных, такие как коллекции.

=back

=cut