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

📄 dataset.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 3 页
字号:
		my $numflds = shift;
		$c->code("\$@{[ $self->sth_vname() ]}->fetchrow_array()");
		return $c;
	}
	sub code_read
	{
		my $self = shift;
		my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
		my @fields = @_; # ETL::Pequel3::Type::Field::Abstract object list;
		my $numflds = int(@fields);
		$c->newline_off();
		$c->code("\@@{[ $self->arr_vname() ]} = ");
		$self->code_decode($c, $numflds);
		return $c;
	}
	sub parse
	{
		my $self = shift;
		$self->_dsn_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->dsn()))
			if (defined($self->dsn()));
		$self->_user_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->user()))
			if (defined($self->user()));
		$self->_password_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->password()))
			if (defined($self->password()));
		$self->_table_name_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->table_name()))
			if (defined($self->table_name()));
		$self->_select_override_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_override()))
			if (defined($self->select_override()));
		$self->_select_where_condition_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_where_condition()))
			if (defined($self->select_where_condition()));
		$self->_select_fields_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_fields()))
			if (defined($self->select_fields()));
		$self->_select_order_by_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_order_by()))
			if (defined($self->select_order_by()));
		$self->_select_group_by_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_group_by()))
			if (defined($self->select_group_by()));
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Input::Sampler;
	use base qw(ETL::Pequel3::Type::DataSet::Input::AsciiDelimited);
	use Class::STL::ClassMembers qw( recs_vname _field_init_values ),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'sampler'),
		Class::STL::ClassMembers::DataMember->new(name => 'datasource_type', default => 'void'),
		ETL::Pequel3::Type::DataMember::User->new(name => 'records', default => 1);
	use Class::STL::ClassMembers::Constructor;
	sub new_extra
	{
		my $self = shift;
		$self->recs_vname("@{[ $self->datasource()->vname() || 'UNDEF' ]}_RECS");
	}
	sub code_init
	{	
		my $self = shift;
		my $c = $self->SUPER::code_init(@_);
		$c->code("my \$@{[ $self->recs_vname() ]}=@{[ $self->records() ]};");
		return $c;
	}
	sub code_open
	{
		my $self = shift;
		my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
		return $c;
	}
	sub code_decode
	{
		my $self = shift;
		my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
		my $numflds = shift;
		return $c;
	}
	sub code_read
	{
		my $self = shift;
		my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
		$c->code("--\$@{[ $self->recs_vname() ]} >= 0");
		return $c;
	}
	sub code_after_read
	{
		my $self = shift;
		my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
		$c->newline_off();
		$c->code("\@@{[ $self->arr_vname() ]} = (");
		$c->add(
			defined($self->_field_init_values())
				? $self->_field_init_values()
				: join(', ', map(q{''}, grep(!defined($_->calc_exp()), $self->input_fields()->to_array())))
		);
		$c->newline_on();
		$c->code(");");
		return $c;
	}
	sub parse
	{
		my $self = shift;
		$self->_field_init_values(ETL::Pequel3::CodeStyler::Program::Perl->new());
		$self->_field_init_values()->code(
			join
			(
				', ', 
				map
				(
					$_->pequel_type()->name() eq 'date' 
						? $self->pequel_ref()->parser()->used_by($_)->translate(
								'(&to_date(&today()<YYYYMMDD>, ' . $_->date_type()->name() . '))'
							)->raw()
						: $_->pequel_type()->name() =~ /^(numeric|amount)$/ ? '0' : q{''}, 
					grep(!defined($_->calc_exp()), $self->input_fields()->to_array())
				)
			)
		);
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::User::Find; # ???
	use base qw(Class::STL::Utilities::FunctionObject::UnaryFunction);
	use Class::STL::ClassMembers qw( dataset_spec );
	use Class::STL::ClassMembers::Constructor;
	sub function_operator
	{
		my $self = shift;
		my $arg = shift; # element object
		return $arg->dataset_spec() eq $self->dataset_spec() ? $arg : 0;
	}
}
# ----------------------------------------------------------------------------------------------------
# CATALOGUE
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Catalogue::Abstract;
	use base qw(ETL::Pequel3::Type::Catalogue);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
		Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
	use Class::STL::ClassMembers::Constructor;
	sub catalogue # --> to_xml
	{
		my $self = shift;
		my $xml_node = shift;
		foreach ($self->to_array()) {
			my $s_xml = $xml_node->createChild("dataset-type");
			$s_xml->attribute('dataset-name', $_->name());
			foreach my $k (keys %{$_->members()}) {
				my $attr = ${$_->members()}{$k};
				next unless UNIVERSAL::isa(${$attr}[2], 'ETL::Pequel3::Type::Properties::Abstract');
				my $m_xml = $s_xml->createChild("property-type");
				$m_xml->attribute('name', $k);
				$m_xml->attribute('default', ${$attr}[0]);
				$m_xml->attribute('validate', ${$attr}[1]);
			}
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Input::Catalogue;
	use base qw(ETL::Pequel3::Type::DataSet::Catalogue::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'input_datasets');
	use Class::STL::ClassMembers::SingletonConstructor;
	sub new_extra
	{
		my $self = shift;
		$self->push_back(
			ETL::Pequel3::Type::DataSet::Input::AsciiDelimited->_new(),
			ETL::Pequel3::Type::DataSet::Input::Packed->_new(),
			ETL::Pequel3::Type::DataSet::Input::Dbi->_new(),
			ETL::Pequel3::Type::DataSet::Input::Sampler->_new(),
		);
		return $self;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Output::Catalogue;
	use base qw(ETL::Pequel3::Type::DataSet::Catalogue::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'output_datasets');
	use Class::STL::ClassMembers::SingletonConstructor;
	sub new_extra
	{
		my $self = shift;
		$self->push_back(
			ETL::Pequel3::Type::DataSet::Output::AsciiDelimited->_new(),
			ETL::Pequel3::Type::DataSet::Output::Packed->_new(),
			ETL::Pequel3::Type::DataSet::Output::Xml->_new(),
		);
		return $self;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::UserShared::Global;
	use base qw(ETL::Pequel3::Type::Catalogue);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'shared_datasets'),
		Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'dataset_spec'),
		Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
	use Class::STL::ClassMembers::SingletonConstructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::User::Local;
	use base qw(ETL::Pequel3::Type::Catalogue);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'local_datasets'),
		Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'dataset_spec'),
		Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
