in vector/src/main/java/org/apache/arrow/vector/compare/RangeEqualsVisitor.java [601:690]
protected boolean compareBaseVariableWidthViewVectors(Range range) {
BaseVariableWidthViewVector leftVector = (BaseVariableWidthViewVector) left;
BaseVariableWidthViewVector rightVector = (BaseVariableWidthViewVector) right;
final ArrowBuf leftViewBuffer = leftVector.getDataBuffer();
final ArrowBuf rightViewBuffer = rightVector.getDataBuffer();
final int elementSize = BaseVariableWidthViewVector.ELEMENT_SIZE;
final int lengthWidth = BaseVariableWidthViewVector.LENGTH_WIDTH;
final int prefixWidth = BaseVariableWidthViewVector.PREFIX_WIDTH;
final int bufIndexWidth = BaseVariableWidthViewVector.BUF_INDEX_WIDTH;
List<ArrowBuf> leftDataBuffers = leftVector.getDataBuffers();
List<ArrowBuf> rightDataBuffers = rightVector.getDataBuffers();
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;
}
if (isNull) {
continue;
}
int startLeftByteOffset = leftIndex * elementSize;
int startRightByteOffset = rightIndex * elementSize;
int leftDataBufferValueLength = leftVector.getValueLength(leftIndex);
int rightDataBufferValueLength = rightVector.getValueLength(rightIndex);
if (leftDataBufferValueLength != rightDataBufferValueLength) {
return false;
}
if (leftDataBufferValueLength > BaseVariableWidthViewVector.INLINE_SIZE) {
// if the value is stored in the dataBuffers
int leftDataBufferIndex =
leftViewBuffer.getInt(startLeftByteOffset + lengthWidth + prefixWidth);
int rightDataBufferIndex =
rightViewBuffer.getInt(startRightByteOffset + lengthWidth + prefixWidth);
final int leftDataOffset =
leftViewBuffer.getInt(startLeftByteOffset + lengthWidth + prefixWidth + bufIndexWidth);
final int rightDataOffset =
rightViewBuffer.getInt(
startRightByteOffset + lengthWidth + prefixWidth + bufIndexWidth);
ArrowBuf leftDataBuffer = leftDataBuffers.get(leftDataBufferIndex);
ArrowBuf rightDataBuffer = rightDataBuffers.get(rightDataBufferIndex);
// check equality in the considered string stored in the dataBuffers
int retDataBuf =
ByteFunctionHelpers.equal(
leftDataBuffer,
leftDataOffset,
leftDataOffset + leftDataBufferValueLength,
rightDataBuffer,
rightDataOffset,
rightDataOffset + rightDataBufferValueLength);
if (retDataBuf == 0) {
return false;
}
} else {
// if the value is stored in the view
final int leftDataOffset = startLeftByteOffset + lengthWidth;
final int rightDataOffset = startRightByteOffset + lengthWidth;
// check equality in the considered string stored in the view
int retDataBuf =
ByteFunctionHelpers.equal(
leftViewBuffer,
leftDataOffset,
leftDataOffset + leftDataBufferValueLength,
rightViewBuffer,
rightDataOffset,
rightDataOffset + rightDataBufferValueLength);
if (retDataBuf == 0) {
return false;
}
}
}
return true;
}