📄 macros.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 + -