407
|
1 package IMPL::SQL::Schema::Constraint;
|
|
2 use strict;
|
|
3 use warnings;
|
|
4
|
|
5 use IMPL::lang;
|
|
6 use IMPL::Const qw(:prop);
|
|
7 use IMPL::declare {
|
|
8 base => [
|
|
9 'IMPL::Object' => undef,
|
|
10 'IMPL::Object::Disposable' => undef
|
|
11 ],
|
|
12 props => [
|
|
13 name => PROP_RO | PROP_DIRECT,
|
|
14 table => PROP_RO | PROP_DIRECT,
|
|
15 columns => PROP_RO | PROP_LIST
|
|
16 ]
|
|
17 };
|
|
18
|
|
19 my %aliases;
|
|
20
|
|
21 sub CTOR {
|
|
22 my ($this,%args) = @_;
|
|
23 is( $args{table}, typeof IMPL::SQL::Schema::Table ) or
|
|
24 die new IMPL::InvalidArgumentException("table argument must be a table object");
|
|
25 $this->{$name} = $args{'name'};
|
|
26 $this->{$table} = $args{'table'};
|
|
27 $this->columns( [map { ResolveColumn($this->table,$_) } @{$args{'columns'}}] );
|
|
28 }
|
|
29
|
|
30 sub ResolveColumn {
|
|
31 my ($Table,$Column) = @_;
|
|
32
|
|
33 my $cn = is($Column,'IMPL::SQL::Schema::Column') ? $Column->name : $Column;
|
|
34
|
|
35 my $resolved = $Table->GetColumn($cn);
|
|
36 die new IMPL::InvalidOperationException("The column is not found in the table", $cn, $Table->name) if not $resolved;
|
|
37 return $resolved;
|
|
38 }
|
|
39
|
|
40 sub HasColumn {
|
|
41 my ($this,@Columns) = @_;
|
|
42
|
|
43 my %Columns = map { $_, 1} @Columns;
|
|
44
|
|
45 return scalar(grep { $Columns{$_->name} } $this->columns ) == scalar(@Columns);
|
|
46 }
|
|
47
|
|
48 sub uniqName {
|
|
49 my ($this) = @_;
|
|
50 return $this->{$table}->name.'_'.$this->{$name};
|
|
51 }
|
|
52
|
|
53 sub Dispose {
|
|
54 my ($this) = @_;
|
|
55
|
|
56 $this->columns([]);
|
|
57
|
|
58 delete $$this{$table};
|
|
59
|
|
60 $this->SUPER::Dispose;
|
|
61 }
|
|
62
|
|
63 sub SameValue {
|
|
64 my ($this,$other) = @_;
|
|
65
|
|
66 return 0 unless $this->columns->Count == $other->columns->Count;
|
|
67
|
|
68 for ( my $i=0; $i < $this->columns->Count; $i++ ) {
|
|
69 return 0 unless $this->columns->[$i]->name eq $other->columns->[$i]->name;
|
|
70 }
|
|
71
|
|
72 return 1;
|
|
73 }
|
|
74
|
|
75 sub ResolveAlias {
|
|
76 my ($self,$alias) = @_;
|
|
77
|
|
78 return isclass($alias, typeof IMPL::SQL::Schema::Constraint) ? $alias : $aliases{$alias};
|
|
79 }
|
|
80
|
|
81 sub RegisterAlias {
|
|
82 my ($self,$alias) = @_;
|
|
83
|
|
84 $aliases{$alias} = typeof($self);
|
|
85 }
|
|
86
|
|
87 1;
|