You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by ja...@apache.org on 2014/06/02 18:51:24 UTC
[3/6] git commit: DRILL-874 : Fix code to handle splitAndTransferTo
in BitVector, when copy is required.
DRILL-874 : Fix code to handle splitAndTransferTo in BitVector, when copy is required.
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/d52e3251
Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/d52e3251
Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/d52e3251
Branch: refs/heads/master
Commit: d52e3251ba30edb7a5ab2fcc0e876fa8e1125bfd
Parents: 760cbd4
Author: Jinfeng Ni <jn...@maprtech.com>
Authored: Sun Jun 1 11:06:29 2014 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Mon Jun 2 09:12:39 2014 -0700
----------------------------------------------------------------------
.../org/apache/drill/exec/vector/BitVector.java | 29 +++++++++++---------
1 file changed, 16 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/d52e3251/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BitVector.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BitVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BitVector.java
index 14324b0..e217ddb 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BitVector.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BitVector.java
@@ -60,11 +60,11 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe
}
private int getSizeFromCount(int valueCount) {
- return (int) Math.ceil((float)valueCount / 8.0);
+ return (int) Math.ceil(valueCount / 8.0);
}
private int getByteIndex(int index) {
- return (int) Math.floor((float) index / 8.0);
+ return (int) Math.floor(index / 8.0);
}
public void allocateNew() {
@@ -174,27 +174,30 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe
public void splitAndTransferTo(int startIndex, int length, BitVector target) {
assert startIndex + length <= valueCount;
int firstByte = getByteIndex(startIndex);
- int lastByte = getSizeFromCount(startIndex + length) - 1;
+ int byteSize = getSizeFromCount(length);
int offset = startIndex % 8;
if (offset == 0) {
// slice
- target.data = this.data.slice(firstByte, lastByte - firstByte + 1);
+ target.data = this.data.slice(firstByte, byteSize);
target.data.retain();
} else {
// Copy data
+ // When the first bit starts from the middle of a byte (offset != 0), copy data from src BitVector.
+ // Each byte in the target is composed by a part in i-th byte, another part in (i+1)-th byte.
+ // The last byte copied to target is a bit tricky :
+ // 1) if length requires partly byte ( length % 8 !=0), copy the remaining bits only.
+ // 2) otherwise, copy the last byte in the same way as to the prior bytes.
target.clear();
target.allocateNew(length);
- if ((startIndex + length) % 8 == 0) {
- lastByte++;
- }
- int i = firstByte;
// TODO maybe do this one word at a time, rather than byte?
- for (; i <= lastByte - 1; i++) {
- target.data.setByte(i - firstByte, (((this.data.getByte(i) & 0xFF) >>> offset) + (this.data.getByte(i + 1) << (8 - offset))));
- }
- if (startIndex + length == this.valueCount) {
- target.data.setByte(i - firstByte, ((this.data.getByte(lastByte) & 0xFF) >>> offset));
+ for (int i = 0; i < byteSize - 1; i++) {
+ target.data.setByte(i, (((this.data.getByte(firstByte + i) & 0xFF) >>> offset) + (this.data.getByte(firstByte + i + 1) << (8 - offset))));
}
+ if (length % 8 != 0)
+ target.data.setByte(byteSize - 1, ((this.data.getByte(firstByte + byteSize - 1) & 0xFF) >>> offset));
+ else
+ target.data.setByte(byteSize - 1,
+ (((this.data.getByte(firstByte + byteSize - 1) & 0xFF) >>> offset) + (this.data.getByte(firstByte + byteSize) << (8 - offset))));
}
}