1
package GenTest::Transform;
10
use GenTest::Constants;
12
use constant TRANSFORMER_QUERIES_PROCESSED => 0;
13
use constant TRANSFORMER_QUERIES_TRANSFORMED => 1;
15
use constant TRANSFORM_OUTCOME_EXACT_MATCH => 1001;
16
use constant TRANSFORM_OUTCOME_UNORDERED_MATCH => 1002;
17
use constant TRANSFORM_OUTCOME_SUPERSET => 1003;
18
use constant TRANSFORM_OUTCOME_SUBSET => 1004;
19
use constant TRANSFORM_OUTCOME_SINGLE_ROW => 1005;
20
use constant TRANSFORM_OUTCOME_FIRST_ROW => 1006;
21
use constant TRANSFORM_OUTCOME_DISTINCT => 1007;
22
use constant TRANSFORM_OUTCOME_COUNT => 1008;
23
use constant TRANSFORM_OUTCOME_CUSTOM => 1009;
25
my %transform_outcomes = (
26
'TRANSFORM_OUTCOME_EXACT_MATCH' => 1001,
27
'TRANSFORM_OUTCOME_UNORDERED_MATCH' => 1002,
28
'TRANSFORM_OUTCOME_SUPERSET' => 1003,
29
'TRANSFORM_OUTCOME_SUBSET' => 1004,
30
'TRANSFORM_OUTCOME_SINGLE_ROW' => 1005,
31
'TRANSFORM_OUTCOME_FIRST_ROW' => 1006,
32
'TRANSFORM_OUTCOME_DISTINCT' => 1007,
33
'TRANSFORM_OUTCOME_COUNT' => 1008,
34
'TRANSFORM_OUTCOME_CUSTOM' => 1009
37
sub transformExecuteValidate {
38
my ($transformer, $original_query, $original_result, $executor) = @_;
40
$transformer->[TRANSFORMER_QUERIES_PROCESSED]++;
42
my $transformed_query = $transformer->transform($original_query, $executor);
44
return STATUS_OK if $transformed_query == STATUS_OK || $transformed_query == STATUS_WONT_HANDLE;
45
return $transformed_query if $transformed_query =~ m{^\d+$}sgio;
47
$transformer->[TRANSFORMER_QUERIES_TRANSFORMED]++;
49
my $result_transformed = $executor->execute($transformed_query, 1);
50
my $transform_outcome = $transformer->validate([ $original_result, $result_transformed ]);
52
return ($transform_outcome, $transformed_query, $result_transformed);
56
my ($transformer, $results) = @_;
58
foreach my $result (@$results) {
59
return STATUS_OK if not defined $result->data();
62
my $transformed_query = $results->[1]->query();
64
my $transform_outcome = TRANSFORM_OUTCOME_CUSTOM;
66
foreach my $potential_outcome (keys %transform_outcomes) {
67
if ($transformed_query =~ m{$potential_outcome}s) {
68
$transform_outcome = $transform_outcomes{$potential_outcome};
73
if ($transform_outcome == TRANSFORM_OUTCOME_SINGLE_ROW) {
74
return $transformer->isSingleRow($results);
75
} elsif ($transform_outcome == TRANSFORM_OUTCOME_DISTINCT) {
76
return $transformer->isDistinct($results);
77
} elsif ($transform_outcome == TRANSFORM_OUTCOME_UNORDERED_MATCH) {
78
return GenTest::Comparator::compare($results->[0], $results->[1]);
79
} elsif ($transform_outcome == TRANSFORM_OUTCOME_SUPERSET) {
80
return $transformer->isSuperset($results);
81
} elsif ($transform_outcome == TRANSFORM_OUTCOME_FIRST_ROW) {
82
return $transformer->isFirstRow($results);
83
} elsif ($transform_outcome == TRANSFORM_OUTCOME_COUNT) {
84
return $transformer->isCount($results);
86
die ("Unknown transform_outcome = $transform_outcome.");
91
my ($transformer, $results) = @_;
94
($results->[1]->rows() == 0) &&
95
($results->[0]->rows() == 0)
99
my $row1 = join('<col>', @{$results->[0]->data()->[0]}) if defined $results->[0]->data();
100
my $row2 = join('<col>', @{$results->[1]->data()->[0]}) if defined $results->[1]->data();
101
return STATUS_CONTENT_MISMATCH if $row1 ne $row2;
107
my ($transformer, $results) = @_;
111
foreach my $i (0..1) {
112
foreach my $row_ref (@{$results->[$i]->data()}) {
113
my $row = join('<col>', @$row_ref);
115
return STATUS_LENGTH_MISMATCH if $rows[$i]->{$row} > 1 && $i == 1;
119
my $distinct_original = join ('<row>', sort keys %{$rows[0]} );
120
my $distinct_transformed = join ('<row>', sort keys %{$rows[1]} );
122
if ($distinct_original ne $distinct_transformed) {
123
return STATUS_CONTENT_MISMATCH;
130
my ($transformer, $results) = @_;
132
foreach my $row_ref (@{$results->[0]->data()}) {
133
my $row = join('<col>', @$row_ref);
137
foreach my $row_ref (@{$results->[1]->data()}) {
138
my $row = join('<col>', @$row_ref);
142
foreach my $row (keys %rows) {
143
return STATUS_LENGTH_MISMATCH if $rows{$row} > 0;
150
my ($transformer, $results) = @_;
153
($results->[1]->rows() == 0) &&
154
($results->[0]->rows() == 0)
157
} elsif ($results->[1]->rows() == 1) {
158
my $transformed_row = join('<col>', @{$results->[1]->data()->[0]});
159
foreach my $original_row_ref (@{$results->[0]->data()}) {
160
my $original_row = join('<col>', @$original_row_ref);
161
return STATUS_OK if $original_row eq $transformed_row;
163
return STATUS_CONTENT_MISMATCH;
165
# More than one row, something is messed up
166
return STATUS_LENGTH_MISMATCH;
171
my ($transformer, $results) = @_;
173
my ($large_result, $small_result) ;
176
($results->[0]->rows() == 0) ||
177
($results->[1]->rows() == 0)
181
($results->[0]->rows() == 1) &&
182
($results->[1]->rows() == 1)
186
($results->[0]->rows() == 1) &&
187
($results->[1]->rows() >= 1)
189
$small_result = $results->[0];
190
$large_result = $results->[1];
192
($results->[1]->rows() == 1) &&
193
($results->[0]->rows() >= 1)
195
$small_result = $results->[1];
196
$large_result = $results->[0];
198
return STATUS_LENGTH_MISMATCH;
201
if ($large_result->rows() != $small_result->data()->[0]->[0]) {
202
return STATUS_LENGTH_MISMATCH;
209
my $transformer = shift;
210
my ($name) = $transformer =~ m{.*::([a-z]*)}sgio;
215
my $transformer = shift;
216
print "# $transformer: queries_processed: ".$transformer->[TRANSFORMER_QUERIES_PROCESSED]."; queries_transformed: ".$transformer->[TRANSFORMER_QUERIES_TRANSFORMED]."\n" if rqg_debug();