Patch from abraxxa to make set_primary_key barf if called with non-existant columns
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / CDBICompat / ColumnGroups.pm
CommitLineData
ea2e61bf 1package DBIx::Class::CDBICompat::ColumnGroups;
2
3use strict;
4use warnings;
ea2e61bf 5
75a23b3e 6use base qw/DBIx::Class::Row/;
ea2e61bf 7
8__PACKAGE__->mk_classdata('_column_groups' => { });
9
ea2e61bf 10sub 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 20sub _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
26sub _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
56sub all_columns { return keys %{$_[0]->_columns}; }
57
58sub primary_column {
59 my ($class) = @_;
103647d5 60 my @pri = $class->primary_columns;
ea2e61bf 61 return wantarray ? @pri : $pri[0];
62}
63
64sub find_column {
65 my ($class, $col) = @_;
103647d5 66 return $col if $class->has_column($col);
ea2e61bf 67}
68
69sub __grouper {
70 my ($class) = @_;
71 return bless({ class => $class}, 'DBIx::Class::CDBICompat::ColumnGroups::GrouperShim');
72}
73
74sub _find_columns {
75 my ($class, @col) = @_;
76 return map { $class->find_column($_) } @col;
77}
78
79package DBIx::Class::CDBICompat::ColumnGroups::GrouperShim;
80
81sub 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
931;