From a1f704636b66ab07d7baf83ac2d919214ec76db2 Mon Sep 17 00:00:00 2001 From: liyafan82 Date: Tue, 27 Aug 2019 11:13:15 +0800 Subject: [PATCH 1/3] [ARROW-6355][Java] Make range equal visitor reusable --- .../vector/compare/ApproxEqualsVisitor.java | 26 ++++---- .../vector/compare/RangeEqualsVisitor.java | 60 +++++++++++++------ .../dictionary/DictionaryHashTable.java | 7 ++- 3 files changed, 61 insertions(+), 32 deletions(-) diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java index 3e9783f43d6da..f5a53f61d7fdc 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java @@ -49,6 +49,11 @@ public class ApproxEqualsVisitor extends RangeEqualsVisitor { private DiffFunction doubleDiffFunction = (Double value1, Double value2) -> Math.abs(value1 - value2); + public ApproxEqualsVisitor(float floatEpsilon, double doubleEpsilon) { + this.floatEpsilon = floatEpsilon; + this.doubleEpsilon = doubleEpsilon; + } + public ApproxEqualsVisitor(ValueVector right, float epsilon) { this (right, epsilon, epsilon, true); } @@ -66,9 +71,9 @@ public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleE */ public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleEpsilon, boolean typeCheckNeeded, int leftStart, int rightStart, int length) { - super(right, rightStart, leftStart, length, typeCheckNeeded); this.floatEpsilon = floatEpsilon; this.doubleEpsilon = doubleEpsilon; + set(right, rightStart, leftStart, length, typeCheckNeeded); } public void setFloatDiffFunction(DiffFunction floatDiffFunction) { @@ -102,9 +107,9 @@ protected boolean compareUnionVectors(UnionVector left) { return false; } + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); for (int k = 0; k < leftChildren.size(); k++) { - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(rightChildren.get(k), - floatEpsilon, doubleEpsilon); + visitor.set(rightChildren.get(k), 0, 0, rightChildren.get(k).getValueCount(), true); if (!leftChildren.get(k).accept(visitor, null)) { return false; } @@ -121,9 +126,9 @@ protected boolean compareStructVectors(NonNullableStructVector left) { return false; } + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); for (String name : left.getChildFieldNames()) { - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(rightVector.getChild(name), - floatEpsilon, doubleEpsilon); + visitor.set(rightVector.getChild(name), 0, 0, rightVector.getChild(name).getValueCount(), true); if (!left.getChild(name).accept(visitor, null)) { return false; } @@ -134,7 +139,7 @@ protected boolean compareStructVectors(NonNullableStructVector left) { @Override protected boolean compareListVectors(ListVector left) { - + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); for (int i = 0; i < length; i++) { int leftIndex = leftStart + i; int rightIndex = rightStart + i; @@ -160,8 +165,8 @@ protected boolean compareListVectors(ListVector left) { ValueVector leftDataVector = left.getDataVector(); ValueVector rightDataVector = ((ListVector)right).getDataVector(); - if (!leftDataVector.accept(new ApproxEqualsVisitor(rightDataVector, floatEpsilon, doubleEpsilon, - typeCheckNeeded, startIndexLeft, startIndexRight, (endIndexLeft - startIndexLeft)), null)) { + visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true); + if (!leftDataVector.accept(visitor, null)) { return false; } } @@ -175,6 +180,7 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { return false; } + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); for (int i = 0; i < length; i++) { int leftIndex = leftStart + i; int rightIndex = rightStart + i; @@ -200,8 +206,8 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { ValueVector leftDataVector = left.getDataVector(); ValueVector rightDataVector = ((FixedSizeListVector)right).getDataVector(); - if (!leftDataVector.accept(new ApproxEqualsVisitor(rightDataVector, floatEpsilon, doubleEpsilon, - typeCheckNeeded, startIndexLeft, startIndexRight, (endIndexLeft - startIndexLeft)), null)) { + visitor.set(rightDataVector, rightStart, leftStart, endIndexLeft - startIndexLeft, true); + if (!leftDataVector.accept(visitor, null)) { return false; } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java index d69cb7cd0f308..7dc55499393b7 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java @@ -37,23 +37,24 @@ */ public class RangeEqualsVisitor implements VectorVisitor { - protected final ValueVector right; - protected int leftStart; - protected int rightStart; - protected int length; + protected ValueVector right; + protected int leftStart = -1; + protected int rightStart = -1; + protected int length = -1; protected boolean typeCheckNeeded = true; + /** + * The default constructor. + */ + public RangeEqualsVisitor() { + } + /** * Constructs a new instance. */ public RangeEqualsVisitor(ValueVector right, int rightStart, int leftStart, int length, boolean typeCheckNeeded) { - this.leftStart = leftStart; - this.rightStart = rightStart; - this.right = right; - this.length = length; - this.typeCheckNeeded = typeCheckNeeded; - Preconditions.checkArgument(length >= 0, "length must be non negative"); + set(right, rightStart, leftStart, length, typeCheckNeeded); } /** @@ -63,6 +64,18 @@ public RangeEqualsVisitor(ValueVector right, int leftStart, int rightStart, int this(right, rightStart, leftStart, length, true); } + /** + * Sets the parameters for comparison. + */ + public void set(ValueVector right, int rightStart, int leftStart, int length, boolean typeCheckNeeded) { + this.right = right; + this.leftStart = leftStart; + this.rightStart = rightStart; + this.length = length; + this.typeCheckNeeded = typeCheckNeeded; + Preconditions.checkArgument(length >= 0, "length must be non negative"); + } + /** * Do some validation work, like type check and indices check. */ @@ -81,6 +94,12 @@ protected boolean validate(ValueVector left) { Preconditions.checkArgument((rightStart + length) <= right.getValueCount(), "(rightStart + length) %s out of range[0, %s].", 0, right.getValueCount()); + Preconditions.checkArgument(left != null, + "left vector cannot be null"); + + Preconditions.checkArgument(right != null, + "right vector cannot be null"); + return true; } @@ -144,9 +163,10 @@ protected boolean compareUnionVectors(UnionVector left) { return false; } + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); for (int k = 0; k < leftChildren.size(); k++) { - RangeEqualsVisitor visitor = new RangeEqualsVisitor(rightChildren.get(k), - leftStart, rightStart, length); + visitor.set(rightChildren.get(k), + rightStart, leftStart, length, true); if (!leftChildren.get(k).accept(visitor, null)) { return false; } @@ -162,9 +182,10 @@ protected boolean compareStructVectors(NonNullableStructVector left) { return false; } + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); for (String name : left.getChildFieldNames()) { - RangeEqualsVisitor visitor = new RangeEqualsVisitor(rightVector.getChild(name), - leftStart, rightStart, length); + visitor.set(rightVector.getChild(name), + rightStart, leftStart, length, true); if (!left.getChild(name).accept(visitor, null)) { return false; } @@ -236,7 +257,7 @@ protected boolean compareBaseVariableWidthVectors(BaseVariableWidthVector left) } protected boolean compareListVectors(ListVector left) { - + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); for (int i = 0; i < length; i++) { int leftIndex = leftStart + i; int rightIndex = rightStart + i; @@ -262,8 +283,8 @@ protected boolean compareListVectors(ListVector left) { ValueVector leftDataVector = left.getDataVector(); ValueVector rightDataVector = ((ListVector)right).getDataVector(); - if (!leftDataVector.accept(new RangeEqualsVisitor(rightDataVector, startIndexLeft, - startIndexRight, (endIndexLeft - startIndexLeft)), null)) { + visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true); + if (!leftDataVector.accept(visitor, null)) { return false; } } @@ -277,6 +298,7 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { return false; } + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); for (int i = 0; i < length; i++) { int leftIndex = leftStart + i; int rightIndex = rightStart + i; @@ -302,8 +324,8 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { ValueVector leftDataVector = left.getDataVector(); ValueVector rightDataVector = ((FixedSizeListVector)right).getDataVector(); - if (!leftDataVector.accept(new RangeEqualsVisitor(rightDataVector, startIndexLeft, startIndexRight, - (endIndexLeft - startIndexLeft)), null)) { + visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true); + if (!leftDataVector.accept(visitor, null)) { return false; } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java index d012c45471c8b..fe378e1e7c068 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java @@ -136,12 +136,13 @@ static final int roundUpToPowerOf2(int size) { public int getIndex(int indexInArray, ValueVector toEncode) { int hash = toEncode.hashCode(indexInArray); int index = indexFor(hash, table.length); + + RangeEqualsVisitor equalVisitor = new RangeEqualsVisitor(); for (DictionaryHashTable.Entry e = table[index]; e != null ; e = e.next) { if (e.hash == hash) { int dictIndex = e.index; - - if (new RangeEqualsVisitor(dictionary, dictIndex, indexInArray, 1, false) - .equals(toEncode)) { + equalVisitor.set(dictionary, dictIndex, indexInArray, 1, false); + if (equalVisitor.equals(toEncode)) { return dictIndex; } } From 7482414c9e2a1f3b1cf0e6683aaba7139650e7b4 Mon Sep 17 00:00:00 2001 From: liyafan82 Date: Thu, 29 Aug 2019 19:59:42 +0800 Subject: [PATCH 2/3] [ARROW-6355][Java] Wrapper visit parameters into a pojo --- .../deduplicate/DeduplicationUtils.java | 13 +- .../vector/compare/ApproxEqualsVisitor.java | 197 ++---------- .../vector/compare/RangeEqualsParameter.java | 146 +++++++++ .../vector/compare/RangeEqualsVisitor.java | 285 ++++++++---------- .../vector/compare/VectorEqualsVisitor.java | 31 +- .../arrow/vector/dictionary/Dictionary.java | 2 +- .../dictionary/DictionaryHashTable.java | 12 +- .../apache/arrow/vector/TestValueVector.java | 85 +++--- .../compare/TestRangeEqualsVisitor.java | 137 +++++++-- 9 files changed, 495 insertions(+), 413 deletions(-) create mode 100644 java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java diff --git a/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java b/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java index a9fe328125f5a..8ae23d0bd355a 100644 --- a/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java +++ b/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java @@ -22,6 +22,7 @@ import org.apache.arrow.vector.BitVectorHelper; import org.apache.arrow.vector.IntVector; import org.apache.arrow.vector.ValueVector; +import org.apache.arrow.vector.compare.RangeEqualsParameter; import org.apache.arrow.vector.compare.RangeEqualsVisitor; import io.netty.buffer.ArrowBuf; @@ -43,11 +44,15 @@ public static void populateRunStartIndicators(V vector, runStarts.setZero(0, bufSize); BitVectorHelper.setValidityBitToOne(runStarts, 0); - + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setRight(vector) + .setLeft(vector) + .setLength(1) + .setTypeCheckNeeded(false); for (int i = 1; i < vector.getValueCount(); i++) { - RangeEqualsVisitor visitor = new RangeEqualsVisitor( - vector, i - 1, i, /* length */1, /* need check type*/false); - if (!visitor.equals(vector)) { + param.setLeftStart(i).setRightStart(i - 1); + if (!visitor.rangeEquals(param)) { BitVectorHelper.setValidityBitToOne(runStarts, i); } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java index f5a53f61d7fdc..b8924eac5cb6f 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java @@ -17,18 +17,9 @@ package org.apache.arrow.vector.compare; -import java.util.List; - import org.apache.arrow.vector.BaseFixedWidthVector; -import org.apache.arrow.vector.FieldVector; import org.apache.arrow.vector.Float4Vector; import org.apache.arrow.vector.Float8Vector; -import org.apache.arrow.vector.ValueVector; -import org.apache.arrow.vector.complex.BaseRepeatedValueVector; -import org.apache.arrow.vector.complex.FixedSizeListVector; -import org.apache.arrow.vector.complex.ListVector; -import org.apache.arrow.vector.complex.NonNullableStructVector; -import org.apache.arrow.vector.complex.UnionVector; /** * Visitor to compare floating point. @@ -54,28 +45,6 @@ public ApproxEqualsVisitor(float floatEpsilon, double doubleEpsilon) { this.doubleEpsilon = doubleEpsilon; } - public ApproxEqualsVisitor(ValueVector right, float epsilon) { - this (right, epsilon, epsilon, true); - } - - public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleEpsilon) { - this (right, floatEpsilon, doubleEpsilon, true); - } - - public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleEpsilon, boolean typeCheckNeeded) { - this (right, floatEpsilon, doubleEpsilon, typeCheckNeeded, 0, 0, right.getValueCount()); - } - - /** - * Construct an instance. - */ - public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleEpsilon, boolean typeCheckNeeded, - int leftStart, int rightStart, int length) { - this.floatEpsilon = floatEpsilon; - this.doubleEpsilon = doubleEpsilon; - set(right, rightStart, leftStart, length, typeCheckNeeded); - } - public void setFloatDiffFunction(DiffFunction floatDiffFunction) { this.floatDiffFunction = floatDiffFunction; } @@ -85,152 +54,39 @@ public void setDoubleDiffFunction(DiffFunction doubleDiffFunction) { } @Override - public Boolean visit(BaseFixedWidthVector left, Void value) { + public Boolean visit(BaseFixedWidthVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); if (left instanceof Float4Vector) { - return validate(left) && float4ApproxEquals((Float4Vector) left); + return parameter.validate() && float4ApproxEquals(parameter); } else if (left instanceof Float8Vector) { - return validate(left) && float8ApproxEquals((Float8Vector) left); + return parameter.validate() && float8ApproxEquals(parameter); } else { - return super.visit(left, value); + return super.visit(left, parameter); } } @Override - protected boolean compareUnionVectors(UnionVector left) { - - UnionVector rightVector = (UnionVector) right; - - List leftChildren = left.getChildrenFromFields(); - List rightChildren = rightVector.getChildrenFromFields(); - - if (leftChildren.size() != rightChildren.size()) { - return false; - } - - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); - for (int k = 0; k < leftChildren.size(); k++) { - visitor.set(rightChildren.get(k), 0, 0, rightChildren.get(k).getValueCount(), true); - if (!leftChildren.get(k).accept(visitor, null)) { - return false; - } - } - return true; - } - - @Override - protected boolean compareStructVectors(NonNullableStructVector left) { - - NonNullableStructVector rightVector = (NonNullableStructVector) right; - - if (!left.getChildFieldNames().equals(rightVector.getChildFieldNames())) { - return false; - } - - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); - for (String name : left.getChildFieldNames()) { - visitor.set(rightVector.getChild(name), 0, 0, rightVector.getChild(name).getValueCount(), true); - if (!left.getChild(name).accept(visitor, null)) { - return false; - } - } - - return true; - } - - @Override - protected boolean compareListVectors(ListVector left) { - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; - - boolean isNull = left.isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { - return false; - } - - int offsetWidth = BaseRepeatedValueVector.OFFSET_WIDTH; - - if (!isNull) { - final int startIndexLeft = left.getOffsetBuffer().getInt(leftIndex * offsetWidth); - final int endIndexLeft = left.getOffsetBuffer().getInt((leftIndex + 1) * offsetWidth); - - final int startIndexRight = right.getOffsetBuffer().getInt(rightIndex * offsetWidth); - final int endIndexRight = right.getOffsetBuffer().getInt((rightIndex + 1) * offsetWidth); - - if ((endIndexLeft - startIndexLeft) != (endIndexRight - startIndexRight)) { - return false; - } - - ValueVector leftDataVector = left.getDataVector(); - ValueVector rightDataVector = ((ListVector)right).getDataVector(); - - visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true); - if (!leftDataVector.accept(visitor, null)) { - return false; - } - } - } - return true; + protected ApproxEqualsVisitor createInnerVisitor() { + return new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); } - protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { + private boolean float4ApproxEquals(RangeEqualsParameter parameter) { + Float4Vector leftVector = (Float4Vector) parameter.getLeft(); + Float4Vector rightVector = (Float4Vector) parameter.getRight(); - if (left.getListSize() != ((FixedSizeListVector)right).getListSize()) { - return false; - } + for (int i = 0; i < parameter.getLength(); i++) { + int leftIndex = parameter.getLeftStart() + i; + int rightIndex = parameter.getRightStart() + i; - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; + boolean isNull = leftVector.isNull(leftIndex); - boolean isNull = left.isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { + if (isNull != rightVector.isNull(rightIndex)) { return false; } - int listSize = left.getListSize(); - if (!isNull) { - final int startIndexLeft = leftIndex * listSize; - final int endIndexLeft = (leftIndex + 1) * listSize; - - final int startIndexRight = rightIndex * listSize; - final int endIndexRight = (rightIndex + 1) * listSize; - - if ((endIndexLeft - startIndexLeft) != (endIndexRight - startIndexRight)) { - return false; - } - - ValueVector leftDataVector = left.getDataVector(); - ValueVector rightDataVector = ((FixedSizeListVector)right).getDataVector(); - - visitor.set(rightDataVector, rightStart, leftStart, endIndexLeft - startIndexLeft, true); - if (!leftDataVector.accept(visitor, null)) { - return false; - } - } - } - return true; - } - - private boolean float4ApproxEquals(Float4Vector left) { - - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; - - boolean isNull = left.isNull(leftIndex); - - if (isNull != right.isNull(rightIndex)) { - return false; - } - - if (!isNull) { - - Float leftValue = left.get(leftIndex); - Float rightValue = ((Float4Vector)right).get(rightIndex); + Float leftValue = leftVector.get(leftIndex); + Float rightValue = rightVector.get(rightIndex); if (leftValue.isNaN()) { return rightValue.isNaN(); } @@ -245,21 +101,24 @@ private boolean float4ApproxEquals(Float4Vector left) { return true; } - private boolean float8ApproxEquals(Float8Vector left) { - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; + private boolean float8ApproxEquals(RangeEqualsParameter parameter) { + Float8Vector leftVector = (Float8Vector) parameter.getLeft(); + Float8Vector rightVector = (Float8Vector) parameter.getRight(); + + for (int i = 0; i < parameter.getLength(); i++) { + int leftIndex = parameter.getLeftStart() + i; + int rightIndex = parameter.getRightStart() + i; - boolean isNull = left.isNull(leftIndex); + boolean isNull = leftVector.isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { + if (isNull != rightVector.isNull(rightIndex)) { return false; } if (!isNull) { - Double leftValue = left.get(leftIndex); - Double rightValue = ((Float8Vector)right).get(rightIndex); + Double leftValue = leftVector.get(leftIndex); + Double rightValue = rightVector.get(rightIndex); if (leftValue.isNaN()) { return rightValue.isNaN(); } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java new file mode 100644 index 0000000000000..e1a58ce24e8d2 --- /dev/null +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.arrow.vector.compare; + +import org.apache.arrow.util.Preconditions; +import org.apache.arrow.vector.ValueVector; + +/** + * Wrapper for the parameters of comparing a range of values in two vectors. + */ +public class RangeEqualsParameter { + + /** + * The left vector. + */ + private ValueVector left; + + /** + * The right vector. + */ + private ValueVector right; + + /** + * Start position in the left vector. + */ + private int leftStart = -1; + + /** + * Start position in the right vector. + */ + private int rightStart = -1; + + /** + * Length of the range. + */ + private int length = -1; + + /** + * If type check is required. + */ + private boolean typeCheckNeeded; + + /** + * Checks the type of the left and right vectors. + * @return true if left and right vectors have the same type, and false otherwise. + */ + public boolean checkType() { + if (!typeCheckNeeded) { + return true; + } + return left.getField().getType().equals(right.getField().getType()); + } + + /** + * Do some validation work, like type check and indices check. + */ + public boolean validate() { + if (!checkType()) { + return false; + } + + Preconditions.checkArgument(leftStart >= 0, + "leftStart %s must be non negative.", leftStart); + Preconditions.checkArgument((leftStart + length) <= left.getValueCount(), + "(leftStart + length) %s out of range[0, %s].", 0, left.getValueCount()); + Preconditions.checkArgument(rightStart >= 0, + "rightStart %s must be non negative.", rightStart); + Preconditions.checkArgument((rightStart + length) <= right.getValueCount(), + "(rightStart + length) %s out of range[0, %s].", 0, right.getValueCount()); + Preconditions.checkArgument(left != null, + "left vector cannot be null"); + Preconditions.checkArgument(right != null, + "right vector cannot be null"); + + return true; + } + + public ValueVector getLeft() { + return left; + } + + public ValueVector getRight() { + return right; + } + + public int getLeftStart() { + return leftStart; + } + + public int getRightStart() { + return rightStart; + } + + public int getLength() { + return length; + } + + public boolean isTypeCheckNeeded() { + return typeCheckNeeded; + } + + public RangeEqualsParameter setLeft(ValueVector left) { + this.left = left; + return this; + } + + public RangeEqualsParameter setRight(ValueVector right) { + this.right = right; + return this; + } + + public RangeEqualsParameter setLeftStart(int leftStart) { + this.leftStart = leftStart; + return this; + } + + public RangeEqualsParameter setRightStart(int rightStart) { + this.rightStart = rightStart; + return this; + } + + public RangeEqualsParameter setLength(int length) { + this.length = length; + return this; + } + + public RangeEqualsParameter setTypeCheckNeeded(boolean typeCheckNeeded) { + this.typeCheckNeeded = typeCheckNeeded; + return this; + } +} diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java index 7dc55499393b7..3a7d1f2c05c29 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java @@ -20,11 +20,9 @@ import java.util.List; import org.apache.arrow.memory.util.ByteFunctionHelpers; -import org.apache.arrow.util.Preconditions; import org.apache.arrow.vector.BaseFixedWidthVector; import org.apache.arrow.vector.BaseVariableWidthVector; import org.apache.arrow.vector.FieldVector; -import org.apache.arrow.vector.ValueVector; import org.apache.arrow.vector.ZeroVector; import org.apache.arrow.vector.complex.BaseRepeatedValueVector; import org.apache.arrow.vector.complex.FixedSizeListVector; @@ -35,158 +33,112 @@ /** * Visitor to compare a range of values for vectors. */ -public class RangeEqualsVisitor implements VectorVisitor { - - protected ValueVector right; - protected int leftStart = -1; - protected int rightStart = -1; - protected int length = -1; - - protected boolean typeCheckNeeded = true; - - /** - * The default constructor. - */ - public RangeEqualsVisitor() { - } - - /** - * Constructs a new instance. - */ - public RangeEqualsVisitor(ValueVector right, int rightStart, int leftStart, int length, boolean typeCheckNeeded) { - set(right, rightStart, leftStart, length, typeCheckNeeded); - } - - /** - * Constructs a new instance. - */ - public RangeEqualsVisitor(ValueVector right, int leftStart, int rightStart, int length) { - this(right, rightStart, leftStart, length, true); - } - - /** - * Sets the parameters for comparison. - */ - public void set(ValueVector right, int rightStart, int leftStart, int length, boolean typeCheckNeeded) { - this.right = right; - this.leftStart = leftStart; - this.rightStart = rightStart; - this.length = length; - this.typeCheckNeeded = typeCheckNeeded; - Preconditions.checkArgument(length >= 0, "length must be non negative"); - } - - /** - * Do some validation work, like type check and indices check. - */ - protected boolean validate(ValueVector left) { - - if (!compareValueVector(left, right)) { - return false; - } - - Preconditions.checkArgument(leftStart >= 0, - "leftStart %s must be non negative.", leftStart); - Preconditions.checkArgument((leftStart + length) <= left.getValueCount(), - "(leftStart + length) %s out of range[0, %s].", 0, left.getValueCount()); - Preconditions.checkArgument(rightStart >= 0, - "rightStart %s must be non negative.", rightStart); - Preconditions.checkArgument((rightStart + length) <= right.getValueCount(), - "(rightStart + length) %s out of range[0, %s].", 0, right.getValueCount()); - - Preconditions.checkArgument(left != null, - "left vector cannot be null"); - - Preconditions.checkArgument(right != null, - "right vector cannot be null"); - - return true; - } +public class RangeEqualsVisitor implements VectorVisitor { /** * Check range equals without passing IN param in VectorVisitor. */ - public boolean equals(ValueVector left) { - return left.accept(this, null); + public boolean rangeEquals(RangeEqualsParameter parameter) { + return parameter.getLeft().accept(this, parameter); } @Override - public Boolean visit(BaseFixedWidthVector left, Void value) { - return validate(left) && compareBaseFixedWidthVectors(left); + public Boolean visit(BaseFixedWidthVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate() && compareBaseFixedWidthVectors(parameter); } @Override - public Boolean visit(BaseVariableWidthVector left, Void value) { - return validate(left) && compareBaseVariableWidthVectors(left); + public Boolean visit(BaseVariableWidthVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate() && compareBaseVariableWidthVectors(parameter); } @Override - public Boolean visit(ListVector left, Void value) { - return validate(left) && compareListVectors(left); + public Boolean visit(ListVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate() && compareListVectors(parameter); } @Override - public Boolean visit(FixedSizeListVector left, Void value) { - return validate(left) && compareFixedSizeListVectors(left); + public Boolean visit(FixedSizeListVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate() && compareFixedSizeListVectors(parameter); } @Override - public Boolean visit(NonNullableStructVector left, Void value) { - return validate(left) && compareStructVectors(left); + public Boolean visit(NonNullableStructVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate() && compareStructVectors(parameter); } @Override - public Boolean visit(UnionVector left, Void value) { - return validate(left) && compareUnionVectors(left); + public Boolean visit(UnionVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate() && compareUnionVectors(parameter); } @Override - public Boolean visit(ZeroVector left, Void value) { - return validate(left); + public Boolean visit(ZeroVector left, RangeEqualsParameter parameter) { + parameter.setLeft(left); + return parameter.validate(); } - protected boolean compareValueVector(ValueVector left, ValueVector right) { - if (!typeCheckNeeded) { - return true; - } - return left.getField().getType().equals(right.getField().getType()); + /** + * Creates a visitor to visit child vectors. + * It is used for complex vector types. + * @return the visitor for child vecors. + */ + protected RangeEqualsVisitor createInnerVisitor() { + return new RangeEqualsVisitor(); } - protected boolean compareUnionVectors(UnionVector left) { - - UnionVector rightVector = (UnionVector) right; + protected boolean compareUnionVectors(RangeEqualsParameter parameter) { + UnionVector leftVector = (UnionVector) parameter.getLeft(); + UnionVector rightVector = (UnionVector) parameter.getRight(); - List leftChildren = left.getChildrenFromFields(); + List leftChildren = leftVector.getChildrenFromFields(); List rightChildren = rightVector.getChildrenFromFields(); if (leftChildren.size() != rightChildren.size()) { return false; } - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsVisitor visitor = createInnerVisitor(); + RangeEqualsParameter innerParam = new RangeEqualsParameter() + .setLeftStart(parameter.getLeftStart()) + .setRightStart(parameter.getRightStart()) + .setLength(parameter.getLength()) + .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); + for (int k = 0; k < leftChildren.size(); k++) { - visitor.set(rightChildren.get(k), - rightStart, leftStart, length, true); - if (!leftChildren.get(k).accept(visitor, null)) { + innerParam.setRight(rightChildren.get(k)); + if (!leftChildren.get(k).accept(visitor, innerParam)) { return false; } } return true; } - protected boolean compareStructVectors(NonNullableStructVector left) { + protected boolean compareStructVectors(RangeEqualsParameter parameter) { + NonNullableStructVector leftVector = (NonNullableStructVector) parameter.getLeft(); + NonNullableStructVector rightVector = (NonNullableStructVector) parameter.getRight(); - NonNullableStructVector rightVector = (NonNullableStructVector) right; - - if (!left.getChildFieldNames().equals(rightVector.getChildFieldNames())) { + List leftChildNames = leftVector.getChildFieldNames(); + if (!leftChildNames.equals(rightVector.getChildFieldNames())) { return false; } - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - for (String name : left.getChildFieldNames()) { - visitor.set(rightVector.getChild(name), - rightStart, leftStart, length, true); - if (!left.getChild(name).accept(visitor, null)) { + RangeEqualsVisitor visitor = createInnerVisitor(); + RangeEqualsParameter innerParam = new RangeEqualsParameter() + .setLeftStart(parameter.getLeftStart()) + .setRightStart(parameter.getRightStart()) + .setLength(parameter.getLength()) + .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); + + for (String name : leftChildNames) { + innerParam.setRight(rightVector.getChild(name)); + if (!leftVector.getChild(name).accept(visitor, innerParam)) { return false; } } @@ -194,19 +146,21 @@ protected boolean compareStructVectors(NonNullableStructVector left) { return true; } - protected boolean compareBaseFixedWidthVectors(BaseFixedWidthVector left) { + protected boolean compareBaseFixedWidthVectors(RangeEqualsParameter parameter) { + BaseFixedWidthVector leftVector = (BaseFixedWidthVector) parameter.getLeft(); + BaseFixedWidthVector rightVector = (BaseFixedWidthVector) parameter.getRight(); - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; + for (int i = 0; i < parameter.getLength(); i++) { + int leftIndex = parameter.getLeftStart() + i; + int rightIndex = parameter.getRightStart() + i; - boolean isNull = left.isNull(leftIndex); + boolean isNull = parameter.getLeft().isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { + if (isNull != parameter.getRight().isNull(rightIndex)) { return false; } - int typeWidth = left.getTypeWidth(); + int typeWidth = leftVector.getTypeWidth(); if (!isNull) { int startIndexLeft = typeWidth * leftIndex; int endIndexLeft = typeWidth * (leftIndex + 1); @@ -214,8 +168,8 @@ protected boolean compareBaseFixedWidthVectors(BaseFixedWidthVector left) { int startIndexRight = typeWidth * rightIndex; int endIndexRight = typeWidth * (rightIndex + 1); - int ret = ByteFunctionHelpers.equal(left.getDataBuffer(), startIndexLeft, endIndexLeft, - right.getDataBuffer(), startIndexRight, endIndexRight); + int ret = ByteFunctionHelpers.equal(leftVector.getDataBuffer(), startIndexLeft, endIndexLeft, + rightVector.getDataBuffer(), startIndexRight, endIndexRight); if (ret == 0) { return false; @@ -225,28 +179,30 @@ protected boolean compareBaseFixedWidthVectors(BaseFixedWidthVector left) { return true; } - protected boolean compareBaseVariableWidthVectors(BaseVariableWidthVector left) { + protected boolean compareBaseVariableWidthVectors(RangeEqualsParameter parameter) { + BaseVariableWidthVector leftVector = (BaseVariableWidthVector) parameter.getLeft(); + BaseVariableWidthVector rightVector = (BaseVariableWidthVector) parameter.getRight(); - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; + for (int i = 0; i < parameter.getLength(); i++) { + int leftIndex = parameter.getLeftStart() + i; + int rightIndex = parameter.getRightStart() + i; - boolean isNull = left.isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { + boolean isNull = leftVector.isNull(leftIndex); + if (isNull != rightVector.isNull(rightIndex)) { return false; } int offsetWidth = BaseVariableWidthVector.OFFSET_WIDTH; if (!isNull) { - final int startIndexLeft = left.getOffsetBuffer().getInt(leftIndex * offsetWidth); - final int endIndexLeft = left.getOffsetBuffer().getInt((leftIndex + 1) * offsetWidth); + final int startIndexLeft = leftVector.getOffsetBuffer().getInt(leftIndex * offsetWidth); + final int endIndexLeft = leftVector.getOffsetBuffer().getInt((leftIndex + 1) * offsetWidth); - final int startIndexRight = right.getOffsetBuffer().getInt(rightIndex * offsetWidth); - final int endIndexRight = right.getOffsetBuffer().getInt((rightIndex + 1) * offsetWidth); + final int startIndexRight = rightVector.getOffsetBuffer().getInt(rightIndex * offsetWidth); + final int endIndexRight = rightVector.getOffsetBuffer().getInt((rightIndex + 1) * offsetWidth); - int ret = ByteFunctionHelpers.equal(left.getDataBuffer(), startIndexLeft, endIndexLeft, - right.getDataBuffer(), startIndexRight, endIndexRight); + int ret = ByteFunctionHelpers.equal(leftVector.getDataBuffer(), startIndexLeft, endIndexLeft, + rightVector.getDataBuffer(), startIndexRight, endIndexRight); if (ret == 0) { return false; @@ -256,35 +212,42 @@ protected boolean compareBaseVariableWidthVectors(BaseVariableWidthVector left) return true; } - protected boolean compareListVectors(ListVector left) { - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; + protected boolean compareListVectors(RangeEqualsParameter parameter) { + ListVector leftVector = (ListVector) parameter.getLeft(); + ListVector rightVector = (ListVector) parameter.getRight(); - boolean isNull = left.isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { + RangeEqualsVisitor visitor = createInnerVisitor(); + RangeEqualsParameter innerParam = new RangeEqualsParameter() + .setLeft(leftVector.getDataVector()) + .setRight(rightVector.getDataVector()) + .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); + + for (int i = 0; i < parameter.getLength(); i++) { + int leftIndex = parameter.getLeftStart() + i; + int rightIndex = parameter.getRightStart() + i; + + boolean isNull = leftVector.isNull(leftIndex); + if (isNull != rightVector.isNull(rightIndex)) { return false; } int offsetWidth = BaseRepeatedValueVector.OFFSET_WIDTH; if (!isNull) { - final int startIndexLeft = left.getOffsetBuffer().getInt(leftIndex * offsetWidth); - final int endIndexLeft = left.getOffsetBuffer().getInt((leftIndex + 1) * offsetWidth); + final int startIndexLeft = leftVector.getOffsetBuffer().getInt(leftIndex * offsetWidth); + final int endIndexLeft = leftVector.getOffsetBuffer().getInt((leftIndex + 1) * offsetWidth); - final int startIndexRight = right.getOffsetBuffer().getInt(rightIndex * offsetWidth); - final int endIndexRight = right.getOffsetBuffer().getInt((rightIndex + 1) * offsetWidth); + final int startIndexRight = rightVector.getOffsetBuffer().getInt(rightIndex * offsetWidth); + final int endIndexRight = rightVector.getOffsetBuffer().getInt((rightIndex + 1) * offsetWidth); if ((endIndexLeft - startIndexLeft) != (endIndexRight - startIndexRight)) { return false; } - ValueVector leftDataVector = left.getDataVector(); - ValueVector rightDataVector = ((ListVector)right).getDataVector(); - - visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true); - if (!leftDataVector.accept(visitor, null)) { + innerParam.setRightStart(startIndexRight) + .setLeftStart(startIndexLeft) + .setLength(endIndexLeft - startIndexLeft); + if (!leftVector.getDataVector().accept(visitor, innerParam)) { return false; } } @@ -292,23 +255,30 @@ protected boolean compareListVectors(ListVector left) { return true; } - protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { + protected boolean compareFixedSizeListVectors(RangeEqualsParameter parameter) { + FixedSizeListVector leftVector = (FixedSizeListVector) parameter.getLeft(); + FixedSizeListVector rightVector = (FixedSizeListVector) parameter.getRight(); - if (left.getListSize() != ((FixedSizeListVector)right).getListSize()) { + if (leftVector.getListSize() != rightVector.getListSize()) { return false; } - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - for (int i = 0; i < length; i++) { - int leftIndex = leftStart + i; - int rightIndex = rightStart + i; + RangeEqualsVisitor visitor = createInnerVisitor(); + RangeEqualsParameter innerParam = new RangeEqualsParameter() + .setLeft(leftVector.getDataVector()) + .setRight(rightVector.getDataVector()) + .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); - boolean isNull = left.isNull(leftIndex); - if (isNull != right.isNull(rightIndex)) { + for (int i = 0; i < parameter.getLength(); i++) { + int leftIndex = parameter.getLeftStart() + i; + int rightIndex = parameter.getRightStart() + i; + + boolean isNull = leftVector.isNull(leftIndex); + if (isNull != rightVector.isNull(rightIndex)) { return false; } - int listSize = left.getListSize(); + int listSize = leftVector.getListSize(); if (!isNull) { final int startIndexLeft = leftIndex * listSize; @@ -321,11 +291,10 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) { return false; } - ValueVector leftDataVector = left.getDataVector(); - ValueVector rightDataVector = ((FixedSizeListVector)right).getDataVector(); - - visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true); - if (!leftDataVector.accept(visitor, null)) { + innerParam.setRightStart(startIndexRight) + .setLeftStart(startIndexLeft) + .setLength(endIndexLeft - startIndexLeft); + if (!leftVector.getDataVector().accept(visitor, innerParam)) { return false; } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java index dfaf45fa43fa0..31383afc64fe7 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java @@ -17,7 +17,6 @@ package org.apache.arrow.vector.compare; -import org.apache.arrow.util.Preconditions; import org.apache.arrow.vector.ValueVector; /** @@ -25,19 +24,33 @@ */ public class VectorEqualsVisitor extends RangeEqualsVisitor { - public VectorEqualsVisitor(ValueVector right) { - this(right, true); + private final boolean typeCheckNeeded; + + public VectorEqualsVisitor() { + this(true); } - public VectorEqualsVisitor(ValueVector right, boolean typeCheckNeeded) { - super(Preconditions.checkNotNull(right), 0, 0, right.getValueCount(), typeCheckNeeded); + public VectorEqualsVisitor(boolean typeCheckNeeded) { + this.typeCheckNeeded = typeCheckNeeded; } - @Override - protected boolean compareValueVector(ValueVector left, ValueVector right) { - if (!super.compareValueVector(left, right)) { + /** + * Checks if two vectors are equals. + * @param left the left vector to compare. + * @param right the right vector to compare. + * @return true if the vectors are equal, and false otherwise. + */ + public boolean vectorEquals(ValueVector left, ValueVector right) { + if (left.getValueCount() != right.getValueCount()) { return false; } - return left.getValueCount() == right.getValueCount(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(left) + .setRight(right) + .setLeftStart(0) + .setRightStart(0) + .setLength(left.getValueCount()) + .setTypeCheckNeeded(typeCheckNeeded); + return super.rangeEquals(param); } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/Dictionary.java b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/Dictionary.java index 0f917e50b3ae5..6f40e5814b972 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/Dictionary.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/Dictionary.java @@ -65,7 +65,7 @@ public boolean equals(Object o) { } Dictionary that = (Dictionary) o; return Objects.equals(encoding, that.encoding) && - (new VectorEqualsVisitor(that.dictionary)).equals(dictionary); + new VectorEqualsVisitor().vectorEquals(that.dictionary, dictionary); } @Override diff --git a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java index fe378e1e7c068..8847c8bfc515d 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java @@ -18,6 +18,7 @@ package org.apache.arrow.vector.dictionary; import org.apache.arrow.vector.ValueVector; +import org.apache.arrow.vector.compare.RangeEqualsParameter; import org.apache.arrow.vector.compare.RangeEqualsVisitor; /** @@ -138,11 +139,18 @@ public int getIndex(int indexInArray, ValueVector toEncode) { int index = indexFor(hash, table.length); RangeEqualsVisitor equalVisitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(dictionary) + .setRight(toEncode) + .setTypeCheckNeeded(false) + .setLength(1); + for (DictionaryHashTable.Entry e = table[index]; e != null ; e = e.next) { if (e.hash == hash) { int dictIndex = e.index; - equalVisitor.set(dictionary, dictIndex, indexInArray, 1, false); - if (equalVisitor.equals(toEncode)) { + param.setRightStart(indexInArray) + .setLeftStart(dictIndex); + if (equalVisitor.rangeEquals(param)) { return dictIndex; } } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java index b826908cb158f..3f89b85fcc436 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java @@ -36,6 +36,7 @@ import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.memory.util.ArrowBufPointer; +import org.apache.arrow.vector.compare.RangeEqualsParameter; import org.apache.arrow.vector.compare.RangeEqualsVisitor; import org.apache.arrow.vector.compare.VectorEqualsVisitor; import org.apache.arrow.vector.complex.ListVector; @@ -2261,8 +2262,8 @@ public void testZeroVectorEquals() { try (final ZeroVector vector1 = new ZeroVector(); final ZeroVector vector2 = new ZeroVector()) { - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertTrue(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2271,11 +2272,11 @@ public void testZeroVectorNotEquals() { try (final IntVector intVector = new IntVector("int", allocator); final ZeroVector zeroVector = new ZeroVector()) { - VectorEqualsVisitor zeroVisitor = new VectorEqualsVisitor(zeroVector); - assertFalse(zeroVisitor.equals(intVector)); + VectorEqualsVisitor zeroVisitor = new VectorEqualsVisitor(); + assertFalse(zeroVisitor.vectorEquals(intVector, zeroVector)); - VectorEqualsVisitor intVisitor = new VectorEqualsVisitor(intVector); - assertFalse(intVisitor.equals(zeroVector)); + VectorEqualsVisitor intVisitor = new VectorEqualsVisitor(); + assertFalse(intVisitor.vectorEquals(zeroVector, intVector)); } } @@ -2293,9 +2294,9 @@ public void testIntVectorEqualsWithNull() { vector1.setSafe(1, 2); vector2.setSafe(0, 1); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); - assertFalse(visitor.equals(vector1)); + assertFalse(visitor.vectorEquals(vector1, vector2)); } } @@ -2316,16 +2317,16 @@ public void testIntVectorEquals() { vector2.setSafe(0, 1); vector2.setSafe(1, 2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); - assertFalse(visitor.equals(vector1)); + assertFalse(visitor.vectorEquals(vector1, vector2)); vector2.setValueCount(3); vector2.setSafe(2, 2); assertFalse(vector1.equals(vector2)); vector2.setSafe(2, 3); - assertTrue(visitor.equals(vector1)); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2351,11 +2352,11 @@ public void testDecimalVectorEquals() { vector3.setSafe(0, 100); vector3.setSafe(1, 200); - VectorEqualsVisitor visitor1 = new VectorEqualsVisitor(vector2); - VectorEqualsVisitor visitor2 = new VectorEqualsVisitor(vector3); + VectorEqualsVisitor visitor1 = new VectorEqualsVisitor(); + VectorEqualsVisitor visitor2 = new VectorEqualsVisitor(); - assertTrue(visitor1.equals(vector1)); - assertFalse(visitor2.equals(vector1)); + assertTrue(visitor1.vectorEquals(vector1, vector2)); + assertFalse(visitor2.vectorEquals(vector1, vector3)); } } @@ -2375,8 +2376,8 @@ public void testVarcharVectorEuqalsWithNull() { vector2.setSafe(0, STR1, 0, STR1.length); vector2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); } } @@ -2398,12 +2399,12 @@ public void testVarcharVectorEquals() { vector2.setSafe(1, STR2, 0, STR2.length); vector2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); vector2.setSafe(2, STR3, 0, STR3.length); vector2.setValueCount(3); - assertTrue(visitor.equals(vector1)); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2425,12 +2426,12 @@ public void testVarBinaryVectorEquals() { vector2.setSafe(1, STR2, 0, STR2.length); vector2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); vector2.setSafe(2, STR3, 0, STR3.length); vector2.setValueCount(3); - assertTrue(visitor.equals(vector1)); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2456,9 +2457,9 @@ public void testListVectorEqualsWithNull() { writeListVector(writer2, new int[] {3, 4}); writer2.setValueCount(3); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); - assertFalse(visitor.equals(vector1)); + assertFalse(visitor.vectorEquals(vector1, vector2)); } } @@ -2484,13 +2485,13 @@ public void testListVectorEquals() { writeListVector(writer2, new int[] {3, 4}); writer2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); writeListVector(writer2, new int[] {5, 6}); writer2.setValueCount(3); - assertTrue(visitor.equals(vector1)); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2519,8 +2520,8 @@ public void testStructVectorEqualsWithNull() { writeStructVector(writer2, 3, 30L); writer2.setValueCount(3); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); } } @@ -2548,13 +2549,13 @@ public void testStructVectorEquals() { writeStructVector(writer2, 2, 20L); writer2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); writeStructVector(writer2, 3, 30L); writer2.setValueCount(3); - assertTrue(visitor.equals(vector1)); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2581,8 +2582,8 @@ public void testStructVectorEqualsWithDiffChild() { writeStructVector(writer2, 2, 20L); writer2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertFalse(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertFalse(visitor.vectorEquals(vector1, vector2)); } } @@ -2613,8 +2614,8 @@ public void testUnionVectorEquals() { vector2.setSafe(1, intHolder); vector2.setValueCount(2); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); - assertTrue(visitor.equals(vector1)); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); + assertTrue(visitor.vectorEquals(vector1, vector2)); } } @@ -2634,8 +2635,14 @@ public void testEqualsWithIndexOutOfRange() { vector2.setSafe(0, 1); vector2.setSafe(1, 2); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector2, 3, 2, 1); - assertTrue(visitor.equals(vector1)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(vector2) + .setRight(vector1) + .setRightStart(3) + .setLeftStart(2) + .setLength(1); + assertTrue(visitor.rangeEquals(param)); } } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java b/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java index 3757757b68483..604d3f62ba682 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java @@ -45,6 +45,7 @@ import org.apache.arrow.vector.types.pojo.FieldType; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; public class TestRangeEqualsVisitor { @@ -80,9 +81,9 @@ public void testIntVectorEqualsWithNull() { vector1.setSafe(1, 2); vector2.setSafe(0, 1); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(vector2); + VectorEqualsVisitor visitor = new VectorEqualsVisitor(); - assertFalse(visitor.equals(vector1)); + assertFalse(visitor.vectorEquals(vector1, vector2)); } } @@ -108,8 +109,14 @@ public void testBaseFixedWidthVectorRangeEqual() { vector2.setSafe(3,4); vector2.setSafe(4,55); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector2, 1, 1, 3); - assertTrue(visitor.equals(vector1)); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(vector1) + .setRight(vector2) + .setLeftStart(1) + .setRightStart(1) + .setLength(3); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + assertTrue(visitor.rangeEquals(param)); } } @@ -136,8 +143,14 @@ public void testBaseVariableVectorRangeEquals() { vector2.setSafe(4, STR1, 0, STR1.length); vector2.setValueCount(5); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector2, 1, 1, 3); - assertTrue(visitor.equals(vector1)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(vector1) + .setRight(vector2) + .setLeftStart(1) + .setRightStart(1) + .setLength(3); + assertTrue(visitor.rangeEquals(param)); } } @@ -168,8 +181,14 @@ public void testListVectorRangeEquals() { writeListVector(writer2, new int[] {0, 0}); writer2.setValueCount(5); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector2, 1, 1, 3); - assertTrue(visitor.equals(vector1)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(vector1) + .setRight(vector2) + .setLeftStart(1) + .setRightStart(1) + .setLength(3); + assertTrue(visitor.rangeEquals(param)); } } @@ -202,8 +221,14 @@ public void testStructVectorRangeEquals() { writeStructVector(writer2, 0, 0L); writer2.setValueCount(5); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector2, 1, 1, 3); - assertTrue(visitor.equals(vector1)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(vector1) + .setRight(vector2) + .setLeftStart(1) + .setRightStart(1) + .setLength(3); + assertTrue(visitor.rangeEquals(param)); } } @@ -240,21 +265,28 @@ public void testUnionVectorRangeEquals() { vector2.setSafe(2, intHolder); vector2.setValueCount(3); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector2, 1, 1, 2); - assertTrue(visitor.equals(vector1)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(); + RangeEqualsParameter param = new RangeEqualsParameter() + .setLeft(vector1) + .setRight(vector2) + .setLeftStart(1) + .setRightStart(1) + .setLength(2); + assertTrue(visitor.rangeEquals(param)); } } + @Ignore @Test public void testEqualsWithOutTypeCheck() { try (final IntVector intVector = new IntVector("int", allocator); final ZeroVector zeroVector = new ZeroVector()) { - VectorEqualsVisitor zeroVisitor = new VectorEqualsVisitor(zeroVector, false); - assertTrue(zeroVisitor.equals(intVector)); + VectorEqualsVisitor zeroVisitor = new VectorEqualsVisitor(false); + assertTrue(zeroVisitor.vectorEquals(intVector, zeroVector)); - VectorEqualsVisitor intVisitor = new VectorEqualsVisitor(intVector, false); - assertTrue(intVisitor.equals(zeroVector)); + VectorEqualsVisitor intVisitor = new VectorEqualsVisitor(false); + assertTrue(intVisitor.vectorEquals(zeroVector, intVector)); } } @@ -282,10 +314,18 @@ public void testFloat4ApproxEquals() { vector3.setSafe(0, 1.1f + epsilon * 2); vector3.setSafe(1, 2.2f + epsilon * 2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(vector1, epsilon); + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); + RangeEqualsParameter param = new RangeEqualsParameter() + .setRight(vector1) + .setLeft(vector2) + .setLeftStart(0) + .setRightStart(0) + .setLength(vector1.getValueCount()); - assertTrue(visitor.equals(vector2)); - assertFalse(visitor.equals(vector3)); + assertTrue(visitor.rangeEquals(param)); + + param.setLeft(vector3); + assertFalse(visitor.rangeEquals(param)); } } @@ -313,10 +353,18 @@ public void testFloat8ApproxEquals() { vector3.setSafe(0, 1.1 + epsilon * 2); vector3.setSafe(1, 2.2 + epsilon * 2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(vector1, epsilon); + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); + RangeEqualsParameter param = new RangeEqualsParameter() + .setRight(vector1) + .setLeft(vector2) + .setLeftStart(0) + .setRightStart(0) + .setLength(vector1.getValueCount()); + + assertTrue(visitor.rangeEquals(param)); - assertTrue(visitor.equals(vector2)); - assertFalse(visitor.equals(vector3)); + param.setLeft(vector3); + assertFalse(visitor.rangeEquals(param)); } } @@ -359,9 +407,18 @@ public void testStructVectorApproxEquals() { writeStructVector(leftWriter2, 2.02f - epsilon * 2, 4.04 - epsilon * 2); leftWriter2.setValueCount(2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(right, epsilon); - assertTrue(visitor.equals(left1)); - assertFalse(visitor.equals(left2)); + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); + RangeEqualsParameter param = new RangeEqualsParameter() + .setRight(right) + .setLeft(left1) + .setLeftStart(0) + .setRightStart(0) + .setLength(right.getValueCount()); + + assertTrue(visitor.rangeEquals(param)); + + param.setLeft(left2); + assertFalse(visitor.rangeEquals(param)); } } @@ -405,9 +462,18 @@ public void testUnionVectorApproxEquals() { left2.setSafe(1, float8Holder); left2.setValueCount(2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(right, epsilon); - assertTrue(visitor.equals(left1)); - assertFalse(visitor.equals(left2)); + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); + RangeEqualsParameter param = new RangeEqualsParameter() + .setRight(right) + .setLeft(left1) + .setLeftStart(0) + .setRightStart(0) + .setLength(right.getValueCount()); + + assertTrue(visitor.rangeEquals(param)); + + param.setLeft(left2); + assertFalse(visitor.rangeEquals(param)); } } @@ -437,9 +503,18 @@ public void testListVectorApproxEquals() { writeListVector(leftWriter2, new double[] {1.01 + epsilon * 2, 2.02 - epsilon * 2}); leftWriter2.setValueCount(2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(right, epsilon); - assertTrue(visitor.equals(left1)); - assertFalse(visitor.equals(left2)); + ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); + RangeEqualsParameter param = new RangeEqualsParameter() + .setRight(right) + .setLeft(left1) + .setLeftStart(0) + .setRightStart(0) + .setLength(right.getValueCount()); + + assertTrue(visitor.rangeEquals(param)); + + param.setLeft(left2); + assertFalse(visitor.rangeEquals(param)); } } From 073bc78d957d3b3571c3976a6e420b007ad47224 Mon Sep 17 00:00:00 2001 From: Pindikura Ravindra Date: Sat, 31 Aug 2019 16:10:36 +0530 Subject: [PATCH 3/3] Test: Move out Range from the visitor params --- .../deduplicate/DeduplicationUtils.java | 14 +- .../vector/compare/ApproxEqualsVisitor.java | 49 ++-- .../apache/arrow/vector/compare/Range.java | 85 +++++++ .../vector/compare/RangeEqualsParameter.java | 146 ----------- .../vector/compare/RangeEqualsVisitor.java | 233 ++++++++++-------- .../vector/compare/VectorEqualsVisitor.java | 32 ++- .../dictionary/DictionaryHashTable.java | 17 +- .../apache/arrow/vector/TestValueVector.java | 11 +- .../compare/TestRangeEqualsVisitor.java | 135 +++------- 9 files changed, 309 insertions(+), 413 deletions(-) create mode 100644 java/vector/src/main/java/org/apache/arrow/vector/compare/Range.java delete mode 100644 java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java diff --git a/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java b/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java index 8ae23d0bd355a..8c0c4af502de6 100644 --- a/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java +++ b/java/algorithm/src/main/java/org/apache/arrow/algorithm/deduplicate/DeduplicationUtils.java @@ -22,7 +22,7 @@ import org.apache.arrow.vector.BitVectorHelper; import org.apache.arrow.vector.IntVector; import org.apache.arrow.vector.ValueVector; -import org.apache.arrow.vector.compare.RangeEqualsParameter; +import org.apache.arrow.vector.compare.Range; import org.apache.arrow.vector.compare.RangeEqualsVisitor; import io.netty.buffer.ArrowBuf; @@ -44,15 +44,11 @@ public static void populateRunStartIndicators(V vector, runStarts.setZero(0, bufSize); BitVectorHelper.setValidityBitToOne(runStarts, 0); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setRight(vector) - .setLeft(vector) - .setLength(1) - .setTypeCheckNeeded(false); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector, vector, false); + Range range = new Range(0, 0, 1); for (int i = 1; i < vector.getValueCount(); i++) { - param.setLeftStart(i).setRightStart(i - 1); - if (!visitor.rangeEquals(param)) { + range.setLeftStart(i).setRightStart(i - 1); + if (!visitor.rangeEquals(range)) { BitVectorHelper.setValidityBitToOne(runStarts, i); } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java index b8924eac5cb6f..1c12768547f23 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java @@ -20,6 +20,7 @@ import org.apache.arrow.vector.BaseFixedWidthVector; import org.apache.arrow.vector.Float4Vector; import org.apache.arrow.vector.Float8Vector; +import org.apache.arrow.vector.ValueVector; /** * Visitor to compare floating point. @@ -40,7 +41,16 @@ public class ApproxEqualsVisitor extends RangeEqualsVisitor { private DiffFunction doubleDiffFunction = (Double value1, Double value2) -> Math.abs(value1 - value2); - public ApproxEqualsVisitor(float floatEpsilon, double doubleEpsilon) { + /** + * Constructs a new instance. + * + * @param left left vector + * @param right right vector + * @param floatEpsilon difference for float values + * @param doubleEpsilon difference for double values + */ + public ApproxEqualsVisitor(ValueVector left, ValueVector right, float floatEpsilon, double doubleEpsilon) { + super(left, right, true); this.floatEpsilon = floatEpsilon; this.doubleEpsilon = doubleEpsilon; } @@ -54,29 +64,28 @@ public void setDoubleDiffFunction(DiffFunction doubleDiffFunction) { } @Override - public Boolean visit(BaseFixedWidthVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); + public Boolean visit(BaseFixedWidthVector left, Range range) { if (left instanceof Float4Vector) { - return parameter.validate() && float4ApproxEquals(parameter); + return float4ApproxEquals(range); } else if (left instanceof Float8Vector) { - return parameter.validate() && float8ApproxEquals(parameter); + return float8ApproxEquals(range); } else { - return super.visit(left, parameter); + return super.visit(left, range); } } @Override - protected ApproxEqualsVisitor createInnerVisitor() { - return new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon); + protected ApproxEqualsVisitor createInnerVisitor(ValueVector left, ValueVector right) { + return new ApproxEqualsVisitor(left, right, floatEpsilon, doubleEpsilon); } - private boolean float4ApproxEquals(RangeEqualsParameter parameter) { - Float4Vector leftVector = (Float4Vector) parameter.getLeft(); - Float4Vector rightVector = (Float4Vector) parameter.getRight(); + private boolean float4ApproxEquals(Range range) { + Float4Vector leftVector = (Float4Vector) getLeft(); + Float4Vector rightVector = (Float4Vector) getRight(); - for (int i = 0; i < parameter.getLength(); i++) { - int leftIndex = parameter.getLeftStart() + i; - int rightIndex = parameter.getRightStart() + i; + for (int i = 0; i < range.getLength(); i++) { + int leftIndex = range.getLeftStart() + i; + int rightIndex = range.getRightStart() + i; boolean isNull = leftVector.isNull(leftIndex); @@ -101,13 +110,13 @@ private boolean float4ApproxEquals(RangeEqualsParameter parameter) { return true; } - private boolean float8ApproxEquals(RangeEqualsParameter parameter) { - Float8Vector leftVector = (Float8Vector) parameter.getLeft(); - Float8Vector rightVector = (Float8Vector) parameter.getRight(); + private boolean float8ApproxEquals(Range range) { + Float8Vector leftVector = (Float8Vector) getLeft(); + Float8Vector rightVector = (Float8Vector) getRight(); - for (int i = 0; i < parameter.getLength(); i++) { - int leftIndex = parameter.getLeftStart() + i; - int rightIndex = parameter.getRightStart() + i; + for (int i = 0; i < range.getLength(); i++) { + int leftIndex = range.getLeftStart() + i; + int rightIndex = range.getRightStart() + i; boolean isNull = leftVector.isNull(leftIndex); diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/Range.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/Range.java new file mode 100644 index 0000000000000..0de99ab011f66 --- /dev/null +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/Range.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.arrow.vector.compare; + +/** + * Wrapper for the parameters of comparing a range of values in two vectors. + */ +public class Range { + + /** + * Start position in the left vector. + */ + private int leftStart = -1; + + /** + * Start position in the right vector. + */ + private int rightStart = -1; + + /** + * Length of the range. + */ + private int length = -1; + + + /** + * Constructs a new instance. + */ + public Range() {} + + /** + * Constructs a new instance. + * + * @param leftStart start index in left vector + * @param rightStart start index in right vector + * @param length length of range + */ + public Range(int leftStart, int rightStart, int length) { + this.leftStart = leftStart; + this.rightStart = rightStart; + this.length = length; + } + + public int getLeftStart() { + return leftStart; + } + + public int getRightStart() { + return rightStart; + } + + public int getLength() { + return length; + } + + public Range setLeftStart(int leftStart) { + this.leftStart = leftStart; + return this; + } + + public Range setRightStart(int rightStart) { + this.rightStart = rightStart; + return this; + } + + public Range setLength(int length) { + this.length = length; + return this; + } +} diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java deleted file mode 100644 index e1a58ce24e8d2..0000000000000 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsParameter.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.arrow.vector.compare; - -import org.apache.arrow.util.Preconditions; -import org.apache.arrow.vector.ValueVector; - -/** - * Wrapper for the parameters of comparing a range of values in two vectors. - */ -public class RangeEqualsParameter { - - /** - * The left vector. - */ - private ValueVector left; - - /** - * The right vector. - */ - private ValueVector right; - - /** - * Start position in the left vector. - */ - private int leftStart = -1; - - /** - * Start position in the right vector. - */ - private int rightStart = -1; - - /** - * Length of the range. - */ - private int length = -1; - - /** - * If type check is required. - */ - private boolean typeCheckNeeded; - - /** - * Checks the type of the left and right vectors. - * @return true if left and right vectors have the same type, and false otherwise. - */ - public boolean checkType() { - if (!typeCheckNeeded) { - return true; - } - return left.getField().getType().equals(right.getField().getType()); - } - - /** - * Do some validation work, like type check and indices check. - */ - public boolean validate() { - if (!checkType()) { - return false; - } - - Preconditions.checkArgument(leftStart >= 0, - "leftStart %s must be non negative.", leftStart); - Preconditions.checkArgument((leftStart + length) <= left.getValueCount(), - "(leftStart + length) %s out of range[0, %s].", 0, left.getValueCount()); - Preconditions.checkArgument(rightStart >= 0, - "rightStart %s must be non negative.", rightStart); - Preconditions.checkArgument((rightStart + length) <= right.getValueCount(), - "(rightStart + length) %s out of range[0, %s].", 0, right.getValueCount()); - Preconditions.checkArgument(left != null, - "left vector cannot be null"); - Preconditions.checkArgument(right != null, - "right vector cannot be null"); - - return true; - } - - public ValueVector getLeft() { - return left; - } - - public ValueVector getRight() { - return right; - } - - public int getLeftStart() { - return leftStart; - } - - public int getRightStart() { - return rightStart; - } - - public int getLength() { - return length; - } - - public boolean isTypeCheckNeeded() { - return typeCheckNeeded; - } - - public RangeEqualsParameter setLeft(ValueVector left) { - this.left = left; - return this; - } - - public RangeEqualsParameter setRight(ValueVector right) { - this.right = right; - return this; - } - - public RangeEqualsParameter setLeftStart(int leftStart) { - this.leftStart = leftStart; - return this; - } - - public RangeEqualsParameter setRightStart(int rightStart) { - this.rightStart = rightStart; - return this; - } - - public RangeEqualsParameter setLength(int length) { - this.length = length; - return this; - } - - public RangeEqualsParameter setTypeCheckNeeded(boolean typeCheckNeeded) { - this.typeCheckNeeded = typeCheckNeeded; - return this; - } -} diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java index 3a7d1f2c05c29..5d43031ffb5cc 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java @@ -20,9 +20,11 @@ import java.util.List; import org.apache.arrow.memory.util.ByteFunctionHelpers; +import org.apache.arrow.util.Preconditions; import org.apache.arrow.vector.BaseFixedWidthVector; import org.apache.arrow.vector.BaseVariableWidthVector; import org.apache.arrow.vector.FieldVector; +import org.apache.arrow.vector.ValueVector; import org.apache.arrow.vector.ZeroVector; import org.apache.arrow.vector.complex.BaseRepeatedValueVector; import org.apache.arrow.vector.complex.FixedSizeListVector; @@ -33,55 +35,115 @@ /** * Visitor to compare a range of values for vectors. */ -public class RangeEqualsVisitor implements VectorVisitor { +public class RangeEqualsVisitor implements VectorVisitor { + private ValueVector left; + private ValueVector right; + private boolean isTypeCheckNeeded; + private boolean typeCompareResult; + + /** + * Constructs a new instance. + * + * @param left left vector + * @param right right vector + * @param isTypeCheckNeeded type check needed + */ + public RangeEqualsVisitor(ValueVector left, ValueVector right, boolean isTypeCheckNeeded) { + this.left = left; + this.right = right; + this.isTypeCheckNeeded = isTypeCheckNeeded; + + Preconditions.checkArgument(left != null, + "left vector cannot be null"); + Preconditions.checkArgument(right != null, + "right vector cannot be null"); + + // types cannot change for a visitor instance. so, the check is done only once. + if (!isTypeCheckNeeded) { + typeCompareResult = true; + } else if (left == right) { + typeCompareResult = true; + } else { + typeCompareResult = left.getField().getType().equals(right.getField().getType()); + } + } + + /** + * Constructs a new instance. + * + * @param left left vector + * @param right right vector + */ + public RangeEqualsVisitor(ValueVector left, ValueVector right) { + this(left, right, true); + } /** * Check range equals without passing IN param in VectorVisitor. */ - public boolean rangeEquals(RangeEqualsParameter parameter) { - return parameter.getLeft().accept(this, parameter); + public boolean rangeEquals(Range range) { + if (!typeCompareResult) { + return false; + } + + Preconditions.checkArgument(range.getLeftStart() >= 0, + "leftStart %s must be non negative.", range.getLeftStart()); + Preconditions.checkArgument(range.getRightStart() >= 0, + "rightStart %s must be non negative.", range.getRightStart()); + + Preconditions.checkArgument(range.getRightStart() + range.getLength() <= right.getValueCount(), + "(rightStart + length) %s out of range[0, %s].", 0, right.getValueCount()); + Preconditions.checkArgument(range.getLeftStart() + range.getLength() <= left.getValueCount(), + "(leftStart + length) %s out of range[0, %s].", 0, left.getValueCount()); + + return left.accept(this, range); + } + + public ValueVector getLeft() { + return left; + } + + public ValueVector getRight() { + return right; + } + + public boolean isTypeCheckNeeded() { + return isTypeCheckNeeded; } @Override - public Boolean visit(BaseFixedWidthVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate() && compareBaseFixedWidthVectors(parameter); + public Boolean visit(BaseFixedWidthVector left, Range range) { + return compareBaseFixedWidthVectors(range); } @Override - public Boolean visit(BaseVariableWidthVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate() && compareBaseVariableWidthVectors(parameter); + public Boolean visit(BaseVariableWidthVector left, Range range) { + return compareBaseVariableWidthVectors(range); } @Override - public Boolean visit(ListVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate() && compareListVectors(parameter); + public Boolean visit(ListVector left, Range range) { + return compareListVectors(range); } @Override - public Boolean visit(FixedSizeListVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate() && compareFixedSizeListVectors(parameter); + public Boolean visit(FixedSizeListVector left, Range range) { + return compareFixedSizeListVectors(range); } @Override - public Boolean visit(NonNullableStructVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate() && compareStructVectors(parameter); + public Boolean visit(NonNullableStructVector left, Range range) { + return compareStructVectors(range); } @Override - public Boolean visit(UnionVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate() && compareUnionVectors(parameter); + public Boolean visit(UnionVector left, Range range) { + return compareUnionVectors(range); } @Override - public Boolean visit(ZeroVector left, RangeEqualsParameter parameter) { - parameter.setLeft(left); - return parameter.validate(); + public Boolean visit(ZeroVector left, Range range) { + return true; } /** @@ -89,13 +151,13 @@ public Boolean visit(ZeroVector left, RangeEqualsParameter parameter) { * It is used for complex vector types. * @return the visitor for child vecors. */ - protected RangeEqualsVisitor createInnerVisitor() { - return new RangeEqualsVisitor(); + protected RangeEqualsVisitor createInnerVisitor(ValueVector leftInner, ValueVector rightInner) { + return new RangeEqualsVisitor(leftInner, rightInner, isTypeCheckNeeded); } - protected boolean compareUnionVectors(RangeEqualsParameter parameter) { - UnionVector leftVector = (UnionVector) parameter.getLeft(); - UnionVector rightVector = (UnionVector) parameter.getRight(); + protected boolean compareUnionVectors(Range range) { + UnionVector leftVector = (UnionVector) left; + UnionVector rightVector = (UnionVector) right; List leftChildren = leftVector.getChildrenFromFields(); List rightChildren = rightVector.getChildrenFromFields(); @@ -104,41 +166,27 @@ protected boolean compareUnionVectors(RangeEqualsParameter parameter) { return false; } - RangeEqualsVisitor visitor = createInnerVisitor(); - RangeEqualsParameter innerParam = new RangeEqualsParameter() - .setLeftStart(parameter.getLeftStart()) - .setRightStart(parameter.getRightStart()) - .setLength(parameter.getLength()) - .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); - for (int k = 0; k < leftChildren.size(); k++) { - innerParam.setRight(rightChildren.get(k)); - if (!leftChildren.get(k).accept(visitor, innerParam)) { + RangeEqualsVisitor visitor = createInnerVisitor(leftChildren.get(k), rightChildren.get(k)); + if (!visitor.rangeEquals(range)) { return false; } } return true; } - protected boolean compareStructVectors(RangeEqualsParameter parameter) { - NonNullableStructVector leftVector = (NonNullableStructVector) parameter.getLeft(); - NonNullableStructVector rightVector = (NonNullableStructVector) parameter.getRight(); + protected boolean compareStructVectors(Range range) { + NonNullableStructVector leftVector = (NonNullableStructVector) left; + NonNullableStructVector rightVector = (NonNullableStructVector) right; List leftChildNames = leftVector.getChildFieldNames(); if (!leftChildNames.equals(rightVector.getChildFieldNames())) { return false; } - RangeEqualsVisitor visitor = createInnerVisitor(); - RangeEqualsParameter innerParam = new RangeEqualsParameter() - .setLeftStart(parameter.getLeftStart()) - .setRightStart(parameter.getRightStart()) - .setLength(parameter.getLength()) - .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); - for (String name : leftChildNames) { - innerParam.setRight(rightVector.getChild(name)); - if (!leftVector.getChild(name).accept(visitor, innerParam)) { + RangeEqualsVisitor visitor = createInnerVisitor(leftVector.getChild(name), rightVector.getChild(name)); + if (!visitor.rangeEquals(range)) { return false; } } @@ -146,17 +194,17 @@ protected boolean compareStructVectors(RangeEqualsParameter parameter) { return true; } - protected boolean compareBaseFixedWidthVectors(RangeEqualsParameter parameter) { - BaseFixedWidthVector leftVector = (BaseFixedWidthVector) parameter.getLeft(); - BaseFixedWidthVector rightVector = (BaseFixedWidthVector) parameter.getRight(); + protected boolean compareBaseFixedWidthVectors(Range range) { + BaseFixedWidthVector leftVector = (BaseFixedWidthVector) left; + BaseFixedWidthVector rightVector = (BaseFixedWidthVector) right; - for (int i = 0; i < parameter.getLength(); i++) { - int leftIndex = parameter.getLeftStart() + i; - int rightIndex = parameter.getRightStart() + i; + for (int i = 0; i < range.getLength(); i++) { + int leftIndex = range.getLeftStart() + i; + int rightIndex = range.getRightStart() + i; - boolean isNull = parameter.getLeft().isNull(leftIndex); + boolean isNull = leftVector.isNull(leftIndex); - if (isNull != parameter.getRight().isNull(rightIndex)) { + if (isNull != rightVector.isNull(rightIndex)) { return false; } @@ -179,13 +227,13 @@ protected boolean compareBaseFixedWidthVectors(RangeEqualsParameter parameter) { return true; } - protected boolean compareBaseVariableWidthVectors(RangeEqualsParameter parameter) { - BaseVariableWidthVector leftVector = (BaseVariableWidthVector) parameter.getLeft(); - BaseVariableWidthVector rightVector = (BaseVariableWidthVector) parameter.getRight(); + protected boolean compareBaseVariableWidthVectors(Range range) { + BaseVariableWidthVector leftVector = (BaseVariableWidthVector) left; + BaseVariableWidthVector rightVector = (BaseVariableWidthVector) right; - for (int i = 0; i < parameter.getLength(); i++) { - int leftIndex = parameter.getLeftStart() + i; - int rightIndex = parameter.getRightStart() + i; + for (int i = 0; i < range.getLength(); i++) { + int leftIndex = range.getLeftStart() + i; + int rightIndex = range.getRightStart() + i; boolean isNull = leftVector.isNull(leftIndex); if (isNull != rightVector.isNull(rightIndex)) { @@ -212,19 +260,16 @@ protected boolean compareBaseVariableWidthVectors(RangeEqualsParameter parameter return true; } - protected boolean compareListVectors(RangeEqualsParameter parameter) { - ListVector leftVector = (ListVector) parameter.getLeft(); - ListVector rightVector = (ListVector) parameter.getRight(); + protected boolean compareListVectors(Range range) { + ListVector leftVector = (ListVector) left; + ListVector rightVector = (ListVector) right; - RangeEqualsVisitor visitor = createInnerVisitor(); - RangeEqualsParameter innerParam = new RangeEqualsParameter() - .setLeft(leftVector.getDataVector()) - .setRight(rightVector.getDataVector()) - .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); + RangeEqualsVisitor innerVisitor = createInnerVisitor(leftVector.getDataVector(), rightVector.getDataVector()); + Range innerRange = new Range(); - for (int i = 0; i < parameter.getLength(); i++) { - int leftIndex = parameter.getLeftStart() + i; - int rightIndex = parameter.getRightStart() + i; + for (int i = 0; i < range.getLength(); i++) { + int leftIndex = range.getLeftStart() + i; + int rightIndex = range.getRightStart() + i; boolean isNull = leftVector.isNull(leftIndex); if (isNull != rightVector.isNull(rightIndex)) { @@ -244,10 +289,11 @@ protected boolean compareListVectors(RangeEqualsParameter parameter) { return false; } - innerParam.setRightStart(startIndexRight) - .setLeftStart(startIndexLeft) - .setLength(endIndexLeft - startIndexLeft); - if (!leftVector.getDataVector().accept(visitor, innerParam)) { + innerRange = innerRange + .setRightStart(startIndexRight) + .setLeftStart(startIndexLeft) + .setLength(endIndexLeft - startIndexLeft); + if (!innerVisitor.rangeEquals(innerRange)) { return false; } } @@ -255,31 +301,27 @@ protected boolean compareListVectors(RangeEqualsParameter parameter) { return true; } - protected boolean compareFixedSizeListVectors(RangeEqualsParameter parameter) { - FixedSizeListVector leftVector = (FixedSizeListVector) parameter.getLeft(); - FixedSizeListVector rightVector = (FixedSizeListVector) parameter.getRight(); + protected boolean compareFixedSizeListVectors(Range range) { + FixedSizeListVector leftVector = (FixedSizeListVector) left; + FixedSizeListVector rightVector = (FixedSizeListVector) right; if (leftVector.getListSize() != rightVector.getListSize()) { return false; } - RangeEqualsVisitor visitor = createInnerVisitor(); - RangeEqualsParameter innerParam = new RangeEqualsParameter() - .setLeft(leftVector.getDataVector()) - .setRight(rightVector.getDataVector()) - .setTypeCheckNeeded(parameter.isTypeCheckNeeded()); + int listSize = leftVector.getListSize(); + RangeEqualsVisitor innerVisitor = createInnerVisitor(leftVector, rightVector); + Range innerRange = new Range(0, 0, listSize); - for (int i = 0; i < parameter.getLength(); i++) { - int leftIndex = parameter.getLeftStart() + i; - int rightIndex = parameter.getRightStart() + i; + for (int i = 0; i < range.getLength(); i++) { + int leftIndex = range.getLeftStart() + i; + int rightIndex = range.getRightStart() + i; boolean isNull = leftVector.isNull(leftIndex); if (isNull != rightVector.isNull(rightIndex)) { return false; } - int listSize = leftVector.getListSize(); - if (!isNull) { final int startIndexLeft = leftIndex * listSize; final int endIndexLeft = (leftIndex + 1) * listSize; @@ -291,10 +333,9 @@ protected boolean compareFixedSizeListVectors(RangeEqualsParameter parameter) { return false; } - innerParam.setRightStart(startIndexRight) - .setLeftStart(startIndexLeft) - .setLength(endIndexLeft - startIndexLeft); - if (!leftVector.getDataVector().accept(visitor, innerParam)) { + innerRange = innerRange.setLeftStart(startIndexLeft) + .setRightStart(startIndexRight); + if (!innerVisitor.rangeEquals(innerRange)) { return false; } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java b/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java index 31383afc64fe7..2ba9509a82507 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/compare/VectorEqualsVisitor.java @@ -22,35 +22,31 @@ /** * Visitor to compare vectors equal. */ -public class VectorEqualsVisitor extends RangeEqualsVisitor { +public class VectorEqualsVisitor { - private final boolean typeCheckNeeded; - - public VectorEqualsVisitor() { - this(true); - } - - public VectorEqualsVisitor(boolean typeCheckNeeded) { - this.typeCheckNeeded = typeCheckNeeded; + /** + * Checks if two vectors are equals. + * @param left the left vector to compare. + * @param right the right vector to compare. + * @return true if the vectors are equal, and false otherwise. + */ + public static boolean vectorEquals(ValueVector left, ValueVector right) { + return vectorEquals(left, right, true); } /** * Checks if two vectors are equals. * @param left the left vector to compare. * @param right the right vector to compare. + * @param isTypeCheckNeeded check equality of types * @return true if the vectors are equal, and false otherwise. */ - public boolean vectorEquals(ValueVector left, ValueVector right) { + public static boolean vectorEquals(ValueVector left, ValueVector right, boolean isTypeCheckNeeded) { if (left.getValueCount() != right.getValueCount()) { return false; } - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(left) - .setRight(right) - .setLeftStart(0) - .setRightStart(0) - .setLength(left.getValueCount()) - .setTypeCheckNeeded(typeCheckNeeded); - return super.rangeEquals(param); + + RangeEqualsVisitor visitor = new RangeEqualsVisitor(left, right, isTypeCheckNeeded); + return visitor.rangeEquals(new Range(0, 0, left.getValueCount())); } } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java index 8847c8bfc515d..c4e003d2998c9 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java @@ -18,7 +18,7 @@ package org.apache.arrow.vector.dictionary; import org.apache.arrow.vector.ValueVector; -import org.apache.arrow.vector.compare.RangeEqualsParameter; +import org.apache.arrow.vector.compare.Range; import org.apache.arrow.vector.compare.RangeEqualsVisitor; /** @@ -138,19 +138,16 @@ public int getIndex(int indexInArray, ValueVector toEncode) { int hash = toEncode.hashCode(indexInArray); int index = indexFor(hash, table.length); - RangeEqualsVisitor equalVisitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(dictionary) - .setRight(toEncode) - .setTypeCheckNeeded(false) - .setLength(1); + RangeEqualsVisitor equalVisitor = new RangeEqualsVisitor(dictionary, toEncode, false); + Range range = new Range(0, 0, 1); for (DictionaryHashTable.Entry e = table[index]; e != null ; e = e.next) { if (e.hash == hash) { int dictIndex = e.index; - param.setRightStart(indexInArray) - .setLeftStart(dictIndex); - if (equalVisitor.rangeEquals(param)) { + + range = range.setRightStart(indexInArray) + .setLeftStart(dictIndex); + if (equalVisitor.rangeEquals(range)) { return dictIndex; } } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java index 3f89b85fcc436..d2f9fc194da96 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java @@ -36,7 +36,7 @@ import org.apache.arrow.memory.BufferAllocator; import org.apache.arrow.memory.RootAllocator; import org.apache.arrow.memory.util.ArrowBufPointer; -import org.apache.arrow.vector.compare.RangeEqualsParameter; +import org.apache.arrow.vector.compare.Range; import org.apache.arrow.vector.compare.RangeEqualsVisitor; import org.apache.arrow.vector.compare.VectorEqualsVisitor; import org.apache.arrow.vector.complex.ListVector; @@ -2635,14 +2635,7 @@ public void testEqualsWithIndexOutOfRange() { vector2.setSafe(0, 1); vector2.setSafe(1, 2); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(vector2) - .setRight(vector1) - .setRightStart(3) - .setLeftStart(2) - .setLength(1); - assertTrue(visitor.rangeEquals(param)); + assertTrue(new RangeEqualsVisitor(vector1, vector2).rangeEquals(new Range(2, 3, 1))); } } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java b/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java index 604d3f62ba682..04d73e231cda2 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java @@ -81,9 +81,8 @@ public void testIntVectorEqualsWithNull() { vector1.setSafe(1, 2); vector2.setSafe(0, 1); - VectorEqualsVisitor visitor = new VectorEqualsVisitor(); - assertFalse(visitor.vectorEquals(vector1, vector2)); + assertFalse(VectorEqualsVisitor.vectorEquals(vector1, vector2)); } } @@ -109,14 +108,8 @@ public void testBaseFixedWidthVectorRangeEqual() { vector2.setSafe(3,4); vector2.setSafe(4,55); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(vector1) - .setRight(vector2) - .setLeftStart(1) - .setRightStart(1) - .setLength(3); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - assertTrue(visitor.rangeEquals(param)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector1, vector2); + assertTrue(visitor.rangeEquals(new Range(1, 1, 3))); } } @@ -143,14 +136,8 @@ public void testBaseVariableVectorRangeEquals() { vector2.setSafe(4, STR1, 0, STR1.length); vector2.setValueCount(5); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(vector1) - .setRight(vector2) - .setLeftStart(1) - .setRightStart(1) - .setLength(3); - assertTrue(visitor.rangeEquals(param)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector1, vector2); + assertTrue(visitor.rangeEquals(new Range(1, 1, 3))); } } @@ -181,14 +168,8 @@ public void testListVectorRangeEquals() { writeListVector(writer2, new int[] {0, 0}); writer2.setValueCount(5); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(vector1) - .setRight(vector2) - .setLeftStart(1) - .setRightStart(1) - .setLength(3); - assertTrue(visitor.rangeEquals(param)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector1, vector2); + assertTrue(visitor.rangeEquals(new Range(1, 1, 3))); } } @@ -221,14 +202,8 @@ public void testStructVectorRangeEquals() { writeStructVector(writer2, 0, 0L); writer2.setValueCount(5); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(vector1) - .setRight(vector2) - .setLeftStart(1) - .setRightStart(1) - .setLength(3); - assertTrue(visitor.rangeEquals(param)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector1, vector2); + assertTrue(visitor.rangeEquals(new Range(1, 1, 3))); } } @@ -265,14 +240,8 @@ public void testUnionVectorRangeEquals() { vector2.setSafe(2, intHolder); vector2.setValueCount(3); - RangeEqualsVisitor visitor = new RangeEqualsVisitor(); - RangeEqualsParameter param = new RangeEqualsParameter() - .setLeft(vector1) - .setRight(vector2) - .setLeftStart(1) - .setRightStart(1) - .setLength(2); - assertTrue(visitor.rangeEquals(param)); + RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector1, vector2); + assertTrue(visitor.rangeEquals(new Range(1, 1, 2))); } } @@ -282,11 +251,8 @@ public void testEqualsWithOutTypeCheck() { try (final IntVector intVector = new IntVector("int", allocator); final ZeroVector zeroVector = new ZeroVector()) { - VectorEqualsVisitor zeroVisitor = new VectorEqualsVisitor(false); - assertTrue(zeroVisitor.vectorEquals(intVector, zeroVector)); - - VectorEqualsVisitor intVisitor = new VectorEqualsVisitor(false); - assertTrue(intVisitor.vectorEquals(zeroVector, intVector)); + assertTrue(VectorEqualsVisitor.vectorEquals(intVector, zeroVector, false)); + assertTrue(VectorEqualsVisitor.vectorEquals(zeroVector, intVector, false)); } } @@ -314,18 +280,13 @@ public void testFloat4ApproxEquals() { vector3.setSafe(0, 1.1f + epsilon * 2); vector3.setSafe(1, 2.2f + epsilon * 2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); - RangeEqualsParameter param = new RangeEqualsParameter() - .setRight(vector1) - .setLeft(vector2) - .setLeftStart(0) - .setRightStart(0) - .setLength(vector1.getValueCount()); + Range range = new Range(0, 0, vector1.getValueCount()); - assertTrue(visitor.rangeEquals(param)); + ApproxEqualsVisitor visitor12 = new ApproxEqualsVisitor(vector1, vector2, epsilon, epsilon); + assertTrue(visitor12.rangeEquals(range)); - param.setLeft(vector3); - assertFalse(visitor.rangeEquals(param)); + ApproxEqualsVisitor visitor13 = new ApproxEqualsVisitor(vector1, vector3, epsilon, epsilon); + assertFalse(visitor13.rangeEquals(range)); } } @@ -353,18 +314,9 @@ public void testFloat8ApproxEquals() { vector3.setSafe(0, 1.1 + epsilon * 2); vector3.setSafe(1, 2.2 + epsilon * 2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); - RangeEqualsParameter param = new RangeEqualsParameter() - .setRight(vector1) - .setLeft(vector2) - .setLeftStart(0) - .setRightStart(0) - .setLength(vector1.getValueCount()); - - assertTrue(visitor.rangeEquals(param)); - - param.setLeft(vector3); - assertFalse(visitor.rangeEquals(param)); + Range range = new Range(0, 0, vector1.getValueCount()); + assertTrue(new ApproxEqualsVisitor(vector1, vector2, epsilon, epsilon).rangeEquals(range)); + assertFalse(new ApproxEqualsVisitor(vector1, vector3, epsilon, epsilon).rangeEquals(range)); } } @@ -407,18 +359,9 @@ public void testStructVectorApproxEquals() { writeStructVector(leftWriter2, 2.02f - epsilon * 2, 4.04 - epsilon * 2); leftWriter2.setValueCount(2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); - RangeEqualsParameter param = new RangeEqualsParameter() - .setRight(right) - .setLeft(left1) - .setLeftStart(0) - .setRightStart(0) - .setLength(right.getValueCount()); - - assertTrue(visitor.rangeEquals(param)); - - param.setLeft(left2); - assertFalse(visitor.rangeEquals(param)); + Range range = new Range(0, 0, right.getValueCount()); + assertTrue(new ApproxEqualsVisitor(left1, right, epsilon, epsilon).rangeEquals(range)); + assertFalse(new ApproxEqualsVisitor(left2, right, epsilon, epsilon).rangeEquals(range)); } } @@ -462,18 +405,9 @@ public void testUnionVectorApproxEquals() { left2.setSafe(1, float8Holder); left2.setValueCount(2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); - RangeEqualsParameter param = new RangeEqualsParameter() - .setRight(right) - .setLeft(left1) - .setLeftStart(0) - .setRightStart(0) - .setLength(right.getValueCount()); - - assertTrue(visitor.rangeEquals(param)); - - param.setLeft(left2); - assertFalse(visitor.rangeEquals(param)); + Range range = new Range(0, 0, right.getValueCount()); + assertTrue(new ApproxEqualsVisitor(left1, right, epsilon, epsilon).rangeEquals(range)); + assertFalse(new ApproxEqualsVisitor(left2, right, epsilon, epsilon).rangeEquals(range)); } } @@ -503,18 +437,9 @@ public void testListVectorApproxEquals() { writeListVector(leftWriter2, new double[] {1.01 + epsilon * 2, 2.02 - epsilon * 2}); leftWriter2.setValueCount(2); - ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(epsilon, epsilon); - RangeEqualsParameter param = new RangeEqualsParameter() - .setRight(right) - .setLeft(left1) - .setLeftStart(0) - .setRightStart(0) - .setLength(right.getValueCount()); - - assertTrue(visitor.rangeEquals(param)); - - param.setLeft(left2); - assertFalse(visitor.rangeEquals(param)); + Range range = new Range(0, 0, right.getValueCount()); + assertTrue(new ApproxEqualsVisitor(left1, right, epsilon, epsilon).rangeEquals(range)); + assertFalse(new ApproxEqualsVisitor(left2, right, epsilon, epsilon).rangeEquals(range)); } }