This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new c07f5bceac GH-37705: [Java] Extra input methods for VarChar writers
(#37883)
c07f5bceac is described below
commit c07f5bceacd5efbdfd2ab3a673916d2ff46078c8
Author: James Duong <[email protected]>
AuthorDate: Tue Sep 26 12:18:52 2023 -0700
GH-37705: [Java] Extra input methods for VarChar writers (#37883)
### Rationale for this change
Improve the convenience of using VarCharWriter and LargeVarCharWriter
interfaces.
Also allow users to avoid unnecessary overhead creating Arrow buffers when
writing
String and Text data.
### What changes are included in this PR?
Add write() methods for Text and String types.
Ensure these methods are part of the writer interfaces and not just the
Impls.### Are these changes tested?
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: #37705
Authored-by: James Duong <[email protected]>
Signed-off-by: David Li <[email protected]>
---
.../codegen/templates/AbstractFieldWriter.java | 10 +++
.../src/main/codegen/templates/ComplexWriters.java | 21 +++++-
.../vector/complex/writer/TestSimpleWriter.java | 81 +++++++++++++++++-----
3 files changed, 94 insertions(+), 18 deletions(-)
diff --git a/java/vector/src/main/codegen/templates/AbstractFieldWriter.java
b/java/vector/src/main/codegen/templates/AbstractFieldWriter.java
index 5e6580b613..bb4ee45eaa 100644
--- a/java/vector/src/main/codegen/templates/AbstractFieldWriter.java
+++ b/java/vector/src/main/codegen/templates/AbstractFieldWriter.java
@@ -142,6 +142,16 @@ abstract class AbstractFieldWriter extends
AbstractBaseWriter implements FieldWr
}
</#if>
+ <#if minor.class?ends_with("VarChar")>
+ public void write${minor.class}(${friendlyType} value) {
+ fail("${name}");
+ }
+
+ public void write${minor.class}(String value) {
+ fail("${name}");
+ }
+ </#if>
+
</#list></#list>
public void writeNull() {
diff --git a/java/vector/src/main/codegen/templates/ComplexWriters.java
b/java/vector/src/main/codegen/templates/ComplexWriters.java
index 4ae4c4f75f..51a52a6e30 100644
--- a/java/vector/src/main/codegen/templates/ComplexWriters.java
+++ b/java/vector/src/main/codegen/templates/ComplexWriters.java
@@ -44,7 +44,11 @@ public class ${eName}WriterImpl extends AbstractFieldWriter {
final ${name}Vector vector;
- public ${eName}WriterImpl(${name}Vector vector) {
+<#if minor.class?ends_with("VarChar")>
+ private final Text textBuffer = new Text();
+</#if>
+
+public ${eName}WriterImpl(${name}Vector vector) {
this.vector = vector;
}
@@ -120,11 +124,19 @@ public class ${eName}WriterImpl extends
AbstractFieldWriter {
}
</#if>
- <#if minor.class == "VarChar">
+ <#if minor.class?ends_with("VarChar")>
+ @Override
public void write${minor.class}(${friendlyType} value) {
vector.setSafe(idx(), value);
vector.setValueCount(idx()+1);
}
+
+ @Override
+ public void write${minor.class}(String value) {
+ textBuffer.set(value);
+ vector.setSafe(idx(), textBuffer);
+ vector.setValueCount(idx()+1);
+ }
</#if>
<#if minor.class?starts_with("Decimal")>
@@ -256,6 +268,11 @@ public interface ${eName}Writer extends BaseWriter {
public void writeTo${minor.class}(ByteBuffer value, int offset, int length);
</#if>
+<#if minor.class?ends_with("VarChar")>
+ public void write${minor.class}(${friendlyType} value);
+
+ public void write${minor.class}(String value);
+</#if>
}
</#list>
diff --git
a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestSimpleWriter.java
b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestSimpleWriter.java
index 7c06509b23..ef918b13fb 100644
---
a/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestSimpleWriter.java
+++
b/java/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestSimpleWriter.java
@@ -22,9 +22,14 @@ import java.nio.ByteBuffer;
import org.apache.arrow.memory.BufferAllocator;
import org.apache.arrow.memory.RootAllocator;
import org.apache.arrow.vector.LargeVarBinaryVector;
+import org.apache.arrow.vector.LargeVarCharVector;
import org.apache.arrow.vector.VarBinaryVector;
+import org.apache.arrow.vector.VarCharVector;
import org.apache.arrow.vector.complex.impl.LargeVarBinaryWriterImpl;
+import org.apache.arrow.vector.complex.impl.LargeVarCharWriterImpl;
import org.apache.arrow.vector.complex.impl.VarBinaryWriterImpl;
+import org.apache.arrow.vector.complex.impl.VarCharWriterImpl;
+import org.apache.arrow.vector.util.Text;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -45,9 +50,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteArrayToVarBinary() {
+ public void testWriteByteArrayToVarBinary() throws Exception {
try (VarBinaryVector vector = new VarBinaryVector("test", allocator);
- VarBinaryWriterImpl writer = new VarBinaryWriterImpl(vector)) {
+ VarBinaryWriter writer = new VarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
writer.writeToVarBinary(input);
byte[] result = vector.get(0);
@@ -56,9 +61,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteArrayWithOffsetToVarBinary() {
+ public void testWriteByteArrayWithOffsetToVarBinary() throws Exception {
try (VarBinaryVector vector = new VarBinaryVector("test", allocator);
- VarBinaryWriterImpl writer = new VarBinaryWriterImpl(vector)) {
+ VarBinaryWriter writer = new VarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
writer.writeToVarBinary(input, 1, 1);
byte[] result = vector.get(0);
@@ -67,9 +72,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteBufferToVarBinary() {
+ public void testWriteByteBufferToVarBinary() throws Exception {
try (VarBinaryVector vector = new VarBinaryVector("test", allocator);
- VarBinaryWriterImpl writer = new VarBinaryWriterImpl(vector)) {
+ VarBinaryWriter writer = new VarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
ByteBuffer buffer = ByteBuffer.wrap(input);
writer.writeToVarBinary(buffer);
@@ -79,9 +84,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteBufferWithOffsetToVarBinary() {
+ public void testWriteByteBufferWithOffsetToVarBinary() throws Exception {
try (VarBinaryVector vector = new VarBinaryVector("test", allocator);
- VarBinaryWriterImpl writer = new VarBinaryWriterImpl(vector)) {
+ VarBinaryWriter writer = new VarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
ByteBuffer buffer = ByteBuffer.wrap(input);
writer.writeToVarBinary(buffer, 1, 1);
@@ -91,9 +96,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteArrayToLargeVarBinary() {
+ public void testWriteByteArrayToLargeVarBinary() throws Exception {
try (LargeVarBinaryVector vector = new LargeVarBinaryVector("test",
allocator);
- LargeVarBinaryWriterImpl writer = new
LargeVarBinaryWriterImpl(vector)) {
+ LargeVarBinaryWriter writer = new LargeVarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
writer.writeToLargeVarBinary(input);
byte[] result = vector.get(0);
@@ -102,9 +107,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteArrayWithOffsetToLargeVarBinary() {
+ public void testWriteByteArrayWithOffsetToLargeVarBinary() throws Exception {
try (LargeVarBinaryVector vector = new LargeVarBinaryVector("test",
allocator);
- LargeVarBinaryWriterImpl writer = new
LargeVarBinaryWriterImpl(vector)) {
+ LargeVarBinaryWriter writer = new LargeVarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
writer.writeToLargeVarBinary(input, 1, 1);
byte[] result = vector.get(0);
@@ -113,9 +118,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteBufferToLargeVarBinary() {
+ public void testWriteByteBufferToLargeVarBinary() throws Exception {
try (LargeVarBinaryVector vector = new LargeVarBinaryVector("test",
allocator);
- LargeVarBinaryWriterImpl writer = new
LargeVarBinaryWriterImpl(vector)) {
+ LargeVarBinaryWriter writer = new LargeVarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
ByteBuffer buffer = ByteBuffer.wrap(input);
writer.writeToLargeVarBinary(buffer);
@@ -125,9 +130,9 @@ public class TestSimpleWriter {
}
@Test
- public void testWriteByteBufferWithOffsetToLargeVarBinary() {
+ public void testWriteByteBufferWithOffsetToLargeVarBinary() throws Exception
{
try (LargeVarBinaryVector vector = new LargeVarBinaryVector("test",
allocator);
- LargeVarBinaryWriterImpl writer = new
LargeVarBinaryWriterImpl(vector)) {
+ LargeVarBinaryWriter writer = new LargeVarBinaryWriterImpl(vector)) {
byte[] input = new byte[] { 0x01, 0x02 };
ByteBuffer buffer = ByteBuffer.wrap(input);
writer.writeToLargeVarBinary(buffer, 1, 1);
@@ -135,4 +140,48 @@ public class TestSimpleWriter {
Assert.assertArrayEquals(new byte[] { 0x02 }, result);
}
}
+
+ @Test
+ public void testWriteStringToVarChar() throws Exception {
+ try (VarCharVector vector = new VarCharVector("test", allocator);
+ VarCharWriter writer = new VarCharWriterImpl(vector)) {
+ String input = "testInput";
+ writer.writeVarChar(input);
+ String result = vector.getObject(0).toString();
+ Assert.assertEquals(input, result);
+ }
+ }
+
+ @Test
+ public void testWriteTextToVarChar() throws Exception {
+ try (VarCharVector vector = new VarCharVector("test", allocator);
+ VarCharWriter writer = new VarCharWriterImpl(vector)) {
+ String input = "testInput";
+ writer.writeVarChar(new Text(input));
+ String result = vector.getObject(0).toString();
+ Assert.assertEquals(input, result);
+ }
+ }
+
+ @Test
+ public void testWriteStringToLargeVarChar() throws Exception {
+ try (LargeVarCharVector vector = new LargeVarCharVector("test", allocator);
+ LargeVarCharWriter writer = new LargeVarCharWriterImpl(vector)) {
+ String input = "testInput";
+ writer.writeLargeVarChar(input);
+ String result = vector.getObject(0).toString();
+ Assert.assertEquals(input, result);
+ }
+ }
+
+ @Test
+ public void testWriteTextToLargeVarChar() throws Exception {
+ try (LargeVarCharVector vector = new LargeVarCharVector("test", allocator);
+ LargeVarCharWriter writer = new LargeVarCharWriterImpl(vector)) {
+ String input = "testInput";
+ writer.writeLargeVarChar(new Text(input));
+ String result = vector.getObject(0).toString();
+ Assert.assertEquals(input, result);
+ }
+ }
}