Skip to content

Commit 4d8b570

Browse files
committed
[ARROW-6738][Java] Fix problems with current union comparison logic
1 parent 3dc2813 commit 4d8b570

File tree

4 files changed

+66
-14
lines changed

4 files changed

+66
-14
lines changed

java/vector/src/main/codegen/templates/UnionVector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ public Iterator<ValueVector> iterator() {
550550
return vectors.iterator();
551551
}
552552

553-
private ValueVector getVector(int index) {
553+
public ValueVector getVector(int index) {
554554
int type = typeBuffer.getByte(index * TYPE_WIDTH);
555555
switch (MinorType.values()[type]) {
556556
case NULL:

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.apache.arrow.util.Preconditions;
2525
import org.apache.arrow.vector.BaseFixedWidthVector;
2626
import org.apache.arrow.vector.BaseVariableWidthVector;
27-
import org.apache.arrow.vector.FieldVector;
2827
import org.apache.arrow.vector.NullVector;
2928
import org.apache.arrow.vector.ValueVector;
3029
import org.apache.arrow.vector.complex.BaseRepeatedValueVector;
@@ -189,26 +188,37 @@ public Boolean visit(NullVector left, Range range) {
189188
/**
190189
* Creates a visitor to visit child vectors.
191190
* It is used for complex vector types.
192-
* @return the visitor for child vecors.
191+
* @return the visitor for child vectors.
193192
*/
194193
protected RangeEqualsVisitor createInnerVisitor(ValueVector leftInner, ValueVector rightInner) {
194+
return this.createInnerVisitor(leftInner, rightInner, this.typeComparator);
195+
}
196+
197+
protected RangeEqualsVisitor createInnerVisitor(
198+
ValueVector leftInner, ValueVector rightInner,
199+
BiFunction<ValueVector, ValueVector, Boolean> typeComparator) {
195200
return new RangeEqualsVisitor(leftInner, rightInner, typeComparator);
196201
}
197202

198203
protected boolean compareUnionVectors(Range range) {
199204
UnionVector leftVector = (UnionVector) left;
200205
UnionVector rightVector = (UnionVector) right;
201206

202-
List<FieldVector> leftChildren = leftVector.getChildrenFromFields();
203-
List<FieldVector> rightChildren = rightVector.getChildrenFromFields();
204-
205-
if (leftChildren.size() != rightChildren.size()) {
206-
return false;
207-
}
208-
209-
for (int k = 0; k < leftChildren.size(); k++) {
210-
RangeEqualsVisitor visitor = createInnerVisitor(leftChildren.get(k), rightChildren.get(k));
211-
if (!visitor.rangeEquals(range)) {
207+
Range subRange = new Range(0, 0, 1);
208+
for (int i = 0; i < range.getLength(); i++) {
209+
subRange.setLeftStart(range.getLeftStart() + i).setRightStart(range.getRightStart() + i);
210+
ValueVector leftSubVector = leftVector.getVector(range.getLeftStart() + i);
211+
ValueVector rightSubVector = rightVector.getVector(range.getRightStart() + i);
212+
213+
if (leftSubVector == null || rightSubVector == null) {
214+
if (leftSubVector == rightSubVector) {
215+
continue;
216+
} else {
217+
return false;
218+
}
219+
}
220+
RangeEqualsVisitor visitor = createInnerVisitor(leftSubVector, rightSubVector, true);
221+
if (!visitor.rangeEquals(subRange)) {
212222
return false;
213223
}
214224
}

java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2320,7 +2320,7 @@ public void testDecimalVectorEquals() {
23202320
VectorEqualsVisitor visitor2 = new VectorEqualsVisitor();
23212321

23222322
assertTrue(visitor1.vectorEquals(vector1, vector2));
2323-
assertFalse(visitor2.vectorEquals(vector1, vector3));
2323+
assertTrue(visitor2.vectorEquals(vector1, vector3));
23242324
}
23252325
}
23262326

java/vector/src/test/java/org/apache/arrow/vector/compare/TestRangeEqualsVisitor.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,48 @@ public void testUnionVectorRangeEquals() {
282282
}
283283
}
284284

285+
/**
286+
* Test comparing two union vectors.
287+
* The two vectors are different in total, but have a range with equal values.
288+
*/
289+
@Test
290+
public void testUnionVectorSubRangeEquals() {
291+
try (final UnionVector vector1 = new UnionVector("union", allocator, null, null);
292+
final UnionVector vector2 = new UnionVector("union", allocator, null, null);) {
293+
294+
final NullableUInt4Holder uInt4Holder = new NullableUInt4Holder();
295+
uInt4Holder.value = 10;
296+
uInt4Holder.isSet = 1;
297+
298+
final NullableIntHolder intHolder = new NullableIntHolder();
299+
uInt4Holder.value = 20;
300+
uInt4Holder.isSet = 1;
301+
302+
vector1.setType(0, Types.MinorType.UINT4);
303+
vector1.setSafe(0, uInt4Holder);
304+
305+
vector1.setType(1, Types.MinorType.INT);
306+
vector1.setSafe(1, intHolder);
307+
308+
vector1.setType(2, Types.MinorType.INT);
309+
vector1.setSafe(2, intHolder);
310+
vector1.setValueCount(3);
311+
312+
vector2.setType(0, Types.MinorType.SMALLINT);
313+
vector2.setSafe(0, intHolder);
314+
315+
vector2.setType(1, Types.MinorType.INT);
316+
vector2.setSafe(1, intHolder);
317+
318+
vector2.setType(2, Types.MinorType.INT);
319+
vector2.setSafe(2, intHolder);
320+
vector2.setValueCount(3);
321+
322+
RangeEqualsVisitor visitor = new RangeEqualsVisitor(vector1, vector2);
323+
assertTrue(visitor.rangeEquals(new Range(1, 1, 2)));
324+
}
325+
}
326+
285327
@Ignore
286328
@Test
287329
public void testEqualsWithOutTypeCheck() {

0 commit comments

Comments
 (0)