/usr/local/CPAN/DSlib/DS/Transformer/Projector.pm


#!perl

# ########################################################################## #
# Title:         Field projector
# Creation date: 2007-03-05
# Author:        Michael Zedeler
# Description:   Make a projection of line
#                Data Stream class
#                Data transformer
# File:          $Source: /data/cvs/lib/DSlib/lib/DS/Transformer/Projector.pm,v $
# Repository:    kronhjorten
# State:         $State: Exp $
# Documentation: inline
# Recepient:     -
# ########################################################################## #

package DS::Transformer::Projector;

use base qw{ DS::Transformer };

use strict;
use Carp::Assert;

our ($VERSION) = $DS::VERSION;
our ($REVISION) = '$Revision: 1.1 $' =~ /(\d+\.\d+)/;


sub new {
    #TODO Do not just set $self->{typespec} to $typespec. Do the restriction on a copy of the existing typespec and use that.
    my( $class, $typespec, $source, $project_fields ) = @_;

    my $project_fields_result;
    my @new_fields = ();
    if( ref( $project_fields ) eq 'HASH' ) {
        $project_fields_result = $project_fields;
    } else {
        $project_fields_result = {};

        foreach my $field_line ( split /\n/, $project_fields ) {
            next if $field_line =~ /^\s*#/;
            my( $old_field, $new_field ) = $field_line =~ /\s*(\S+)(?:\s+(\S+))?/;     
            $project_fields_result->{$old_field} = $new_field;
            push @new_fields, $new_field;
        }
    }

    my $self;

    if( defined( $project_fields_result ) ) {
        my $projected_typespec = $typespec->project( 'adlines', $project_fields_result );
        $self = $class->SUPER::new( $projected_typespec, $source );
        $self->{project_fields} = $project_fields_result;
    }

    return $self;
}

sub process {
    my( $self, $row ) = @_;

    my $new_row = {};

    foreach my $old_field (keys %$row) {
        if(defined(my $new_field = $self->{project_fields}->{$old_field})) {
            $new_row->{$new_field} = $row->{$old_field};
        }
    }

    $new_row;
}

1;