mustafaiman commented on a change in pull request #1352: URL: https://github.com/apache/hive/pull/1352#discussion_r464532531
########## File path: ql/src/java/org/apache/hadoop/hive/ql/exec/vector/wrapper/VectorHashKeyWrapperGeneral.java ########## @@ -262,6 +255,138 @@ private void duplicateTo(VectorHashKeyWrapperGeneral clone) { clone.hashcode = hashcode; assert clone.equals(this); + + return clone; + } + + private long[] copyInPlaceOrAllocate(long[] from, long[] to) { + if (from.length > 0) { + if (to != null && to.length == from.length) { + System.arraycopy(from, 0, to, 0, from.length); + return to; + } else { + return from.clone(); + } + } else { + return EMPTY_LONG_ARRAY; + } + } + + private double[] copyInPlaceOrAllocate(double[] from, double[] to) { + if (from.length > 0) { + if (to != null && to.length == from.length) { + System.arraycopy(from, 0, to, 0, from.length); + return to; + } else { + return from.clone(); + } + } else { + return EMPTY_DOUBLE_ARRAY; + } + } + + private boolean[] copyInPlaceOrAllocate(boolean[] from, boolean[] to) { + if (to != null && to.length == from.length) { + System.arraycopy(from, 0, to, 0, from.length); + return to; + } else { + return from.clone(); + } + } + + private HiveDecimalWritable[] copyInPlaceOrAllocate(HiveDecimalWritable[] from, HiveDecimalWritable[] to) { + if (from.length > 0) { + if (to == null || to.length != from.length) { + to = new HiveDecimalWritable[from.length]; + } + for (int i = 0; i < from.length; i++) { + to[i] = new HiveDecimalWritable(from[i]); + } + return to; + } else { + return EMPTY_DECIMAL_ARRAY; + } + } + + private Timestamp[] copyInPlaceOrAllocate(Timestamp[] from, Timestamp[] to) { + if (from.length > 0) { + if (to == null || to.length != from.length) { + to = new Timestamp[from.length]; + } + for (int i = 0; i < from.length; i++) { + to[i] = (Timestamp) from[i].clone(); + } + return to; + } else { + return EMPTY_TIMESTAMP_ARRAY; + } + } + + @Override + public void copyKey(KeyWrapper oldWrapper) { + VectorHashKeyWrapperGeneral clone = (VectorHashKeyWrapperGeneral) oldWrapper; + clone.hashCtx = hashCtx; + clone.keyCount = keyCount; + clone.longValues = copyInPlaceOrAllocate(longValues, clone.longValues); + clone.doubleValues = copyInPlaceOrAllocate(doubleValues, clone.doubleValues); + clone.isNull = copyInPlaceOrAllocate(isNull, clone.isNull); + clone.decimalValues = copyInPlaceOrAllocate(decimalValues, clone.decimalValues); + + if (byteLengths.length > 0) { + if (clone.byteLengths == null || clone.byteValues.length != byteValues.length) { + // byteValues and byteStarts are always the same length + clone.byteValues = new byte[byteValues.length][]; + clone.byteStarts = new int[byteValues.length]; + clone.byteLengths = byteLengths.clone(); + for (int i = 0; i < byteValues.length; ++i) { + // avoid allocation/copy of nulls, because it potentially expensive. + // branch instead. + if (byteLengths[i] != -1) { + clone.byteValues[i] = Arrays.copyOfRange(byteValues[i], + byteStarts[i], byteStarts[i] + byteLengths[i]); + } + } + } else { + System.arraycopy(byteLengths, 0, clone.byteLengths, 0, byteValues.length); + Arrays.fill(byteStarts, 0); + System.arraycopy(byteStarts, 0, clone.byteStarts, 0, byteValues.length); + for (int i = 0; i < byteValues.length; ++i) { + // avoid allocation/copy of nulls, because it potentially expensive. + // branch instead. + if (byteLengths[i] != -1) { + if (clone.byteValues[i] != null && clone.byteValues[i].length >= byteValues[i].length) { + System.arraycopy(byteValues[i], byteStarts[i], clone.byteValues[i], 0, byteLengths[i]); + } else { + clone.byteValues[i] = Arrays.copyOfRange(byteValues[i], + byteStarts[i], byteStarts[i] + byteLengths[i]); Review comment: `clone.byteStarts[i]` is always zero but `byteStarts[i]` can be different values, depending on how it was assigned initially in `VectorHashKeyWrapperBatch#assignString` methods. Example: assignStringBullsNoRepeatingSelection ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: gitbox-unsubscr...@hive.apache.org For additional commands, e-mail: gitbox-h...@hive.apache.org