You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by xi...@apache.org on 2021/05/25 04:15:19 UTC

[incubator-pinot] branch master updated: Fixing comparison and hashcode for Schema, FieldSpec and ColumnMetadata (#6965)

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

xiangfu 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 1efde00  Fixing comparison and hashcode for Schema, FieldSpec and ColumnMetadata (#6965)
1efde00 is described below

commit 1efde00c91655a361dc1c5fb2868a2693dbe3a52
Author: Xiang Fu <xi...@gmail.com>
AuthorDate: Mon May 24 21:15:06 2021 -0700

    Fixing comparison and hashcode for Schema, FieldSpec and ColumnMetadata (#6965)
---
 .../segment/spi/index/metadata/ColumnMetadata.java | 29 ++++++++++++----------
 .../java/org/apache/pinot/spi/data/FieldSpec.java  |  4 ++-
 .../java/org/apache/pinot/spi/data/Schema.java     |  4 +++
 .../org/apache/pinot/spi/utils/EqualityUtils.java  | 27 ++++++++++++++++++++
 4 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/pinot-segment-spi/src/main/java/org/apache/pinot/segment/spi/index/metadata/ColumnMetadata.java b/pinot-segment-spi/src/main/java/org/apache/pinot/segment/spi/index/metadata/ColumnMetadata.java
index b8859f4..0b1a61e0 100644
--- a/pinot-segment-spi/src/main/java/org/apache/pinot/segment/spi/index/metadata/ColumnMetadata.java
+++ b/pinot-segment-spi/src/main/java/org/apache/pinot/segment/spi/index/metadata/ColumnMetadata.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.pinot.segment.spi.V1Constants;
 import org.apache.pinot.segment.spi.index.creator.TextIndexType;
 import org.apache.pinot.segment.spi.partition.PartitionFunction;
@@ -38,6 +39,7 @@ import org.apache.pinot.spi.data.MetricFieldSpec;
 import org.apache.pinot.spi.data.TimeFieldSpec;
 import org.apache.pinot.spi.data.TimeGranularitySpec;
 import org.apache.pinot.spi.utils.BytesUtils;
+import org.apache.pinot.spi.utils.EqualityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -597,23 +599,24 @@ public class ColumnMetadata {
     }
     if (object instanceof ColumnMetadata) {
       ColumnMetadata columnMetadata = (ColumnMetadata) object;
-      return getColumnName() == columnMetadata.getColumnName() && getCardinality() == columnMetadata.getCardinality()
-          && getTotalDocs() == columnMetadata.getTotalDocs() && getDataType().equals(columnMetadata.getDataType())
-          && getBitsPerElement() == columnMetadata.getBitsPerElement() && getFieldSpec()
-          .equals(columnMetadata.getFieldSpec()) && isSorted() == columnMetadata.isSorted()
+      return StringUtils.equals(getColumnName(), columnMetadata.getColumnName()) && getCardinality() == columnMetadata
+          .getCardinality() && getTotalDocs() == columnMetadata.getTotalDocs() && getDataType()
+          .equals(columnMetadata.getDataType()) && getBitsPerElement() == columnMetadata.getBitsPerElement()
+          && getFieldSpec().equals(columnMetadata.getFieldSpec()) && isSorted() == columnMetadata.isSorted()
           && hasNulls() == columnMetadata.hasNulls() && hasDictionary() == columnMetadata.hasDictionary()
           && hasInvertedIndex() == columnMetadata.hasInvertedIndex() && isSingleValue() == columnMetadata
           .isSingleValue() && isVirtual() == columnMetadata.isVirtual() && getMaxNumberOfMultiValues() == columnMetadata
           .getMaxNumberOfMultiValues() && getTotalNumberOfEntries() == columnMetadata.getTotalNumberOfEntries()
-          && isAutoGenerated() == columnMetadata.isAutoGenerated() && getDefaultNullValueString() == columnMetadata
-          .getDefaultNullValueString() && getTimeUnit() == (columnMetadata.getTimeUnit())
-          && getPaddingCharacter() == columnMetadata.getPaddingCharacter() && minValue == (columnMetadata.getMinValue())
-          && maxValue == (columnMetadata.getMaxValue()) && getPartitionFunction() == (columnMetadata
-          .getPartitionFunction()) && getNumPartitions() == columnMetadata.getNumPartitions()
-          && getPartitions() == (columnMetadata.getPartitions()) && getDateTimeFormat() == (columnMetadata
-          .getDateTimeFormat()) && getDateTimeGranularity() == (columnMetadata.getDateTimeGranularity())
-          && hasFSTIndex() == columnMetadata.hasFSTIndex() && getTextIndexType()
-          .equals(columnMetadata.getTextIndexType());
+          && isAutoGenerated() == columnMetadata.isAutoGenerated() && StringUtils
+          .equals(getDefaultNullValueString(), columnMetadata.getDefaultNullValueString())
+          && getTimeUnit() == (columnMetadata.getTimeUnit()) && getPaddingCharacter() == columnMetadata
+          .getPaddingCharacter() && EqualityUtils.isEqual(getMinValue(), columnMetadata.getMinValue()) && EqualityUtils
+          .isEqual(getMaxValue(), columnMetadata.getMaxValue()) && getPartitionFunction() == (columnMetadata
+          .getPartitionFunction()) && getNumPartitions() == columnMetadata.getNumPartitions() && EqualityUtils
+          .isEqualSet(getPartitions(), columnMetadata.getPartitions()) && StringUtils
+          .equals(getDateTimeFormat(), columnMetadata.getDateTimeFormat()) && StringUtils
+          .equals(getDateTimeGranularity(), columnMetadata.getDateTimeGranularity()) && hasFSTIndex() == columnMetadata
+          .hasFSTIndex() && getTextIndexType().equals(columnMetadata.getTextIndexType());
     }
     return false;
   }
diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/data/FieldSpec.java b/pinot-spi/src/main/java/org/apache/pinot/spi/data/FieldSpec.java
index f77facb..f966f9b 100644
--- a/pinot-spi/src/main/java/org/apache/pinot/spi/data/FieldSpec.java
+++ b/pinot-spi/src/main/java/org/apache/pinot/spi/data/FieldSpec.java
@@ -339,7 +339,8 @@ public abstract class FieldSpec implements Comparable<FieldSpec>, Serializable {
     return EqualityUtils.isEqual(_name, that._name) && EqualityUtils.isEqual(_dataType, that._dataType) && EqualityUtils
         .isEqual(_isSingleValueField, that._isSingleValueField) && EqualityUtils
         .isEqual(getStringValue(_defaultNullValue), getStringValue(that._defaultNullValue)) && EqualityUtils
-        .isEqual(_maxLength, that._maxLength) && EqualityUtils.isEqual(_transformFunction, that._transformFunction);
+        .isEqual(_maxLength, that._maxLength) && EqualityUtils.isEqual(_transformFunction, that._transformFunction)
+        && EqualityUtils.isEqual(_virtualColumnProvider, that._virtualColumnProvider);
   }
 
   @Override
@@ -350,6 +351,7 @@ public abstract class FieldSpec implements Comparable<FieldSpec>, Serializable {
     result = EqualityUtils.hashCodeOf(result, getStringValue(_defaultNullValue));
     result = EqualityUtils.hashCodeOf(result, _maxLength);
     result = EqualityUtils.hashCodeOf(result, _transformFunction);
+    result = EqualityUtils.hashCodeOf(result, _virtualColumnProvider);
     return result;
   }
 
diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/data/Schema.java b/pinot-spi/src/main/java/org/apache/pinot/spi/data/Schema.java
index 40b55d1..25b29ad 100644
--- a/pinot-spi/src/main/java/org/apache/pinot/spi/data/Schema.java
+++ b/pinot-spi/src/main/java/org/apache/pinot/spi/data/Schema.java
@@ -641,6 +641,8 @@ public final class Schema implements Serializable {
         .isEqualIgnoreOrder(_metricFieldSpecs, that._metricFieldSpecs) && EqualityUtils
         .isEqual(_timeFieldSpec, that._timeFieldSpec) && EqualityUtils
         .isEqualIgnoreOrder(_dateTimeFieldSpecs, that._dateTimeFieldSpecs) && EqualityUtils
+        .isEqualIgnoreOrder(_complexFieldSpecs, that._complexFieldSpecs) && EqualityUtils
+        .isEqualMap(_fieldSpecMap, that._fieldSpecMap) && EqualityUtils
         .isEqual(_primaryKeyColumns, that._primaryKeyColumns);
   }
 
@@ -673,6 +675,8 @@ public final class Schema implements Serializable {
     result = EqualityUtils.hashCodeOf(result, _metricFieldSpecs);
     result = EqualityUtils.hashCodeOf(result, _timeFieldSpec);
     result = EqualityUtils.hashCodeOf(result, _dateTimeFieldSpecs);
+    result = EqualityUtils.hashCodeOf(result, _complexFieldSpecs);
+    result = EqualityUtils.hashCodeOf(result, _fieldSpecMap);
     result = EqualityUtils.hashCodeOf(result, _primaryKeyColumns);
     return result;
   }
diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/EqualityUtils.java b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/EqualityUtils.java
index 8839975..13796e0 100644
--- a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/EqualityUtils.java
+++ b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/EqualityUtils.java
@@ -22,6 +22,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
@@ -74,6 +76,9 @@ public class EqualityUtils {
 
   public static boolean isEqual(@Nullable Object left, @Nullable Object right) {
     if (left != null && right != null) {
+      if ((left instanceof Map) && (right instanceof Map)) {
+        return EqualityUtils.isEqualMap((Map)left, (Map)right);
+      }
       return left.equals(right);
     } else {
       return left == right;
@@ -84,6 +89,21 @@ public class EqualityUtils {
     return Arrays.deepEquals(left, right);
   }
 
+  public static boolean isEqualMap(@Nullable Map left, @Nullable Map right) {
+    if (left != null && right != null) {
+      if (left.size() != right.size()) {
+        return false;
+      }
+      for (Object key : left.keySet()) {
+        if ((!right.containsKey(key)) || (!EqualityUtils.isEqual(left.get(key), right.get(key)))) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return left == right;
+  }
+
   @SuppressWarnings("unchecked")
   public static boolean isEqualIgnoreOrder(@Nullable List left, @Nullable List right) {
     if (left != null && right != null) {
@@ -97,6 +117,13 @@ public class EqualityUtils {
     }
   }
 
+  public static boolean isEqualSet(@Nullable Set left, @Nullable Set right) {
+    if (left != null && right != null) {
+      return isEqualIgnoreOrder(Arrays.asList(left.toArray()), Arrays.asList(right.toArray()));
+    }
+    return left == right;
+  }
+
   public static boolean isNullOrNotSameClass(@Nonnull Object left, @Nullable Object right) {
     return right == null || left.getClass() != right.getClass();
   }

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