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

📄 user.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 2 页
字号:
	}
	sub from_hash
	{
		my $self = shift;
		my $filename = shift || do {
			$self->config()->prefix() 
			. '/' 
			. (split(/[\/]+/, $self->script_filename()))[-1]
			. ".dump"
		};
		open(HASH, "$filename");
		local $/=undef;
		my $hash = eval("my " . <HASH>);
		confess "Error in eval -- $@" if ($@);
		close(HASH);
		$self->hash2pequel($hash);
		$self->err()->diag(1, "<--HASH load read from $filename");
	}
	sub mk_filename #???
	{
		my $self = shift;
		my $suffix = shift;
		my $filename = shift || do {
			$self->config()->prefix() 
			. '/' 
			. (split(/[\/]+/, $self->script_filename()))[-1]
			. ".$suffix"
		};
		$filename = $self->config()->prefix() . '/' . $filename
		if (defined($self->config()->prefix()) && $filename !~ /^\// && $filename !~ /^\.\//);

		return $filename;
	}
	sub makefilepath
	{
		my $self = shift;
		my $filename = shift;
#>		my $suffix = shift; #--replace suffix in $filename with this;
#>		TODO:use $self-os()->getpath(...)
		return $filename if ($filename =~ /^\// || $filename =~ /^\.\//);

		return $self->config()->prefix() . '/' . $filename
		if (defined($self->config()) 
			&& defined($self->config()->prefix()) && $self->config()->prefix() ne '');

		return $self->properties()->prefix() . '/' . $filename
		if (defined($self->properties()) 
			&& defined($self->properties()->prefix()) && $self->properties()->prefix() ne '');

		return $filename;
	}
	sub check
	{
		my $self = shift;
		return $self->generator()->user_prog()->syntax_check();
	}
	sub display_code
	{
		# Display generated code to STDOUT with line numbers;
		my $self = shift;
		print $self->generator()->user_prog()->display();
	}
	sub dump_code
	{
		# Save generated code to file;
		my $self = shift;
		my $filename = shift;
		$self->generator()->user_prog()->save($filename);
	}
	sub xsdgen
	{
		my $self = shift;
		$self->xml_schema()->generate();
		my $filename = $self->xml_schema()->writefile(@_);
		$self->err()->diag(1, "-->Pequel xml-schema saved in $filename");
		return $filename;
	}
	sub docgen
	{
		my $self = shift;
		$self->section('configuration')->select()
			->add_item(property_name => 'tab_size', value => 3)
			->add_item(property_name => 'tab_type', value => 'spaces');
		$self->produce();
		use ETL::Pequel3::DocGen;
		$self->doc(ETL::Pequel3::DocGen::MainProgram->new(
			POM => $self, 
			doc_filename => ( (split(/[\/]+/, $self->script_filename()))[-1] . ".pod" ),
			doc_type => (
				$self->pequel_name() eq 'main' 
					? (split(/[\/]+/, $self->script_filename()))[-1]
					: $self->pequel_name()
				),
			doc_version => $self->config()->script_version(),
			doc_email => $self->properties()->pequel_home_page(),
			doc_author => $self->config()->script_author(),
			@_,
		));
		$self->err()->diag(1, "[@{[ $self->pequel_name() ]}] docgen...");
		$self->doc()->build();
		$self->err()->diag(1, "-->User Script Reference document POD saved in @{[ 
			$self->doc()->user_prog()->program_name() ]}");
		my $filename = $self->doc()->make_pdf();
		$self->err()->diag(1, "-->User Script Reference document PDF saved in $filename");
		return $self;
	}
	sub catgen
	{
		my $self = shift;
		eval("use ETL::Pequel3::Extension::DataSet::Apache");
		eval("use ETL::Pequel3::Extension::DataSet::CSV");
		use ETL::Pequel3::CatGen;
		$self->cat(ETL::Pequel3::CatGen::MainProgram->new(POM => $self, @_));
		$self->cat()->build();
		my $filename = $self->cat()->make_pdf();
		$self->err()->diag(1, "-->Pequel Type Catalogue document PDF saved in $filename");
		return $self;
	}
	sub eval
	{
		my $self = shift;
		$self->generator()->user_prog()->eval();
	}
	sub exec
	{
		my $self = shift;
		$self->generator()->user_prog()->exec();
	}
	sub execute
	{
		my $self = shift;
		$self->generator()->user_prog()->run();
	}
	sub spawn #TODO
	{
		my $self = shift;
		# execute in background as detached process...
	}
	sub produce 
	{
		my $self = shift;
		#TODO: need to be able to call multiple times;
#		return if (defined($self->generator()));
#< 		$self->getopt()->prep_options($self);
		$self->err()->diag(1, "[@{[ $self->pequel_name() ]}] produce...");
		$self->_prepare();
		$self->_parse();
		use ETL::Pequel3::Generator;
		$self->generator($self->catalogue()->generators()->exists($self->generator_type())
			->new(main => $self));
		$self->generator()->build();
		$self->getopt()->exec_options($self);
		return $self;
	}
	sub _prepare # recursive
	{
		my $self = shift;

		#NOTE: do NOT try to de-duplicate here -- won't work!
		map($_->_prepare(), $self->user_pequels()->to_array()); # recurse

		$self->config($self->user_sections()->configuration()->select()->config());
		$self->getopt()->copy_config($self->config());
		$self->user_joins($self->user_sections()->input_join());
		$self->user_tables(ETL::Pequel3::Type::Table::Factory::Global->new()); # Singleton
		$self->shared_datasets(ETL::Pequel3::Type::DataSet::UserShared::Global->new()); # Singleton
		$self->user_sections()->input()->select();
		$self->user_sections()->output()->select();

#>		$self->err()->display_dot_begin("[@{[ $self->pequel_name() ]}] prepare ...");
		$self->err()->diag(1, "[@{[ $self->pequel_name() ]}] prepare...");
		map
		(
			do 
			{ 
				$self->err()->diag(20, "...@{[ $_->section_name() ]}..." );
				$_->prepare();
			}, 
			map($_->to_array(), $self->user_sections()->to_array())
		);
	}
	sub _parse # recursive
	{
		my $self = shift;
		#TODO: remove the 1st:
		map($_->_parse(), grep($_->duplicate() == 0, $self->user_pequels()->to_array())); # recurse
#?		map($_->_parse(), $self->user_pequels()->to_array()); # recurse
		$self->parser(ETL::Pequel3::Parser->new(
			user_joins => $self->user_joins(),
			pequel_ref  => $self,
			macro_use_list => $self->macro_use_list(),
		));
		$self->parser_input(ETL::Pequel3::Parser->new(
			user_joins => $self->user_joins(),
			pequel_ref  => $self,
			macro_use_list => $self->macro_use_list(),
			translate_fields => ETL::Pequel3::Parser::TranslateFields::Input->new(
				input_fields => $self->input()->input_fields())
		));
		$self->parser_output(ETL::Pequel3::Parser->new(
			user_joins => $self->user_joins(),
			pequel_ref  => $self,
			macro_use_list => $self->macro_use_list(),
			translate_fields => ETL::Pequel3::Parser::TranslateFields::Output->new(
				input_fields => $self->input()->input_fields(), 
				output_fields => $self->output()->output_fields())
		));
		$self->err()->diag(1, "[@{[ $self->pequel_name() ]}] parse..."); 
		map
		(
			do 
			{ 
				$self->err()->diag(20, "...(section)@{[ $_->section_name() ]}...");
				$_->parse();
			}, 
			map($_->to_array(), $self->user_sections()->to_array())
		);
		map
		(
			do 
			{ 
				$self->err()->diag(20, "...(dataset)@{[ $_->name() ]}:@{[ 
					$_->datasource()->target_name() ]}...");
				$_->parse();
			}, 
			$self->user_datasets()->to_array()
#<			grep
#<			(
#<				defined($_),
#<				(
#<					map
#<					(
#<						$_->input_dataset(), 
#<						(
#<							$self->user_sections()->input()->to_array(),
#<							$self->user_sections()->input_join()->to_array(),
#<							grep ($_->can('input_dataset'), $self->user_tables()->to_array()),
#<						)
#<					),
#<					map
#<					(
#<						$_->output_dataset(), 
#<						(
#<							$self->user_sections()->output()->to_array(),
#<							$self->user_sections()->copy_record_on_input()->to_array(),
#<							$self->user_sections()->copy_record_on_output()->to_array(),
#<							$self->user_sections()->divert_record_on_input()->to_array(),
#<							$self->user_sections()->divert_record_on_output()->to_array(),
#<						)
#<					),
#<					map
#<					(
#<						$_->dataset(), #-->output_dataset
#<						(
#<							$self->user_sections()->reject_record_on_input()->to_array(),
#<							$self->user_sections()->reject_record_on_output()->to_array(),
#<						)
#<					),
#<					map
#<					(
#<						$_->transfer_dataset(), 
#<						(
#<							$self->user_sections()->output()->to_array(),
#<							$self->user_sections()->input_join()->to_array(),
#<						)
#<					)
#<				)
#<			)
		);
#<		map
#<		(
#<			$self->err()->diag(15, "Dataset:@{[ $_->datasource()->target_name() ]}"),
#<			$self->user_datasets()->to_array()
#<		);
	}
	sub output_interface # ??? remove
	{
		my $self = shift;
		return
		grep
		(
			$_->name() !~ /^_/,
			(
				$self->output()->transfer_fields()->to_array(),
				$self->output()->output_fields()->to_array() 
			)
		);
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::User::Find;
	use base qw(Class::STL::Utilities::FunctionObject::UnaryFunction);
	use Class::STL::ClassMembers qw( pequel_name );
	use Class::STL::ClassMembers::Constructor;
	sub function_operator
	{
		my $self = shift;
		my $arg = shift; # element object
		return $arg->pequel_name() eq $self->pequel_name() ? $arg : 0;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::User::TableLoader;
	use base qw(ETL::Pequel3::User);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'generator_type', default => 'table_loader');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::User::SubProgram;
	use base qw(ETL::Pequel3::User);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'generator_type', default => 'sub_program');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
1;

⌨️ 快捷键说明

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