http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/util/DecimalUtility.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/util/DecimalUtility.java b/exec/java-exec/src/main/java/org/apache/drill/exec/util/DecimalUtility.java new file mode 100644 index 0000000..8e752eb --- /dev/null +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/util/DecimalUtility.java @@ -0,0 +1,692 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec.util; + +import io.netty.buffer.DrillBuf; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Arrays; + +import org.apache.drill.common.types.TypeProtos; +import org.apache.drill.common.util.CoreDecimalUtility; + +public class DecimalUtility extends CoreDecimalUtility{ + + public final static int MAX_DIGITS = 9; + public final static int DIGITS_BASE = 1000000000; + public final static int DIGITS_MAX = 999999999; + public final static int integerSize = (Integer.SIZE/8); + + public final static String[] decimalToString = {"", + "0", + "00", + "000", + "0000", + "00000", + "000000", + "0000000", + "00000000", + "000000000"}; + + public final static long[] scale_long_constants = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000l, + 100000000000l, + 1000000000000l, + 10000000000000l, + 100000000000000l, + 1000000000000000l, + 10000000000000000l, + 100000000000000000l, + 1000000000000000000l}; + + /* + * Simple function that returns the static precomputed + * power of ten, instead of using Math.pow + */ + public static long getPowerOfTen(int power) { + assert power >= 0 && power < scale_long_constants.length; + return scale_long_constants[(power)]; + } + + /* + * Math.pow returns a double and while multiplying with large digits + * in the decimal data type we encounter noise. So instead of multiplying + * with Math.pow we use the static constants to perform the multiplication + */ + public static long adjustScaleMultiply(long input, int factor) { + int index = Math.abs(factor); + assert index >= 0 && index < scale_long_constants.length; + if (factor >= 0) { + return input * scale_long_constants[index]; + } else { + return input / scale_long_constants[index]; + } + } + + public static long adjustScaleDivide(long input, int factor) { + int index = Math.abs(factor); + assert index >= 0 && index < scale_long_constants.length; + if (factor >= 0) { + return input / scale_long_constants[index]; + } else { + return input * scale_long_constants[index]; + } + } + + /* Given the number of actual digits this function returns the + * number of indexes it will occupy in the array of integers + * which are stored in base 1 billion + */ + public static int roundUp(int ndigits) { + return (ndigits + MAX_DIGITS - 1)/MAX_DIGITS; + } + + /* Returns a string representation of the given integer + * If the length of the given integer is less than the + * passed length, this function will prepend zeroes to the string + */ + public static StringBuilder toStringWithZeroes(int number, int desiredLength) { + String value = ((Integer) number).toString(); + int length = value.length(); + + StringBuilder str = new StringBuilder(); + str.append(decimalToString[desiredLength - length]); + str.append(value); + + return str; + } + + public static StringBuilder toStringWithZeroes(long number, int desiredLength) { + String value = ((Long) number).toString(); + int length = value.length(); + + StringBuilder str = new StringBuilder(); + + // Desired length can be > MAX_DIGITS + int zeroesLength = desiredLength - length; + while (zeroesLength > MAX_DIGITS) { + str.append(decimalToString[MAX_DIGITS]); + zeroesLength -= MAX_DIGITS; + } + str.append(decimalToString[zeroesLength]); + str.append(value); + + return str; + } + + public static BigDecimal getBigDecimalFromIntermediate(DrillBuf data, int startIndex, int nDecimalDigits, int scale) { + + // In the intermediate representation we don't pad the scale with zeroes, so set truncate = false + return getBigDecimalFromDrillBuf(data, startIndex, nDecimalDigits, scale, false); + } + + public static BigDecimal getBigDecimalFromSparse(DrillBuf data, int startIndex, int nDecimalDigits, int scale) { + + // In the sparse representation we pad the scale with zeroes for ease of arithmetic, need to truncate + return getBigDecimalFromDrillBuf(data, startIndex, nDecimalDigits, scale, true); + } + + public static BigDecimal getBigDecimalFromDrillBuf(DrillBuf bytebuf, int start, int length, int scale) { + byte[] value = new byte[length]; + bytebuf.getBytes(start, value, 0, length); + BigInteger unscaledValue = new BigInteger(value); + return new BigDecimal(unscaledValue, scale); + } + + /* Create a BigDecimal object using the data in the DrillBuf. + * This function assumes that data is provided in a non-dense format + * It works on both sparse and intermediate representations. + */ + public static BigDecimal getBigDecimalFromDrillBuf(DrillBuf data, int startIndex, int nDecimalDigits, int scale, boolean truncateScale) { + + // For sparse decimal type we have padded zeroes at the end, strip them while converting to BigDecimal. + int actualDigits; + + // Initialize the BigDecimal, first digit in the DrillBuf has the sign so mask it out + BigInteger decimalDigits = BigInteger.valueOf((data.getInt(startIndex)) & 0x7FFFFFFF); + + BigInteger base = BigInteger.valueOf(DIGITS_BASE); + + for (int i = 1; i < nDecimalDigits; i++) { + + BigInteger temp = BigInteger.valueOf(data.getInt(startIndex + (i * integerSize))); + decimalDigits = decimalDigits.multiply(base); + decimalDigits = decimalDigits.add(temp); + } + + // Truncate any additional padding we might have added + if (truncateScale == true && scale > 0 && (actualDigits = scale % MAX_DIGITS) != 0) { + BigInteger truncate = BigInteger.valueOf((int)Math.pow(10, (MAX_DIGITS - actualDigits))); + decimalDigits = decimalDigits.divide(truncate); + } + + // set the sign + if ((data.getInt(startIndex) & 0x80000000) != 0) { + decimalDigits = decimalDigits.negate(); + } + + BigDecimal decimal = new BigDecimal(decimalDigits, scale); + + return decimal; + } + + /* This function returns a BigDecimal object from the dense decimal representation. + * First step is to convert the dense representation into an intermediate representation + * and then invoke getBigDecimalFromDrillBuf() to get the BigDecimal object + */ + public static BigDecimal getBigDecimalFromDense(DrillBuf data, int startIndex, int nDecimalDigits, int scale, int maxPrecision, int width) { + + /* This method converts the dense representation to + * an intermediate representation. The intermediate + * representation has one more integer than the dense + * representation. + */ + byte[] intermediateBytes = new byte[((nDecimalDigits + 1) * integerSize)]; + + // Start storing from the least significant byte of the first integer + int intermediateIndex = 3; + + int[] mask = {0x03, 0x0F, 0x3F, 0xFF}; + int[] reverseMask = {0xFC, 0xF0, 0xC0, 0x00}; + + int maskIndex; + int shiftOrder; + byte shiftBits; + + // TODO: Some of the logic here is common with casting from Dense to Sparse types, factor out common code + if (maxPrecision == 38) { + maskIndex = 0; + shiftOrder = 6; + shiftBits = 0x00; + intermediateBytes[intermediateIndex++] = (byte) (data.getByte(startIndex) & 0x7F); + } else if (maxPrecision == 28) { + maskIndex = 1; + shiftOrder = 4; + shiftBits = (byte) ((data.getByte(startIndex) & 0x03) << shiftOrder); + intermediateBytes[intermediateIndex++] = (byte) (((data.getByte(startIndex) & 0x3C) & 0xFF) >>> 2); + } else { + throw new UnsupportedOperationException("Dense types with max precision 38 and 28 are only supported"); + } + + int inputIndex = 1; + boolean sign = false; + + if ((data.getByte(startIndex) & 0x80) != 0) { + sign = true; + } + + while (inputIndex < width) { + + intermediateBytes[intermediateIndex] = (byte) ((shiftBits) | (((data.getByte(startIndex + inputIndex) & reverseMask[maskIndex]) & 0xFF) >>> (8 - shiftOrder))); + + shiftBits = (byte) ((data.getByte(startIndex + inputIndex) & mask[maskIndex]) << shiftOrder); + + inputIndex++; + intermediateIndex++; + + if (((inputIndex - 1) % integerSize) == 0) { + shiftBits = (byte) ((shiftBits & 0xFF) >>> 2); + maskIndex++; + shiftOrder -= 2; + } + + } + /* copy the last byte */ + intermediateBytes[intermediateIndex] = shiftBits; + + if (sign == true) { + intermediateBytes[0] = (byte) (intermediateBytes[0] | 0x80); + } + DrillBuf intermediate = data.getAllocator().buffer(intermediateBytes.length); + intermediate.setBytes(0, intermediateBytes); + + BigDecimal ret = getBigDecimalFromIntermediate(intermediate, 0, nDecimalDigits + 1, scale); + intermediate.release(); + return ret; + } + + /* + * Function converts the BigDecimal and stores it in out internal sparse representation + */ + public static void getSparseFromBigDecimal(BigDecimal input, DrillBuf data, int startIndex, int scale, int precision, int nDecimalDigits) { + + // Initialize the buffer + for (int i = 0; i < nDecimalDigits; i++) { + data.setInt(startIndex + (i * integerSize), 0); + } + + boolean sign = false; + + if (input.signum() == -1) { + // negative input + sign = true; + input = input.abs(); + } + + // Truncate the input as per the scale provided + input = input.setScale(scale, BigDecimal.ROUND_HALF_UP); + + // Separate out the integer part + BigDecimal integerPart = input.setScale(0, BigDecimal.ROUND_DOWN); + + int destIndex = nDecimalDigits - roundUp(scale) - 1; + + // we use base 1 billion integer digits for out integernal representation + BigDecimal base = new BigDecimal(DIGITS_BASE); + + while (integerPart.compareTo(BigDecimal.ZERO) == 1) { + // store the modulo as the integer value + data.setInt(startIndex + (destIndex * integerSize), (integerPart.remainder(base)).intValue()); + destIndex--; + // Divide by base 1 billion + integerPart = (integerPart.divide(base)).setScale(0, BigDecimal.ROUND_DOWN); + } + + /* Sparse representation contains padding of additional zeroes + * so each digit contains MAX_DIGITS for ease of arithmetic + */ + int actualDigits; + if ((actualDigits = (scale % MAX_DIGITS)) != 0) { + // Pad additional zeroes + scale = scale + (MAX_DIGITS - actualDigits); + input = input.setScale(scale, BigDecimal.ROUND_DOWN); + } + + //separate out the fractional part + BigDecimal fractionalPart = input.remainder(BigDecimal.ONE).movePointRight(scale); + + destIndex = nDecimalDigits - 1; + + while (scale > 0) { + // Get next set of MAX_DIGITS (9) store it in the DrillBuf + fractionalPart = fractionalPart.movePointLeft(MAX_DIGITS); + BigDecimal temp = fractionalPart.remainder(BigDecimal.ONE); + + data.setInt(startIndex + (destIndex * integerSize), (temp.unscaledValue().intValue())); + destIndex--; + + fractionalPart = fractionalPart.setScale(0, BigDecimal.ROUND_DOWN); + scale -= MAX_DIGITS; + } + + // Set the negative sign + if (sign == true) { + data.setInt(startIndex, data.getInt(startIndex) | 0x80000000); + } + + } + + + public static long getDecimal18FromBigDecimal(BigDecimal input, int scale, int precision) { + // Truncate or pad to set the input to the correct scale + input = input.setScale(scale, BigDecimal.ROUND_HALF_UP); + + return (input.unscaledValue().longValue()); + } + + public static BigDecimal getBigDecimalFromPrimitiveTypes(int input, int scale, int precision) { + return BigDecimal.valueOf(input, scale); + } + + public static BigDecimal getBigDecimalFromPrimitiveTypes(long input, int scale, int precision) { + return BigDecimal.valueOf(input, scale); + } + + + public static int compareDenseBytes(DrillBuf left, int leftStart, boolean leftSign, DrillBuf right, int rightStart, boolean rightSign, int width) { + + int invert = 1; + + /* If signs are different then simply look at the + * sign of the two inputs and determine which is greater + */ + if (leftSign != rightSign) { + + return((leftSign == true) ? -1 : 1); + } else if(leftSign == true) { + /* Both inputs are negative, at the end we will + * have to invert the comparison + */ + invert = -1; + } + + int cmp = 0; + + for (int i = 0; i < width; i++) { + byte leftByte = left.getByte(leftStart + i); + byte rightByte = right.getByte(rightStart + i); + // Unsigned byte comparison + if ((leftByte & 0xFF) > (rightByte & 0xFF)) { + cmp = 1; + break; + } else if ((leftByte & 0xFF) < (rightByte & 0xFF)) { + cmp = -1; + break; + } + } + cmp *= invert; // invert the comparison if both were negative values + + return cmp; + } + + public static int getIntegerFromSparseBuffer(DrillBuf buffer, int start, int index) { + int value = buffer.getInt(start + (index * 4)); + + if (index == 0) { + /* the first byte contains sign bit, return value without it */ + value = (value & 0x7FFFFFFF); + } + return value; + } + + public static void setInteger(DrillBuf buffer, int start, int index, int value) { + buffer.setInt(start + (index * 4), value); + } + + public static int compareSparseBytes(DrillBuf left, int leftStart, boolean leftSign, int leftScale, int leftPrecision, DrillBuf right, int rightStart, boolean rightSign, int rightPrecision, int rightScale, int width, int nDecimalDigits, boolean absCompare) { + + int invert = 1; + + if (absCompare == false) { + if (leftSign != rightSign) { + return (leftSign == true) ? -1 : 1; + } + + // Both values are negative invert the outcome of the comparison + if (leftSign == true) { + invert = -1; + } + } + + int cmp = compareSparseBytesInner(left, leftStart, leftSign, leftScale, leftPrecision, right, rightStart, rightSign, rightPrecision, rightScale, width, nDecimalDigits); + return cmp * invert; + } + public static int compareSparseBytesInner(DrillBuf left, int leftStart, boolean leftSign, int leftScale, int leftPrecision, DrillBuf right, int rightStart, boolean rightSign, int rightPrecision, int rightScale, int width, int nDecimalDigits) { + /* compute the number of integer digits in each decimal */ + int leftInt = leftPrecision - leftScale; + int rightInt = rightPrecision - rightScale; + + /* compute the number of indexes required for storing integer digits */ + int leftIntRoundedUp = org.apache.drill.exec.util.DecimalUtility.roundUp(leftInt); + int rightIntRoundedUp = org.apache.drill.exec.util.DecimalUtility.roundUp(rightInt); + + /* compute number of indexes required for storing scale */ + int leftScaleRoundedUp = org.apache.drill.exec.util.DecimalUtility.roundUp(leftScale); + int rightScaleRoundedUp = org.apache.drill.exec.util.DecimalUtility.roundUp(rightScale); + + /* compute index of the most significant integer digits */ + int leftIndex1 = nDecimalDigits - leftScaleRoundedUp - leftIntRoundedUp; + int rightIndex1 = nDecimalDigits - rightScaleRoundedUp - rightIntRoundedUp; + + int leftStopIndex = nDecimalDigits - leftScaleRoundedUp; + int rightStopIndex = nDecimalDigits - rightScaleRoundedUp; + + /* Discard the zeroes in the integer part */ + while (leftIndex1 < leftStopIndex) { + if (getIntegerFromSparseBuffer(left, leftStart, leftIndex1) != 0) { + break; + } + + /* Digit in this location is zero, decrement the actual number + * of integer digits + */ + leftIntRoundedUp--; + leftIndex1++; + } + + /* If we reached the stop index then the number of integers is zero */ + if (leftIndex1 == leftStopIndex) { + leftIntRoundedUp = 0; + } + + while (rightIndex1 < rightStopIndex) { + if (getIntegerFromSparseBuffer(right, rightStart, rightIndex1) != 0) { + break; + } + + /* Digit in this location is zero, decrement the actual number + * of integer digits + */ + rightIntRoundedUp--; + rightIndex1++; + } + + if (rightIndex1 == rightStopIndex) { + rightIntRoundedUp = 0; + } + + /* We have the accurate number of non-zero integer digits, + * if the number of integer digits are different then we can determine + * which decimal is larger and needn't go down to comparing individual values + */ + if (leftIntRoundedUp > rightIntRoundedUp) { + return 1; + } + else if (rightIntRoundedUp > leftIntRoundedUp) { + return -1; + } + + /* The number of integer digits are the same, set the each index + * to the first non-zero integer and compare each digit + */ + leftIndex1 = nDecimalDigits - leftScaleRoundedUp - leftIntRoundedUp; + rightIndex1 = nDecimalDigits - rightScaleRoundedUp - rightIntRoundedUp; + + while (leftIndex1 < leftStopIndex && rightIndex1 < rightStopIndex) { + if (getIntegerFromSparseBuffer(left, leftStart, leftIndex1) > getIntegerFromSparseBuffer(right, rightStart, rightIndex1)) { + return 1; + } + else if (getIntegerFromSparseBuffer(right, rightStart, rightIndex1) > getIntegerFromSparseBuffer(left, leftStart, leftIndex1)) { + return -1; + } + + leftIndex1++; + rightIndex1++; + } + + /* The integer part of both the decimal's are equal, now compare + * each individual fractional part. Set the index to be at the + * beginning of the fractional part + */ + leftIndex1 = leftStopIndex; + rightIndex1 = rightStopIndex; + + /* Stop indexes will be the end of the array */ + leftStopIndex = nDecimalDigits; + rightStopIndex = nDecimalDigits; + + /* compare the two fractional parts of the decimal */ + while (leftIndex1 < leftStopIndex && rightIndex1 < rightStopIndex) { + if (getIntegerFromSparseBuffer(left, leftStart, leftIndex1) > getIntegerFromSparseBuffer(right, rightStart, rightIndex1)) { + return 1; + } + else if (getIntegerFromSparseBuffer(right, rightStart, rightIndex1) > getIntegerFromSparseBuffer(left, leftStart, leftIndex1)) { + return -1; + } + + leftIndex1++; + rightIndex1++; + } + + /* Till now the fractional part of the decimals are equal, check + * if one of the decimal has fractional part that is remaining + * and is non-zero + */ + while (leftIndex1 < leftStopIndex) { + if (getIntegerFromSparseBuffer(left, leftStart, leftIndex1) != 0) { + return 1; + } + leftIndex1++; + } + + while(rightIndex1 < rightStopIndex) { + if (getIntegerFromSparseBuffer(right, rightStart, rightIndex1) != 0) { + return -1; + } + rightIndex1++; + } + + /* Both decimal values are equal */ + return 0; + } + + public static BigDecimal getBigDecimalFromByteArray(byte[] bytes, int start, int length, int scale) { + byte[] value = Arrays.copyOfRange(bytes, start, start + length); + BigInteger unscaledValue = new BigInteger(value); + return new BigDecimal(unscaledValue, scale); + } + + public static void roundDecimal(DrillBuf result, int start, int nDecimalDigits, int desiredScale, int currentScale) { + int newScaleRoundedUp = org.apache.drill.exec.util.DecimalUtility.roundUp(desiredScale); + int origScaleRoundedUp = org.apache.drill.exec.util.DecimalUtility.roundUp(currentScale); + + if (desiredScale < currentScale) { + + boolean roundUp = false; + + //Extract the first digit to be truncated to check if we need to round up + int truncatedScaleIndex = desiredScale + 1; + if (truncatedScaleIndex <= currentScale) { + int extractDigitIndex = nDecimalDigits - origScaleRoundedUp -1; + extractDigitIndex += org.apache.drill.exec.util.DecimalUtility.roundUp(truncatedScaleIndex); + int extractDigit = getIntegerFromSparseBuffer(result, start, extractDigitIndex); + int temp = org.apache.drill.exec.util.DecimalUtility.MAX_DIGITS - (truncatedScaleIndex % org.apache.drill.exec.util.DecimalUtility.MAX_DIGITS); + if (temp != 0) { + extractDigit = extractDigit / (int) (Math.pow(10, temp)); + } + if ((extractDigit % 10) > 4) { + roundUp = true; + } + } + + // Get the source index beyond which we will truncate + int srcIntIndex = nDecimalDigits - origScaleRoundedUp - 1; + int srcIndex = srcIntIndex + newScaleRoundedUp; + + // Truncate the remaining fractional part, move the integer part + int destIndex = nDecimalDigits - 1; + if (srcIndex != destIndex) { + while (srcIndex >= 0) { + setInteger(result, start, destIndex--, getIntegerFromSparseBuffer(result, start, srcIndex--)); + } + + // Set the remaining portion of the decimal to be zeroes + while (destIndex >= 0) { + setInteger(result, start, destIndex--, 0); + } + srcIndex = nDecimalDigits - 1; + } + + // We truncated the decimal digit. Now we need to truncate within the base 1 billion fractional digit + int truncateFactor = org.apache.drill.exec.util.DecimalUtility.MAX_DIGITS - (desiredScale % org.apache.drill.exec.util.DecimalUtility.MAX_DIGITS); + if (truncateFactor != org.apache.drill.exec.util.DecimalUtility.MAX_DIGITS) { + truncateFactor = (int) Math.pow(10, truncateFactor); + int fractionalDigits = getIntegerFromSparseBuffer(result, start, nDecimalDigits - 1); + fractionalDigits /= truncateFactor; + setInteger(result, start, nDecimalDigits - 1, fractionalDigits * truncateFactor); + } + + // Finally round up the digit if needed + if (roundUp == true) { + srcIndex = nDecimalDigits - 1; + int carry; + if (truncateFactor != org.apache.drill.exec.util.DecimalUtility.MAX_DIGITS) { + carry = truncateFactor; + } else { + carry = 1; + } + + while (srcIndex >= 0) { + int value = getIntegerFromSparseBuffer(result, start, srcIndex); + value += carry; + + if (value >= org.apache.drill.exec.util.DecimalUtility.DIGITS_BASE) { + setInteger(result, start, srcIndex--, value % org.apache.drill.exec.util.DecimalUtility.DIGITS_BASE); + carry = value / org.apache.drill.exec.util.DecimalUtility.DIGITS_BASE; + } else { + setInteger(result, start, srcIndex--, value); + carry = 0; + break; + } + } + } + } else if (desiredScale > currentScale) { + // Add fractional digits to the decimal + + // Check if we need to shift the decimal digits to the left + if (newScaleRoundedUp > origScaleRoundedUp) { + int srcIndex = 0; + int destIndex = newScaleRoundedUp - origScaleRoundedUp; + + // Check while extending scale, we are not overwriting integer part + while (srcIndex < destIndex) { + if (getIntegerFromSparseBuffer(result, start, srcIndex++) != 0) { + throw new org.apache.drill.common.exceptions.DrillRuntimeException("Truncate resulting in loss of integer part, reduce scale specified"); + } + } + + srcIndex = 0; + while (destIndex < nDecimalDigits) { + setInteger(result, start, srcIndex++, getIntegerFromSparseBuffer(result, start, destIndex++)); + } + + // Clear the remaining part + while (srcIndex < nDecimalDigits) { + setInteger(result, start, srcIndex++, 0); + } + } + } + } + + public static int getFirstFractionalDigit(int decimal, int scale) { + if (scale == 0) { + return 0; + } + int temp = (int) adjustScaleDivide(decimal, scale - 1); + return Math.abs(temp % 10); + } + + public static int getFirstFractionalDigit(long decimal, int scale) { + if (scale == 0) { + return 0; + } + long temp = adjustScaleDivide(decimal, scale - 1); + return (int) (Math.abs(temp % 10)); + } + + public static int getFirstFractionalDigit(DrillBuf data, int scale, int start, int nDecimalDigits) { + if (scale == 0) { + return 0; + } + + int index = nDecimalDigits - roundUp(scale); + return (int) (adjustScaleDivide(data.getInt(start + (index * integerSize)), MAX_DIGITS - 1)); + } +} +
http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java index 7d0fbc7..b711c66 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseDataValueVector.java @@ -17,9 +17,10 @@ */ package org.apache.drill.exec.vector; -import java.util.Iterator; +import io.netty.buffer.DrillBuf; +import io.netty.buffer.DrillBuf; -import io.netty.buffer.ByteBuf; +import java.util.Iterator; import org.apache.drill.exec.memory.BufferAllocator; import org.apache.drill.exec.proto.UserBitShared.SerializedField; @@ -30,7 +31,7 @@ import com.google.common.collect.Iterators; public abstract class BaseDataValueVector extends BaseValueVector{ - protected ByteBuf data = DeadBuf.DEAD_BUFFER; + protected DrillBuf data; protected int valueCount; protected int currentValueCount; @@ -40,13 +41,13 @@ public abstract class BaseDataValueVector extends BaseValueVector{ } /** - * Release the underlying ByteBuf and reset the ValueVector + * Release the underlying DrillBuf and reset the ValueVector */ @Override public void clear() { - if (data != DeadBuf.DEAD_BUFFER) { + if (data != null) { data.release(); - data = DeadBuf.DEAD_BUFFER; + data = data.getAllocator().getEmpty(); valueCount = 0; } } @@ -61,12 +62,12 @@ public abstract class BaseDataValueVector extends BaseValueVector{ @Override - public ByteBuf[] getBuffers(){ - ByteBuf[] out; + public DrillBuf[] getBuffers(){ + DrillBuf[] out; if(valueCount == 0){ - out = new ByteBuf[0]; + out = new DrillBuf[0]; }else{ - out = new ByteBuf[]{data}; + out = new DrillBuf[]{data}; data.readerIndex(0); data.retain(); } @@ -82,10 +83,14 @@ public abstract class BaseDataValueVector extends BaseValueVector{ @Override public abstract SerializedField getMetadata(); - public ByteBuf getData(){ + public DrillBuf getData(){ return data; } + public long getDataAddr(){ + return data.memoryAddress(); + } + @Override public Iterator<ValueVector> iterator() { return Iterators.emptyIterator(); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java index e310b81..cf62d54 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/BaseValueVector.java @@ -63,7 +63,7 @@ public abstract class BaseValueVector implements ValueVector{ abstract public ByteBuf getData(); - abstract class BaseAccessor implements ValueVector.Accessor{ + abstract static class BaseAccessor implements ValueVector.Accessor{ public abstract int getValueCount(); public void reset(){} } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/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 01fcfe0..0076a1d 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 @@ -17,8 +17,7 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.AccountingByteBuf; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; import org.apache.drill.common.expression.FieldReference; import org.apache.drill.exec.expr.holders.BitHolder; @@ -113,11 +112,11 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe } @Override - public int load(int valueCount, ByteBuf buf) { + public int load(int valueCount, DrillBuf buf) { clear(); this.valueCount = valueCount; int len = getSizeFromCount(valueCount); - data = buf.slice(0, len); + data = (DrillBuf) buf.slice(0, len); data.retain(); return len; } @@ -136,7 +135,7 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe } @Override - public void load(SerializedField metadata, ByteBuf buffer) { + public void load(SerializedField metadata, DrillBuf buffer) { assert this.field.matches(metadata); int loaded = load(metadata.getValueCount(), buffer); assert metadata.getBufferLength() == loaded; @@ -181,7 +180,7 @@ public final class BitVector extends BaseDataValueVector implements FixedWidthVe int offset = startIndex % 8; if (offset == 0) { // slice - target.data = this.data.slice(firstByte, byteSize); + target.data = (DrillBuf) this.data.slice(firstByte, byteSize); target.data.retain(); } else { // Copy data http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java index c5e1ae7..b546b9e 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/FixedWidthVector.java @@ -17,26 +17,26 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; public interface FixedWidthVector extends ValueVector{ - + /** * Allocate a new memory space for this vector. Must be called prior to using the ValueVector. * * @param valueCount Number of values in the vector. */ public void allocateNew(int valueCount); - + /** * Load the records in the provided buffer based on the given number of values. * @param valueCount Number of values the buffer contains. * @param buf Incoming buffer. * @return The number of bytes of the buffer that were consumed. */ - public int load(int valueCount, ByteBuf buf); - - + public int load(int valueCount, DrillBuf buf); + + public abstract Mutator getMutator(); /** http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ObjectVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ObjectVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ObjectVector.java index 650f5ae..2c215ff 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ObjectVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ObjectVector.java @@ -18,6 +18,8 @@ package org.apache.drill.exec.vector; import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; + import org.apache.drill.common.expression.FieldReference; import org.apache.drill.exec.expr.holders.ObjectHolder; import org.apache.drill.exec.memory.BufferAllocator; @@ -164,12 +166,12 @@ public class ObjectVector extends BaseValueVector{ } @Override - public ByteBuf[] getBuffers() { + public DrillBuf[] getBuffers() { throw new UnsupportedOperationException("ObjectVector does not support this"); } @Override - public void load(UserBitShared.SerializedField metadata, ByteBuf buffer) { + public void load(UserBitShared.SerializedField metadata, DrillBuf buffer) { throw new UnsupportedOperationException("ObjectVector does not support this"); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedFixedWidthVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedFixedWidthVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedFixedWidthVector.java index 6d03541..a28caf1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedFixedWidthVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedFixedWidthVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; public interface RepeatedFixedWidthVector extends ValueVector{ /** @@ -27,7 +27,7 @@ public interface RepeatedFixedWidthVector extends ValueVector{ * @param childValueCount Number of supported values in the vector. */ public void allocateNew(int parentValueCount, int childValueCount); - + /** * Load the records in the provided buffer based on the given number of values. * @param parentValueCount Number of separate repeating groupings. @@ -35,7 +35,7 @@ public interface RepeatedFixedWidthVector extends ValueVector{ * @param buf Incoming buffer. * @return The number of bytes of the buffer that were consumed. */ - public int load(int parentValueCount, int childValueCount, ByteBuf buf); + public int load(int parentValueCount, int childValueCount, DrillBuf buf); public abstract RepeatedAccessor getAccessor(); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedVariableWidthVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedVariableWidthVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedVariableWidthVector.java index a2c884e..2e7689c 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedVariableWidthVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/RepeatedVariableWidthVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; public interface RepeatedVariableWidthVector extends ValueVector{ /** @@ -45,5 +45,5 @@ public interface RepeatedVariableWidthVector extends ValueVector{ * @param buf Incoming buffer. * @return The number of bytes of the buffer that were consumed. */ - public int load(int dataBytes, int parentValueCount, int childValueCount, ByteBuf buf); + public int load(int dataBytes, int parentValueCount, int childValueCount, DrillBuf buf); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueHolderHelper.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueHolderHelper.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueHolderHelper.java index 6968c21..31afb6f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueHolderHelper.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueHolderHelper.java @@ -17,20 +17,18 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.SwappedByteBuf; -import io.netty.buffer.Unpooled; -import io.netty.buffer.UnpooledByteBufAllocator; +import io.netty.buffer.DrillBuf; import java.math.BigDecimal; -import java.nio.ByteOrder; -import org.apache.drill.common.util.DecimalUtility; import org.apache.drill.exec.expr.holders.Decimal18Holder; import org.apache.drill.exec.expr.holders.Decimal28SparseHolder; import org.apache.drill.exec.expr.holders.Decimal38SparseHolder; import org.apache.drill.exec.expr.holders.Decimal9Holder; import org.apache.drill.exec.expr.holders.IntervalDayHolder; import org.apache.drill.exec.expr.holders.VarCharHolder; +import org.apache.drill.exec.memory.BufferAllocator; +import org.apache.drill.exec.util.DecimalUtility; import com.google.common.base.Charsets; @@ -38,13 +36,24 @@ import com.google.common.base.Charsets; public class ValueHolderHelper { static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ValueHolderHelper.class); - public static VarCharHolder getVarCharHolder(String s){ + public static VarCharHolder getVarCharHolder(DrillBuf buf, String s){ VarCharHolder vch = new VarCharHolder(); byte[] b = s.getBytes(Charsets.UTF_8); vch.start = 0; vch.end = b.length; - vch.buffer = UnpooledByteBufAllocator.DEFAULT.buffer(b.length).order(ByteOrder.LITTLE_ENDIAN); // use the length of input string to allocate buffer. + vch.buffer = buf.reallocIfNeeded(b.length); + vch.buffer.setBytes(0, b); + return vch; + } + + public static VarCharHolder getVarCharHolder(BufferAllocator a, String s){ + VarCharHolder vch = new VarCharHolder(); + + byte[] b = s.getBytes(Charsets.UTF_8); + vch.start = 0; + vch.end = b.length; + vch.buffer = a.buffer(b.length); // vch.buffer.setBytes(0, b); return vch; } @@ -53,7 +62,7 @@ public class ValueHolderHelper { IntervalDayHolder dch = new IntervalDayHolder(); dch.days = days; - dch.milliSeconds = millis; + dch.milliseconds = millis; return dch; } @@ -77,7 +86,7 @@ public class ValueHolderHelper { return dch; } - public static Decimal28SparseHolder getDecimal28Holder(String decimal) { + public static Decimal28SparseHolder getDecimal28Holder(DrillBuf buf, String decimal) { Decimal28SparseHolder dch = new Decimal28SparseHolder(); @@ -85,18 +94,15 @@ public class ValueHolderHelper { dch.scale = bigDecimal.scale(); dch.precision = bigDecimal.precision(); - dch.setSign(bigDecimal.signum() == -1); + Decimal28SparseHolder.setSign(bigDecimal.signum() == -1, dch.start, dch.buffer); dch.start = 0; - - dch.buffer = Unpooled.wrappedBuffer(new byte[5 * DecimalUtility.integerSize]); - dch.buffer = new SwappedByteBuf(dch.buffer); + dch.buffer = buf.reallocIfNeeded(5 * DecimalUtility.integerSize); DecimalUtility.getSparseFromBigDecimal(bigDecimal, dch.buffer, dch.start, dch.scale, dch.precision, dch.nDecimalDigits); return dch; } - public static Decimal38SparseHolder getDecimal38Holder(String decimal) { - + public static Decimal38SparseHolder getDecimal38Holder(DrillBuf buf, String decimal) { Decimal38SparseHolder dch = new Decimal38SparseHolder(); @@ -104,12 +110,9 @@ public class ValueHolderHelper { dch.scale = bigDecimal.scale(); dch.precision = bigDecimal.precision(); - dch.setSign(bigDecimal.signum() == -1); + Decimal38SparseHolder.setSign(bigDecimal.signum() == -1, dch.start, dch.buffer); dch.start = 0; - - - dch.buffer = Unpooled.wrappedBuffer(new byte[dch.maxPrecision * DecimalUtility.integerSize]); - dch.buffer = new SwappedByteBuf(dch.buffer); + dch.buffer = buf.reallocIfNeeded(dch.maxPrecision * DecimalUtility.integerSize); DecimalUtility.getSparseFromBigDecimal(bigDecimal, dch.buffer, dch.start, dch.scale, dch.precision, dch.nDecimalDigits); return dch; http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueVector.java index 8b871fc..f7f010a 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/ValueVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; import java.io.Closeable; @@ -56,7 +56,7 @@ public interface ValueVector extends Closeable, Iterable<ValueVector> { public void close(); /** - * Release the underlying ByteBuf and reset the ValueVector to empty. + * Release the underlying DrillBuf and reset the ValueVector to empty. */ public void clear(); @@ -99,9 +99,9 @@ public interface ValueVector extends Closeable, Iterable<ValueVector> { * this buffer so it only should be used for in-context access. Also note that this buffer changes regularly thus * external classes shouldn't hold a reference to it (unless they change it). * - * @return The underlying ByteBuf. + * @return The underlying DrillBuf. */ - public abstract ByteBuf[] getBuffers(); + public abstract DrillBuf[] getBuffers(); /** * Load the data provided in the buffer. Typically used when deserializing from the wire. @@ -111,7 +111,7 @@ public interface ValueVector extends Closeable, Iterable<ValueVector> { * @param buffer * The buffer that contains the ValueVector. */ - public void load(SerializedField metadata, ByteBuf buffer); + public void load(SerializedField metadata, DrillBuf buffer); /** * Get the metadata for this field. Used in serialization http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java index 5c1d3ab..ff3ee63 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VariableWidthVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; public interface VariableWidthVector extends ValueVector{ @@ -28,15 +28,13 @@ public interface VariableWidthVector extends ValueVector{ * @param valueCount Number of values in the vector. */ public void allocateNew(int totalBytes, int valueCount); - + /** * Provide the maximum amount of variable width bytes that can be stored int his vector. * @return */ public int getByteCapacity(); - public int getCurrentSizeInBytes(); - /** * Load the records in the provided buffer based on the given number of values. * @param dataBytes The number of bytes associated with the data array. @@ -44,8 +42,8 @@ public interface VariableWidthVector extends ValueVector{ * @param buf Incoming buffer. * @return The number of bytes of the buffer that were consumed. */ - public int load(int dataBytes, int valueCount, ByteBuf buf); - + public int load(int dataBytes, int valueCount, DrillBuf buf); + public abstract VariableWidthMutator getMutator(); public abstract VariableWidthAccessor getAccessor(); @@ -54,6 +52,8 @@ public interface VariableWidthVector extends ValueVector{ public int getValueLength(int index); } + public int getCurrentSizeInBytes(); + public interface VariableWidthMutator extends Mutator { public boolean setValueLengthSafe(int index, int length); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VectorTrimmer.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VectorTrimmer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VectorTrimmer.java index e946afe..619dd95 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VectorTrimmer.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/VectorTrimmer.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector; -import io.netty.buffer.AccountingByteBuf; +import io.netty.buffer.DrillBuf; import io.netty.buffer.ByteBuf; public class VectorTrimmer { @@ -25,7 +25,7 @@ public class VectorTrimmer { public static void trim(ByteBuf data, int idx) { data.writerIndex(idx); - if (data instanceof AccountingByteBuf) { + if (data instanceof DrillBuf) { // data.capacity(idx); data.writerIndex(idx); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java index 480b863..c91c397 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/MapVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector.complex; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; import java.util.HashMap; import java.util.Iterator; @@ -276,18 +276,18 @@ public class MapVector extends AbstractContainerVector { } @Override - public ByteBuf[] getBuffers() { - List<ByteBuf> bufs = Lists.newArrayList(); + public DrillBuf[] getBuffers() { + List<DrillBuf> bufs = Lists.newArrayList(); for(ValueVector v : vectors.values()){ - for(ByteBuf b : v.getBuffers()){ + for(DrillBuf b : v.getBuffers()){ bufs.add(b); } } - return bufs.toArray(new ByteBuf[bufs.size()]); + return bufs.toArray(new DrillBuf[bufs.size()]); } @Override - public void load(SerializedField metadata, ByteBuf buf) { + public void load(SerializedField metadata, DrillBuf buf) { List<SerializedField> fields = metadata.getChildList(); valueCount = metadata.getValueCount(); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java index 57c47d4..00716cf 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedListVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector.complex; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; import java.util.Collections; import java.util.Iterator; @@ -354,7 +354,7 @@ public class RepeatedListVector extends AbstractContainerVector implements Repea } @Override - public ByteBuf[] getBuffers() { + public DrillBuf[] getBuffers() { return ArrayUtils.addAll(offsets.getBuffers(), vector.getBuffers()); } @@ -364,7 +364,7 @@ public class RepeatedListVector extends AbstractContainerVector implements Repea } @Override - public void load(SerializedField metadata, ByteBuf buf) { + public void load(SerializedField metadata, DrillBuf buf) { SerializedField childField = metadata.getChildList().get(0); int bufOffset = offsets.load(metadata.getValueCount()+1, buf); @@ -429,7 +429,7 @@ public class RepeatedListVector extends AbstractContainerVector implements Repea } @Override - public int load(int parentValueCount, int childValueCount, ByteBuf buf) { + public int load(int parentValueCount, int childValueCount, DrillBuf buf) { throw new UnsupportedOperationException(); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java index c67c047..f7baaa9 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/RepeatedMapVector.java @@ -17,7 +17,7 @@ */ package org.apache.drill.exec.vector.complex; -import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; import java.util.Iterator; import java.util.List; @@ -307,20 +307,20 @@ public class RepeatedMapVector extends AbstractContainerVector implements Repeat } @Override - public ByteBuf[] getBuffers() { - List<ByteBuf> bufs = Lists.newArrayList(offsets.getBuffers()); + public DrillBuf[] getBuffers() { + List<DrillBuf> bufs = Lists.newArrayList(offsets.getBuffers()); for(ValueVector v : vectors.values()){ - for(ByteBuf b : v.getBuffers()){ + for(DrillBuf b : v.getBuffers()){ bufs.add(b); } } - return bufs.toArray(new ByteBuf[bufs.size()]); + return bufs.toArray(new DrillBuf[bufs.size()]); } @Override - public void load(SerializedField metadata, ByteBuf buf) { + public void load(SerializedField metadata, DrillBuf buf) { List<SerializedField> fields = metadata.getChildList(); int bufOffset = offsets.load(metadata.getValueCount()+1, buf); @@ -513,7 +513,7 @@ public class RepeatedMapVector extends AbstractContainerVector implements Repeat } @Override - public int load(int parentValueCount, int childValueCount, ByteBuf buf) { + public int load(int parentValueCount, int childValueCount, DrillBuf buf) { throw new UnsupportedOperationException(); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java index d365c6f..59035cb 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java @@ -17,9 +17,7 @@ */ package org.apache.drill.exec.vector.complex.fn; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufInputStream; -import io.netty.buffer.UnpooledByteBufAllocator; +import io.netty.buffer.DrillBuf; import java.io.IOException; import java.io.Reader; @@ -33,11 +31,10 @@ import org.apache.drill.exec.vector.complex.writer.BaseWriter.ListWriter; import org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter; import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.JsonParser.Feature; +import com.fasterxml.jackson.core.JsonToken; import com.google.common.base.Charsets; public class JsonReader { @@ -48,10 +45,12 @@ public class JsonReader { private final JsonFactory factory = new JsonFactory(); private JsonParser parser; + private DrillBuf workBuf; - public JsonReader() throws JsonParseException, IOException { + public JsonReader(DrillBuf managedBuf) throws JsonParseException, IOException { factory.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); factory.configure(Feature.ALLOW_COMMENTS, true); + this.workBuf = managedBuf; } public boolean write(Reader reader, ComplexWriter writer) throws JsonParseException, IOException { @@ -134,9 +133,9 @@ public class JsonReader { VarCharHolder vh = new VarCharHolder(); String value = parser.getText(); byte[] b = value.getBytes(Charsets.UTF_8); - ByteBuf d = UnpooledByteBufAllocator.DEFAULT.buffer(b.length); - d.setBytes(0, b); - vh.buffer = d; + ensure(b.length); + workBuf.setBytes(0, b); + vh.buffer = workBuf; vh.start = 0; vh.end = b.length; map.varChar(fieldName).write(vh); @@ -152,6 +151,10 @@ public class JsonReader { } + private void ensure(int length){ + workBuf = workBuf.reallocIfNeeded(length); + } + private void writeData(ListWriter list) throws JsonParseException, IOException { list.start(); outside: while(true){ @@ -197,9 +200,9 @@ public class JsonReader { VarCharHolder vh = new VarCharHolder(); String value = parser.getText(); byte[] b = value.getBytes(Charsets.UTF_8); - ByteBuf d = UnpooledByteBufAllocator.DEFAULT.buffer(b.length); - d.setBytes(0, b); - vh.buffer = d; + ensure(b.length); + workBuf.setBytes(0, b); + vh.buffer = workBuf; vh.start = 0; vh.end = b.length; list.varChar().write(vh); @@ -209,7 +212,7 @@ public class JsonReader { } } list.end(); - - + + } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReaderWithState.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReaderWithState.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReaderWithState.java index cf885a4..54e063b 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReaderWithState.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReaderWithState.java @@ -18,6 +18,8 @@ package org.apache.drill.exec.vector.complex.fn; +import io.netty.buffer.DrillBuf; + import java.io.IOException; import java.io.Reader; @@ -35,10 +37,10 @@ public class JsonReaderWithState { private JsonRecordSplitter splitter; private JsonReader jsonReader; - public JsonReaderWithState(JsonRecordSplitter splitter) throws IOException{ + public JsonReaderWithState(JsonRecordSplitter splitter, DrillBuf workspace) throws IOException{ this.splitter = splitter; reader = splitter.getNextReader(); - jsonReader = new JsonReader(); + jsonReader = new JsonReader(workspace); } public WriteState write(ComplexWriter writer) throws JsonParseException, IOException { @@ -50,7 +52,7 @@ public class JsonReaderWithState { } jsonReader.write(reader, writer); - + if (!writer.ok()) { reader.reset(); return WriteState.WRITE_FAILED; http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/main/java/org/apache/drill/exec/work/batch/SpoolingRawBatchBuffer.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/work/batch/SpoolingRawBatchBuffer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/work/batch/SpoolingRawBatchBuffer.java index 76d642c..c7527d5 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/work/batch/SpoolingRawBatchBuffer.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/work/batch/SpoolingRawBatchBuffer.java @@ -18,6 +18,7 @@ package org.apache.drill.exec.work.batch; import io.netty.buffer.ByteBuf; +import io.netty.buffer.DrillBuf; import java.io.IOException; import java.util.List; @@ -36,10 +37,6 @@ import org.apache.drill.exec.proto.BitData; import org.apache.drill.exec.proto.ExecProtos; import org.apache.drill.exec.proto.helper.QueryIdHelper; import org.apache.drill.exec.record.RawFragmentBatch; -import org.apache.drill.exec.rpc.RemoteConnection; -import org.apache.drill.exec.rpc.ResponseSender; -import org.apache.drill.exec.rpc.data.BitServerConnection; -import org.apache.drill.exec.rpc.data.DataRpcConfig; import org.apache.drill.exec.store.LocalSyncableFileSystem; import org.apache.drill.exec.work.fragment.FragmentManager; import org.apache.hadoop.conf.Configuration; @@ -272,7 +269,7 @@ public class SpoolingRawBatchBuffer implements RawBatchBuffer { Stopwatch watch = new Stopwatch(); watch.start(); BitData.FragmentRecordBatch header = BitData.FragmentRecordBatch.parseDelimitedFrom(stream); - ByteBuf buf = allocator.buffer(bodyLength); + DrillBuf buf = allocator.buffer(bodyLength); buf.writeBytes(stream, bodyLength); batch = new RawFragmentBatch(null, header, buf, null); buf.release(); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/RunRootExec.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/RunRootExec.java b/exec/java-exec/src/test/java/org/apache/drill/exec/RunRootExec.java new file mode 100644 index 0000000..4258e60 --- /dev/null +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/RunRootExec.java @@ -0,0 +1,74 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec; + + +import java.io.File; +import java.util.concurrent.TimeUnit; + +import org.apache.drill.common.config.DrillConfig; +import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry; +import org.apache.drill.exec.ops.FragmentContext; +import org.apache.drill.exec.physical.PhysicalPlan; +import org.apache.drill.exec.physical.base.FragmentRoot; +import org.apache.drill.exec.physical.impl.ImplCreator; +import org.apache.drill.exec.physical.impl.SimpleRootExec; +import org.apache.drill.exec.planner.PhysicalPlanReader; +import org.apache.drill.exec.proto.BitControl.PlanFragment; +import org.apache.drill.exec.server.Drillbit; +import org.apache.drill.exec.server.DrillbitContext; +import org.apache.drill.exec.server.RemoteServiceSet; +import org.apache.drill.exec.vector.ValueVector; + +import com.google.common.base.Charsets; +import com.google.common.base.Stopwatch; +import com.google.common.io.Files; + +public class RunRootExec { + public static DrillConfig c = DrillConfig.create(); + + public static void main(String args[]) throws Exception { + String path = args[0]; + int iterations = Integer.parseInt(args[1]); + Drillbit bit = new Drillbit(c, RemoteServiceSet.getLocalServiceSet()); + bit.run(); + DrillbitContext bitContext = bit.getContext(); + PhysicalPlanReader reader = bitContext.getPlanReader(); + PhysicalPlan plan = reader.readPhysicalPlan(Files.toString(new File(path), Charsets.UTF_8)); + FunctionImplementationRegistry registry = bitContext.getFunctionImplementationRegistry(); + FragmentContext context = new FragmentContext(bitContext, PlanFragment.getDefaultInstance(), null, registry); + SimpleRootExec exec; + for (int i = 0; i < iterations; i ++) { + Stopwatch w= new Stopwatch().start(); + System.out.println("STARTITER:" + i); + exec = new SimpleRootExec(ImplCreator.getExec(context, (FragmentRoot) plan.getSortedOperators(false).iterator().next())); + + while (exec.next()) { + for (ValueVector v : exec) { + v.clear(); + } + } + System.out.println("ENDITER: " + i); + System.out.println("TIME: " + w.elapsed(TimeUnit.MILLISECONDS) + "ms"); + exec.stop(); + } + context.close(); + bit.close(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/client/DumpCatTest.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/client/DumpCatTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/client/DumpCatTest.java index 9090685..e678c29 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/client/DumpCatTest.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/client/DumpCatTest.java @@ -28,6 +28,7 @@ import org.apache.drill.common.config.DrillConfig; import org.apache.drill.common.util.FileUtils; import org.apache.drill.exec.ExecTest; import org.apache.drill.exec.ExecConstants; +import org.apache.drill.exec.compile.CodeCompiler; import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry; import org.apache.drill.exec.memory.TopLevelAllocator; import org.apache.drill.exec.ops.FragmentContext; @@ -70,6 +71,7 @@ public class DumpCatTest extends ExecTest{ bitContext.getMetrics(); result = new MetricRegistry(); bitContext.getAllocator(); result = new TopLevelAllocator(); bitContext.getConfig(); result = c; + bitContext.getCompiler(); result = CodeCompiler.getTestCompiler(c); bitContext.getOperatorCreatorRegistry(); result = new OperatorCreatorRegistry(c); }}; @@ -87,6 +89,8 @@ public class DumpCatTest extends ExecTest{ } assertTrue(!context.isFailed()); + exec.stop(); + FragmentHandle handle = context.getHandle(); /* Form the file name to which the trace output will dump the record batches */ http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestClassTransformation.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestClassTransformation.java b/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestClassTransformation.java index e1fefdf..896cf4d 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestClassTransformation.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestClassTransformation.java @@ -20,6 +20,7 @@ package org.apache.drill.exec.compile; import java.io.IOException; import org.apache.drill.BaseTestQuery; +import org.apache.drill.exec.cache.local.LocalCache; import org.apache.drill.exec.compile.ClassTransformer.ClassSet; import org.apache.drill.exec.compile.sig.GeneratorMapping; import org.apache.drill.exec.compile.sig.MappingSet; @@ -72,7 +73,7 @@ public class TestClassTransformation extends BaseTestQuery { public void testCompilationNoDebug() throws CompileException, ClassNotFoundException, ClassTransformationException, IOException { CodeGenerator<ExampleInner> cg = newCodeGenerator(ExampleInner.class, ExampleTemplateWithInner.class); ClassSet classSet = new ClassSet(null, cg.getDefinition().getTemplateClassName(), cg.getMaterializedClassName()); - String sourceCode = cg.generate(); + String sourceCode = cg.generateAndGet(); sessionOptions.setOption(OptionValue.createString(OptionType.SESSION, QueryClassLoader.JAVA_COMPILER_OPTION, QueryClassLoader.CompilerPolicy.JDK.name())); sessionOptions.setOption(OptionValue.createBoolean(OptionType.SESSION, QueryClassLoader.JAVA_COMPILER_DEBUG_OPTION, false)); @@ -104,9 +105,9 @@ public class TestClassTransformation extends BaseTestQuery { private void compilationInnerClass(QueryClassLoader loader) throws Exception{ CodeGenerator<ExampleInner> cg = newCodeGenerator(ExampleInner.class, ExampleTemplateWithInner.class); - ClassTransformer ct = new ClassTransformer(); - ExampleInner t = ct.getImplementationClass(loader, cg.getDefinition(), cg.generate(), cg.getMaterializedClassName()); - + ClassTransformer ct = new ClassTransformer(new LocalCache()); + Class<? extends ExampleInner> c = (Class<? extends ExampleInner>) ct.getImplementationClass(loader, cg.getDefinition(), cg.generateAndGet(), cg.getMaterializedClassName()); + ExampleInner t = (ExampleInner) c.newInstance(); t.doOutside(); t.doInsideOutside(); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestEvaluationVisitor.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestEvaluationVisitor.java b/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestEvaluationVisitor.java index 4d0cbcd..2265347 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestEvaluationVisitor.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/compile/TestEvaluationVisitor.java @@ -69,7 +69,7 @@ public class TestEvaluationVisitor { ValueVectorWriteExpression e2 = new ValueVectorWriteExpression(outId, e, true); v.addExpr(e2, g.getRoot()); - System.out.println(g.generate()); + System.out.println(g.generateAndGet()); } private LogicalExpression getExpr(String expr) throws Exception{ http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/compile/bytecode/ReplaceMethodInvoke.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/compile/bytecode/ReplaceMethodInvoke.java b/exec/java-exec/src/test/java/org/apache/drill/exec/compile/bytecode/ReplaceMethodInvoke.java new file mode 100644 index 0000000..c7467a0 --- /dev/null +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/compile/bytecode/ReplaceMethodInvoke.java @@ -0,0 +1,105 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec.compile.bytecode; + +import java.io.File; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.URL; + +import org.apache.drill.common.config.DrillConfig; +import org.apache.drill.exec.compile.QueryClassLoader; +import org.apache.drill.exec.server.options.SystemOptionManager; +import org.apache.drill.exec.store.sys.local.LocalPStoreProvider; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.util.ASMifier; +import org.objectweb.asm.util.CheckClassAdapter; +import org.objectweb.asm.util.Textifier; +import org.objectweb.asm.util.TraceClassVisitor; + +import com.google.common.io.Files; +import com.google.common.io.Resources; + +public class ReplaceMethodInvoke { + static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ReplaceMethodInvoke.class); + + @SuppressWarnings("unchecked") + public static void main(String[] args) throws Exception{ + String e = "org/apache/drill/ExampleReplaceable.class"; + String h = "org/apache/drill/exec/physical/impl/aggregate/HashAggTemplate.class"; + String k = "org/apache/drill/Pickle$OutgoingBatch.class"; + String k2 = "org/apache/drill/Pickle.class"; + String r = "org/apache/drill/exec/test/generated/FiltererGen0.class"; + String p = "org/apache/drill/exec/test/generated/PartitionerGen4.class"; + URL url = Resources.getResource(k2); + byte[] clazz = Resources.toByteArray(url); + ClassReader cr = new ClassReader(clazz); + + ClassWriter cw = writer(); + TraceClassVisitor visitor = new TraceClassVisitor(cw, new Textifier(), new PrintWriter(System.out)); + //getTracer(false) + ValueHolderReplacementVisitor v2 = new ValueHolderReplacementVisitor(visitor); + cr.accept(v2, ClassReader.EXPAND_FRAMES );//| ClassReader.SKIP_DEBUG); + + byte[] output = cw.toByteArray(); + Files.write(output, new File("/src/scratch/bytes/S.class")); + check(output); + + + DrillConfig c = DrillConfig.createClient(); + SystemOptionManager m = new SystemOptionManager(c, new LocalPStoreProvider(c)); + m.init(); + QueryClassLoader ql = new QueryClassLoader(DrillConfig.create(), m); + ql.injectByteCode("org.apache.drill.Pickle$OutgoingBatch", output); + Class<?> clz = ql.loadClass("org.apache.drill.Pickle$OutgoingBatch"); + clz.getMethod("x").invoke(null); + + } + + + private static final void check(byte[] b) { + ClassReader cr = new ClassReader(b); + ClassWriter cw = writer(); + ClassVisitor cv = new CheckClassAdapter(cw); + cr.accept(cv, 0); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), false, pw); + + assert sw.toString().length() == 0 : sw.toString(); + } + + private static ClassWriter writer() { + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + return cw; + } + + private static ClassVisitor getTracer(boolean asm) { + if (asm) { + return new TraceClassVisitor(null, new ASMifier(), new PrintWriter(System.out)); + } else { + return new TraceClassVisitor(null, new Textifier(), new PrintWriter(System.out)); + } + } + + + +} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java b/exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java index da82998..392af18 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/expr/ExpressionTest.java @@ -126,7 +126,7 @@ public class ExpressionTest extends ExecTest { ClassGenerator<Projector> cg = CodeGenerator.get(Projector.TEMPLATE_DEFINITION, new FunctionImplementationRegistry(DrillConfig.create())).getRoot(); cg.addExpr(new ValueVectorWriteExpression(new TypedFieldId(materializedExpr.getMajorType(), -1), materializedExpr)); - return cg.getCodeGenerator().generate(); + return cg.getCodeGenerator().generateAndGet(); } } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestByteComparisonFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestByteComparisonFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestByteComparisonFunctions.java new file mode 100644 index 0000000..632f5a4 --- /dev/null +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestByteComparisonFunctions.java @@ -0,0 +1,129 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec.fn.impl; + +import static org.junit.Assert.*; + +import org.apache.drill.common.config.DrillConfig; +import org.apache.drill.exec.ExecTest; +import org.apache.drill.exec.expr.fn.impl.ByteFunctionHelpers; +import org.apache.drill.exec.expr.holders.VarCharHolder; +import org.apache.drill.exec.memory.TopLevelAllocator; +import org.apache.drill.exec.vector.ValueHolderHelper; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class TestByteComparisonFunctions extends ExecTest{ + static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestByteComparisonFunctions.class); + + static TopLevelAllocator allocator; + static VarCharHolder hello; + static VarCharHolder goodbye; + static VarCharHolder helloLong; + static VarCharHolder goodbyeLong; + + @BeforeClass + public static void setup(){ + DrillConfig c= DrillConfig.create(); + allocator = new TopLevelAllocator(c); + hello = ValueHolderHelper.getVarCharHolder(allocator, "hello"); + goodbye = ValueHolderHelper.getVarCharHolder(allocator, "goodbye"); + helloLong = ValueHolderHelper.getVarCharHolder(allocator, "hellomyfriend"); + goodbyeLong = ValueHolderHelper.getVarCharHolder(allocator, "goodbyemyenemy"); + } + + @AfterClass + public static void teardown(){ + hello.buffer.release(); + helloLong.buffer.release(); + goodbye.buffer.release(); + goodbyeLong.buffer.release(); + allocator.close(); + } + + @Test + public void testAfter(){ + VarCharHolder left = hello; + VarCharHolder right = goodbye; + assertTrue(ByteFunctionHelpers.compare(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 1); + } + + @Test + public void testBefore(){ + VarCharHolder left = goodbye; + VarCharHolder right = hello; + assertTrue(ByteFunctionHelpers.compare(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == -1); + } + + @Test + public void testEqualCompare(){ + VarCharHolder left = hello; + VarCharHolder right = hello; + assertTrue(ByteFunctionHelpers.compare(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 0); + } + + @Test + public void testEqual(){ + VarCharHolder left = hello; + VarCharHolder right = hello; + assertTrue(ByteFunctionHelpers.equal(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 1); + } + + @Test + public void testNotEqual(){ + VarCharHolder left = hello; + VarCharHolder right = goodbye; + assertTrue(ByteFunctionHelpers.equal(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 0); + } + + @Test + public void testAfterLong(){ + VarCharHolder left = helloLong; + VarCharHolder right = goodbyeLong; + assertTrue(ByteFunctionHelpers.compare(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 1); + } + + @Test + public void testBeforeLong(){ + VarCharHolder left = goodbyeLong; + VarCharHolder right = helloLong; + assertTrue(ByteFunctionHelpers.compare(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == -1); + } + + @Test + public void testEqualCompareLong(){ + VarCharHolder left = helloLong; + VarCharHolder right = helloLong; + assertTrue(ByteFunctionHelpers.compare(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 0); + } + + @Test + public void testEqualLong(){ + VarCharHolder left = helloLong; + VarCharHolder right = helloLong; + assertTrue(ByteFunctionHelpers.equal(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 1); + } + + @Test + public void testNotEqualLong(){ + VarCharHolder left = helloLong; + VarCharHolder right = goodbyeLong; + assertTrue(ByteFunctionHelpers.equal(left.buffer.memoryAddress(), left.start, left.end, right.buffer.memoryAddress(), right.start, right.end) == 0); + } +} http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctions.java index 104923b..4f06a9d 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctions.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestMathFunctions.java @@ -28,6 +28,7 @@ import org.apache.drill.common.expression.ExpressionPosition; import org.apache.drill.common.expression.SchemaPath; import org.apache.drill.common.util.FileUtils; import org.apache.drill.exec.ExecTest; +import org.apache.drill.exec.compile.CodeCompiler; import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry; import org.apache.drill.exec.memory.TopLevelAllocator; import org.apache.drill.exec.ops.FragmentContext; @@ -64,6 +65,7 @@ public class TestMathFunctions extends ExecTest { bitContext.getMetrics(); result = new MetricRegistry(); bitContext.getAllocator(); result = new TopLevelAllocator(); bitContext.getConfig(); result = c; + bitContext.getCompiler(); result = CodeCompiler.getTestCompiler(c); bitContext.getOperatorCreatorRegistry(); result = new OperatorCreatorRegistry(c); }}; http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestNewMathFunctions.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestNewMathFunctions.java b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestNewMathFunctions.java index 62a224e..3d41f0b 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestNewMathFunctions.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestNewMathFunctions.java @@ -27,6 +27,7 @@ import mockit.Injectable; import mockit.NonStrictExpectations; import org.apache.drill.common.config.DrillConfig; +import org.apache.drill.exec.compile.CodeCompiler; import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry; import org.apache.drill.exec.memory.TopLevelAllocator; import org.apache.drill.exec.ops.FragmentContext; @@ -83,6 +84,7 @@ public class TestNewMathFunctions { bitContext.getAllocator(); result = new TopLevelAllocator(); bitContext.getOperatorCreatorRegistry(); result = new OperatorCreatorRegistry(c); bitContext.getConfig(); result = c; + bitContext.getCompiler(); result = CodeCompiler.getTestCompiler(c); }}; String planString = Resources.toString(Resources.getResource(planPath), Charsets.UTF_8); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/5c5cef06/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestRepeatedFunction.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestRepeatedFunction.java b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestRepeatedFunction.java index 4345560..fd71dd9 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestRepeatedFunction.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/fn/impl/TestRepeatedFunction.java @@ -27,6 +27,7 @@ import org.apache.drill.common.expression.ExpressionPosition; import org.apache.drill.common.expression.SchemaPath; import org.apache.drill.common.util.FileUtils; import org.apache.drill.exec.ExecTest; +import org.apache.drill.exec.compile.CodeCompiler; import org.apache.drill.exec.expr.fn.FunctionImplementationRegistry; import org.apache.drill.exec.memory.TopLevelAllocator; import org.apache.drill.exec.ops.FragmentContext; @@ -64,6 +65,7 @@ public class TestRepeatedFunction extends ExecTest{ bitContext.getAllocator(); result = new TopLevelAllocator(); bitContext.getOperatorCreatorRegistry(); result = new OperatorCreatorRegistry(c); bitContext.getConfig(); result = c; + bitContext.getCompiler(); result = CodeCompiler.getTestCompiler(c); }};