NAME

ETL::Yertl::Transform - Transform a stream of documents

VERSION

version 0.043

SYNOPSIS

    ### Simple transform callback
    use ETL::Yertl;
    use ETL::Yertl::Transform;
    my $xform = ETL::Yertl::Transform->new(
        transform_doc => sub {
            # Document is in $_
        },
        source => ETL::Yertl::FormatStream->new_for_stdin,
        destination => ETL::Yertl::FormatStream->new_for_stdout,
    );

    ### Transform class
    package Local::Transform::Dump;
    use ETL::Yertl;
    use Data::Dumper;
    use base 'ETL::Yertl::Transform';
    sub transform_doc {
        my ( $self, $doc ) = @_;
        say Dumper $doc;
        return $doc;
    }

    package main;
    use ETL::Yertl;
    my $xform = Local::Transform::Dump->new(
        source => ETL::Yertl::FormatStream->new_for_stdin,
        destination => ETL::Yertl::FormatStream->new_for_stdout,
    );

DESCRIPTION

This class holds a transformation routine in a Yertl stream. Transforms read documents from ETL::Yertl::FormatStream objects and optionally write them to another ETL::Yertl::FormatStream object. Transforms can chain to other transforms, creating a pipeline of transformations.

Transformations can be simple subroutines or full classes (inheriting from this class).

Transform Object

Create ad-hoc transform objects by passing in a transform_doc callback. The callback receives two arguments: The transform object, and the document to transform. The callback should return the transformed document (whether or not it is the same document modified in-place).

Transform Class

Create transform classes by inheriting from ETL::Yertl::Transform. Subclasses can override the transform_doc method to transform documents. This method receives the same arguments, returns the same values, sets $_, and behaves exactly like the transform_doc callback.

Overloaded Operators

Transforms can be chained together using the pipe (|) operator. The result of the expression is the transform on the right side, for continued chaining.

    my $xform1 = ETL::Yertl::Transform->new(
        transform_doc => sub { ... },
    );
    my $xform2 = ETL::Yertl::Transform->new(
        transform_doc => sub { ... },
    );
    my $xform3 = $xform1 | $xform2 | ETL::Yertl::Transform->new(
        transform_doc => sub { ... },
    );

Transforms can receive sources using the << operator with a ETL::Yertl::FormatStream object. The result of the expression is the transform object, for continued chaining.

    my $input = ETL::Yertl::FormatStream->new_for_stdin;
    my $xform = ETL::Yertl::Transform->new(
        transform_doc => sub { ... },
    ) << $input;

Transforms can receive destinations using the >> operator with a ETL::Yertl::FormatStream object. The result of the expression is the transform object, for continued chaining.

    my $output = ETL::Yertl::FormatStream->new_for_stdout;
    my $xform = ETL::Yertl::Transform->new(
        transform_doc => sub { ... },
    ) >> $output;

METHODS

new

    my $xform = ETL::Yertl::Transform->new( %args );

Create a new transform object. %args is a hash with the following keys:

source

The source for documents. Can be a ETL::Yertl::FormatStream or a ETL::Yertl::Transform object. You do not need to specify this right away, but it is required for the transform to do useful work.

destination

(optional) A ETL::Yertl::FormatStream object to write the documents to. This can be an intermediate destination or the ultimate destination. The last transform in a stream should have a destination.

transform_doc

A subref to transform the documents read from the source. The subref will receive two arguments: The transform object and the document to transform. It should return the transformed document. The document to transform is also set as $_ for simpler transforms.

configure

    $xform->configure( %args );

Configure this object. Takes the same arguments as the constructor, "new". This method allows updating any of the transform attributes later, so that transforms can be given new sources/destinations.

write

    $xform->write( $doc );

Write a document explicitly. This can be used by the transform_doc callback to write documents without needing to return them from the callback.

run

    $xform->run;

Run the transform, returning when all data is read from the source, and all data written to the destination (if any).

SEE ALSO

ETL::Yertl, ETL::Yertl::FormatStream

AUTHOR

Doug Bell <preaction@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2018 by Doug Bell.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.