my $pri_col = $colg->primary;
This returns a list of the columns in the Primary group.
| Class-DBI documentation | Contained in the Class-DBI distribution. |
Class::DBI::ColumnGrouper - Columns and Column Groups
my $colg = Class::DBI::ColumnGrouper->new; $colg->add_group(People => qw/star director producer/); my @cols = $colg->group_cols($group); my @all = $colg->all_columns; my @pri_col = $colg->primary; my @essential_cols = $colg->essential;
Each Class::DBI class maintains a list of its columns as class data. This provides an interface to that. You probably don't want to be dealing with this directly.
my $colg = Class::DBI::ColumnGrouper->new;
A new blank ColumnnGrouper object.
my $colg2 = $colg->clone;
Clone an existing ColumnGrouper.
$colg->add_column($name); my Class::DBI::Column $col = $colg->find_column($name);
Add or return a Column object for the given column name.
$colg->add_group(People => qw/star director producer/);
This adds a list of columns as a column group.
my @colg = $cols->group_cols($group); my @groups = $cols->groups_for(@cols);
This returns a list of all columns which are in the given group, or the groups a given column is in.
my @cols = $colg->columns_in(@groups);
This returns a list of all columns which are in the given groups.
my @all = $colg->all_columns;
This returns a list of all the real columns.
my $pri_col = $colg->primary;
This returns a list of the columns in the Primary group.
my @essential_cols = $colg->essential;
This returns a list of the columns in the Essential group.
| Class-DBI documentation | Contained in the Class-DBI distribution. |
package Class::DBI::ColumnGrouper;
use strict; use Carp; use Storable 'dclone'; use Class::DBI::Column; sub _unique { my %seen; map { $seen{$_}++ ? () : $_ } @_; } sub _uniq { my %tmp; return grep !$tmp{$_}++, @_; }
sub new { my $class = shift; bless { _groups => {}, _cols => {}, }, $class; } sub clone { my ($class, $prev) = @_; return dclone $prev; }
sub add_column { my ($self, $col) = @_; # TODO remove this croak "Need a Column, got $col" unless $col->isa("Class::DBI::Column"); $self->{_allcol}->{ $col->name_lc } ||= $col; } sub find_column { my ($self, $name) = @_; return $name if ref $name; return unless $self->{_allcol}->{ lc $name }; }
sub add_group { my ($self, $group, @names) = @_; $self->add_group(Primary => $names[0]) if ($group eq "All" or $group eq "Essential") and not $self->group_cols('Primary'); $self->add_group(Essential => @names) if $group eq "All" and !$self->essential; @names = _unique($self->primary, @names) if $group eq "Essential"; my @cols = map $self->add_column($_), @names; $_->add_group($group) foreach @cols; $self->{_groups}->{$group} = \@cols; return $self; }
sub group_cols { my ($self, $group) = @_; return $self->all_columns if $group eq "All"; @{ $self->{_groups}->{$group} || [] }; } sub groups_for { my ($self, @cols) = @_; return _uniq(map $_->groups, @cols); }
sub columns_in { my ($self, @groups) = @_; return _uniq(map $self->group_cols($_), @groups); }
sub all_columns { my $self = shift; return grep $_->in_database, values %{ $self->{_allcol} }; } sub primary { my @cols = shift->group_cols('Primary'); if (!wantarray && @cols > 1) { local ($Carp::CarpLevel) = 1; confess( "Multiple columns in Primary group (@cols) but primary called in scalar context" ); return $cols[0]; } return @cols; } sub essential { my $self = shift; my @cols = $self->columns_in('Essential'); @cols = $self->primary unless @cols; return @cols; } 1;