📄 dataset.pm
字号:
my $numflds = shift;
$c->code("\$@{[ $self->sth_vname() ]}->fetchrow_array()");
return $c;
}
sub code_read
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my @fields = @_; # ETL::Pequel3::Type::Field::Abstract object list;
my $numflds = int(@fields);
$c->newline_off();
$c->code("\@@{[ $self->arr_vname() ]} = ");
$self->code_decode($c, $numflds);
return $c;
}
sub parse
{
my $self = shift;
$self->_dsn_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->dsn()))
if (defined($self->dsn()));
$self->_user_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->user()))
if (defined($self->user()));
$self->_password_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->password()))
if (defined($self->password()));
$self->_table_name_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->table_name()))
if (defined($self->table_name()));
$self->_select_override_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_override()))
if (defined($self->select_override()));
$self->_select_where_condition_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_where_condition()))
if (defined($self->select_where_condition()));
$self->_select_fields_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_fields()))
if (defined($self->select_fields()));
$self->_select_order_by_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_order_by()))
if (defined($self->select_order_by()));
$self->_select_group_by_parsed($self->pequel_ref()->parser()->used_by($self)->translate($self->select_group_by()))
if (defined($self->select_group_by()));
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Input::Sampler;
use base qw(ETL::Pequel3::Type::DataSet::Input::AsciiDelimited);
use Class::STL::ClassMembers qw( recs_vname _field_init_values ),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'sampler'),
Class::STL::ClassMembers::DataMember->new(name => 'datasource_type', default => 'void'),
ETL::Pequel3::Type::DataMember::User->new(name => 'records', default => 1);
use Class::STL::ClassMembers::Constructor;
sub new_extra
{
my $self = shift;
$self->recs_vname("@{[ $self->datasource()->vname() || 'UNDEF' ]}_RECS");
}
sub code_init
{
my $self = shift;
my $c = $self->SUPER::code_init(@_);
$c->code("my \$@{[ $self->recs_vname() ]}=@{[ $self->records() ]};");
return $c;
}
sub code_open
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
return $c;
}
sub code_decode
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
my $numflds = shift;
return $c;
}
sub code_read
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->code("--\$@{[ $self->recs_vname() ]} >= 0");
return $c;
}
sub code_after_read
{
my $self = shift;
my $c = shift || ETL::Pequel3::CodeStyler::Program::Perl->new();
$c->newline_off();
$c->code("\@@{[ $self->arr_vname() ]} = (");
$c->add(
defined($self->_field_init_values())
? $self->_field_init_values()
: join(', ', map(q{''}, grep(!defined($_->calc_exp()), $self->input_fields()->to_array())))
);
$c->newline_on();
$c->code(");");
return $c;
}
sub parse
{
my $self = shift;
$self->_field_init_values(ETL::Pequel3::CodeStyler::Program::Perl->new());
$self->_field_init_values()->code(
join
(
', ',
map
(
$_->pequel_type()->name() eq 'date'
? $self->pequel_ref()->parser()->used_by($_)->translate(
'(&to_date(&today()<YYYYMMDD>, ' . $_->date_type()->name() . '))'
)->raw()
: $_->pequel_type()->name() =~ /^(numeric|amount)$/ ? '0' : q{''},
grep(!defined($_->calc_exp()), $self->input_fields()->to_array())
)
)
);
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::User::Find; # ???
use base qw(Class::STL::Utilities::FunctionObject::UnaryFunction);
use Class::STL::ClassMembers qw( dataset_spec );
use Class::STL::ClassMembers::Constructor;
sub function_operator
{
my $self = shift;
my $arg = shift; # element object
return $arg->dataset_spec() eq $self->dataset_spec() ? $arg : 0;
}
}
# ----------------------------------------------------------------------------------------------------
# CATALOGUE
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Catalogue::Abstract;
use base qw(ETL::Pequel3::Type::Catalogue);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
use Class::STL::ClassMembers::Constructor;
sub catalogue # --> to_xml
{
my $self = shift;
my $xml_node = shift;
foreach ($self->to_array()) {
my $s_xml = $xml_node->createChild("dataset-type");
$s_xml->attribute('dataset-name', $_->name());
foreach my $k (keys %{$_->members()}) {
my $attr = ${$_->members()}{$k};
next unless UNIVERSAL::isa(${$attr}[2], 'ETL::Pequel3::Type::Properties::Abstract');
my $m_xml = $s_xml->createChild("property-type");
$m_xml->attribute('name', $k);
$m_xml->attribute('default', ${$attr}[0]);
$m_xml->attribute('validate', ${$attr}[1]);
}
}
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Input::Catalogue;
use base qw(ETL::Pequel3::Type::DataSet::Catalogue::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'input_datasets');
use Class::STL::ClassMembers::SingletonConstructor;
sub new_extra
{
my $self = shift;
$self->push_back(
ETL::Pequel3::Type::DataSet::Input::AsciiDelimited->_new(),
ETL::Pequel3::Type::DataSet::Input::Packed->_new(),
ETL::Pequel3::Type::DataSet::Input::Dbi->_new(),
ETL::Pequel3::Type::DataSet::Input::Sampler->_new(),
);
return $self;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Output::Catalogue;
use base qw(ETL::Pequel3::Type::DataSet::Catalogue::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'output_datasets');
use Class::STL::ClassMembers::SingletonConstructor;
sub new_extra
{
my $self = shift;
$self->push_back(
ETL::Pequel3::Type::DataSet::Output::AsciiDelimited->_new(),
ETL::Pequel3::Type::DataSet::Output::Packed->_new(),
ETL::Pequel3::Type::DataSet::Output::Xml->_new(),
);
return $self;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::UserShared::Global;
use base qw(ETL::Pequel3::Type::Catalogue);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'shared_datasets'),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'dataset_spec'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
use Class::STL::ClassMembers::SingletonConstructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::User::Local;
use base qw(ETL::Pequel3::Type::Catalogue);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'local_datasets'),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'dataset_spec'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
# FACTORY
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Factory::Abstract;
use ETL::Pequel3::Type::Factory;
use base qw(ETL::Pequel3::Type::Factory::Abstract); # --> Type::Factory
use Class::STL::ClassMembers qw( default_dataset_spec shared_datasets ), # datasets --> catalogue
Class::STL::ClassMembers::DataMember->new(name => 'factory_name', default => 'dataset'),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'name'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::DataSet::Abstract');
use Class::STL::ClassMembers::Constructor;
sub new_extra
{
my $self = shift;
$self->shared_datasets(ETL::Pequel3::Type::DataSet::UserShared::Global->new()); # Singleton
}
sub factory
{
my $self = shift;
my %p = @_;
$p{dataset_spec} = $self->default_dataset_spec()
if (!defined($p{dataset_spec}) && defined($self->default_dataset_spec()));
use Carp qw(confess);
confess "Undefined dataset_spec parameter!" unless (defined($p{dataset_spec}));
confess "Undefined pequel_ref parameter!" unless (defined($p{pequel_ref}));
# 1) type:ds
# 2) type(args):ds
# 3) type(args):ds(args)
# 4) type:ds(args)
# 5) type --> type:default
# 6) ds --> ascii:ds
# 7) type(args) --> type:default
# 8) ds(args) --> ascii:ds
# 9) type:
# 10) type(args):
# 11) :ds
# 12) :ds(args)
my $type;
my @args;
if ($p{dataset_spec} =~ /\s*(\w+)\s*\((.*?)\)\s*:\s*(.*)$/) # 2, 3, 10
{
$type = $1; # must be dataset-type
@args=('datasource_spec', $3,
ETL::Pequel3::Parser->new(pequel_ref => $p{pequel_ref})->extract_args($2));
}
elsif ($p{dataset_spec} =~ /\s*(\w+)\s*:\s*(.*)$/) # 1, 4, 9
{
$type = $1; # must be dataset-type
@args=('datasource_spec', $2);
}
elsif ($p{dataset_spec} =~ /\s*:?\s*(\w+)\s*\((.*?)\)\s*$/) # 7, 8, 12
{
$type = $1; # dataset or datasource type
my $args = $2;
if ($self->catalogue()->exists($type)) { # 7
@args=('datasource_spec', $self->catalogue()->exists($type)->default_datasource_spec(),
ETL::Pequel3::Parser->new(pequel_ref => $p{pequel_ref})->extract_args($args));
}
else # 8
{
$type = 'ascii';
@args=('datasource_spec', $p{dataset_spec});
}
}
else # 5, 6, 11
{
$type = $p{dataset_spec}; # dataset or datasource type
$type =~ s/^\s*://;
if ($self->catalogue()->exists($type)) { # 5
@args=('datasource_spec', $self->catalogue()->exists($type)->default_datasource_spec());
}
else # 6, 11
{
$type = 'ascii';
@args=('datasource_spec', $p{dataset_spec});
}
}
confess "\nUnknown dataset type $type -- [$p{dataset_spec}]!" unless ($self->catalogue()->exists($type));
my $ds = $self->catalogue()->exists($type)->new(@args, %p); # explicit datasource_spec in @_ will take preference;
$self->err()->trace_msg(10, "@{[ $ds->pequel_ref()->pequel_name() ]} -->"
. "Dataset Type:" . $ds->name()
. "; target_name:" . $ds->datasource()->target_name()
. "; fdname:" . $ds->datasource()->fdname()
. "; Datasource Type:" . $ds->datasource()->datasource_name()
. "; dataset_spec:" . $ds->dataset_spec()
. "; io_name:" . $ds->datasource()->io_name()
);
$self->shared_datasets()->push_back($ds)
if ($ds->shared() && !$self->shared_datasets()->exists($ds->dataset_spec()));
$p{pequel_ref}->user_datasets()->push_back($ds)
unless ($p{pequel_ref}->user_datasets()->exists($ds->dataset_spec()));
return $ds;
}
sub add
{
my $self = shift;
$self->push_back($self->factory(@_));
return $self->back();
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Input::Factory::Abstract;
use base qw(ETL::Pequel3::Type::DataSet::Factory::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_type', default => 'input_datasets'),
Class::STL::ClassMembers::DataMember->new(name => 'default_dataset_spec', default => 'stdin');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Output::Factory::Abstract;
use base qw(ETL::Pequel3::Type::DataSet::Factory::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_type', default => 'output_datasets'),
Class::STL::ClassMembers::DataMember->new(name => 'default_dataset_spec', default => 'stdout');
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Input::Factory::Local;
use base qw(ETL::Pequel3::Type::DataSet::Input::Factory::Abstract);
use Class::STL::ClassMembers;
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Output::Factory::Local;
use base qw(ETL::Pequel3::Type::DataSet::Output::Factory::Abstract);
use Class::STL::ClassMembers;
use Class::STL::ClassMembers::Constructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Input::Factory::Global;
use base qw(ETL::Pequel3::Type::DataSet::Input::Factory::Abstract);
use Class::STL::ClassMembers;
use Class::STL::ClassMembers::SingletonConstructor;
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::DataSet::Output::Factory::Global;
use base qw(ETL::Pequel3::Type::DataSet::Output::Factory::Abstract);
use Class::STL::ClassMembers;
use Class::STL::ClassMembers::SingletonConstructor;
}
# ----------------------------------------------------------------------------------------------------
1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -