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

📄 generator.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 5 页
字号:
			$self->user_prog()->comment(" ---> Configuration >> statistics <<");
			$self->user_prog()->comment("");
			$self->user_prog()->code("use Benchmark;");
			$self->user_prog()->code("my \$benchmark_start = new Benchmark;");
		}

		my $r=0;
		map
		(
			$self->user_prog()->code("my \$_IRVAL_@{[ ++$r ]}; # Input repeater $r value"),
			$self->main()->repeat_record_on_input()->fields()->to_array()
		)
		if ($self->main()->user_sections()->repeat_record_on_input()->size());

		$r=0;
		map
		(
			$self->user_prog()->code("my \$_ORVAL_@{[ ++$r ]}; # Output repeater $r value"),
			$self->main()->repeat_record_on_output()->fields()->to_array()
		)
		if ($self->main()->user_sections()->repeat_record_on_output()->size());
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::OpenLocal; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'open_local');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		foreach (grep(!$_->shared(), $self->_get_datasets()))
		{
			$self->user_prog()->comment("");
			$self->user_prog()->comment(" ---> @{[ 
				ucfirst($_->datasource()->io_name()) 
				]}: @{[ $_->datasource()->fdname() ]} (@{[ 
				$_->name() ]}:@{[ $_->datasource()->datasource_name() ]})");
			$self->user_prog()->comment("");
			$_->code_open($self->user_prog()); 
		}
		# Output Header
		foreach 
		(
			grep
			(
				defined($_) && !$_->shared() && $_->print_header(),
				(
					$self->main()->output()->output_dataset(),
					map($_->output_dataset(), $self->main()->user_sections()->divert_record_on_output()->to_array()),
					map($_->output_dataset(), $self->main()->user_sections()->copy_record_on_output()->to_array()),
					map($_->dataset(), $self->main()->user_sections()->reject_record_on_output()->to_array()),
				)
			)
		) 
		{
			$self->catalogue()->code_segments()->print_output_header()->new(
				main => $self->main(), user_prog => $self->user_prog(), dataset => $_)
				->prepare();
		}
		# Input Header
		foreach 
		(
			grep
			(
				defined($_) && !$_->shared() && $_->print_header(),
				(
					map($_->output_dataset(), $self->main()->user_sections()->divert_record_on_input()->to_array()),
					map($_->output_dataset(), $self->main()->user_sections()->copy_record_on_input()->to_array()),
					map($_->dataset(), $self->main()->user_sections()->reject_record_on_input()->to_array()),
				)
			)
		) 
		{
			$self->catalogue()->code_segments()->print_input_header()->new(
				main => $self->main(), user_prog => $self->user_prog(), dataset => $_)
				->prepare();
		}
	}
	sub prepare_finish
	{
		my $self = shift;
		$self->program_info();
		foreach (reverse grep(!$_->shared(), $self->_get_datasets())) {
			$_->code_close($self->user_prog());
		}
	}
	sub _get_datasets
	{
		my $self = shift;
		return (
			grep
			(
				defined($_),
				(
					map($_->input_dataset(), $self->main()->user_joins()->to_array()),
					map($_->output_dataset(), $self->main()->user_sections()->copy_record_on_input()->to_array()),
					map($_->output_dataset(), $self->main()->user_sections()->copy_record_on_output()->to_array()),
					map($_->output_dataset(), $self->main()->user_sections()->divert_record_on_input()->to_array()),
					map($_->output_dataset(), $self->main()->user_sections()->divert_record_on_output()->to_array()),
					map($_->dataset(), $self->main()->user_sections()->reject_record_on_input()->to_array()),
					map($_->dataset(), $self->main()->user_sections()->reject_record_on_output()->to_array()),
					$self->main()->input()->input_dataset(),
					$self->main()->output()->output_dataset()
				)
			)
		);	
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::Main; #--> Input
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'main');
	use Class::STL::ClassMembers::Constructor; 
	sub new_extra
	{
		my $self = shift;
	
		$self->segments()->push_back($self->catalogue()->code_segments()->main_while_loop()->new(@_));

		$self->segments()->push_back($self->catalogue()->code_segments()->input_record_counter()->new(@_));

		$self->segments()->push_back($self->catalogue()->code_segments()->input_join()->new(@_))
			if ($self->main()->user_joins()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->input_repeater()->new(@_))
			if ($self->main()->user_sections()->repeat_record_on_input()->size());
	
		# TODO: this should be right after main_while_loop
#<		$self->segments()->push_back($self->catalogue()->code_segments()->input_record_counter()->new(@_));
	
		$self->segments()->push_back($self->catalogue()->code_segments()->input_record_limit()->new(@_))
			if ($self->main()->config()->input_record_limit());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->derived_input_fields()->new(@_));
	
		$self->segments()->push_back($self->catalogue()->code_segments()->field_process_input()->new(@_))
			if ($self->main()->user_sections()->field_process_on_input()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->input_filter()->new(@_))
			if ($self->main()->user_sections()->filter_on_input()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->reject_input_record()->new(@_))
			if ($self->main()->user_sections()->reject_record_on_input()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->divert_input_record()->new(@_))
			if ($self->main()->user_sections()->divert_record_on_input()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->copy_input_record()->new(@_))
			if ($self->main()->user_sections()->copy_record_on_input()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->grouping_break_control()->new(@_))
			if ($self->main()->user_sections()->group_by()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->dedup_on_input()->new(@_))
			if ($self->main()->user_sections()->group_by()->size()); #< && !$self->main()->config()->hash());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->main_body()->new(@_));
	
		$self->segments()->push_back($self->catalogue()->code_segments()->prepare_transfer_fields()->new(@_))
			if ($self->main()->output()->transfer_fields()->size());
	
		$self->segments()->push_back($self->catalogue()->code_segments()->output()->new(@_))
			if ($self->main()->user_sections()->group_by()->size() == 0);
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::MainWhileLoop; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'main_while_loop');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->catalogue()->code_segments()->verbose_msg()->new(
			target_name => $self->main()->pequel_name(),
			user_prog => $self->user_prog(), 
			msg_text => "Start",
		)->prepare() if ($self->main()->config()->verbose()); 
		$self->main()->input()->input_dataset()->code_prepare($self->user_prog()); 
		$self->user_prog()->newline_off();

		$self->user_prog()->code("while (");
		$self->main()->input()->input_dataset()->code_read($self->user_prog(), 
		   grep(!defined($_->calc_exp()), $self->main()->input()->input_fields()->to_array()));
		$self->user_prog()->newline_on();
		$self->user_prog()->code(")");
		$self->user_prog()->open_block(); # main while loop
			$self->main()->input()->input_dataset()->code_after_read($self->user_prog(),
			   grep(!defined($_->calc_exp()), $self->main()->input()->input_fields()->to_array())); #TODO: remove -- now done in parse
			$self->catalogue()->code_segments()->input_verify()->new(
				main => $self->main(), 
				user_prog => $self->user_prog(), 
				dataset => $self->main()->input()->input_dataset(),
				input_fields => $self->main()->input()->input_fields(), 
			)->prepare()
				if ($self->main()->input()->input_dataset()->verify());
	}
	sub prepare_finish
	{
		my $self = shift;
		$self->user_prog()->close_block(); # main while loop

		if ($self->main()->user_sections()->group_by()->size()) {
			my %ts_set;
			if (!$self->main()->config()->hash()) {
				$ts_set{$self->main()->output()->output_dataset()->arr_vname()}++ 
					if ($self->main()->output()->output_fields()->size());
				map($ts_set{$_->dataset()->arr_vname()}++, $self->main()->output()->transfer_fields()->to_array());
				if (keys(%ts_set)) {
					$self->user_prog()->code("if (" . join(' || ', map("\@$_", keys(%ts_set))) . ")");
					$self->user_prog()->open_block();
				}
			}
			$self->catalogue()->code_segments()->output()->new(
				main => $self->main(), user_prog => $self->user_prog())->prepare();
			$self->user_prog()->close_block() if (!$self->main()->config()->hash() && keys(%ts_set));
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::InputJoin; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'input_join');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		my $r=0;
		foreach my $j ($self->main()->user_joins()->to_array()) 
		{
			$self->user_prog()->comment(" +++ Input Join (@{[ $j->input_dataset()->datasource()->fdname() ]}) Segment +++");
			$self->user_prog()->code("if");
			$self->user_prog()->open_block("(");
				$self->user_prog()->code("!defined(@{[ $j->key_field_ref()->getvar() ]})");
				$self->user_prog()->code("|| "
					. $j->join_field_ref()->getvar()
					. ($j->key_type() =~ /^(numeric|amount)$/ ? ' > ' : ' gt ')
					. $j->key_field_ref()->getvar() 
				);
			$self->user_prog()->close_block();
			$self->user_prog()->open_block();
				$j->input_dataset()->code_prepare($self->user_prog());
				$self->user_prog()->newline_off();
				$self->user_prog()->code("while (");
				$j->input_dataset()->code_read($self->user_prog(), 
				   grep(!defined($_->calc_exp()), $j->input_fields()->to_array()));
				$self->user_prog()->newline_on();
				$self->user_prog()->code(")");
				$self->user_prog()->open_block();
					$j->input_dataset()->code_after_read($self->user_prog(),
					   grep(!defined($_->calc_exp()), $j->input_fields()->to_array())); #TODO: remove -- now done in parse
					$self->user_prog()->code("++\$@{[ $j->input_dataset()->count_vname() ]};")
						if ($self->main()->config()->verbose());
					$self->catalogue()->code_segments()->input_verify()->new(
						main => $self->main(), 
						user_prog => $self->user_prog(), 
						dataset => $j->input_dataset(),
						input_fields => $j->input_fields(), 
					)->prepare()
						if ($j->input_dataset()->verify());
					$self->user_prog()->code("last if (@{[ $j->join_field_ref()->getvar() ]} le @{[ $j->key_field_ref()->getvar() ]});");
				$self->user_prog()->close_block();
			$self->user_prog()->close_block();
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::InputVerify; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers qw( input_fields dataset ),
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'input_verify');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info("@{[ $self->dataset()->datasource()->fdname() ]} --> @{[ 
			uc($self->dataset()->verify()) ]}");
		$self->user_prog()->code("my \$fn=0;");
		$self->user_prog()->code("if");
		$self->user_prog()->open_block("(");
			$self->user_prog()->code("int(\@@{[ $self->dataset()->arr_vname() ]}) < @{[ 
				$self->main()->config()->show_synonyms() 
					? $self->dataset()->numflds_vname()
					: int(grep(!defined($_->calc_exp()), $self->input_fields()->to_array())) 
				]}");
			map
			(
				do {
					$self->user_prog()->code("|| (++\$fn!=@{[ $_->field_number() ]})");
					$self->user_prog()->over();
						$self->user_prog()->code("|| !defined(@{[ $_->getvar() ]})");
						$self->user_prog()->code("|| @{[ $_->getvar() ]} !~ /@{[ 
							$_->pequel_type()->validate() ]}/ # @{[ $_->pequel_type()->name() ]}"),
					$self->user_prog()->back();
				},
				grep(!defined($_->calc_exp()), $self->input_fields()->to_array())
			);
		$self->user_prog()->close_block();
		$self->user_prog()->open_block();
			if ($self->dataset()->verify() eq 'abort' || $self->main()->config()->verbose()) {
				$self->user_prog()->code("print STDERR \"Input record \", \$@{[ 
					$self->dataset()->count_vname() ]}, \" mismatch for @{[ $self->dataset()->datasource()->fdname() ]}->\@{[");
				$self->user_prog()->open_block("(");
					$self->user_prog()->code("'<num-fields>',");
					map
					(
						$self->user_prog()->code("'@{[ $_->name() ]}',"),
						grep(!defined($_->calc_exp()), $self->input_fields()->to_array())
					);

⌨️ 快捷键说明

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