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

📄 generator.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 5 页
字号:
				$self->user_prog()->close_block();
				$self->user_prog()->code("[\$fn]");
				$self->user_prog()->code("]}!\\n\";");
			}
			$self->dataset()->verify() eq 'abort' 
				? $self->user_prog()->code("die \"Process aborted.\";")
				: $self->user_prog()->code("next;"); # verify == 'skip'
		$self->user_prog()->close_block();
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::OutputVerify; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers qw( output_fields dataset ),
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'output_verify');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
#?		return unless ($self->main()->divert_output()->size());
#>		$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("0");
#>			map
#>			(
#>				$self->user_prog()->code("|| (++\$fn!=@{[ $_->field_number() ]}) || !defined(@{[ $_->getvar() ]}) || @{[ $_->getvar() ]} !~ /@{[ $_->pequel_type()->validate() ]}/ # @{[ $_->pequel_type()->name() ]}"),
#>				grep(!defined($_->calc_exp()), $self->output_fields()->to_array())
#>			);
#>		$self->user_prog()->close_block();
#>		$self->user_prog()->open_block();
#>			if ($self->dataset()->verify() eq 'abort' || $self->main()->configuration()->verbose()) {
#>				$self->user_prog()->code("print STDERR \"Output record \", \$@{[ $self->dataset()->count_vname() ]}, \" mismatch for @{[ $self->dataset()->datasource()->fdname() ]}->\@{[");
#>				$self->user_prog()->over();
#>				$self->user_prog()->code("('<num-fields>', " . join(', ', map(qq{'$_'}, map($_->name(), grep(!defined($_->calc_exp()), $self->output_fields()->to_array())))) . ")[\$fn]");
#>				$self->user_prog()->back();
#>				$self->user_prog()->code("]}!\\n\";");
#>			}
#>			$self->dataset()->verify() eq 'abort' 
#>				? $self->user_prog()->code("die \"Process aborted.\";")
#>				: $self->user_prog()->code("next;"); # verify == 'skip'
#>		$self->user_prog()->close_block();
#>	
#>		$self->user_prog()->code("else");
#>		$self->user_prog()->open_block();
	}
	sub prepare_finish
	{
#?		my $self = shift;
#?		return unless ($self->main()->divert_output()->size());
#?		$self->user_prog()->close_block();
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::InputRecordCounter; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'input_record_counter');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->user_prog()->code("++\$@{[ $self->main()->input()->input_dataset()->count_vname() ]};")
			if ($self->main()->config()->verbose() || $self->main()->config()->input_record_limit());

		$self->catalogue()->code_segments()->verbose_msg()->new(
			target_name => $self->main()->pequel_name(),
			user_prog => $self->user_prog(), 
			msg_text => "\$@{[ $self->main()->input()->input_dataset()->count_vname() ]} records.", 
			cond => (
				"if (\$@{[ $self->main()->input()->input_dataset()->count_vname() ]} % "
				. ( $self->properties()->show_synonyms() 
					? '_VERBOSE' : $self->main()->config()->verbose() )
				. " == 0)"
			)
		)->prepare() if ($self->main()->config()->verbose()); 
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::InputRepeater; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'input_repeater');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->repeat_record_on_input()->size());
		$self->program_info();
		my $r=0;
		foreach ($self->main()->repeat_record_on_input()->fields()->to_array()) {
			$self->user_prog()->code("foreach \$_IRVAL_@{[ ++$r ]} (@{[ $_->exp_raw() ]})");
			$self->user_prog()->code("# Input repeater $r value (@{[ $_->exp() ]})");
			$self->user_prog()->open_block();
		}
	}
	sub prepare_finish
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->repeat_record_on_input()->size());
		foreach ($self->main()->repeat_record_on_input()->fields()->to_array()) {
			$self->user_prog()->close_block();
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::PrintOutputHeader;
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers qw( dataset ),
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'print_output_header');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->dataset()->code_lock($self->user_prog()) if ($self->dataset()->shared());
		$self->dataset()->code_write_header($self->user_prog(),
				grep
				(
					$_->name() !~ /^_/, 
					$self->main()->output()->transfer_fields()->to_array(), 
					$self->main()->output()->output_fields()->to_array()
				)
			);
		$self->dataset()->code_unlock($self->user_prog()) if ($self->dataset()->shared());
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::PrintInputHeader;
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers qw( dataset ),
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'print_input_header');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->dataset()->code_lock($self->user_prog()) if ($self->dataset()->shared());
		$self->dataset()->code_write_header($self->user_prog(),
				grep
				(
					$_->name() !~ /^_/, 
					$self->main()->input()->input_fields()->to_array()
				)
			);
		$self->dataset()->code_unlock($self->user_prog()) if ($self->dataset()->shared());
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::DerivedInputFields; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'derived_input_fields');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		# Calculate Derived Input Fields:
		# if the field is in use only (by output-field, other input-field, group-by, transfer, etc
		# ...not quite though because some input derived fields may only be used conditionally!
		foreach (grep(defined($_->calc_exp()), $self->main()->input()->input_fields()->to_array())) {
			$self->user_prog()->code("@{[ $_->getvar() ]} @{[ defined($_->operator()) ? $_->operator() : '=' ]} # @{[ $_->calc_exp() ]}");
			$self->user_prog()->over();
				$self->user_prog()->code($_->calc_exp_raw());
				$self->user_prog()->code(";");
			$self->user_prog()->back();
		}
		foreach my $j ($self->main()->user_joins()->to_array()) {
			foreach (grep(defined($_->calc_exp()), $j->input_fields()->to_array())) {
				$self->user_prog()->code("@{[ $_->getvar() ]} @{[ defined($_->operator()) ? $_->operator() : '=' ]} # @{[ $_->calc_exp() ]}");
				$self->user_prog()->over();
					$self->user_prog()->code($_->calc_exp_raw());
					$self->user_prog()->code(";");
				$self->user_prog()->back();
			}
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::RejectInputRecord; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'reject_input_record');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->reject_record_on_input()->size());
		$self->program_info();
		my $join='if';
		foreach my $ri ($self->main()->user_sections()->reject_record_on_input()->to_array()) {
			foreach my $r ($ri->reason_codes_list()->to_array()) {
				#$r->reason_code() ...
				#$r->condition_exp_raw() ...
				$self->user_prog()->comment(" +++ Reason Code (@{[ $r->reason_code() ]}) +++");
				$self->user_prog()->newline_off();
				$self->user_prog()->code("$join (");
				$self->user_prog()->code($r->condition_exp_raw());
				$self->user_prog()->newline_on();
				$self->user_prog()->code(")");
				$self->user_prog()->open_block();

				foreach (grep(defined($_->calc_exp()), $r->output_fields()->to_array())) {
					$self->user_prog()->code("@{[ $_->getvar() ]} = # @{[ $_->calc_exp() ]}");
					$self->user_prog()->over();
						$self->user_prog()->code($_->calc_exp_raw());
						$self->user_prog()->code(";");
					$self->user_prog()->back();
				}
				$ri->dataset()->code_lock($self->user_prog()) if ($ri->dataset()->shared());
				$ri->dataset()->code_write($self->user_prog(),
						grep
						(
							$_->name() !~ /^_/, 
							$r->output_fields()->to_array(),
							$self->main()->input()->input_fields()->to_array()
						)
					);
				$ri->dataset()->code_unlock($self->user_prog()) if ($ri->dataset()->shared());

				$self->user_prog()->code('next;');
				$self->user_prog()->close_block();
				$join='elsif';
			}
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::DivertInputRecord; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'divert_input_record');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->divert_record_on_input()->size());
		$self->program_info();
		my $join='if';
		foreach ($self->main()->user_sections()->divert_record_on_input()->to_array()) {
			$self->user_prog()->newline_off();
			$self->user_prog()->code("$join (");
			$self->user_prog()->code($_->condition_exp_raw());
			$self->user_prog()->newline_on();
			$self->user_prog()->code(")");
			$self->user_prog()->open_block();
			$self->catalogue()->code_segments()->print_input()->new(
				main => $self->main(), user_prog => $self->user_prog(), dataset => $_->output_dataset())
				->prepare();
			$self->user_prog()->code('next;');
			$self->user_prog()->close_block();
			$join='elsif'; # maybe not
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::CopyInputRecord; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'copy_input_record');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->copy_record_on_input()->size());
		$self->program_info();
		foreach ($self->main()->user_sections()->copy_record_on_input()->to_array()) {
			if (defined($_->condition_exp())) {
				$self->user_prog()->newline_off();
				$self->user_prog()->code("if (");
				$self->user_prog()->code($_->condition_exp_raw());
				$self->user_prog()->newline_on();
				$self->user_prog()->code(")");
				$self->user_prog()->open_block();
			}
			$self->catalogue()->code_segments()->print_input()->new(
				main => $self->main(), user_prog => $self->user_prog(), dataset => $_->output_dataset())
				->prepare();
			$self->user_prog()->close_block() if (defined($_->condition_exp()));
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::PrintInput; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers qw( dataset ),
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'print_input');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->dataset()->code_lock($self->user_prog()) if ($self->dataset()->shared());
		$self->dataset()->code_write($self->user_prog(),
				grep
				(
					$_->name() !~ /^_/, 
					$self->main()->input()->input_fields()->to_array()
				)
			);
		$self->dataset()->code_unlock($self->user_prog()) if ($self->dataset()->shared());
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::FieldProcessInput; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'field_process_input');

⌨️ 快捷键说明

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