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

📄 generator.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 5 页
字号:
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->field_process_on_input()->size());
		$self->program_info();
		foreach ($self->main()->field_process_on_input()->fields()->to_array())
		{
			$self->user_prog()->code("@{[ $_->input_field()->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::InputFilter; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'input_filter');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->filter_on_input()->size());
		$self->program_info();
		$self->user_prog()->code("next unless");
		$self->user_prog()->open_block("(");
		my $join = "";
		foreach ($self->main()->filter_on_input()->filter_expressions()->to_array()) {
			$self->user_prog()->newline_off();
			$self->user_prog()->code("$join");
			$self->user_prog()->newline_on();
			$self->user_prog()->code($_->exp_raw());
#> Configurable join operator
			$join = "|| ";
		}
		$self->user_prog()->close_block();
		$self->user_prog()->code(";");
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::DedupOnInput; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'dedup_on_input');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		return unless ($self->main()->user_sections()->dedup_on_input()->size());
		$self->program_info();
		$self->user_prog()->code("next if");
		$self->user_prog()->open_block("(");
		my $join = "";
		foreach ($self->main()->dedup_on_input()->fields()->to_array()) 
		{
			$self->user_prog()->code($join . "defined(\$previous_dedup@{[ $_->input_field()->tname() ]})");
			$self->user_prog()->code("&& \$previous_dedup@{[ $_->input_field()->tname() ]}"
				. ($_->pequel_type()->name() =~ /^(numeric|amount)$/ ? ' == ' : ' eq ')
				. $_->input_field()->getvar());
			$join = "&& ";
		}
		$self->user_prog()->close_block();
		$self->user_prog()->code(";");
		map
		(
			$self->user_prog()->code("\$previous_dedup@{[ $_->input_field()->tname() ]} = @{[ $_->input_field()->getvar() ]};"),
			$self->main()->dedup_on_input()->fields()->to_array()
		);
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::InputRecordLimit; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'input_record_limit');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->user_prog()->code("last if (\$@{[ 
			$self->main()->input()->input_dataset()->count_vname() 
		]} == @{[ 
			$self->main()->config()->input_record_limit()+1 
		]});");
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::MainBody; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'main_body');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		my @calculated_output_flds;	#C3;
		my %conditional_output_flds; #C2;
		foreach ($self->main()->output()->output_fields()->to_array())
		{
			defined($_->calc_exp())
				? push(@calculated_output_flds, $_)
				: push(@{$conditional_output_flds{"@{[ defined($_->condition_exp()) ? $_->condition_exp() : '' ]}"}}, $_);
		}	
