This is an automated email from the ASF dual-hosted git repository.

siddteotia pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 56ef680  Fix an issue with datetime column in Rule Engine (#6731)
56ef680 is described below

commit 56ef6803a962ad5f51295d9ff8194cb29f8fc47c
Author: Sajjad Moradi <[email protected]>
AuthorDate: Wed Mar 31 22:31:21 2021 -0700

    Fix an issue with datetime column in Rule Engine (#6731)
    
    * Fix an issue with datetime column in Rule Engine
    
    * minor refactoring
    
    * public -> private
---
 .../pinot/controller/recommender/io/InputManager.java  | 18 +++++++++++++-----
 .../pinot/controller/recommender/TestConfigEngine.java | 13 +++++++++++--
 ...n => RealtimeProvisioningInput_dateTimeColumn.json} | 14 +++++++-------
 ....json => RealtimeProvisioningInput_timeColumn.json} |  0
 4 files changed, 31 insertions(+), 14 deletions(-)

diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
index 69f2694..d6e3ccb 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/recommender/io/InputManager.java
@@ -41,6 +41,7 @@ import 
org.apache.pinot.core.query.request.context.utils.BrokerRequestToQueryCon
 import org.apache.pinot.core.requesthandler.BrokerRequestOptimizer;
 import org.apache.pinot.core.requesthandler.PinotQueryParserFactory;
 import org.apache.pinot.parsers.AbstractCompiler;
+import org.apache.pinot.spi.data.DateTimeFieldSpec;
 import org.apache.pinot.spi.data.DimensionFieldSpec;
 import org.apache.pinot.spi.data.FieldSpec;
 import org.apache.pinot.spi.data.MetricFieldSpec;
@@ -141,7 +142,7 @@ public class InputManager {
       throws InvalidInputException {
     LOGGER.info("Preprocessing Input:");
     reorderDimsAndBuildMap();
-    registerColnameFieldType();
+    registerColNameFieldType();
     validateQueries();
     if (_useCardinalityNormalization){
       regulateCardinalityForAll();
@@ -181,15 +182,20 @@ public class InputManager {
     invalidQueries.forEach(_queryWeightMap::remove);
   }
 
-  public void registerColnameFieldType() { // create a map from colname to 
data type
+  // create a map from col name to data type
+  private void registerColNameFieldType() {
     for (DimensionFieldSpec dimensionFieldSpec : 
_schema.getDimensionFieldSpecs()) {
       _colNameFieldTypeMap.put(dimensionFieldSpec.getName(), 
dimensionFieldSpec.getDataType());
     }
     for (MetricFieldSpec metricFieldSpec : _schema.getMetricFieldSpecs()) {
       _colNameFieldTypeMap.put(metricFieldSpec.getName(), 
metricFieldSpec.getDataType());
     }
-    //TODO: add support for multiple getDateTimeFieldSpecs
-    _colNameFieldTypeMap.put(_schema.getTimeFieldSpec().getName(), 
_schema.getTimeFieldSpec().getDataType());
+    for (DateTimeFieldSpec dateTimeFieldSpec : 
_schema.getDateTimeFieldSpecs()) {
+      _colNameFieldTypeMap.put(dateTimeFieldSpec.getName(), 
dateTimeFieldSpec.getDataType());
+    }
+    if (_schemaWithMetaData.getTimeFieldSpec() != null) {
+      _colNameFieldTypeMap.put(_schema.getTimeFieldSpec().getName(), 
_schema.getTimeFieldSpec().getDataType());
+    }
   }
 
   private void reorderDimsAndBuildMap()
@@ -361,7 +367,9 @@ public class InputManager {
     _schemaWithMetaData.getDateTimeFieldSpecs().forEach(fieldMetadata -> {
       _metaDataMap.put(fieldMetadata.getName(), fieldMetadata);
     });
-    _metaDataMap.put(_schemaWithMetaData.getTimeFieldSpec().getName(), 
_schemaWithMetaData.getTimeFieldSpec());
+    if (_schemaWithMetaData.getTimeFieldSpec() != null) {
+      _metaDataMap.put(_schemaWithMetaData.getTimeFieldSpec().getName(), 
_schemaWithMetaData.getTimeFieldSpec());
+    }
   }
 
   @JsonIgnore
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
index c241543..257142c 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/recommender/TestConfigEngine.java
@@ -361,8 +361,17 @@ public class TestConfigEngine {
   }
 
   @Test
-  void testRealtimeProvisioningRule() throws Exception {
-    String input = 
readInputToStr("recommenderInput/RealtimeProvisioningInput.json");
+  void testRealtimeProvisioningRule_withTimeColumn() throws Exception {
+    
testRealtimeProvisioningRule("recommenderInput/RealtimeProvisioningInput_timeColumn.json");
+  }
+
+  @Test
+  void testRealtimeProvisioningRule_withDateTimeColumn() throws Exception {
+    
testRealtimeProvisioningRule("recommenderInput/RealtimeProvisioningInput_dateTimeColumn.json");
+  }
+
+  private void testRealtimeProvisioningRule(String fileName) throws Exception {
+    String input = readInputToStr(fileName);
     String output = RecommenderDriver.run(input);
     ConfigManager configManager = objectMapper.readValue(output, 
ConfigManager.class);
     Map<String, Map<String, String>> recommendations = 
configManager.getRealtimeProvisioningRecommendations();
diff --git 
a/pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput.json
 
b/pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput_dateTimeColumn.json
similarity index 96%
copy from 
pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput.json
copy to 
pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput_dateTimeColumn.json
index cd568d5..a846ecb 100644
--- 
a/pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput.json
+++ 
b/pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput_dateTimeColumn.json
@@ -116,15 +116,15 @@
         "numValuesPerEntry":1
       }
     ],
-    "timeFieldSpec": {
-      "incomingGranularitySpec": {
-        "dataType": "INT",
+    "dateTimeFieldSpecs": [
+      {
         "name": "t",
-        "timeType": "DAYS",
-        "cardinality":1000,
-        "numValuesPerEntry":1
+        "dataType": "INT",
+        "format": "1:DAYS:EPOCH",
+        "granularity": "1:DAYS",
+        "cardinality": 1000
       }
-    }
+    ]
   },
   "queriesWithWeights":{
     "select i from tableName where b in (2,4) and ((a in (1,2,3) and e = 4) or 
c = 7) and d in ('#VALUES', 23) and t > 500": 1,
diff --git 
a/pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput.json
 
b/pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput_timeColumn.json
similarity index 100%
rename from 
pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput.json
rename to 
pinot-controller/src/test/resources/recommenderInput/RealtimeProvisioningInput_timeColumn.json

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

Reply via email to