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