Mercurial > pub > Impl
diff Lib/IMPL/ORM/Object.pm @ 28:6d33f75c6e1f
ORM in works
author | Sergey |
---|---|
date | Mon, 19 Oct 2009 04:13:54 +0400 |
parents | b544a772b654 |
children | 37160f7c8edb |
line wrap: on
line diff
--- a/Lib/IMPL/ORM/Object.pm Fri Oct 16 16:37:53 2009 +0400 +++ b/Lib/IMPL/ORM/Object.pm Mon Oct 19 04:13:54 2009 +0400 @@ -7,9 +7,15 @@ use IMPL::Class::Property::Direct; require IMPL::ORM::Entity; +require IMPL::ORM::Schema::Entity; +require IMPL::ORM::Schema::Field; +require IMPL::ORM::Schema::Relation::HasMany; +require IMPL::ORM::Schema::Relation::HasOne; +require IMPL::ORM::Schema::Relation::Subclass; BEGIN { private _direct property _entities => prop_all; + public property objectType => prop_all; } my %schemaCache; @@ -36,18 +42,19 @@ return $this->{$_entities}{$class} ? $this->{$_entities}{$class}->Get($prop,$value) : undef; } -sub _PropertyImplementor { - 'IMPL::ORM::Property' +#sub _PropertyImplementor { +# 'IMPL::ORM::Property' +#} + +sub entityName { + (my $self = ref $_[0] || $_[0]) =~ s/::/_/g; + return $self; } sub ormGetSchema { - my ($self) = @_; - - my $class = ref $self || $self; + my ($self,$dataSchema) = @_; - return $schemaCache{$class} if $schemaCache{$class}; - - my %schema; + my $schema = IMPL::ORM::Schema::Entity->new($self->entityName); foreach my $ormProp ( $self->get_meta( @@ -55,17 +62,22 @@ sub { UNIVERSAL::isa($_->Implementor, 'IMPL::ORM::Property' ) }, - 1 + 0 ) ){ - push @{$schema{$ormProp->Class}},{ - name => $ormProp->Name, - virtual => $ormProp->Virtual, - type => $ormProp->Type - }; + if ($ormProp->Mutators & prop_list) { + my $type = $dataSchema->resolveType($ormProp->Type) or die new IMPL::InvalidOperationException("Failed to resolve a reference type due building schema for a class", $ormProp->Class, $ormProp->Name); + $schema->appendChild( new IMPL::ORM::Schema::Relation::HasMany($ormProp->Name, $type->entityName) ); + } elsif (my $type = $dataSchema->isValueType($ormProp->Type,'IMPL::ORM::Object')) { + $schema->appendChild( new IMPL::ORM::Schema::Field($ormProp->Name,$type) ); + } elsif (my $entity = $dataSchema->resolveType($ormProp->Type)) { + $schema->appendChild( new IMPL::ORM::Schema::Relation::HasOne($ormProp->Name,$entity->entityName)); + } else { + die new IMPL::Exception('Uexpected error due building schema for a class', $ormProp->Class, $ormProp->Name); + } } - return ($schemaCache{$class} = \%schema); + return $schema; } 1; @@ -79,4 +91,7 @@ Базовый объект для реляционного отображения, содержит в себе реляционные записи представляющие данный объект. +Каждый класс отображается в определенную сущность. Сущности хранят +состояние объектов в том виде в котором удобно записывать в реляционную базу. + =cut \ No newline at end of file