Added JSONReportFormatter, a subclass of QueryReportFormatter that does what it says on the tin. WIP as it does not report profile or prepared statement data yet

This commit is contained in:
Brian Fraser fraserb@gmail.com
2013-01-14 13:20:35 -03:00
parent 5e5763f82a
commit 3c63750c9b
4 changed files with 139 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
{
package JSONReportFormatter;
use Mo;
use JSON;
use constant PTDEBUG => $ENV{PTDEBUG} || 0;
extends qw(QueryReportFormatter);
override [qw(rusage date hostname files header profile prepared)] => sub {
return;
};
override event_report => sub {
my ($self, %args) = @_;
return $self->event_report_values(%args);
};
override query_report => sub {
my ($self, %args) = @_;
foreach my $arg ( qw(ea worst orderby groupby) ) {
die "I need a $arg argument" unless defined $arg;
}
my $ea = $args{ea};
my $groupby = $args{groupby};
my $worst = $args{worst};
my $q = $self->Quoter;
my $qv = $self->{QueryReview};
my $qr = $self->{QueryRewriter};
my $query_report_vals = $self->query_report_values(%args);
# Sort the attributes, removing any hidden attributes.
my $attribs = $self->sort_attribs(
($args{select} ? $args{select} : $ea->get_attributes()),
$ea,
);
ITEM:
foreach my $vals ( @$query_report_vals ) {
my $item = $vals->{item};
my $samp_query = $vals->{samp_query};
# ###############################################################
# Print the standard query analysis report.
# ###############################################################
$vals->{event_report} = $self->event_report(
%args,
item => $item,
sample => $ea->results->{samples}->{$item},
rank => $vals->{rank},
reason => $vals->{reason},
attribs => $attribs,
db => $vals->{default_db},
);
if ( $groupby eq 'fingerprint' ) {
if ( $item =~ m/^(?:[\(\s]*select|insert|replace)/ ) {
if ( $item !~ m/^(?:insert|replace)/ ) { # No EXPLAIN
$vals->{for_explain} = "EXPLAIN /*!50100 PARTITIONS*/\n$samp_query\\G\n";
$vals->{explain_report} = $self->explain_report($samp_query, $vals->{default_db});
}
}
else {
my $converted = $qr->convert_to_select($samp_query);
if ( $converted
&& $converted =~ m/^[\(\s]*select/i ) {
$vals->{for_explain} = "EXPLAIN /*!50100 PARTITIONS*/\n$converted\\G\n";
}
}
}
else {
if ( $groupby eq 'tables' ) {
my ( $db, $tbl ) = $q->split_unquote($item);
$vals->{tables_report} = $self->tables_report([$db, $tbl]);
}
}
}
return encode_json($query_report_vals) . "\n";
};
1;
}