pequeltypes.pm
来自「普通的ETL工具」· PM 代码 · 共 218 行
PM
218 行
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
# Name : ETL::Pequel3::Type::PequelTypes.pm
# Created : 9 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::PequelTypes;
require 5.005_62;
use strict;
use warnings;
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::Abstract;
use base qw(Class::STL::Element);
use Class::STL::ClassMembers qw( name description validate_catalogue ),
Class::STL::ClassMembers::DataMember->new(name => 'xs_type', default => 'NMTOKEN'),
Class::STL::ClassMembers::DataMember->new(name => 'data_xs_type', default => 'xs:string'),
Class::STL::ClassMembers::DataMember->new(name => 'validate', default => '^.*$');
use Class::STL::ClassMembers::Constructor;
sub getvar
{
my $self = shift;
my $f = shift;
return $f->getvar();
}
sub lt
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub lte
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub gt
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub gte
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub eq
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub ne
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub cmp
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return '';
}
sub xml_schema
{
use XML::Mini::Document;
my $self = shift;
my $xsd = shift;
my $xml_node = shift || $xsd->schema_root();
return if ($xsd->exists('element', $self->name(), $xml_node));
$xsd->comment($xml_node, "Pequel Type: @{[ $self->name() ]}");
my $element = $xsd->xs_element($xml_node, name => $self->name());
if (defined($self->description()) && $self->description() ne '') {
my $doc = $xsd->xs_documentation($xsd->xs_annotation($element), 'xml:lang' => 'en');
$xsd->text($doc, $self->description());
}
my $restriction = $xsd->xs_restriction($xsd->xs_simpleType($element),
base => $self->data_xs_type()
);
$xsd->xs_pattern($restriction, value => $self->validate())
if (defined($self->validate()));
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::Numeric;
use base qw(ETL::Pequel3::Type::PequelTypes::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'validate', default => '^\d+$'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Numeric data'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'numeric');
use Class::STL::ClassMembers::Constructor;
sub lt
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return "$v1 ne '' && $v1 < $v2";
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::String;
use base qw(ETL::Pequel3::Type::PequelTypes::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Alpha-numeric data'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'string');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::Amount;
use base qw(ETL::Pequel3::Type::PequelTypes::Abstract);
use Class::STL::ClassMembers qw( decimal_places ),
Class::STL::ClassMembers::DataMember->new(name => 'validate', default => '^(\d|\.|\-)+$'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Decimal numeric data'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'amount');
use Class::STL::ClassMembers::Constructor;
sub getvar
{
my $self = shift;
my $f = shift;
return defined($self->decimal_places())
? "sprintf(\"%.@{[ $self->decimal_places() ]}f\", @{[ $f->getvar() ]})"
: $f->getvar();
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::Array;
use base qw(ETL::Pequel3::Type::PequelTypes::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Array list data'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'array');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::Date;
use base qw(ETL::Pequel3::Type::PequelTypes::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'date'),
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Date data'),
Class::STL::ClassMembers::DataMember->new(name => 'validate_catalogue', default => 'date_types');
use Class::STL::ClassMembers::Constructor;
sub lt
{
my $self = shift;
my $v1 = shift;
my $v2 = shift;
return $self->date_type()->lt($v1, $v2);
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::PequelTypes::Catalogue;
use base qw(ETL::Pequel3::Type::Catalogue);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'pequel_types'),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::PequelTypes::Abstract');
use Class::STL::ClassMembers::SingletonConstructor;
sub new_extra
{
my $self = shift;
$self->push_back(
ETL::Pequel3::Type::PequelTypes::Numeric->new(), # includes float
ETL::Pequel3::Type::PequelTypes::String->new(),
ETL::Pequel3::Type::PequelTypes::Amount->new(),
ETL::Pequel3::Type::PequelTypes::Array->new(),
ETL::Pequel3::Type::PequelTypes::Date->new(),
);
return $self;
}
sub catalogue
{
my $self = shift;
my $xml_node = shift;
foreach ($self->to_array()) {
my $s_xml = $xml_node->createChild("pequel-data-type");
$s_xml->attribute('pequel-type-name', $_->name());
}
}
}
# ----------------------------------------------------------------------------------------------------
1;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?