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

📄 macros.pm

📁 普通的ETL工具
💻 PM
字号:
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
#  Name		: ETL::Pequel3::Type::Macros.pm
#  Created	: 8 May 2006
#  Author	: Mario Gaffiero (gaffie)
#
# Copyright 1999-2007 Mario Gaffiero.
# 
# This file is part of Pequel(TM).
# 
# Pequel is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
# 
# Pequel is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with Pequel; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
# ----------------------------------------------------------------------------------------------------
# Modification History
# When          Version     Who     What
# ----------------------------------------------------------------------------------------------------
package ETL::Pequel3::Type::Macros;
require 5.005_62;
use strict;
use warnings;
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Abstract;
	use base qw(Class::STL::Element);
	use Class::STL::ClassMembers 
		qw( 
			err 
			name 
			catalogue 
			properties 
			pequel_types 
			date_types 
			used_by_list 
			use_list 
			configuration 
			category
			description
			usage
		);
	use Class::STL::ClassMembers::Constructor;
	use Class::CodeStyler;
	sub new_extra
	{
		my $self = shift;
		$self->err(ETL::Pequel3::Error->new());
		$self->catalogue(ETL::Pequel3::Catalogue->new());
		$self->properties($self->catalogue()->properties());
		$self->configuration($self->properties()) unless (defined($self->configuration()));
		$self->pequel_types($self->catalogue()->pequel_types());
		$self->date_types($self->catalogue()->date_types());
		$self->used_by_list(stl::list());
		$self->use_list(stl::list());
		$self->data($self->name()); # need this for the stl::stable_sort in generator;
		return $self;
	}
    sub code_init_global
	{ 
		my $self = shift; 
		my $c = shift || Class::CodeStyler::Program::Perl->new();
		return $c;
	}
    sub code_init_private
	{ 
		my $self = shift; 
		my $c = shift || Class::CodeStyler::Program::Perl->new();
		return $c;
	}
    sub code_init
	{ 
		my $self = shift; 
		my $c = shift || Class::CodeStyler::Program::Perl->new();
		return $c;
	}
    sub translate
	{ 
		my $self = shift; 
		my $c = Class::CodeStyler::Program::Perl->new();
		$self->err->trace_msg(12, "-->macro @{[ $self->name() ]}(@{[ join(',', @_) ]}) -- @{[ ref($self) ]}");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Catalogue;
	use base qw(ETL::Pequel3::Type::Catalogue);
	use stl;
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'macros'),
		Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
		Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::Macros::Abstract'),
		Class::STL::ClassMembers::DataMember->new(name => 'debug', default => 0);
	use Class::STL::ClassMembers::SingletonConstructor;
	sub new_extra
	{
		my $self = shift;
		return $self;
	}
}
# ----------------------------------------------------------------------------------------------------
# MACRO CATEGORY
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::Abstract;
	use base qw(Class::STL::Element);
	use Class::STL::ClassMembers qw( name );
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::Arithmetic;
	use base qw(ETL::Pequel3::Type::Macros::Category::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'arithmetic');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::Array;
	use base qw(ETL::Pequel3::Type::Macros::Category::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'array');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::General;
	use base qw(ETL::Pequel3::Type::Macros::Category::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'general');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::Date;
	use base qw(ETL::Pequel3::Type::Macros::Category::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'date');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::String;
	use base qw(ETL::Pequel3::Type::Macros::Category::Abstract);
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'string');
	use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Category::Catalogue;
	use base qw(ETL::Pequel3::Type::Catalogue);
	use stl;
	use Class::STL::ClassMembers
		Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'macro_categories'),
		Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
		Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::Macros::Category::Abstract'),
		Class::STL::ClassMembers::DataMember->new(name => 'debug', default => 0);
	use Class::STL::ClassMembers::SingletonConstructor;
	sub new_extra
	{
		my $self = shift;
		$self->push_back(
			ETL::Pequel3::Type::Macros::Category::General->_new(),
			ETL::Pequel3::Type::Macros::Category::String->_new(),
			ETL::Pequel3::Type::Macros::Category::Arithmetic->_new(),
			ETL::Pequel3::Type::Macros::Category::Date->_new(),
			ETL::Pequel3::Type::Macros::Category::Array->_new(),
		);
		return $self;
	}
}
# ----------------------------------------------------------------------------------------------------
1;
__END__
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::UserMacro;
	use base qw(ETL::Pequel3::Type::Macros::Element);

	sub new : method
	{
		my $self = shift;
		my $class = ref($self) || $self;
		my %params = @_;
		$self = $class->SUPER::new
		(
			@_,
			name => $params{'name'},
			eval => $params{'eval'},
			external => 1,
		);
		bless($self, $class);
		return $self;
	}

	sub compile : method
	{
		my $self = shift;
		my $eval = $self->eval;
		$eval =~ s/_ARGS/@{[ join(',', @_) ]}/g;
		$eval =~ s/_ARG(\d+)/@{[ $_[$1-1] ]}/g;
		return ("$eval");
	}
}
# ----------------------------------------------------------------------------------------------------
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macro;
	use ETL::Pequel3::Collection;	#+++++
	use base qw(ETL::Pequel3::Collection::Hierarchy);
	sub new : method
	{
		my $self = shift;
		my $param = shift;
		my $class = ref($self) || $self;
		$self = $class->SUPER::new(@_);
		bless($self, $class);
		$self->PARAM($param);

		$self->addAll
		(
			ETL::Pequel3::Type::Macros::Group::Basic->new($self->PARAM),
			ETL::Pequel3::Type::Macros::Group::Date->new($self->PARAM),
			ETL::Pequel3::Type::Macros::Group::String->new($self->PARAM),
			ETL::Pequel3::Type::Macros::Group::Array->new($self->PARAM),
			ETL::Pequel3::Type::Macros::Group::Arithmetic->new($self->PARAM),
#>			ETL::Pequel3::Type::Macros::Group::Other->new($self->PARAM),
		);

		return $self;
	}

	sub codeInit : method
	{
		my $self = shift;
		my $c = ETL::Pequel3::Code->new(PARAM => $self->PARAM);
		if 
		(
			$self->exists('day_number')->useList->size 
			|| $self->exists('last_day')->useList->size 
			|| $self->exists('date_last_day')->useList->size 
			|| $self->exists('date_next_day')->useList->size 
		)
		{
			$c->add("my \@_LAST_DAY_LEAP = (0,31,29,31,30,31,30,31,31,30,31,30,31);");
			$c->add("my \@_LAST_DAY = (0,31,28,31,30,31,30,31,31,30,31,30,31);");
		}

		if 
		(
			$self->exists('day_number')->useList->size 
		)
		{
			$c->add("my \@_FIRST_DAYNUMBER_LEAP = (0,1,32,61,92,122,153,183,214,245,275,306,336);");
			$c->add("my \@_FIRST_DAYNUMBER = (0,1,32,60,91,121,152,182,213,244,274,305,335);");

			$c->add("my \%_DAYNUMBER_TO_MONTH;");
			$c->add("my \$d=0; foreach my \$m (1..12) { foreach (1..\$_LAST_DAY[\$m]) { \$_DAYNUMBER_TO_MONTH{++\$d} = \$m; } }");
			$c->add("my \%_DAYNUMBER_TO_MONTH_LEAP;");
			$c->add("my \$d=0; foreach my \$m (1..12) { foreach (1..\$_LAST_DAY_LEAP[\$m]) { \$_DAYNUMBER_TO_MONTH_LEAP{++\$d} = \$m; } }");
		}

		if (grep($_->useList->size && $_->m->len > 2, $self->PARAM->datetypes->toArray))
		{
			$c->add("my \%MONTH_NUM = ");
			$c->add("(");
			$c->over;
			map
			(
				$c->add("@{[ $_->name ]} => '@{[ $_->value ]}',"),
				$self->PARAM->monthtypes->toArray
			);
			$c->endList;
			$c->back;
			$c->add(");");
			$c->add("my \%MONTH_NAME;  foreach my \$m (keys \%MONTH_NUM) { \$MONTH_NAME{\$MONTH_NUM{\$m}} = \$m; }");
		}
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
1;
__END__
#>			ETL::Pequel3::Type::Macros::InputFieldCount->new(PARAM => $param),
#>			ETL::Pequel3::Type::Macros::IsBetween->new,		# &is_between(field, from, to)
#>			ETL::Pequel3::Type::Macros::IsIn->new,			# &is_in(field, v1, ...)
#>			ETL::Pequel3::Type::Macros::Now->new,
#>			ETL::Pequel3::Type::Macros::Time->new,
#>			ETL::Pequel3::Type::Macros::DaysBetween->new,		# return num days between 2 dates
#>			ETL::Pequel3::Type::Macros::DateIsBetween->new,	# &date_is_between(dt1, dt2)
#>			ETL::Pequel3::Type::Macros::DayNumberToDate->new,	# return date for day number in year
#>			ETL::Pequel3::Type::Macros::AddDays->new,			# return date plus days
#>			ETL::Pequel3::Type::Macros::AddMonths->new,		# return date plus months
#>			ETL::Pequel3::Type::Macros::ToDate->new,			# 
#?			ETL::Pequel3::Type::Macros::Remove->new,			# &remove(field, char-set) -- remove all char-set characters from field
#>			ETL::Pequel3::Type::Macros::Replace->new,			# change words
#>			ETL::Pequel3::Type::Macros::ArrPush->new,			# &push(field, value [, ...])
#<			ETL::Pequel3::Type::Macros::ArrPeek->new,			# return last element in array
#>			ETL::Pequel3::Type::Macros::ArrAvgDistinct->new,	# return average for distinct values in array
#>			ETL::Pequel3::Type::Macros::ArrSumDistinct->new,	# return sum for distinct values in array
#>			ETL::Pequel3::Type::Macros::ArrPack->new(PARAM => $param),
#>			ETL::Pequel3::Type::Macros::ArrUnpack->new(PARAM => $param),
#>v3		ETL::Pequel3::Type::Macros::ArrSelect->new,	# or ArrFilter: &arr_select(<field>, <value|/regex/>)
#>v3		ETL::Pequel3::Type::Macros::ArrDistinct->new,		# return count of distinct values
#>v3		ETL::Pequel3::Type::Macros::ArrMedian->new,
#>v3		ETL::Pequel3::Type::Macros::ArrVariance->new,
#>v3		ETL::Pequel3::Type::Macros::ArrStddev->new,
#>v3		ETL::Pequel3::Type::Macros::ArrRange->new,
#>v3		ETL::Pequel3::Type::Macros::ArrMode->new,
#>			ETL::Pequel3::Type::Macros::ArrLongest->new,		# return longest string in array
#>			ETL::Pequel3::Type::Macros::ArrShortest->new,		# return longest string in array
#>			ETL::Pequel3::Type::Macros::ArrString->new,		# combine elements into string
#>			ETL::Pequel3::Type::Macros::Split->new,
#>			ETL::Pequel3::Type::Macros::ArrSetAnd->new,
#>			ETL::Pequel3::Type::Macros::ArrSetOr->new,
#>			ETL::Pequel3::Type::Macros::ArrSetXOr->new,
#>v3		ETL::Pequel3::Type::Macros::LeftShift,			# numeric shift
#>v3		ETL::Pequel3::Type::Macros::RightShift,			# numeric shift
#>v3		ETL::Pequel3::Type::Macros::Pequel->new,
#>v3		ETL::Pequel3::Type::Macros::Switch->new,	#--> same as ? :

#>v3		ETL::Pequel3::Type::Macros::Lag,				# &lag(value-exp, offset, default)
#>v3		#It provides access to more than one row of a table at the same time without a 
#>v3		#self join. Given a series of rows returned from a query and a position of the 
#>v3		#cursor, LAG provides access to a row at a given physical offset prior to that 
#>v3		#position.
#>v3		#If you do not specify offset, then its default is 1. The optional default value 
#>v3		#is returned if the offset goes beyond the scope of the window. If you do not 
#>v3		#specify default, then its default value is null.
#>v3
#>v3		ETL::Pequel3::Type::Macros::Lead,				# &lead(value-exp, offset, default)
#>v3		#It provides access to more than one row of a table at the same time without a 
#>v3		#self join. Given a series of rows returned from a query and a position of the 
#>v3		#cursor, LEAD provides access to a row at a given physical offset beyond that 
#>v3		#position.
#>v3		#If you do not specify offset, then its default is 1. The optional default value 
#>v3		#is returned if the offset goes beyond the scope of the table. If you do not 
#>v3		#specify default, then its default value is null.
#>v3
#>v3		ETL::Pequel3::Type::Macros::ArrWidthBucket,
#>v3		ETL::Pequel3::Type::Macros::ArrNtile,
#>v3		ETL::Pequel3::Type::Macros::ArrRank,
#>v3		ETL::Pequel3::Type::Macros::ArrCorr,
#>v3		ETL::Pequel3::Type::Macros::ArrCumeDist,
#>v3		ETL::Pequel3::Type::Macros::ArrCovarPop,
#>v3		ETL::Pequel3::Type::Macros::ArrCovarSamp,
#>v3		ETL::Pequel3::Type::Macros::ArrPercentRank,
#>v3		ETL::Pequel3::Type::Macros::ArrPercentileCont,
#>v3		ETL::Pequel3::Type::Macros::ArrPercentileDisc,

⌨️ 快捷键说明

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