📄 generator.pm
字号:
$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 + -