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', |
8e1b1e1d |
31 | has_columns => 'Length', |
a499b4bd |
32 | clear_columns => 'CLEAR', |
4f4fd192 |
33 | }, |
a499b4bd |
34 | coerce => 1, |
35 | default => sub { Tie::IxHash->new() } |
4f4fd192 |
36 | ); |
37 | |
38 | has 'type' => ( |
39 | is => 'rw', |
40 | isa => Str, |
aa20eb7f |
41 | predicate => 'has_type', |
ad203890 |
42 | required => 1, |
4f4fd192 |
43 | ); |
526e74d1 |
44 | |
b750d2f1 |
45 | has 'deferrable' => ( |
46 | is => 'rw', |
47 | isa => Bool, |
075b652f |
48 | default => 1 |
b750d2f1 |
49 | ); |
50 | |
51 | has 'expression' => ( |
52 | is => 'rw', |
53 | isa => Str, |
54 | ); |
55 | |
d63c8da0 |
56 | has 'reference_table' => ( |
57 | isa => Maybe[Str], |
58 | is => 'rw', |
59 | ); |
60 | |
61 | has 'reference_columns' => ( |
106f5e00 |
62 | isa => ArrayRef, |
63 | traits => ['Array'], |
64 | handles => { |
65 | reference_columns => 'elements', |
891ce668 |
66 | add_reference_column => 'push', |
106f5e00 |
67 | }, |
68 | default => sub { [] }, |
ad203890 |
69 | required => 1, |
cb13230a |
70 | ); |
71 | |
72 | has 'match_type' => ( |
3c557f72 |
73 | isa => MatchType, |
d191bceb |
74 | is => 'rw', |
3c557f72 |
75 | coerce => 1, |
d191bceb |
76 | lazy => 1, |
77 | default => '' |
d63c8da0 |
78 | ); |
79 | |
160f1f55 |
80 | has '_order' => ( |
81 | isa => Int, |
82 | is => 'rw', |
83 | ); |
84 | |
4d662d4c |
85 | has 'on_delete' => ( is => 'rw', required => 0); |
86 | has 'on_update' => ( is => 'rw', required => 0); |
87 | |
801e0d4f |
88 | around add_column(Column $column does coerce) { |
aa20eb7f |
89 | if ($self->has_type && $self->type eq 'PRIMARY KEY') { |
90 | $column->is_primary_key(1); |
91 | } |
1dfb508c |
92 | $column->table($self->table); |
00e28941 |
93 | $self->$orig($column->name, $column); |
94 | return $self->get_column($column->name); |
aa20eb7f |
95 | } |
96 | |
160f1f55 |
97 | multi method order(Int $order) { $self->_order($order); } |
98 | multi method order { |
99 | my $order = $self->_order; |
100 | unless (defined $order && $order) { |
101 | my $tables = Tie::IxHash->new( map { $_->name => $_ } $self->schema->get_tables ); |
102 | $order = $tables->Indices($self->name) || 0; $order++; |
103 | $self->_order($order); |
104 | } |
105 | return $order; |
106 | } |
107 | |
aa20eb7f |
108 | method is_valid { return $self->has_type && scalar $self->column_ids ? 1 : undef } |
d971846d |
109 | |
110 | around BUILDARGS(ClassName $self: @args) { |
111 | my $args = $self->$orig(@args); |
112 | |
113 | my $fields = delete $args->{fields} || []; |
114 | |
115 | $fields = ref($fields) eq 'ARRAY' ? $fields : [ $fields ]; |
116 | my $ix_hash = Tie::IxHash->new(); |
117 | $ix_hash->STORE($_, SQL::Translator::Object::Column->new( name => $_ )) for @$fields; |
118 | $args->{columns} = $ix_hash; |
119 | |
120 | return $args; |
121 | } |
4f4fd192 |
122 | } |