⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fieldset.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 2 页
字号:
# 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 + -