#?		$self->scope()->push_back ....
		foreach my $cond (sort keys %conditional_output_flds) # for each condition...
		{
			if ($cond ne '')
			{
				my $obj = ${$conditional_output_flds{$cond}}[0];
				$self->user_prog()->newline_off();
				$self->user_prog()->code("if (");
				$self->user_prog()->code($obj->condition_exp_raw());
				$self->user_prog()->newline_on();
				$self->user_prog()->code(")");
				$self->user_prog()->open_block();
#?				$self->scope()->push_back ....
			}
			map($self->code_output($_), @{$conditional_output_flds{$cond}}); # for each output-field inside condition...
#?			$self->scope()->pop_back ....if ($cond ne '');
			$self->user_prog()->close_block() if ($cond ne '');
		}
		map($self->code_output($_), @calculated_output_flds);
	}
	sub code_output
	{        	
		my $self = shift;
		my $output_field = shift;
		if (defined($output_field->aggregate_type()))
		{
			$output_field->aggregate_type()->code_output($self->user_prog());
		}
		elsif (!defined($output_field->calc_exp()))
		{
			$self->user_prog()->code("@{[ $output_field->getvar() ]} = @{[ $output_field->input_field()->getvar() ]};");
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::PrepareTransferFields; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'prepare_transfer_fields');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		$self->user_prog()->comment(" ---> Input Fields (@{[ $self->main()->config()->transfer() ]})");
		foreach
		(
			grep
			(
				$_->input_field()->dataset() == $self->main()->input()->input_dataset(),
				$self->main()->output()->transfer_fields()->to_array()
			)
		)
		{
			if (defined($_->aggregate_type()))
			{
				$_->aggregate_type()->code_output($self->user_prog());
			}
			elsif (!defined($_->calc_exp()))
			{
#?				if ($self->main()->group_by_fields()->size() == 0 && $_->getvar() eq $_->input_field()->getvar() 
				$self->user_prog()->code("@{[ $_->getvar() ]} = @{[ $_->input_field()->getvar() ]}; # assigned");
			}
		}

		foreach my $j ($self->main()->user_joins()->to_array()) 
		{
			$self->user_prog()->comment(" ---> Input Join Fields (@{[ $j->input_dataset()->datasource()->fdname() ]})");
			$self->user_prog()->code(
				"if ("
				. $j->key_field_ref()->getvar() 
			    . ($j->key_type() =~ /^(numeric|amount)$/ ? ' == ' : ' eq ')
				. $j->join_field_ref()->getvar()
				. ")"
			);
			$self->user_prog()->open_block();
			foreach
			(
				grep
				(
					$_->input_field()->dataset() == $j->input_dataset(),
					$self->main()->output()->transfer_fields()->to_array()
				)
			)
			{
				if (defined($_->aggregate_type()))
				{
					$_->aggregate_type()->code_output($self->user_prog());
				}
				elsif (!defined($_->calc_exp()))
				{
					$self->user_prog()->code("@{[ $_->getvar() ]} = @{[ $_->input_field()->getvar() ]}; # assigned");
				}
			}
			$self->user_prog()->close_block();
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::GroupingBreakControl; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'grouping_break_control');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		return unless ($self->main()->user_sections()->group_by()->size());
		# TODO:code_break_before()...

		foreach ($self->main()->group_by()->input_fields()->to_array()) {
			$self->user_prog()->newline_off();
			$self->user_prog()->code("\$key@{[ $_->tname() ]} = @{[ $_->input_field()->getvar() ]}");
			$self->user_prog()->code($_->pequel_type()->name() =~ /^(numeric|amount)$/ ? '+0' : '');
			$self->user_prog()->newline_on();
			$self->user_prog()->code(";");
		}
		
		if ($self->main()->config()->hash()) 
		{
			$self->user_prog()->code("\$_HKEY = "
				. join(" . '|' . ", map("\$key@{[ $_->tname() ]}", $self->main()->group_by()->input_fields()->to_array()))
				. ";"
			);
		}
		else
		{
			$self->user_prog()->code("if ("
				. join(" || ", map("!defined(\$previous_key@{[ $_->tname() ]})", $self->main()->group_by()->input_fields()->to_array()))
				. ")"
			);
			$self->user_prog()->open_block();
				map
				(
					$self->user_prog()->code("\$previous_key@{[ $_->tname() ]} = \$key@{[ $_->tname() ]};"),
					$self->main()->group_by()->input_fields()->to_array()
				);
			$self->user_prog()->close_block();

			$self->user_prog()->code("elsif ("
				. join
					(
						" || ", 
						map
						(
							"\$previous_key@{[ $_->tname() ]} @{[ $_->pequel_type()->name() =~ /^(numeric|amount)$/ ? '!=' : 'ne' ]} \$key@{[ $_->tname() ]}",
							$self->main()->group_by()->input_fields()->to_array()
						)
					)
				. ")"
			);
			$self->user_prog()->open_block();
#?				$self->code_zero_nulls if ($self->properties()->nonulls());
				$self->catalogue()->code_segments()->output()->new(
					main => $self->main(), user_prog => $self->user_prog())->prepare();
				$self->catalogue()->code_segments()->reset()->new(
					main => $self->main(), user_prog => $self->user_prog())->prepare();
			$self->user_prog()->close_block();
		}
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Generator::Segment::Reset; 
	use base qw(ETL::Pequel3::Generator::Segment::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'segment_name', default => 'reset');
	use Class::STL::ClassMembers::Constructor; 
	sub prepare_start
	{
		my $self = shift;
		$self->program_info();
		map
		(
			$self->user_prog()->code("\$previous_key@{[ $_->tname() ]} = \$key@{[ $_->tname() ]};"),
			$self->main()->group_by()->input_fields()->to_array()
		) 
		if ($self->main()->user_sections()->group_by()->size());

		map
		(
			$self->user_prog()->code("\$previous_dedup@{[ $_->input_field()->tname() ]} = undef;"),
			$self->main()->dedup_on_input()->fields()->to_array()
		)
		if ($self->main()->user_sections()->dedup_on_input()->size());

		map
		(
			$self->user_prog()->code("\$previous_dedup@{[ $_->output_field()->tname() ]} = undef;"),
			$self->main()->dedup_on_output()->fields()->to_array()
		)
		if ($self->main()->user_sections()->dedup_on_output()->size());

		foreach 
		(
			grep
			(
				defined($_),
				(
					map($_->aggregate_type(), 
						grep(defined($_->aggregate_type()), $self->main()->output()->output_fields()->to_array())),
					$self->main()->output()->output_dataset(),
					$self->main()->output()->transfer_dataset(),
					map($_->transfer_dataset(), $self->main()->user_joins()->to_arra

⌨️ 快捷键说明

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