Github user viirya commented on a diff in the pull request:
https://github.com/apache/spark/pull/20850#discussion_r177939830
--- Diff:
sql/catalyst/src/main/java/org/apache/spark/sql/catalyst/expressions/codegen/UnsafeWriter.java
---
@@ -17,17 +17,86 @@
package org.apache.spark.sql.catalyst.expressions.codegen;
import org.apache.spark.sql.types.Decimal;
+import org.apache.spark.unsafe.Platform;
+import org.apache.spark.unsafe.array.ByteArrayMethods;
import org.apache.spark.unsafe.types.CalendarInterval;
import org.apache.spark.unsafe.types.UTF8String;
/**
* Base class for writing Unsafe* structures.
*/
public abstract class UnsafeWriter {
+ // Keep internal buffer holder
+ protected final BufferHolder holder;
+
+ // The offset of the global buffer where we start to write this
structure.
+ protected int startingOffset;
+
+ protected UnsafeWriter(BufferHolder holder) {
+ this.holder = holder;
+ }
+
+ /**
+ * Accessor methods are delegated from BufferHolder class
+ */
+ public final BufferHolder getBufferHolder() {
+ return holder;
+ }
+
+ public final byte[] buffer() {
+ return holder.buffer();
+ }
+
+ public final void reset() {
+ holder.reset();
+ }
+
+ public final int totalSize() {
+ return holder.totalSize();
+ }
+
+ public final void grow(int neededSize) {
+ holder.grow(neededSize);
+ }
+
+ public final int cursor() {
+ return holder.getCursor();
+ }
+
+ public final void incrementCursor(int val) {
+ holder.incrementCursor(val);
+ }
+
+ public abstract void setOffsetAndSizeFromMark(int ordinal, int mark);
+
+ protected void _setOffsetAndSizeFromMark(int ordinal, int mark) {
+ setOffsetAndSize(ordinal, mark, cursor() - mark);
+ }
+
+ protected void setOffsetAndSize(int ordinal, int size) {
+ setOffsetAndSize(ordinal, cursor(), size);
+ }
+
+ protected void setOffsetAndSize(int ordinal, int currentCursor, int
size) {
+ final long relativeOffset = currentCursor - startingOffset;
+ final long offsetAndSize = (relativeOffset << 32) | (long)size;
+
+ write(ordinal, offsetAndSize);
+ }
+
+ protected final void zeroOutPaddingBytes(int numBytes) {
+ if ((numBytes & 0x07) > 0) {
+ Platform.putLong(buffer(), cursor() + ((numBytes >> 3) << 3), 0L);
+ }
+ }
+
+ protected abstract long getOffset(int ordinal, int elementSize);
--- End diff --
Can this just be `getOffset(int ordinal)`? One reason is only
`UnsafeArrayWriter` has `elementSize`, another reason is `elementSize` is given
at constructing `UnsafeArrayWriter`.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]