📄 aggregates.pm
字号:
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = "@{[ $self->output_field()->name() ]}@{[ $self->hash() ]}";
my $if = $self->output_field()->input_field()->getvar();
$c->code("@{[ $self->output_field()->getvar() ]}++");
$c->over();
$c->code("if");
$c->open_block("(");
$c->code("defined($if)");
$c->code("&& ++\$DISTINCT_$of\{qq{$if}} == 1");
$c->close_block();
$c->code(";@{[ $self->prinfo() ]}");
$c->back();
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::CountDistinct;
use base qw(ETL::Pequel3::Type::Aggregates::Distinct);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'count_distinct'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the count of unique values for field-name in the group.');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Minimum;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'minimum'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the minimum value in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = $self->output_field()->getvar();
my $if = $self->output_field()->input_field()->getvar();
if ($self->output_field()->pequel_type()->name() eq 'date')
{
$c->code("@{[ $self->prinfo() ]} -- date_type: @{[ $self->output_field()->date_type()->name() ]}");
$c->code("if (!defined($of))");
$c->open_block();
$c->code("$of = $if;");
$c->close_block();
$c->code("else");
$c->open_block();
$c->add($self->output_field()->date_type()->code_cmp_date($if, $of));
$c->code("if (\$cmp == -1) { $of = $if; }");
$c->close_block();
}
else
{
$c->code("$of = $if");
$c->over();
$c->code("if");
$c->open_block("(");
$c->code("!defined($of)");
$c->code("||");
$c->open_block("(");
$c->code("defined($if)");
$c->code("&& $if ne ''");
$c->code("&& $if");
$c->over();
$c->code("@{[ $self->output_field()->pequel_type()->name() eq 'string' ? 'lt' : '<' ]} $of");
$c->back();
#TODO: what about date comparison ??? -- need to use pequel_type()->lt()
$c->close_block();
$c->close_block();
$c->code(";@{[ $self->prinfo() ]}");
$c->back();
}
#? $c->code("if (!defined($of) || (defined($if) && @{[ $self->output_field()->pequel_type()->lt($if, $of) ]}));");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Maximum;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'maximum'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the maximum value in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = $self->output_field()->getvar();
my $if = $self->output_field()->input_field()->getvar();
if ($self->output_field()->pequel_type()->name() eq 'date')
{
$c->code("@{[ $self->prinfo() ]} -- date_type: @{[ $self->output_field()->date_type()->name() ]}");
$c->code("if (!defined($of))");
$c->open_block();
$c->code("$of = $if;");
$c->close_block();
$c->code("else");
$c->open_block();
$c->add($self->output_field()->date_type()->code_cmp_date($if, $of));
$c->code("if (\$cmp == 1) { $of = $if; }");
$c->close_block;
}
else
{
$c->code("$of = $if");
$c->over();
$c->code("if");
$c->open_block("(");
$c->code("!defined($of)");
$c->code("||");
$c->open_block("(");
$c->code("defined($if)");
$c->code("&& $if ne ''");
$c->code("&& $if");
$c->over();
$c->code("@{[ $self->output_field()->pequel_type()->name() eq 'string' ? 'gt' : '>' ]} $of");
$c->back();
#TODO: what about date comparison ??? -- need to use pequel_type()->gt()
$c->close_block();
$c->close_block();
$c->code(";@{[ $self->prinfo() ]}");
$c->back();
}
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Min;
use base qw(ETL::Pequel3::Type::Aggregates::Minimum);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'min'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the minimum value in the group. Same as minimum.');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Max;
use base qw(ETL::Pequel3::Type::Aggregates::Maximum);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'max'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the maximum value in the group. Same as maximum.');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Last;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'last'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the last value in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->code("@{[ $self->output_field()->getvar() ]} = @{[ $self->output_field()->input_field()->getvar() ]};@{[ $self->prinfo() ]}")
unless ($self->output_field()->getvar() eq $self->output_field()->input_field()->getvar());
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::First;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'first'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the first value in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = $self->output_field()->getvar();
my $if = $self->output_field()->input_field()->getvar();
$c->code("$of = $if");
$c->over();
$c->code("if (!defined($of));@{[ $self->prinfo() ]}");
$c->back();
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Flag;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'require_input_field', default => 0),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'flag'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => '');
use Class::STL::ClassMembers::Constructor;
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->code("@{[ $self->output_field()->getvar() ]} = 1;@{[ $self->prinfo() ]}");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::AvgDistinct;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'avg_distinct'),
Class::STL::ClassMembers::DataMember->new(name => 'valid_types', default => 'amount|numeric|date'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the average value for unique values for field-name in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_init
{
my $self = shift;
my $c = shift || ETL::CodeStyler::Program::Perl->new();
$c->code("my \%AVG_DISTINCT_@{[ $self->output_field()->name() ]};@{[ $self->prinfo() ]}");
$c->code("my \%AVG_DISTINCT_KEYS_@{[ $self->output_field()->name() ]};@{[ $self->prinfo() ]}");
return $c;
}
sub code_reset
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->code("\%AVG_DISTINCT_@{[ $self->output_field()->name() ]} = ();@{[ $self->prinfo() ]}");
$c->code("\%AVG_DISTINCT_KEYS_@{[ $self->output_field()->name() ]} = ();@{[ $self->prinfo() ]}");
return $c;
}
sub code_output_final
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = "@{[ $self->output_field()->name() ]}@{[ $self->hash() ]}";
$c->code("@{[ $self->output_field()->getvar() ]} =");
$c->over();
$c->open_block("(");
$c->code("\$AVG_DISTINCT_$of\{_COUNT} == 0");
$c->over();
$c->code("? 0");
$c->code(": \$AVG_DISTINCT_$of\{_SUM} / \$AVG_DISTINCT_$of\{_COUNT}");
$c->back();
$c->close_block();
$c->code(";@{[ $self->prinfo() ]}");
$c->back();
return $c;
}
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = "@{[ $self->output_field()->name() ]}@{[ $self->hash() ]}";
my $if = $self->output_field()->input_field()->getvar();
$c->code("if");
$c->open_block("(");
$c->code("++\$AVG_DISTINCT_KEYS_$of\{qq{$if}}");
$c->code("== 1");
$c->close_block();
$c->open_block();
$c->code("\$AVG_DISTINCT_$of\{_SUM} += $if;");
$c->code("\$AVG_DISTINCT_$of\{_COUNT}++;");
$c->close_block();
$c->code("@{[ $self->prinfo() ]}");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Avg;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'avg'),
Class::STL::ClassMembers::DataMember->new(name => 'valid_types', default => 'amount|numeric|date'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the average value in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_init
{
my $self = shift;
my $c = shift || ETL::CodeStyler::Program::Perl->new();
$c->code("my \%@{[ uc($self->name()) ]}_@{[ $self->output_field()->name() ]};@{[ $self->prinfo() ]}");
return $c;
}
sub code_reset
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->code("\%@{[ uc($self->name()) ]}_@{[ $self->output_field()->name() ]} = ();@{[ $self->prinfo() ]}");
return $c;
}
sub code_output_final
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = "@{[ $self->output_field()->name() ]}@{[ $self->hash() ]}";
$c->code("@{[ $self->output_field()->getvar() ]} =");
$c->over();
$c->open_block("(");
$c->code("!defined(\$@{[ uc($self->name()) ]}_$of\{_COUNT}) || \$@{[ uc($self->name()) ]}_$of\{_COUNT} == 0");
$c->over();
$c->code("? 0");
$c->code(": \$@{[ uc($self->name()) ]}_$of\{_SUM} / \$@{[ uc($self->name()) ]}_$of\{_COUNT}");
$c->back();
$c->close_block();
$c->code(";@{[ $self->prinfo() ]}");
$c->back();
return $c;
}
sub code_output
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = "@{[ $self->output_field()->name() ]}@{[ $self->hash() ]}";
my $if = $self->output_field()->input_field()->getvar();
$c->code("\$@{[ uc($self->name()) ]}_$of\{_SUM} += $if;@{[ $self->prinfo() ]}");
$c->code("\$@{[ uc($self->name()) ]}_$of\{_COUNT}++;@{[ $self->prinfo() ]}");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Mean;
use base qw(ETL::Pequel3::Type::Aggregates::Avg);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'mean'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the average value in the group. Same as avg.');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Aggregates::Median;
use base qw(ETL::Pequel3::Type::Aggregates::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'median'),
Class::STL::ClassMembers::DataMember->new(name => 'valid_types', default => 'amount|numeric|date'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Output the middle vale in the group, or, in the case of an even number of values, output the mean of the two middle values in the group.');
use Class::STL::ClassMembers::Constructor;
sub code_init
{
my $self = shift;
my $c = shift || ETL::CodeStyler::Program::Perl->new();
$c->code("my \%MEDIAN_@{[ $self->output_field()->name() ]};@{[ $self->prinfo() ]}");
$c->code("my @{[ $self->hash() eq '' ? '$' : '%' ]}MEDIAN_COUNT_@{[ $self->output_field()->name() ]};@{[ $self->prinfo() ]}");
return $c;
}
sub code_reset
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->code("\%MEDIAN_@{[ $self->output_field()->name() ]} = ();@{[ $self->prinfo() ]}");
$c->code("\$MEDIAN_COUNT_@{[ $self->output_field()->name() ]} = @{[ $self->hash() eq '' ? 'undef' : '()' ]};@{[ $self->prinfo() ]}");
return $c;
}
sub code_output_final
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $of = "@{[ $self->output_field()->name() ]}@{[ $self->hash() ]}";
my $v1 = $self->hash() eq '' ? "\$MEDIAN_COUNT_$of / 2 - 1" : "\${\$MEDIAN_COUNT_$of} / 2 - 1";
my $v2 = $self->hash() eq '' ? "\$MEDIAN_COUNT_$of / 2" : "\${\$MEDIAN_COUNT_$of} / 2";
my $keys = $self->hash() eq '' ? "keys \%MEDIAN_$of" : "keys \%{\$MEDIAN_$of}";
$c->newline_off();
$c->code("@{[ $self->output_field()->getvar() ]} = ");
$c->newline_on();
$self->hash() eq ''
? $c->code("\$MEDIAN_COUNT_$of % 2 == 0")
: $c->code("\${\$MEDIAN_COUNT_$of} % 2 == 0");
$c->over();
$c->code("? \&{sub{(\$_[0] + \$_[1]) / 2}}");
$c->open_block("(");
$c->open_block("(");
$c->code("( sort {\$a <=> \$b} $keys )");
$c->over();
$c->code("[$v1, $v2]");
$c->back();
$c->close_block();
$c->code("[0,1]");
$c->close_block();
$c->code(": ( sort {\$a <=> \$b} $keys )");
$c->open_block("[");
$self->hash() eq ''
? $c->code("((\$MEDIAN_COUNT_$of+1)/2)-1")
: $c->code("((\${\$MEDIAN_COUNT_$of}+1)/2)-1");
$c->close_block();
$c->code(";@{[ $self->prinfo() ]}"); # hash
$c->back();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -