@Override public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { Block leftArray = leftBlock.getObject(leftPosition, Block.class); Block rightArray = rightBlock.getObject(rightPosition, Block.class); if (leftArray.getPositionCount() != rightArray.getPositionCount()) { return false; } for (int i = 0; i < leftArray.getPositionCount(); i++) { checkElementNotNull(leftArray.isNull(i), ARRAY_NULL_ELEMENT_MSG); checkElementNotNull(rightArray.isNull(i), ARRAY_NULL_ELEMENT_MSG); if (!elementType.equalTo(leftArray, i, rightArray, i)) { return false; } } return true; }
@Override public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { Block leftMapBlock = leftBlock.getObject(leftPosition, Block.class); Block rightMapBlock = rightBlock.getObject(rightPosition, Block.class); if (leftMapBlock.getPositionCount() != rightMapBlock.getPositionCount()) { return false; } Map<KeyWrapper, Integer> wrappedLeftMap = new HashMap<>(); for (int position = 0; position < leftMapBlock.getPositionCount(); position += 2) { wrappedLeftMap.put(new KeyWrapper(keyType, leftMapBlock, position), position + 1); } for (int position = 0; position < rightMapBlock.getPositionCount(); position += 2) { KeyWrapper key = new KeyWrapper(keyType, rightMapBlock, position); Integer leftValuePosition = wrappedLeftMap.get(key); if (leftValuePosition == null) { return false; } int rightValuePosition = position + 1; checkElementNotNull(leftMapBlock.isNull(leftValuePosition), MAP_NULL_ELEMENT_MSG); checkElementNotNull(rightMapBlock.isNull(rightValuePosition), MAP_NULL_ELEMENT_MSG); if (!valueType.equalTo(leftMapBlock, leftValuePosition, rightMapBlock, rightValuePosition)) { return false; } } return true; }
@Override public int compareTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { if (!elementType.isOrderable()) { throw new UnsupportedOperationException(getTypeSignature() + " type is not orderable"); } Block leftArray = leftBlock.getObject(leftPosition, Block.class); Block rightArray = rightBlock.getObject(rightPosition, Block.class); int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount()); int index = 0; while (index < len) { checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG); checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG); int comparison = elementType.compareTo(leftArray, index, rightArray, index); if (comparison != 0) { return comparison; } index++; } if (index == len) { return leftArray.getPositionCount() - rightArray.getPositionCount(); } return 0; }
@Override public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { Block leftArray = leftBlock.getObject(leftPosition, Block.class); Block rightArray = rightBlock.getObject(rightPosition, Block.class); if (leftArray.getPositionCount() != rightArray.getPositionCount()) { return false; } for (int i = 0; i < leftArray.getPositionCount(); i++) { checkElementNotNull(leftArray.isNull(i), ARRAY_NULL_ELEMENT_MSG); checkElementNotNull(rightArray.isNull(i), ARRAY_NULL_ELEMENT_MSG); if (!elementType.equalTo(leftArray, i, rightArray, i)) { return false; } } return true; }
@Override public boolean equalTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { Block leftMapBlock = leftBlock.getObject(leftPosition, Block.class); Block rightMapBlock = rightBlock.getObject(rightPosition, Block.class); if (leftMapBlock.getPositionCount() != rightMapBlock.getPositionCount()) { return false; } Map<KeyWrapper, Integer> wrappedLeftMap = new HashMap<>(); for (int position = 0; position < leftMapBlock.getPositionCount(); position += 2) { wrappedLeftMap.put(new KeyWrapper(keyType, leftMapBlock, position), position + 1); } for (int position = 0; position < rightMapBlock.getPositionCount(); position += 2) { KeyWrapper key = new KeyWrapper(keyType, rightMapBlock, position); Integer leftValuePosition = wrappedLeftMap.get(key); if (leftValuePosition == null) { return false; } int rightValuePosition = position + 1; checkElementNotNull(leftMapBlock.isNull(leftValuePosition), MAP_NULL_ELEMENT_MSG); checkElementNotNull(rightMapBlock.isNull(rightValuePosition), MAP_NULL_ELEMENT_MSG); if (!valueType.equalTo(leftMapBlock, leftValuePosition, rightMapBlock, rightValuePosition)) { return false; } } return true; }
@Override public int compareTo(Block leftBlock, int leftPosition, Block rightBlock, int rightPosition) { if (!elementType.isOrderable()) { throw new UnsupportedOperationException(getTypeSignature() + " type is not orderable"); } Block leftArray = leftBlock.getObject(leftPosition, Block.class); Block rightArray = rightBlock.getObject(rightPosition, Block.class); int len = Math.min(leftArray.getPositionCount(), rightArray.getPositionCount()); int index = 0; while (index < len) { checkElementNotNull(leftArray.isNull(index), ARRAY_NULL_ELEMENT_MSG); checkElementNotNull(rightArray.isNull(index), ARRAY_NULL_ELEMENT_MSG); int comparison = elementType.compareTo(leftArray, index, rightArray, index); if (comparison != 0) { return comparison; } index++; } if (index == len) { return leftArray.getPositionCount() - rightArray.getPositionCount(); } return 0; }