Copilot commented on code in PR #16746:
URL: https://github.com/apache/pinot/pull/16746#discussion_r2324062581


##########
pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java:
##########
@@ -160,54 +160,67 @@ public StreamingOutput 
handleTimeSeriesQueryRange(@QueryParam("language") String
 
   @POST
   @Path("validateMultiStageQuery")
-  public MultiStageQueryValidationResponse 
validateMultiStageQuery(MultiStageQueryValidationRequest request,
+  public List<MultiStageQueryValidationResponse> 
validateMultiStageQuery(MultiStageQueryValidationRequest request,
       @Context HttpHeaders httpHeaders) {
 
-    String sqlQuery = request.getSql().trim();
-    if (request.getSql() == null || sqlQuery.isEmpty()) {
-      return new MultiStageQueryValidationResponse(false, "Request is missing 
the query string field 'sql'", null);
-    }
-
-    Map<String, String> queryOptionsMap = 
RequestUtils.parseQuery(sqlQuery).getOptions();
-    String database = 
DatabaseUtils.extractDatabaseFromQueryRequest(queryOptionsMap, httpHeaders);
-
-    try {
-      TableCache tableCache;
-      if (CollectionUtils.isNotEmpty(request.getTableConfigs()) && 
CollectionUtils.isNotEmpty(request.getSchemas())) {
-        tableCache =
-            new StaticTableCache(request.getTableConfigs(), 
request.getSchemas(), request.getLogicalTableConfigs(),
-                request.isIgnoreCase());
-        LOGGER.info("Validating multi-stage query compilation using static 
table cache for query: {}",
-            request.getSql());
-      } else {
-        // Use TableCache from environment if static fields are not specified
-        tableCache = _pinotHelixResourceManager.getTableCache();
-        LOGGER.info("Validating multi-stage query compilation using Zk table 
cache for query: {}", request.getSql());
-      }
-      try (QueryEnvironment.CompiledQuery compiledQuery = new 
QueryEnvironment(database, tableCache, null).compile(
-          sqlQuery)) {
-        return new MultiStageQueryValidationResponse(true, null, null);
+    List<String> sqlQueries = request.getSql();
+    List<MultiStageQueryValidationResponse> multiStageQueryValidationResponses 
= new ArrayList<>();
+    if (request.getSql() == null || sqlQueries.isEmpty()) {
+      MultiStageQueryValidationResponse multiStageQueryValidationResponse =
+          new MultiStageQueryValidationResponse(false, "Request is missing the 
queries string field 'sql'", null, null);
+      
multiStageQueryValidationResponses.add(multiStageQueryValidationResponse);

Review Comment:
   When the SQL query list is null or empty, the method adds an error response 
but continues processing the (empty) list, which will result in returning the 
error response plus attempting to iterate over the empty list. This should 
return early after adding the error response.
   ```suggestion
         
multiStageQueryValidationResponses.add(multiStageQueryValidationResponse);
         return multiStageQueryValidationResponses;
   ```



##########
pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/MultiStageEngineIntegrationTest.java:
##########
@@ -1880,11 +1971,6 @@ public void testValidateQueryApiWithStaticTable()
     upsertConfig.setEnablePreload(true);
     upsertConfig.setDropOutOfOrderRecord(false);
     upsertConfig.setNewSegmentTrackingTimeMs(10000L);
-    
upsertConfig.setMetadataManagerClass("ai.startree.pinot.upsert.rocksdb.RocksDBTableUpsertMetadataManager");
-
-    Map<String, String> metadataManagerConfigs = new HashMap<>();
-    metadataManagerConfigs.put("rocksdb.preload.num_partition_overwrite", "2");
-    upsertConfig.setMetadataManagerConfigs(metadataManagerConfigs);
 
     
upsertConfig.setDefaultPartialUpsertStrategy(UpsertConfig.Strategy.OVERWRITE);

Review Comment:
   The removed lines containing `setMetadataManagerClass` and 
`setMetadataManagerConfigs` appear to be unrelated to the main purpose of this 
PR (adding multiple query support). These changes should be in a separate 
commit or PR to keep the diff focused on the stated purpose.



##########
pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java:
##########
@@ -160,54 +160,67 @@ public StreamingOutput 
handleTimeSeriesQueryRange(@QueryParam("language") String
 
   @POST
   @Path("validateMultiStageQuery")
-  public MultiStageQueryValidationResponse 
validateMultiStageQuery(MultiStageQueryValidationRequest request,
+  public List<MultiStageQueryValidationResponse> 
validateMultiStageQuery(MultiStageQueryValidationRequest request,
       @Context HttpHeaders httpHeaders) {
 
-    String sqlQuery = request.getSql().trim();
-    if (request.getSql() == null || sqlQuery.isEmpty()) {
-      return new MultiStageQueryValidationResponse(false, "Request is missing 
the query string field 'sql'", null);
-    }
-
-    Map<String, String> queryOptionsMap = 
RequestUtils.parseQuery(sqlQuery).getOptions();
-    String database = 
DatabaseUtils.extractDatabaseFromQueryRequest(queryOptionsMap, httpHeaders);
-
-    try {
-      TableCache tableCache;
-      if (CollectionUtils.isNotEmpty(request.getTableConfigs()) && 
CollectionUtils.isNotEmpty(request.getSchemas())) {
-        tableCache =
-            new StaticTableCache(request.getTableConfigs(), 
request.getSchemas(), request.getLogicalTableConfigs(),
-                request.isIgnoreCase());
-        LOGGER.info("Validating multi-stage query compilation using static 
table cache for query: {}",
-            request.getSql());
-      } else {
-        // Use TableCache from environment if static fields are not specified
-        tableCache = _pinotHelixResourceManager.getTableCache();
-        LOGGER.info("Validating multi-stage query compilation using Zk table 
cache for query: {}", request.getSql());
-      }
-      try (QueryEnvironment.CompiledQuery compiledQuery = new 
QueryEnvironment(database, tableCache, null).compile(
-          sqlQuery)) {
-        return new MultiStageQueryValidationResponse(true, null, null);
+    List<String> sqlQueries = request.getSql();
+    List<MultiStageQueryValidationResponse> multiStageQueryValidationResponses 
= new ArrayList<>();
+    if (request.getSql() == null || sqlQueries.isEmpty()) {
+      MultiStageQueryValidationResponse multiStageQueryValidationResponse =
+          new MultiStageQueryValidationResponse(false, "Request is missing the 
queries string field 'sql'", null, null);
+      
multiStageQueryValidationResponses.add(multiStageQueryValidationResponse);
+    }
+    for (String sqlQuery : sqlQueries) {
+      Map<String, String> queryOptionsMap = 
RequestUtils.parseQuery(sqlQuery).getOptions();
+      String database = 
DatabaseUtils.extractDatabaseFromQueryRequest(queryOptionsMap, httpHeaders);
+
+      try {
+        TableCache tableCache;
+        if (CollectionUtils.isNotEmpty(request.getTableConfigs()) && 
CollectionUtils.isNotEmpty(request.getSchemas())) {
+          tableCache =
+              new StaticTableCache(request.getTableConfigs(), 
request.getSchemas(), request.getLogicalTableConfigs(),
+                  request.isIgnoreCase());
+          LOGGER.info("Validating multi-stage query: {} compilation using 
static table cache ",
+              request.getSql());
+        } else {
+          // Use TableCache from environment if static fields are not specified
+          tableCache = _pinotHelixResourceManager.getTableCache();
+          LOGGER.info("Validating multi-stage query: {} compilation using Zk 
table cache", request.getSql());

Review Comment:
   The log message logs the entire list of SQL queries instead of the current 
query being processed. This should log `sqlQuery` instead of `request.getSql()` 
to show which specific query is being validated.



##########
pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java:
##########
@@ -160,54 +160,67 @@ public StreamingOutput 
handleTimeSeriesQueryRange(@QueryParam("language") String
 
   @POST
   @Path("validateMultiStageQuery")
-  public MultiStageQueryValidationResponse 
validateMultiStageQuery(MultiStageQueryValidationRequest request,
+  public List<MultiStageQueryValidationResponse> 
validateMultiStageQuery(MultiStageQueryValidationRequest request,
       @Context HttpHeaders httpHeaders) {
 
-    String sqlQuery = request.getSql().trim();
-    if (request.getSql() == null || sqlQuery.isEmpty()) {
-      return new MultiStageQueryValidationResponse(false, "Request is missing 
the query string field 'sql'", null);
-    }
-
-    Map<String, String> queryOptionsMap = 
RequestUtils.parseQuery(sqlQuery).getOptions();
-    String database = 
DatabaseUtils.extractDatabaseFromQueryRequest(queryOptionsMap, httpHeaders);
-
-    try {
-      TableCache tableCache;
-      if (CollectionUtils.isNotEmpty(request.getTableConfigs()) && 
CollectionUtils.isNotEmpty(request.getSchemas())) {
-        tableCache =
-            new StaticTableCache(request.getTableConfigs(), 
request.getSchemas(), request.getLogicalTableConfigs(),
-                request.isIgnoreCase());
-        LOGGER.info("Validating multi-stage query compilation using static 
table cache for query: {}",
-            request.getSql());
-      } else {
-        // Use TableCache from environment if static fields are not specified
-        tableCache = _pinotHelixResourceManager.getTableCache();
-        LOGGER.info("Validating multi-stage query compilation using Zk table 
cache for query: {}", request.getSql());
-      }
-      try (QueryEnvironment.CompiledQuery compiledQuery = new 
QueryEnvironment(database, tableCache, null).compile(
-          sqlQuery)) {
-        return new MultiStageQueryValidationResponse(true, null, null);
+    List<String> sqlQueries = request.getSql();
+    List<MultiStageQueryValidationResponse> multiStageQueryValidationResponses 
= new ArrayList<>();
+    if (request.getSql() == null || sqlQueries.isEmpty()) {
+      MultiStageQueryValidationResponse multiStageQueryValidationResponse =
+          new MultiStageQueryValidationResponse(false, "Request is missing the 
queries string field 'sql'", null, null);
+      
multiStageQueryValidationResponses.add(multiStageQueryValidationResponse);
+    }
+    for (String sqlQuery : sqlQueries) {
+      Map<String, String> queryOptionsMap = 
RequestUtils.parseQuery(sqlQuery).getOptions();
+      String database = 
DatabaseUtils.extractDatabaseFromQueryRequest(queryOptionsMap, httpHeaders);
+
+      try {
+        TableCache tableCache;
+        if (CollectionUtils.isNotEmpty(request.getTableConfigs()) && 
CollectionUtils.isNotEmpty(request.getSchemas())) {
+          tableCache =
+              new StaticTableCache(request.getTableConfigs(), 
request.getSchemas(), request.getLogicalTableConfigs(),
+                  request.isIgnoreCase());
+          LOGGER.info("Validating multi-stage query: {} compilation using 
static table cache ",
+              request.getSql());
+        } else {
+          // Use TableCache from environment if static fields are not specified
+          tableCache = _pinotHelixResourceManager.getTableCache();
+          LOGGER.info("Validating multi-stage query: {} compilation using Zk 
table cache", request.getSql());

Review Comment:
   Same issue as above - this logs the entire list of SQL queries instead of 
the current query being processed. Should log `sqlQuery` instead of 
`request.getSql()`.
   ```suggestion
             LOGGER.info("Validating multi-stage query: {} compilation using Zk 
table cache", sqlQuery);
   ```



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to