package Analizo::Batch::Output::CSV;
use parent qw( Analizo::Batch::Output );
use Analizo::Metrics;
sub push {
my ($self, $job) = @_;
$self->{jobs} ||= [];
push @{$self->{jobs}}, $job;
}
sub write_data {
my ($self, $fh) = @_;
my @fields = ();
my @metadata_fields;
for my $job (@{$self->{jobs}}) {
my ($summary, $details) = $job->metrics->data();
my $metadata = $job->metadata;
unless (@fields) {
@fields = sort(keys(%$summary));
@metadata_fields = map { $_->[0] } @$metadata;
my $header = join(',', 'id', @metadata_fields, @fields) . "\n";
print $fh $header;
}
my @metadata = map{ _encode_value($_->[1])} @$metadata;
my @values = map { _encode_value($summary->{$_}) || '' } @fields;
my $line = join(',', $job->id, @metadata, @values) . "\n";
print $fh $line;
$self->_write_details($job->id, $details);
}
}
my $__encoders = {
_default => sub { $_[0] },
ARRAY => sub { '"' . join(';', @{$_[0]}) . '"' },
HASH => sub { '"' . join(';', map { join(':', $_, $_[0]->{$_}) } sort(keys(%{$_[0]}))) . '"' },
};
sub _encode_value($) {
my ($value) = @_;
my $encoder = $__encoders->{ref($value)} || $__encoders->{_default};
return &$encoder($value);
}
sub _extract_short_names_of_metrics {
my $metrics_instance = Analizo::Metrics->new;
my @short_names = ();
my %metrics_names = $metrics_instance->list_of_metrics();
@short_names = sort(keys %metrics_names);
return @short_names;
}
sub _write_details {
my ($self, $id, $details) = @_;
my @array_of_values = ();
my $file_name;
my @fields = $self->_extract_short_names_of_metrics();
my $csv_filename = $id. "-details.csv";
open my $csv_handler, '>'.$csv_filename || die "Cannot open ".$id."-details.csv\n".$!;
print $csv_handler "filename".",module";
foreach (@fields){
print $csv_handler ",".$_;
}
print $csv_handler "\n";
foreach (@$details){
if(!( $_->{_filename}[1])){
$file_name = $_->{_filename}[0];
}else{
$file_name = $_->{_filename}[0]."\/".$_->{_filename}[1];
}
CORE::push @array_of_values, $file_name.",".$_->{_module};
foreach $field (@fields){
CORE::push @array_of_values, ",".$_->{$field};
}
CORE::push @array_of_values, "\n";
}
print $csv_handler @array_of_values;
close $csv_handler;
}
1;