package Faults;

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 $filters =
      Filters::build_filter_clause( $experiment_dir, @filter_config_names );

    my $querystring = "SELECT
benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults,
CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address,
CASE
  WHEN o.disassemble IS NOT NULL AND SUBSTRING_INDEX(TRIM(o.disassemble), ' ', 1) REGEXP '^[a-zA-Z][a-zA-Z0-9 ]*\$'
  THEN SUBSTRING_INDEX(TRIM(o.disassemble), ' ', 1)
  ELSE NULL
END AS mnemonic
FROM variant v
JOIN trace t ON v.id = t.variant_id
JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address
JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id
JOIN fsppilot p ON r.pilot_id = p.id
LEFT JOIN objdump o ON o.variant_id = v.id AND o.instr_address = p.injection_instr_absolute
WHERE v.variant = '$experiment'$filters
GROUP BY benchmark, resulttype, p.injection_instr_absolute
ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;";

    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 "faults${suffix}.csv";
}

sub postprocess { $_[0] =~ s/\t/,/g; }

1;
