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

snlee 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 ec1c859  Relaxing timeColumnName and indexingConfig validation (#6185)
ec1c859 is described below

commit ec1c85987a25416ecb3ce57961d888381b29027d
Author: Seunghyun Lee <sn...@linkedin.com>
AuthorDate: Mon Oct 26 19:24:02 2020 -0700

    Relaxing timeColumnName and indexingConfig validation (#6185)
    
    Current validation code will fail when the time column name or
    indexing config list includes the empty string. We can relax the
    validation by treating the empty string the same as the null value.
    Added the unit test.
---
 .../apache/pinot/core/util/TableConfigUtils.java   | 30 +++++++++++++++++++++-
 .../pinot/core/util/TableConfigUtilsTest.java      | 30 ++++++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/util/TableConfigUtils.java 
b/pinot-core/src/main/java/org/apache/pinot/core/util/TableConfigUtils.java
index f2c787e..83d752c 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/util/TableConfigUtils.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/util/TableConfigUtils.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.pinot.common.tier.TierFactory;
@@ -75,6 +76,8 @@ public final class TableConfigUtils {
     if (tableConfig.getTableType() == TableType.REALTIME) {
       Preconditions.checkState(schema != null, "Schema should not be null for 
REALTIME table");
     }
+    // Sanitize the table config before validation
+    sanitize(tableConfig);
     validateValidationConfig(tableConfig, schema);
     validateIngestionConfig(tableConfig.getIngestionConfig(), schema);
     validateTierConfigList(tableConfig.getTierConfigsList());
@@ -150,7 +153,7 @@ public final class TableConfigUtils {
       Preconditions.checkState(timeColumnName != null, "'timeColumnName' 
cannot be null in REALTIME table config");
     }
     // timeColumnName can be null in OFFLINE table
-    if (timeColumnName != null && schema != null) {
+    if (timeColumnName != null && !timeColumnName.isEmpty() && schema != null) 
{
       Preconditions.checkState(schema.getSpecForTimeColumn(timeColumnName) != 
null,
           "Cannot find valid fieldSpec for timeColumn: %s from the table 
config: %s, in the schema: %s", timeColumnName,
           tableConfig.getTableName(), schema.getSchemaName());
@@ -438,4 +441,29 @@ public final class TableConfigUtils {
           "Column Name " + columnName + " defined in field config list must be 
a valid column defined in the schema");
     }
   }
+
+  private static void sanitize(TableConfig tableConfig) {
+    
tableConfig.setIndexingConfig(sanitizeIndexingConfig(tableConfig.getIndexingConfig()));
+  }
+
+  private static IndexingConfig sanitizeIndexingConfig(IndexingConfig 
indexingConfig) {
+    
indexingConfig.setInvertedIndexColumns(sanitizeListBasedIndexingColumns(indexingConfig.getInvertedIndexColumns()));
+    
indexingConfig.setNoDictionaryColumns(sanitizeListBasedIndexingColumns(indexingConfig.getNoDictionaryColumns()));
+    
indexingConfig.setSortedColumn(sanitizeListBasedIndexingColumns(indexingConfig.getSortedColumn()));
+    
indexingConfig.setBloomFilterColumns(sanitizeListBasedIndexingColumns(indexingConfig.getBloomFilterColumns()));
+    indexingConfig
+        
.setOnHeapDictionaryColumns(sanitizeListBasedIndexingColumns(indexingConfig.getOnHeapDictionaryColumns()));
+    
indexingConfig.setRangeIndexColumns(sanitizeListBasedIndexingColumns(indexingConfig.getRangeIndexColumns()));
+    indexingConfig.setVarLengthDictionaryColumns(
+        
sanitizeListBasedIndexingColumns(indexingConfig.getVarLengthDictionaryColumns()));
+    return indexingConfig;
+  }
+
+  private static List<String> sanitizeListBasedIndexingColumns(List<String> 
indexingColumns) {
+    if (indexingColumns != null) {
+      // Disregard the empty string value for indexing columns
+      return indexingColumns.stream().filter(v -> 
!v.isEmpty()).collect(Collectors.toList());
+    }
+    return null;
+  }
 }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/util/TableConfigUtilsTest.java 
b/pinot-core/src/test/java/org/apache/pinot/core/util/TableConfigUtilsTest.java
index 55aa1d6..8594463 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/util/TableConfigUtilsTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/util/TableConfigUtilsTest.java
@@ -157,6 +157,12 @@ public class TableConfigUtilsTest {
       // expected
     }
 
+    // empty timeColumnName - valid
+    schema = new Schema.SchemaBuilder().setSchemaName(TABLE_NAME).build();
+    tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME).setTimeColumnName("").build();
+    TableConfigUtils.validate(tableConfig, schema);
+
     // valid
     schema = new Schema.SchemaBuilder().setSchemaName(TABLE_NAME)
         .addDateTime(TIME_COLUMN, FieldSpec.DataType.LONG, 
"1:MILLISECONDS:EPOCH", "1:MILLISECONDS").build();
@@ -501,6 +507,10 @@ public class TableConfigUtilsTest {
     }
 
     tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
+        .setInvertedIndexColumns(Arrays.asList("")).build();
+    TableConfigUtils.validate(tableConfig, schema);
+
+    tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setInvertedIndexColumns(Arrays.asList("myCol2")).build();
     try {
       TableConfigUtils.validate(tableConfig, schema);
@@ -510,6 +520,10 @@ public class TableConfigUtilsTest {
     }
 
     tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
+        .setNoDictionaryColumns(Arrays.asList("")).build();
+    TableConfigUtils.validate(tableConfig, schema);
+
+    tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(Arrays.asList("myCol2")).build();
     try {
       TableConfigUtils.validate(tableConfig, schema);
@@ -519,6 +533,10 @@ public class TableConfigUtilsTest {
     }
 
     tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
+        .setOnHeapDictionaryColumns(Arrays.asList("")).build();
+    TableConfigUtils.validate(tableConfig, schema);
+
+    tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setOnHeapDictionaryColumns(Arrays.asList("myCol2")).build();
     try {
       TableConfigUtils.validate(tableConfig, schema);
@@ -528,6 +546,11 @@ public class TableConfigUtilsTest {
     }
 
     tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME).setRangeIndexColumns(Arrays.asList(""))
+            .build();
+    TableConfigUtils.validate(tableConfig, schema);
+
+    tableConfig =
         new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME).setRangeIndexColumns(Arrays.asList("myCol2"))
             .build();
     try {
@@ -537,6 +560,9 @@ public class TableConfigUtilsTest {
       // expected
     }
 
+    tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME).setSortedColumn("").build();
+    TableConfigUtils.validate(tableConfig, schema);
+
     tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME).setSortedColumn("myCol2").build();
     try {
       TableConfigUtils.validate(tableConfig, schema);
@@ -546,6 +572,10 @@ public class TableConfigUtilsTest {
     }
 
     tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
+        .setVarLengthDictionaryColumns(Arrays.asList("")).build();
+    TableConfigUtils.validate(tableConfig, schema);
+
+    tableConfig = new 
TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setVarLengthDictionaryColumns(Arrays.asList("myCol2")).build();
     try {
       TableConfigUtils.validate(tableConfig, schema);


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

Reply via email to