add constraints after all tables are added
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Constraint.pm
CommitLineData
4f4fd192 1use MooseX::Declare;
ebf2721d 2class 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' => (
3210a6a5 57 isa => Str,
d63c8da0 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}