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

📄 aggregates.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 3 页
字号:
	{ 
		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 + -