📄 fieldset.pm
字号:
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
# Name : ETL::Pequel3::Type::FieldSet.pm
# Created : 19 December 2006
# Author : Mario Gaffiero (gaffie)
#
# Copyright 1999-2007 Mario Gaffiero.
#
# This file is part of Pequel(TM).
#
# Pequel is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# Pequel is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Pequel; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# ----------------------------------------------------------------------------------------------------
# Modification History
# When Version Who What
# ----------------------------------------------------------------------------------------------------
package ETL::Pequel3::Type::FieldSet;
require 5.005_62;
use strict;
use warnings;
use stl;
use ETL::Pequel3::Type::Field;
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::FieldSet::Abstract;
use base qw(ETL::Pequel3::Type::Catalogue);
use Class::STL::ClassMembers qw( aggregate_types dataset configuration pequel_ref ),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
Class::STL::ClassMembers::DataMember->new(name => 'allow_duplicates', default => 0),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::Field::Abstract');
use Class::STL::ClassMembers::Constructor;
sub new_extra
{
my $self = shift;
use ETL::Pequel3::Type::Aggregates;
$self->aggregate_types(ETL::Pequel3::Type::Aggregates::Catalogue->new());
$self->configuration($self->pequel_ref()->config())
if (defined($self->pequel_ref()));
return $self;
}
sub add
# derived classes should ALWAYS call this base class add() function with addition options, etc
{
my $self = shift;
$self->push_back($self->factory(
field_number => $self->size() +1,
dataset => $self->dataset(),
pequel_ref => $self->pequel_ref(),
@_
));
$self->err()->trace_msg(10, $self->back()->print_info());
}
sub map_fields
{
my $self = shift;
my $field_map = shift;
my $dataset = shift;
$self->err()->diag(50, "......map fields...");
$self->err()->user_error(10801, "@{[ $self->catalogue_name() ]}->map_fields() -- 'field_map' argument undefined!")
unless (defined($field_map));
# field_map=field_a:1,field_b:2,fieldc:4
# column-number must start from 1;
# column not relevant for local table;
$self->clear();
my $col_count=0;
$self->err()->trace_msg(10, "@{[ $self->pequel_ref()->pequel_name() ]} -->"
. "map_fields: [@{[ $self->catalogue_name() ]}] -- @{[
$field_map ]} -- @{[
defined($dataset) ? $dataset->datasource()->target_name() : 'null'
]}");
foreach (split(/\s*,\s*/, $field_map))
{
my ($fname, $col) = m/:/ ? split(/\s*:\s*/) : ($_, ++$col_count);
$self->err()->user_error(10301, "Invalid column number zero for field '$fname' for '@{[
$self->tname() ]}' (@{[ ref($self) ]})")
if ($col == 0);
$self->add(name => $fname, ds_column => $col, dataset => $dataset);
}
}
sub map_input
{
my $self = shift;
my $items = shift;
my $input_fields = shift;
$self->err()->diag(50, "......map input...");
foreach my $f ($items->to_array())
{
$self->err()->diag(50, ".........@{[ $f->field_name() ]}...");
$self->err()->user_error(10240, "Duplicate (@{[ $self->catalogue_name() ]}) field name '@{[
$f->field_name() ]}' not allowed!")
if (!$self->allow_duplicates() && $self->exists($f->field_name()));
my $input_field=undef;
if ($f->attributes()->exists('input_field_name'))
{ # use by Section::Output
$input_field = $input_fields->exists($f->input_field_name())
|| $self->err()->user_error(10242, "Unknown input field '@{[
$f->input_field_name() ]}' for (@{[ $self->catalogue_name() ]}) field '@{[
$f->field_name() ]}'") if (defined($input_fields) && defined($f->input_field_name()));
}
elsif ($f->attributes()->exists('field_name'))
{ # use by all other sections
$input_field = $input_fields->exists($f->field_name())
|| $self->err()->user_error(10242, "Unknown field '@{[
$f->field_name() ]}' for (@{[ $self->catalogue_name() ]}) field '@{[
$f->field_name() ]}'") if (defined($input_fields) && defined($f->field_name()));
}
$self->err()->diag(50, ".........@{[ $f->field_name() ]}...add >>>");
$self->add(
name => $f->field_name(),
map(do{ my $n=$_->name(); ( $n => $f->$n() ) }, $f->attributes()->to_array()),
do { defined($input_field) ? ( input_field => $input_field ) : () },
);
$self->err()->diag(50, ".........@{[ $f->field_name() ]}...add <<<");
}
}
sub map_output
{
my $self = shift;
my $items = shift;
my $output_fields = shift;
$self->err()->diag(50, "......map output...");
foreach my $f ($items->to_array())
{
$self->err()->diag(50, ".........@{[ $f->field_name() ]}...");
$self->err()->user_error(10240, "Duplicate (@{[ $self->catalogue_name() ]}) field name '@{[
$f->field_name() ]}' not allowed!")
if (!$self->allow_duplicates() && $self->exists($f->field_name()));
my $output_field = $output_fields->exists($f->field_name())
|| $self->err()->user_error(10242, "Unknown output field '@{[
$f->field_name() ]}' for (@{[ $self->catalogue_name() ]}) field '@{[
$f->field_name() ]}'") if (defined($output_fields) && defined($f->field_name()));
$self->err()->diag(50, ".........@{[ $f->field_name() ]}...add");
$self->add(
name => $f->field_name(),
map(do{ my $n=$_->name(); ( $n => $f->$n() ) }, $f->attributes()->to_array()),
do { defined($output_field) ? ( output_field => $output_field ) : () },
);
}
}
sub code_decl
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $maxlen = defined($self->configuration()) ? $self->configuration()->decl_min_pad_size() : 12;
foreach my $f ($self->to_array()) {
$maxlen = length($f->tname()) if (length($f->tname()) > $maxlen);
}
$c->comment("code_decl->@{[ ref($self) ]}");
foreach my $f ($self->to_array()) {
$c->code("my \$c" . sprintf("%-*s", $maxlen+2, $f->tname())
. " = " . sprintf("%3d", $f->field_number() -1) . ";"
. ($f->name() =~ /^_/ ? ' # -- transparent' : '')
. ($f->can('calc_exp') && defined($f->calc_exp()) ? " # -- derived: @{[ $f->calc_exp() ]}" : '')
);
}
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::FieldSet::InputFields;
use base qw(ETL::Pequel3::Type::FieldSet::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'input_fields'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::Field::InputField');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -