Commit | Line | Data |
4f4fd192 |
1 | use MooseX::Declare; |
ebf2721d |
2 | class SQL::Translator::Object::Constraint extends SQL::Translator::Object { |
160f1f55 |
3 | use MooseX::Types::Moose qw(ArrayRef Bool HashRef Int Maybe Str Undef); |
035b8503 |
4 | use MooseX::MultiMethods; |
a499b4bd |
5 | use SQL::Translator::Types qw(Column MatchType Table ColumnHash IxHash); |
6 | use Tie::IxHash; |
f49a2a49 |
7 | |
8 | has 'table' => ( |
9 | is => 'rw', |
10 | isa => Table, |
f49a2a49 |
11 | weak_ref => 1, |
12 | ); |
4f4fd192 |
13 | |
14 | has 'name' => ( |
15 | is => 'rw', |
70ab6d8c |
16 | isa => Str, |
17 | default => '', |
4f4fd192 |
18 | required => 1 |
19 | ); |
20 | |
21 | has 'columns' => ( |
4f4fd192 |
22 | is => 'rw', |
a499b4bd |
23 | isa => IxHash, #ColumnHash, |
28bd628e |
24 | handles => { |
a499b4bd |
25 | exists_column => 'EXISTS', |
26 | column_ids => 'Keys', |
27 | get_columns => 'Values', |
28 | get_column => 'FETCH', |
29 | add_column => 'STORE', |
30 | remove_column => 'DELETE', |
31 | clear_columns => 'CLEAR', |
4f4fd192 |
32 | }, |
a499b4bd |
33 | coerce => 1, |
34 | default => sub { Tie::IxHash->new() } |
4f4fd192 |
35 | ); |
36 | |
37 | has 'type' => ( |
38 | is => 'rw', |
39 | isa => Str, |
aa20eb7f |
40 | predicate => 'has_type', |
ad203890 |
41 | required => 1, |
4f4fd192 |
42 | ); |
526e74d1 |
43 | |
b750d2f1 |
44 | has 'deferrable' => ( |
45 | is => 'rw', |
46 | isa => Bool, |
075b652f |
47 | default => 1 |
b750d2f1 |
48 | ); |
49 | |
50 | has 'expression' => ( |
51 | is => 'rw', |
52 | isa => Str, |
53 | ); |
54 | |
d63c8da0 |
55 | has 'reference_table' => ( |
56 | isa => Maybe[Str], |
57 | is => 'rw', |
58 | ); |
59 | |
60 | has 'reference_columns' => ( |
106f5e00 |
61 | isa => ArrayRef, |
62 | traits => ['Array'], |
63 | handles => { |
64 | reference_columns => 'elements', |
891ce668 |
65 | add_reference_column => 'push', |
106f5e00 |
66 | }, |
67 | default => sub { [] }, |
ad203890 |
68 | required => 1, |
cb13230a |
69 | ); |
70 | |
71 | has 'match_type' => ( |
3c557f72 |
72 | isa => MatchType, |
d191bceb |
73 | is => 'rw', |
3c557f72 |
74 | coerce => 1, |
d191bceb |
75 | lazy => 1, |
76 | default => '' |
d63c8da0 |
77 | ); |
78 | |
160f1f55 |
79 | has '_order' => ( |
80 | isa => Int, |
81 | is => 'rw', |
82 | ); |
83 | |
4d662d4c |
84 | has 'on_delete' => ( is => 'rw', required => 0); |
85 | has 'on_update' => ( is => 'rw', required => 0); |
86 | |
aa20eb7f |
87 | around add_column(Column $column) { |
88 | if ($self->has_type && $self->type eq 'PRIMARY KEY') { |
89 | $column->is_primary_key(1); |
90 | } |
00e28941 |
91 | $self->$orig($column->name, $column); |
92 | return $self->get_column($column->name); |
aa20eb7f |
93 | } |
94 | |
160f1f55 |
95 | multi method order(Int $order) { $self->_order($order); } |
96 | multi method order { |
97 | my $order = $self->_order; |
98 | unless (defined $order && $order) { |
99 | my $tables = Tie::IxHash->new( map { $_->name => $_ } $self->schema->get_tables ); |
100 | $order = $tables->Indices($self->name) || 0; $order++; |
101 | $self->_order($order); |
102 | } |
103 | return $order; |
104 | } |
105 | |
aa20eb7f |
106 | method is_valid { return $self->has_type && scalar $self->column_ids ? 1 : undef } |
4f4fd192 |
107 | } |