Commit | Line | Data |
ea2e61bf |
1 | package DBIx::Class::CDBICompat::ColumnGroups; |
2 | |
3 | use strict; |
4 | use warnings; |
ea2e61bf |
5 | |
75a23b3e |
6 | use base qw/DBIx::Class::Row/; |
ea2e61bf |
7 | |
8 | __PACKAGE__->mk_classdata('_column_groups' => { }); |
9 | |
ea2e61bf |
10 | sub columns { |
11 | my $proto = shift; |
12 | my $class = ref $proto || $proto; |
13 | my $group = shift || "All"; |
510ca912 |
14 | $class->_add_column_group($group => @_) if @_; |
ea2e61bf |
15 | return $class->all_columns if $group eq "All"; |
16 | return $class->primary_column if $group eq "Primary"; |
17 | return keys %{$class->_column_groups->{$group}}; |
18 | } |
19 | |
510ca912 |
20 | sub _add_column_group { |
ea2e61bf |
21 | my ($class, $group, @cols) = @_; |
510ca912 |
22 | $class->add_columns(@cols); |
6a94f7f4 |
23 | $class->_register_column_group($group => @cols); |
ea2e61bf |
24 | } |
25 | |
26 | sub _register_column_group { |
27 | my ($class, $group, @cols) = @_; |
b8e1e21f |
28 | |
29 | my $groups = { %{$class->_column_groups} }; |
30 | |
ea2e61bf |
31 | if ($group eq 'Primary') { |
510ca912 |
32 | $class->set_primary_key(@cols); |
b8e1e21f |
33 | $groups->{'Essential'}{$_} ||= {} for @cols; |
ea2e61bf |
34 | } |
35 | |
ea2e61bf |
36 | if ($group eq 'All') { |
510ca912 |
37 | unless (exists $class->_column_groups->{'Primary'}) { |
ea2e61bf |
38 | $groups->{'Primary'}{$cols[0]} = {}; |
510ca912 |
39 | $class->set_primary_key($cols[0]); |
ea2e61bf |
40 | } |
510ca912 |
41 | unless (exists $class->_column_groups->{'Essential'}) { |
b8e1e21f |
42 | #$class->_register_column_group('Essential' => $cols[0]); |
ea2e61bf |
43 | $groups->{'Essential'}{$cols[0]} = {}; |
b8e1e21f |
44 | #$groups->{'Essential'}{$_} ||= {} for keys %{ $class->_primaries || {} }; |
ea2e61bf |
45 | } |
46 | } |
47 | |
48 | $groups->{$group}{$_} ||= {} for @cols; |
b8e1e21f |
49 | #if ($group eq 'Essential') { |
50 | # $groups->{$group}{$_} ||= {} for keys %{ $class->_primaries || {} }; |
51 | #} |
52 | |
ea2e61bf |
53 | $class->_column_groups($groups); |
54 | } |
55 | |
56 | sub all_columns { return keys %{$_[0]->_columns}; } |
57 | |
58 | sub primary_column { |
59 | my ($class) = @_; |
103647d5 |
60 | my @pri = $class->primary_columns; |
ea2e61bf |
61 | return wantarray ? @pri : $pri[0]; |
62 | } |
63 | |
64 | sub find_column { |
65 | my ($class, $col) = @_; |
103647d5 |
66 | return $col if $class->has_column($col); |
ea2e61bf |
67 | } |
68 | |
69 | sub __grouper { |
70 | my ($class) = @_; |
71 | return bless({ class => $class}, 'DBIx::Class::CDBICompat::ColumnGroups::GrouperShim'); |
72 | } |
73 | |
74 | sub _find_columns { |
75 | my ($class, @col) = @_; |
76 | return map { $class->find_column($_) } @col; |
77 | } |
78 | |
79 | package DBIx::Class::CDBICompat::ColumnGroups::GrouperShim; |
80 | |
81 | sub groups_for { |
82 | my ($self, @cols) = @_; |
83 | my %groups; |
84 | foreach my $col (@cols) { |
85 | foreach my $group (keys %{$self->{class}->_column_groups}) { |
86 | $groups{$group} = 1 if $self->{class}->_column_groups->{$group}->{$col}; |
87 | } |
88 | } |
89 | return keys %groups; |
90 | } |
91 | |
92 | |
93 | 1; |