Files
failnix/scripts/Queries/ResultsDataWriteGroups.pm
T

108 lines
3.6 KiB
Perl

package ResultsDataWriteGroups;
use strict;
use warnings;
use diagnostics;
use FindBin;
use lib "$FindBin::Bin/../Modules";
use Filters;
use feature 'say';
sub query {
my ( $experiment, $experiment_dir, @filter_config_names ) = @_;
my $extra =
Filters::build_filter_clause( $experiment_dir, @filter_config_names );
# The write branch applies the data filters on the trace and the
# instruction filters on the pilot, so the clause is built per column.
my $data_extra =
Filters::build_filter_clause_restricted( $experiment_dir, qr/^g\./,
@filter_config_names );
my $instr_extra =
Filters::build_filter_clause_restricted( $experiment_dir, qr/^p\./,
@filter_config_names );
# This is the same as ResultsData.pm (how much faultspace
# area ended up in each possible outcome), but applies the
# possible writegroups fix.
#
# At first I have written this query similar to ResultsData.pm, with
# an inner join to reconstruct the "fixed" fspgroup table within the query.
# This was extremely slow since it resulted in a large cross product
# between the write groups/classes and the write pilots injections
# (also I don't think the indices were helping the way I wrote the query).
#
# This version now constructs the result in two
# disjunct branches (as the data is disjunct in known_outcome = 0/1).
my $resulttype_order =
"FIELD(resulttype, 'OK_MARKER', 'FAIL_MARKER', 'DETECTED_MARKER',"
. " 'GROUP1_MARKER', 'GROUP2_MARKER', 'GROUP3_MARKER', 'GROUP4_MARKER',"
. " 'TIMEOUT', 'TRAP', 'WRITE_TEXTSEGMENT', 'ACCESS_OUTERSPACE',"
. " 'SDC', 'UNKNOWN')";
my $querystring = "SELECT
benchmark, resulttype, SUM(faults) AS faults
FROM (
SELECT v.benchmark AS benchmark, rc.resulttype AS resulttype, SUM(cl.len * rc.cnt) AS faults
FROM variant v
JOIN (
SELECT g.variant_id, p.id AS pilot_id, SUM(g.time2 - g.time1 + 1) AS len
FROM trace g
JOIN fsppilot p ON p.variant_id = g.variant_id
AND p.known_outcome = 0
AND p.instr2 = g.instr2
AND p.data_physical_address = g.data_physical_address
WHERE 1 = 1$extra
GROUP BY g.variant_id, p.id
) cl ON cl.variant_id = v.id
JOIN (
SELECT r.pilot_id, r.resulttype, COUNT(*) AS cnt
FROM result_GenericExperimentMessage r
GROUP BY r.pilot_id, r.resulttype
) rc ON rc.pilot_id = cl.pilot_id
WHERE v.variant = '$experiment'
GROUP BY v.id, rc.resulttype
UNION ALL
SELECT v.benchmark AS benchmark, rc.resulttype AS resulttype, wl.len * rc.cnt AS faults
FROM variant v
JOIN (
SELECT g.variant_id, SUM(g.time2 - g.time1 + 1) AS len
FROM trace g
WHERE g.accesstype = 'W'$data_extra
GROUP BY g.variant_id
) wl ON wl.variant_id = v.id
JOIN (
SELECT p.variant_id, r.resulttype, COUNT(*) AS cnt
FROM fsppilot p
JOIN result_GenericExperimentMessage r ON r.pilot_id = p.id
WHERE p.known_outcome = 1$instr_extra
GROUP BY p.variant_id, r.resulttype
) rc ON rc.variant_id = v.id
WHERE v.variant = '$experiment'
) x
GROUP BY benchmark, resulttype
ORDER BY benchmark, $resulttype_order;";
say $querystring;
return $querystring;
}
sub args { return "--batch --raw"; }
sub filename {
my @filter_config_names = grep { defined && length } @_;
my $suffix =
@filter_config_names ? "_" . join( "+", sort @filter_config_names ) : "";
return "resultsdata_writegroups${suffix}.csv";
}
sub postprocess { $_[0] =~ s/\t/,/g; }
1;