Mercurial > pub > Impl
comparison Lib/IMPL/ORM/Schema.pm @ 42:4ff27cd051e3
updated ORM schema model
| author | Sergey |
|---|---|
| date | Thu, 07 Jan 2010 15:34:42 +0300 |
| parents | d59526f6310e |
| children | 009aa9ca2e48 |
comparison
equal
deleted
inserted
replaced
| 37:c2e7f7c96bcd | 42:4ff27cd051e3 |
|---|---|
| 3 use warnings; | 3 use warnings; |
| 4 | 4 |
| 5 use base qw(IMPL::DOM::Document); | 5 use base qw(IMPL::DOM::Document); |
| 6 use IMPL::Class::Property; | 6 use IMPL::Class::Property; |
| 7 require IMPL::ORM::Schema::Entity; | 7 require IMPL::ORM::Schema::Entity; |
| 8 require IMPL::ORM::Schema::ValueType; | |
| 8 | 9 |
| 9 our %CTOR = ( | 10 our %CTOR = ( |
| 10 'IMPL::DOM::Document' => sub { nodeName => 'Schema' } | 11 'IMPL::DOM::Document' => sub { nodeName => 'Schema' } |
| 11 ); | 12 ); |
| 12 | 13 |
| 45 | 46 |
| 46 my $entity = new IMPL::ORM::Schema::Entity($typeName); | 47 my $entity = new IMPL::ORM::Schema::Entity($typeName); |
| 47 | 48 |
| 48 $this->mapPending->{$typeName} = $entity; | 49 $this->mapPending->{$typeName} = $entity; |
| 49 | 50 |
| 51 $this->appendChild($entity); | |
| 52 | |
| 50 return $this->mapReferenceTypes->{$typeName} = $entity; | 53 return $this->mapReferenceTypes->{$typeName} = $entity; |
| 51 } | 54 } |
| 52 | 55 |
| 53 sub _addReferenceType { | 56 sub _addReferenceType { |
| 54 my ($this,$className) = @_; | 57 my ($this,$className) = @_; |
| 55 | 58 |
| 56 $this->mapReferenceTypes->{$className} = $className->ormGetSchema($this,delete $this->mapPending->{$className}); | 59 if ( my $entity = delete $this->mapPending->{$className} ) { |
| 60 $className->ormGetSchema($this,$entity); | |
| 61 } else { | |
| 62 return $this->appendChild( $this->mapReferenceTypes->{$className} = $className->ormGetSchema($this) ); | |
| 63 } | |
| 64 | |
| 57 } | 65 } |
| 58 | 66 |
| 59 # returns valuetype name | 67 # returns valuetype name |
| 60 sub isValueType { | 68 sub isValueType { |
| 61 my ($this,$typeName) = @_; | 69 my ($this,$typeName) = @_; |
| 75 sub ValueTypes { | 83 sub ValueTypes { |
| 76 my ($this,%classes) = @_; | 84 my ($this,%classes) = @_; |
| 77 | 85 |
| 78 $this = ref $this ? $this : $this->instance; | 86 $this = ref $this ? $this : $this->instance; |
| 79 | 87 |
| 80 $this->mapValueTypes->{$_} = $classes{$_} foreach keys %classes; | 88 while ( my ($typeName,$typeReflected) = each %classes ) { |
| 89 $this->mapValueTypes->{$typeName} = $typeReflected; | |
| 90 $this->appendChild(IMPL::ORM::Schema::ValueType->new($typeName,$typeReflected)); | |
| 91 } | |
| 81 } | 92 } |
| 82 | 93 |
| 83 sub Classes { | 94 sub Classes { |
| 84 my ($this,@classNames) = @_; | 95 my ($this,@classNames) = @_; |
| 85 | 96 |
| 99 sub CompleteSchema { | 110 sub CompleteSchema { |
| 100 my ($this) = @_; | 111 my ($this) = @_; |
| 101 | 112 |
| 102 $this = ref $this ? $this : $this->instance; | 113 $this = ref $this ? $this : $this->instance; |
| 103 | 114 |
| 104 $this->mapReferenceTypes->{$_} = $_->ormGetSchema($this,delete $this->mapPending->{$_}) | 115 $_->ormGetSchema($this,delete $this->mapPending->{$_}) foreach (keys %{$this->mapPending}); |
| 105 foreach (keys %{$this->mapPending}); | |
| 106 } | 116 } |
| 107 | 117 |
| 108 1; | 118 1; |
| 109 | 119 |
| 110 __END__ | 120 __END__ |
| 116 Схема данных, представляет собой DOM документ, элементами которой | 126 Схема данных, представляет собой DOM документ, элементами которой |
| 117 являются сущности. | 127 являются сущности. |
| 118 | 128 |
| 119 Каждый узел - это описание сущности. | 129 Каждый узел - это описание сущности. |
| 120 | 130 |
| 131 <Schema> | |
| 132 <Entity entityName="My_Data_Foo"> | |
| 133 <Field fieldName="Doo" fieldType="String"/> | |
| 134 <HasMany name="Boxes" target="My_Data_Box"/> | |
| 135 </Entity> | |
| 136 <Entity entityName="My_Data_Bar"> | |
| 137 <Subclass base="My_Data_Foo"/> | |
| 138 <Field fieldName="Timestamp" fieldType="Integer"/> | |
| 139 </Entity> | |
| 140 <Entity entityName="My_Data_Box"> | |
| 141 <Field fieldName="Capacity" fieldType="Integer"/> | |
| 142 </Entity> | |
| 143 </Schema> | |
| 144 | |
| 121 =cut | 145 =cut |
