mqliang commented on a change in pull request #8433:
URL: https://github.com/apache/pinot/pull/8433#discussion_r838004763



##########
File path: 
pinot-common/src/main/java/org/apache/pinot/common/utils/SqlResultComparator.java
##########
@@ -381,22 +384,22 @@ private static boolean 
areNumEntriesScannedInFilterEqual(JsonNode actual, JsonNo
     return true;
   }
 
-  private static boolean areNumEntriesScannedPostFilterEqual(JsonNode actual, 
JsonNode expected) {
+  private static boolean isNumEntriesScannedPostFilterBetter(JsonNode actual, 
JsonNode expected) {
     long actualNumEntriesScannedPostFilter = 
actual.get(FIELD_NUM_ENTRIES_SCANNED_POST_FILTER).asLong();
     long expectedNumEntriesScannedPostFilter = 
expected.get(FIELD_NUM_ENTRIES_SCANNED_POST_FILTER).asLong();
-    if (actualNumEntriesScannedPostFilter != 
expectedNumEntriesScannedPostFilter) {
+    if (actualNumEntriesScannedPostFilter > 
expectedNumEntriesScannedPostFilter) {
       LOGGER.error("The numEntriesScannedPostFilter don't match! Actual: {}, 
Expected: {}",

Review comment:
       The numEntriesScannedPostFilter is worse

##########
File path: 
pinot-common/src/main/java/org/apache/pinot/common/utils/SqlResultComparator.java
##########
@@ -126,29 +126,32 @@ public static boolean areEqual(JsonNode actual, JsonNode 
expected, String query)
      */
     if (expected.has(FIELD_IS_SUPERSET) && 
expected.get(FIELD_IS_SUPERSET).asBoolean(false)) {
       return areElementsSubset(actualElementsSerialized, 
expectedElementsSerialized);
-    } else {
-      if (!areLengthsEqual(actual, expected)) {
-        return false;
-      }
-      /*
-       * Pinot server do some early termination optimization (process in 
parallel and early return if get enough
-       * documents to fulfill the LIMIT and OFFSET requirement) for queries:
-       * - selection without order by
-       * - selection with order by (by sorting the segments on min-max value)
-       * - DISTINCT queries.
-       * numDocsScanned is non-deterministic for those queries so 
numDocsScanned comparison should be skipped.
-       *
-       * NOTE: DISTINCT queries are modeled as non-selection queries during 
query processing, but all DISTINCT
-       * queries are selection queries during Calcite parsing (DISTINCT 
queries are selection queries with
-       * selectNode.getModifierNode(SqlSelectKeyword.DISTINCT) != null).
-       */
-      if (!isSelectionQuery(query) && !areNumDocsScannedEqual(actual, 
expected)) {
-        return false;
-      }
-      return isOrderByQuery(query) ? areOrderByQueryElementsEqual(actualRows, 
expectedRows, actualElementsSerialized,
-          expectedElementsSerialized, query)
-          : areNonOrderByQueryElementsEqual(actualElementsSerialized, 
expectedElementsSerialized);
     }
+    if (!areLengthsEqual(actual, expected)) {
+      return false;
+    }
+    boolean areResultsEqual = isOrderByQuery(query) ? 
areOrderByQueryElementsEqual(actualRows, expectedRows,
+        actualElementsSerialized, expectedElementsSerialized, query)
+        : areNonOrderByQueryElementsEqual(actualElementsSerialized, 
expectedElementsSerialized);
+    /*
+     * Pinot servers implement early termination optimization (process in 
parallel and early return if we get enough
+     * documents to fulfill the LIMIT and OFFSET requirement) for queries for 
the following cases:
+     * - selection without order by
+     * - selection with order by (by sorting the segments on min-max value)
+     * - DISTINCT queries.
+     * numDocsScanned is non-deterministic for those queries so numDocsScanned 
comparison should be skipped.
+     *
+     * In other cases, we accept if numDocsScanned is better than the expected 
one, since that is indicative of
+     * performance improvement.
+     *
+     * NOTE: DISTINCT queries are modeled as non-selection queries during 
query processing, but all DISTINCT
+     * queries are selection queries during Calcite parsing (DISTINCT queries 
are selection queries with
+     * selectNode.getModifierNode(SqlSelectKeyword.DISTINCT) != null).
+     */
+    if (areResultsEqual && !isSelectionQuery(query) && 
!isNumDocsScannedBetter(actual, expected)) {
+      return false;
+    }
+    return areResultsEqual;

Review comment:
       ```
   if ( !isSelectionQuery(query) && !isNumDocsScannedBetter(actual, expected)) {
         return false;
   }
   return areResultsEqual;
   ```

##########
File path: 
pinot-common/src/main/java/org/apache/pinot/common/utils/SqlResultComparator.java
##########
@@ -369,10 +372,10 @@ private static boolean areNumServersQueriedEqual(JsonNode 
actual, JsonNode expec
     return true;
   }
 
-  private static boolean areNumEntriesScannedInFilterEqual(JsonNode actual, 
JsonNode expected) {
+  private static boolean isNumEntriesScannedInFilterBetter(JsonNode actual, 
JsonNode expected) {
     long actualNumEntriesScannedInFilter = 
actual.get(FIELD_NUM_ENTRIES_SCANNED_IN_FILTER).asLong();
     long expectedNumEntriesScannedInFilter = 
expected.get(FIELD_NUM_ENTRIES_SCANNED_IN_FILTER).asLong();
-    if (actualNumEntriesScannedInFilter != expectedNumEntriesScannedInFilter) {
+    if (actualNumEntriesScannedInFilter > expectedNumEntriesScannedInFilter) {
       LOGGER
           .error("The numEntriesScannedInFilter don't match! Actual: {}, 
Expected: {}", actualNumEntriesScannedInFilter,

Review comment:
       The numEntriesScannedInFilter is worse




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to