# FACTORY
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Factory::Abstract;
	use ETL::Pequel3::Type::Factory;
	use base qw(ETL::Pequel3::Type::Factory::Abstract); # --> Type::Factory
	use Class::STL::ClassMembers qw( default_dataset_spec shared_datasets ), # datasets --> catalogue
		Class::STL::ClassMembers::DataMember->new(name => 'factory_name', default => 'dataset'),
		Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
		Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
	use Class::STL::ClassMembers::Constructor;
	sub new_extra
	{
		my $self = shift;
		$self->shared_datasets(ETL::Pequel3::Type::DataSet::UserShared::Global->new()); # Singleton
	}
	sub factory
	{
		my $self = shift;
		my %p = @_;
		$p{dataset_spec} = $self->default_dataset_spec()
			if (!defined($p{dataset_spec}) && defined($self->default_dataset_spec()));

		use Carp qw(confess);
		confess "Undefined dataset_spec parameter!" unless (defined($p{dataset_spec}));
		confess "Undefined pequel_ref parameter!" unless (defined($p{pequel_ref}));

		# 1) type:ds
		# 2) type(args):ds
		# 3) type(args):ds(args)
		# 4) type:ds(args)
		# 5) type --> type:default
		# 6) ds --> ascii:ds
		# 7) type(args) --> type:default
		# 8) ds(args) --> ascii:ds
		# 9) type:
		# 10) type(args):
		# 11) :ds
		# 12) :ds(args)
		my $type;
		my @args;
		if ($p{dataset_spec} =~ /\s*(\w+)\s*\((.*?)\)\s*:\s*(.*)$/) # 2, 3, 10
		{
			$type = $1; # must be dataset-type
			@args=('datasource_spec', $3,
				ETL::Pequel3::Parser->new(pequel_ref => $p{pequel_ref})->extract_args($2));
		}
		elsif ($p{dataset_spec} =~ /\s*(\w+)\s*:\s*(.*)$/) # 1, 4, 9
		{
			$type = $1; # must be dataset-type
			@args=('datasource_spec', $2);
		}
		elsif ($p{dataset_spec} =~ /\s*:?\s*(\w+)\s*\((.*?)\)\s*$/) # 7, 8, 12
		{
			$type = $1; # dataset or datasource type
			my $args = $2;
			if ($self->catalogue()->exists($type)) { # 7
				@args=('datasource_spec', $self->catalogue()->exists($type)->default_datasource_spec(), 
					ETL::Pequel3::Parser->new(pequel_ref => $p{pequel_ref})->extract_args($args));
			}
			else # 8
			{
				$type = 'ascii';
				@args=('datasource_spec', $p{dataset_spec});
			}
		}
		else # 5, 6, 11
		{
			$type = $p{dataset_spec}; # dataset or datasource type
			$type =~ s/^\s*://;
			if ($self->catalogue()->exists($type)) { # 5
				@args=('datasource_spec', $self->catalogue()->exists($type)->default_datasource_spec());
			}
			else # 6, 11
			{
				$type = 'ascii';
				@args=('datasource_spec', $p{dataset_spec});
			}
		}
		confess "\nUnknown dataset type $type -- [$p{dataset_spec}]!" unless ($self->catalogue()->exists($type));
		my $ds = $self->catalogue()->exists($type)->new(@args, %p); # explicit datasource_spec in @_ will take preference;
		$self->err()->trace_msg(10, "@{[ $ds->pequel_ref()->pequel_name() ]} -->"
			. "Dataset Type:" . $ds->name()
			. "; target_name:" . $ds->datasource()->target_name()
			. "; fdname:" . $ds->datasource()->fdname()
			. "; Datasource Type:" . $ds->datasource()->datasource_name()
			. "; dataset_spec:" . $ds->dataset_spec()
			. "; io_name:" . $ds->datasource()->io_name()
		);
		$self->shared_datasets()->push_back($ds) 
			if ($ds->shared() && !$self->shared_datasets()->exists($ds->dataset_spec()));
		$p{pequel_ref}->user_datasets()->push_back($ds)
			unless ($p{pequel_ref}->user_datasets()->exists($ds->dataset_spec()));
		return $ds;
	}
	sub add
	{
		my $self = shift;
		$self->push_back($self->factory(@_));
		return $self->back();
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Input::Factory::Abstract;
	use base qw(ETL::Pequel3::Type::DataSet::Factory::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_type', default => 'input_datasets'),
		Class::STL::ClassMembers::DataMember->new(name => 'default_dataset_spec', default => 'stdin');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Output::Factory::Abstract;
	use base qw(ETL::Pequel3::Type::DataSet::Factory::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_type', default => 'output_datasets'),
		Class::STL::ClassMembers::DataMember->new(name => 'default_dataset_spec', default => 'stdout');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Input::Factory::Local;
	use base qw(ETL::Pequel3::Type::DataSet::Input::Factory::Abstract);
	use Class::STL::ClassMembers;
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Output::Factory::Local;
	use base qw(ETL::Pequel3::Type::DataSet::Output::Factory::Abstract);
	use Class::STL::ClassMembers;
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Input::Factory::Global;
	use base qw(ETL::Pequel3::Type::DataSet::Input::Factory::Abstract);
	use Class::STL::ClassMembers;
	use Class::STL::ClassMembers::SingletonConstructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::DataSet::Output::Factory::Global;
	use base qw(ETL::Pequel3::Type::DataSet::Output::Factory::Abstract);
	use Class::STL::ClassMembers;
	use Class::STL::ClassMembers::SingletonConstructor;
}
# ----------------------------------------------------------------------------------------------------
1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -