Skip to content

Commit a1f7046

Browse files
committed
[ARROW-6355][Java] Make range equal visitor reusable
1 parent c9bd6d7 commit a1f7046

File tree

3 files changed

+61
-32
lines changed

3 files changed

+61
-32
lines changed

java/vector/src/main/java/org/apache/arrow/vector/compare/ApproxEqualsVisitor.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public class ApproxEqualsVisitor extends RangeEqualsVisitor {
4949
private DiffFunction<Double> doubleDiffFunction =
5050
(Double value1, Double value2) -> Math.abs(value1 - value2);
5151

52+
public ApproxEqualsVisitor(float floatEpsilon, double doubleEpsilon) {
53+
this.floatEpsilon = floatEpsilon;
54+
this.doubleEpsilon = doubleEpsilon;
55+
}
56+
5257
public ApproxEqualsVisitor(ValueVector right, float epsilon) {
5358
this (right, epsilon, epsilon, true);
5459
}
@@ -66,9 +71,9 @@ public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleE
6671
*/
6772
public ApproxEqualsVisitor(ValueVector right, float floatEpsilon, double doubleEpsilon, boolean typeCheckNeeded,
6873
int leftStart, int rightStart, int length) {
69-
super(right, rightStart, leftStart, length, typeCheckNeeded);
7074
this.floatEpsilon = floatEpsilon;
7175
this.doubleEpsilon = doubleEpsilon;
76+
set(right, rightStart, leftStart, length, typeCheckNeeded);
7277
}
7378

7479
public void setFloatDiffFunction(DiffFunction<Float> floatDiffFunction) {
@@ -102,9 +107,9 @@ protected boolean compareUnionVectors(UnionVector left) {
102107
return false;
103108
}
104109

110+
ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon);
105111
for (int k = 0; k < leftChildren.size(); k++) {
106-
ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(rightChildren.get(k),
107-
floatEpsilon, doubleEpsilon);
112+
visitor.set(rightChildren.get(k), 0, 0, rightChildren.get(k).getValueCount(), true);
108113
if (!leftChildren.get(k).accept(visitor, null)) {
109114
return false;
110115
}
@@ -121,9 +126,9 @@ protected boolean compareStructVectors(NonNullableStructVector left) {
121126
return false;
122127
}
123128

129+
ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon);
124130
for (String name : left.getChildFieldNames()) {
125-
ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(rightVector.getChild(name),
126-
floatEpsilon, doubleEpsilon);
131+
visitor.set(rightVector.getChild(name), 0, 0, rightVector.getChild(name).getValueCount(), true);
127132
if (!left.getChild(name).accept(visitor, null)) {
128133
return false;
129134
}
@@ -134,7 +139,7 @@ protected boolean compareStructVectors(NonNullableStructVector left) {
134139

135140
@Override
136141
protected boolean compareListVectors(ListVector left) {
137-
142+
ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon);
138143
for (int i = 0; i < length; i++) {
139144
int leftIndex = leftStart + i;
140145
int rightIndex = rightStart + i;
@@ -160,8 +165,8 @@ protected boolean compareListVectors(ListVector left) {
160165
ValueVector leftDataVector = left.getDataVector();
161166
ValueVector rightDataVector = ((ListVector)right).getDataVector();
162167

163-
if (!leftDataVector.accept(new ApproxEqualsVisitor(rightDataVector, floatEpsilon, doubleEpsilon,
164-
typeCheckNeeded, startIndexLeft, startIndexRight, (endIndexLeft - startIndexLeft)), null)) {
168+
visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true);
169+
if (!leftDataVector.accept(visitor, null)) {
165170
return false;
166171
}
167172
}
@@ -175,6 +180,7 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) {
175180
return false;
176181
}
177182

183+
ApproxEqualsVisitor visitor = new ApproxEqualsVisitor(floatEpsilon, doubleEpsilon);
178184
for (int i = 0; i < length; i++) {
179185
int leftIndex = leftStart + i;
180186
int rightIndex = rightStart + i;
@@ -200,8 +206,8 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) {
200206
ValueVector leftDataVector = left.getDataVector();
201207
ValueVector rightDataVector = ((FixedSizeListVector)right).getDataVector();
202208

203-
if (!leftDataVector.accept(new ApproxEqualsVisitor(rightDataVector, floatEpsilon, doubleEpsilon,
204-
typeCheckNeeded, startIndexLeft, startIndexRight, (endIndexLeft - startIndexLeft)), null)) {
209+
visitor.set(rightDataVector, rightStart, leftStart, endIndexLeft - startIndexLeft, true);
210+
if (!leftDataVector.accept(visitor, null)) {
205211
return false;
206212
}
207213
}

java/vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,24 @@
3737
*/
3838
public class RangeEqualsVisitor implements VectorVisitor<Boolean, Void> {
3939

40-
protected final ValueVector right;
41-
protected int leftStart;
42-
protected int rightStart;
43-
protected int length;
40+
protected ValueVector right;
41+
protected int leftStart = -1;
42+
protected int rightStart = -1;
43+
protected int length = -1;
4444

4545
protected boolean typeCheckNeeded = true;
4646

47+
/**
48+
* The default constructor.
49+
*/
50+
public RangeEqualsVisitor() {
51+
}
52+
4753
/**
4854
* Constructs a new instance.
4955
*/
5056
public RangeEqualsVisitor(ValueVector right, int rightStart, int leftStart, int length, boolean typeCheckNeeded) {
51-
this.leftStart = leftStart;
52-
this.rightStart = rightStart;
53-
this.right = right;
54-
this.length = length;
55-
this.typeCheckNeeded = typeCheckNeeded;
56-
Preconditions.checkArgument(length >= 0, "length must be non negative");
57+
set(right, rightStart, leftStart, length, typeCheckNeeded);
5758
}
5859

5960
/**
@@ -63,6 +64,18 @@ public RangeEqualsVisitor(ValueVector right, int leftStart, int rightStart, int
6364
this(right, rightStart, leftStart, length, true);
6465
}
6566

67+
/**
68+
* Sets the parameters for comparison.
69+
*/
70+
public void set(ValueVector right, int rightStart, int leftStart, int length, boolean typeCheckNeeded) {
71+
this.right = right;
72+
this.leftStart = leftStart;
73+
this.rightStart = rightStart;
74+
this.length = length;
75+
this.typeCheckNeeded = typeCheckNeeded;
76+
Preconditions.checkArgument(length >= 0, "length must be non negative");
77+
}
78+
6679
/**
6780
* Do some validation work, like type check and indices check.
6881
*/
@@ -81,6 +94,12 @@ protected boolean validate(ValueVector left) {
8194
Preconditions.checkArgument((rightStart + length) <= right.getValueCount(),
8295
"(rightStart + length) %s out of range[0, %s].", 0, right.getValueCount());
8396

97+
Preconditions.checkArgument(left != null,
98+
"left vector cannot be null");
99+
100+
Preconditions.checkArgument(right != null,
101+
"right vector cannot be null");
102+
84103
return true;
85104
}
86105

@@ -144,9 +163,10 @@ protected boolean compareUnionVectors(UnionVector left) {
144163
return false;
145164
}
146165

166+
RangeEqualsVisitor visitor = new RangeEqualsVisitor();
147167
for (int k = 0; k < leftChildren.size(); k++) {
148-
RangeEqualsVisitor visitor = new RangeEqualsVisitor(rightChildren.get(k),
149-
leftStart, rightStart, length);
168+
visitor.set(rightChildren.get(k),
169+
rightStart, leftStart, length, true);
150170
if (!leftChildren.get(k).accept(visitor, null)) {
151171
return false;
152172
}
@@ -162,9 +182,10 @@ protected boolean compareStructVectors(NonNullableStructVector left) {
162182
return false;
163183
}
164184

185+
RangeEqualsVisitor visitor = new RangeEqualsVisitor();
165186
for (String name : left.getChildFieldNames()) {
166-
RangeEqualsVisitor visitor = new RangeEqualsVisitor(rightVector.getChild(name),
167-
leftStart, rightStart, length);
187+
visitor.set(rightVector.getChild(name),
188+
rightStart, leftStart, length, true);
168189
if (!left.getChild(name).accept(visitor, null)) {
169190
return false;
170191
}
@@ -236,7 +257,7 @@ protected boolean compareBaseVariableWidthVectors(BaseVariableWidthVector left)
236257
}
237258

238259
protected boolean compareListVectors(ListVector left) {
239-
260+
RangeEqualsVisitor visitor = new RangeEqualsVisitor();
240261
for (int i = 0; i < length; i++) {
241262
int leftIndex = leftStart + i;
242263
int rightIndex = rightStart + i;
@@ -262,8 +283,8 @@ protected boolean compareListVectors(ListVector left) {
262283
ValueVector leftDataVector = left.getDataVector();
263284
ValueVector rightDataVector = ((ListVector)right).getDataVector();
264285

265-
if (!leftDataVector.accept(new RangeEqualsVisitor(rightDataVector, startIndexLeft,
266-
startIndexRight, (endIndexLeft - startIndexLeft)), null)) {
286+
visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true);
287+
if (!leftDataVector.accept(visitor, null)) {
267288
return false;
268289
}
269290
}
@@ -277,6 +298,7 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) {
277298
return false;
278299
}
279300

301+
RangeEqualsVisitor visitor = new RangeEqualsVisitor();
280302
for (int i = 0; i < length; i++) {
281303
int leftIndex = leftStart + i;
282304
int rightIndex = rightStart + i;
@@ -302,8 +324,8 @@ protected boolean compareFixedSizeListVectors(FixedSizeListVector left) {
302324
ValueVector leftDataVector = left.getDataVector();
303325
ValueVector rightDataVector = ((FixedSizeListVector)right).getDataVector();
304326

305-
if (!leftDataVector.accept(new RangeEqualsVisitor(rightDataVector, startIndexLeft, startIndexRight,
306-
(endIndexLeft - startIndexLeft)), null)) {
327+
visitor.set(rightDataVector, startIndexRight, startIndexLeft, endIndexLeft - startIndexLeft, true);
328+
if (!leftDataVector.accept(visitor, null)) {
307329
return false;
308330
}
309331
}

java/vector/src/main/java/org/apache/arrow/vector/dictionary/DictionaryHashTable.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,13 @@ static final int roundUpToPowerOf2(int size) {
136136
public int getIndex(int indexInArray, ValueVector toEncode) {
137137
int hash = toEncode.hashCode(indexInArray);
138138
int index = indexFor(hash, table.length);
139+
140+
RangeEqualsVisitor equalVisitor = new RangeEqualsVisitor();
139141
for (DictionaryHashTable.Entry e = table[index]; e != null ; e = e.next) {
140142
if (e.hash == hash) {
141143
int dictIndex = e.index;
142-
143-
if (new RangeEqualsVisitor(dictionary, dictIndex, indexInArray, 1, false)
144-
.equals(toEncode)) {
144+
equalVisitor.set(dictionary, dictIndex, indexInArray, 1, false);
145+
if (equalVisitor.equals(toEncode)) {
145146
return dictIndex;
146147
}
147148
}

0 commit comments

Comments
 (0)