Skip to content

Commit fb3b7a3

Browse files
committed
precision for decimal/float types
1 parent f943af0 commit fb3b7a3

File tree

6 files changed

+135
-35
lines changed

6 files changed

+135
-35
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
300057.3299997481
1+
300057.3299998181

framework/src/main/java/org/apache/drill/test/framework/CmdParam.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ public class CmdParam {
5959
@Parameter(names = {"-t"}, description = "timeout", required=false)
6060
public int timeout = 120;
6161

62+
@Parameter(names = {"-pF"}, description = "precision value for float values", required=false)
63+
public double precisionFloat = 1.0E-6;
64+
65+
@Parameter(names = {"-pD"}, description = "precision value for double values", required=false)
66+
public double precisionDouble = 1.0E-12;
67+
6268
@Parameter(names = {"-w"}, description = "enable write actual query result to file", required=false)
6369
public boolean outputQueryResult = false;
6470

framework/src/main/java/org/apache/drill/test/framework/ColumnList.java

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class ColumnList {
3232
private final List<Integer> types;
3333
private final boolean Simba;
3434
public static final String SIMBA_JDBC = "sjdbc";
35-
3635
public ColumnList(List<Integer> types, List<Object> values) {
3736
this.values = values;
3837
this.types = types;
@@ -63,6 +62,11 @@ public List<Object> getValues() {
6362
*/
6463
@Override
6564
public boolean equals(Object object) {
65+
return (compare(this, (ColumnList) object)>0);
66+
}
67+
68+
69+
public int equallll(Object object) {
6670
return compare(this, (ColumnList) object);
6771
}
6872

@@ -132,20 +136,20 @@ public String toString() {
132136
return sb.toString();
133137
}
134138

135-
private boolean compare(ColumnList o1, ColumnList o2) {
139+
public int compare(ColumnList o1, ColumnList o2) {
136140
List<Object> list1 = o1.values;
137141
List<Object> list2 = o2.values;
138-
if (list1.size() != list2.size()) return false;
142+
if (list1.size() != list2.size()) return 0;
139143
for (int i = 0; i < list1.size(); i++) {
140144
if (types == null || types.size() == 0) {
141-
if (!list1.get(i).equals(list2.get(i))) return false;
145+
if (!list1.get(i).equals(list2.get(i))) return 0;
142146
continue;
143147
}
144148
if (bothNull(list1.get(i), list2.get(i))) {
145149
continue;
146150
}
147151
if (oneNull(list1.get(i), list2.get(i))) {
148-
return false;
152+
return 0;
149153
}
150154
int type = (Integer) (types.get(i));
151155
try {
@@ -155,9 +159,22 @@ private boolean compare(ColumnList o1, ColumnList o2) {
155159
float f1 = (Float) list1.get(i);
156160
float f2 = (Float) list2.get(i);
157161
if ((f1 + f2) / 2 != 0) {
158-
if (!(Math.abs((f1 - f2) / ((f1 + f2) / 2)) < 1.0E-6)) return false;
162+
if (!(Math.abs((f1 - f2) / ((f1 + f2) / 2)) < TestDriver.cmdParam.precisionFloat)){
163+
if (!(Math.abs((f1 - f2) / ((f1 + f2) / 2)) < TestDriver.cmdParam.precisionFloat*10)){
164+
if (!(Math.abs((f1 - f2) / ((f1 + f2) / 2)) < TestDriver.cmdParam.precisionFloat*100)){
165+
return 0;
166+
}
167+
else{
168+
return -1;//data precision error
169+
}
170+
}
171+
else{
172+
return -1;
173+
}
174+
//return false;
175+
}
159176
} else if (f1 != 0) {
160-
return false;
177+
return 0;//data verification error
161178
}
162179
break;
163180
case Types.DOUBLE:
@@ -168,26 +185,39 @@ private boolean compare(ColumnList o1, ColumnList o2) {
168185
// otherwise proceed with "loosened" logic
169186
if (!d1.equals(d2)) {
170187
if ((d1 + d2) / 2 != 0) {
171-
if (!(Math.abs((d1 - d2) / ((d1 + d2) / 2)) < 1.0E-12)) return false;
188+
if (!(Math.abs((d1 - d2) / ((d1 + d2) / 2)) < TestDriver.cmdParam.precisionDouble)){
189+
if (!(Math.abs((d1 - d2) / ((d1 + d2) / 2)) < TestDriver.cmdParam.precisionDouble*10)){
190+
if (!(Math.abs((d1 - d2) / ((d1 + d2) / 2)) < TestDriver.cmdParam.precisionDouble*100)){
191+
return 0;
192+
}
193+
else{
194+
return -1;
195+
}
196+
}
197+
else{
198+
return -1;
199+
}
200+
//return false;
201+
}
172202
} else if (d1 != 0) {
173-
return false;
203+
return 0;
174204
}
175205
}
176206
break;
177207
case Types.DECIMAL:
178208
BigDecimal bd1 = (BigDecimal) list1.get(i);
179209
BigDecimal bd2 = (BigDecimal) list2.get(i);
180-
if (!(bd1.compareTo(bd2) == 0)) return false;
210+
if (!(bd1.compareTo(bd2) == 0)) return 0;
181211
break;
182212
default:
183-
if (!(list1.get(i).equals(list2.get(i)))) return false;
213+
if (!(list1.get(i).equals(list2.get(i)))) return 0;
184214
break;
185215
}
186216
} catch (Exception e) {
187-
if (!(list1.get(i).equals(list2.get(i)))) return false;
217+
if (!(list1.get(i).equals(list2.get(i)))) return 0;
188218
}
189219
}
190-
return true;
220+
return 1;
191221
}
192222

193223
public static boolean bothNull(Object obj1, Object obj2) {

framework/src/main/java/org/apache/drill/test/framework/DrillTestJdbc.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.drill.test.framework.TestCaseModeler.TestMatrix;
2323
import org.apache.drill.test.framework.TestVerifier.TestStatus;
2424
import org.apache.drill.test.framework.TestVerifier.VerificationException;
25+
import org.apache.drill.test.framework.TestVerifier.PrecisionException;
2526
import org.apache.drill.test.framework.TestVerifier.PlanVerificationException;
2627
import org.apache.log4j.Logger;
2728

@@ -131,7 +132,10 @@ public void run() {
131132
}
132133
} catch (VerificationException e) {
133134
fail(TestStatus.DATA_VERIFICATION_FAILURE, e);
134-
} catch (PlanVerificationException e) {
135+
}catch (PrecisionException e) {
136+
fail(TestStatus.DATA_PRECISION_FAILURE, e);
137+
}
138+
catch (PlanVerificationException e) {
135139
fail(TestStatus.PLAN_VERIFICATION_FAILURE, e);
136140
} catch (Exception e) {
137141
fail(TestStatus.EXECUTION_FAILURE, e);

framework/src/main/java/org/apache/drill/test/framework/TestDriver.java

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ public int runTests() throws Exception {
182182

183183
HashSet <DrillTest> finalExecutionFailures = new HashSet<DrillTest>();
184184
HashSet <DrillTest> finalDataVerificationFailures = new HashSet<DrillTest>();
185+
HashSet <DrillTest> finalDataPrecisionFailures = new HashSet<DrillTest>();
185186
HashSet <DrillTest> finalPlanVerificationFailures = new HashSet<DrillTest>();
186187
HashSet <DrillTest> finalCancelledFailures = new HashSet<DrillTest>();
187188
HashSet <DrillTest> finalRandomFailures = new HashSet<DrillTest>();
@@ -190,6 +191,7 @@ public int runTests() throws Exception {
190191
int totalPassingTests = 0;
191192
int totalExecutionFailures = 0;
192193
int totalDataVerificationFailures = 0;
194+
int totalDataPrecisionFailures = 0;
193195
int totalPlanVerificationFailures = 0;
194196
int totalTimeoutFailures = 0;
195197
int totalCancelledFailures = 0;
@@ -203,6 +205,7 @@ public int runTests() throws Exception {
203205

204206
List<DrillTest> passingTests = Lists.newArrayList();
205207
List<DrillTest> dataVerificationFailures = Lists.newArrayList();
208+
List<DrillTest> dataPrecisionFailures = Lists.newArrayList();
206209
List<DrillTest> planVerificationFailures = Lists.newArrayList();
207210
List<DrillTest> executionFailures = Lists.newArrayList();
208211
List<DrillTest> timeoutFailures = Lists.newArrayList();
@@ -287,6 +290,9 @@ public int runTests() throws Exception {
287290
case DATA_VERIFICATION_FAILURE:
288291
dataVerificationFailures.add(test);
289292
break;
293+
case DATA_PRECISION_FAILURE:
294+
dataPrecisionFailures.add(test);
295+
break;
290296
case PLAN_VERIFICATION_FAILURE:
291297
planVerificationFailures.add(test);
292298
break;
@@ -328,6 +334,9 @@ public int runTests() throws Exception {
328334
else if(dataVerificationFailures.contains(test)){
329335
dataVerificationFailures.remove(test);
330336
}
337+
else if(dataPrecisionFailures.contains(test)){
338+
dataPrecisionFailures.remove(test);
339+
}
331340
else if(planVerificationFailures.contains(test)){
332341
planVerificationFailures.remove(test);
333342
}
@@ -337,7 +346,7 @@ else if(timeoutFailures.contains(test)){
337346
}
338347
}
339348

340-
if(executionFailures.size()>0 || dataVerificationFailures.size()>0 || planVerificationFailures.size()>0 || timeoutFailures.size()>0) {
349+
if(executionFailures.size()>0 || dataVerificationFailures.size()>0 || dataPrecisionFailures.size()>0 || planVerificationFailures.size()>0 || timeoutFailures.size()>0) {
341350
LOG.info("\n"+DrillTestDefaults.LINE_BREAK+"\nITERATION FAILURES\n"+DrillTestDefaults.LINE_BREAK);
342351
}
343352

@@ -357,6 +366,15 @@ else if(timeoutFailures.contains(test)){
357366
LOG.info(test.getException().getMessage());
358367
}
359368
}
369+
370+
if(dataPrecisionFailures.size()>0) {
371+
LOG.info("\nData Precision Failures:\n");
372+
for (DrillTest test : dataPrecisionFailures) {
373+
LOG.info("Query: " + test.getInputFile()+ "\n" + test.getQuery());
374+
LOG.info("\nBaseline: "+ test.getExpectedFile());
375+
LOG.info(test.getException().getMessage());
376+
}
377+
}
360378

361379
if(planVerificationFailures.size()>0) {
362380
LOG.info("\nPlan Verification Failures:\n");
@@ -390,7 +408,7 @@ else if(timeoutFailures.contains(test)){
390408
}
391409
}
392410

393-
if(executionFailures.size()>0 || dataVerificationFailures.size()>0 || planVerificationFailures.size()>0 || timeoutFailures.size()>0 || randomFailures.size()>0) {
411+
if(executionFailures.size()>0 || dataVerificationFailures.size()>0 || dataPrecisionFailures.size()>0 || planVerificationFailures.size()>0 || timeoutFailures.size()>0 || randomFailures.size()>0) {
394412
LOG.info("\n"+DrillTestDefaults.LINE_BREAK+"\nITERATION RESULTS\n"+DrillTestDefaults.LINE_BREAK);
395413
}
396414

@@ -410,6 +428,13 @@ else if(timeoutFailures.contains(test)){
410428
}
411429
}
412430

431+
if(dataPrecisionFailures.size()>0){
432+
LOG.info("\nData Precision Failures:\n");
433+
for (DrillTest test : dataPrecisionFailures) {
434+
LOG.info(test.getInputFile());
435+
}
436+
}
437+
413438
if(planVerificationFailures.size()>0){
414439
LOG.info("\nPlan Verification Failures:\n");
415440
for (DrillTest test : planVerificationFailures) {
@@ -458,9 +483,10 @@ else if(timeoutFailures.contains(test)){
458483
LOG.info(DrillTestDefaults.LINE_BREAK+"\nITERATION SUMMARY\n"+DrillTestDefaults.LINE_BREAK);
459484
LOG.info("Total Tests : " + (countTotalTests*cmdParam.clones));
460485
LOG.info("Passing Tests : " + passingTests.size());
461-
LOG.info("Failing Tests : " + (executionFailures.size() + dataVerificationFailures.size() + planVerificationFailures.size() + timeoutFailures.size())+"\n");
486+
LOG.info("Failing Tests : " + (executionFailures.size() + dataVerificationFailures.size() + dataPrecisionFailures.size() + planVerificationFailures.size() + timeoutFailures.size())+"\n");
462487
LOG.info("> Execution Failures : " + executionFailures.size());
463488
LOG.info("> Data Verification Failures : " + dataVerificationFailures.size());
489+
LOG.info("> Data Precision Failures : " + dataPrecisionFailures.size());
464490
LOG.info("> Plan Verification Failures : " + planVerificationFailures.size());
465491
LOG.info("> Timeout Failures : " + timeoutFailures.size());
466492

@@ -490,13 +516,15 @@ else if(timeoutFailures.contains(test)){
490516
totalPassingTests += passingTests.size();
491517
totalExecutionFailures += executionFailures.size();
492518
totalDataVerificationFailures += dataVerificationFailures.size();
519+
totalDataPrecisionFailures += dataPrecisionFailures.size();
493520
totalPlanVerificationFailures += planVerificationFailures.size();
494521
totalTimeoutFailures += timeoutFailures.size();
495522
totalRandomFailures += randomFailures.size();
496523
totalCancelledFailures += canceledTests.size();
497524
finalRandomFailures.addAll(randomFailures);
498525
finalExecutionFailures.addAll(executionFailures);
499526
finalDataVerificationFailures.addAll(dataVerificationFailures);
527+
finalDataPrecisionFailures.addAll(dataPrecisionFailures);
500528
finalPlanVerificationFailures.addAll(planVerificationFailures);
501529
finalTimeoutFailures.addAll(timeoutFailures);
502530
}
@@ -505,7 +533,7 @@ else if(timeoutFailures.contains(test)){
505533
LOG.info(DrillTestDefaults.LINE_BREAK+"\n"+String.format("\nCompleted %d iterations.\n Passing tests: %d \n Random failures: %d \n" +
506534
" Execution Failures: %d\n Data Verification Failures: %d\n Plan Verification Failures: %d" +
507535
"\n Timeouts: %d\n Canceled: %d", i-1, totalPassingTests, totalRandomFailures,totalExecutionFailures,
508-
totalDataVerificationFailures, totalPlanVerificationFailures, totalTimeoutFailures, totalCancelledFailures));
536+
totalDataVerificationFailures, totalDataPrecisionFailures, totalPlanVerificationFailures, totalTimeoutFailures, totalCancelledFailures));
509537
if(finalRandomFailures.size()>0){
510538
LOG.info(DrillTestDefaults.LINE_BREAK+"\nRandom Failures:");
511539
for(DrillTest test : finalRandomFailures){
@@ -534,6 +562,12 @@ else if(timeoutFailures.contains(test)){
534562
LOG.info(test.getInputFile());
535563
}
536564
}
565+
if(finalDataPrecisionFailures.size()>0){
566+
LOG.info(DrillTestDefaults.LINE_BREAK+"\nData Precision Failures");
567+
for(DrillTest test : finalDataPrecisionFailures){
568+
LOG.info(test.getInputFile());
569+
}
570+
}
537571
if(finalPlanVerificationFailures.size()>0){
538572
LOG.info(DrillTestDefaults.LINE_BREAK+"\nPlan Verification Failures");
539573
for(DrillTest test : finalPlanVerificationFailures){
@@ -560,7 +594,7 @@ else if(timeoutFailures.contains(test)){
560594
executor.close();
561595
connectionPool.close();
562596
restartDrill();
563-
return totalExecutionFailures + totalDataVerificationFailures + totalPlanVerificationFailures + totalTimeoutFailures + totalRandomFailures;
597+
return totalExecutionFailures + totalDataVerificationFailures + totalDataPrecisionFailures + totalPlanVerificationFailures + totalTimeoutFailures + totalRandomFailures;
564598
}
565599

566600
public void setup() throws IOException, InterruptedException, URISyntaxException {
@@ -880,7 +914,8 @@ private void generateReports(List<DrillTest> tests, int iteration) {
880914
document.set("status", test.getTestStatus().toString());
881915
if(test.getTestStatus().equals(TestStatus.EXECUTION_FAILURE)
882916
|| test.getTestStatus().equals(TestStatus.DATA_VERIFICATION_FAILURE)
883-
|| test.getTestStatus().equals(TestStatus.PLAN_VERIFICATION_FAILURE)) {
917+
||test.getTestStatus().equals(TestStatus.DATA_PRECISION_FAILURE)
918+
|| test.getTestStatus().equals(TestStatus.PLAN_VERIFICATION_FAILURE)) {
884919
document.set("errorMessage", test.getException().toString().replaceAll("\n",""));
885920
}else{
886921
document.set("errorMessage", "N/A");

0 commit comments

Comments
 (0)