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 <xiangfu.1...@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-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org