Skip to content

Commit 033ecc3

Browse files
ViggoClewiszlw
andauthored
GH-110: bind StringView/BinaryView for Flight SQL JDBC (#905)
## What's Changed Closes #110. --------- Co-authored-by: 张林伟 <lewiszlw520@gmail.com>
1 parent 9dc1410 commit 033ecc3

File tree

11 files changed

+135
-4
lines changed

11 files changed

+135
-4
lines changed

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessorFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
import org.apache.arrow.vector.ValueVector;
6969
import org.apache.arrow.vector.VarBinaryVector;
7070
import org.apache.arrow.vector.VarCharVector;
71+
import org.apache.arrow.vector.ViewVarBinaryVector;
72+
import org.apache.arrow.vector.ViewVarCharVector;
7173
import org.apache.arrow.vector.complex.DenseUnionVector;
7274
import org.apache.arrow.vector.complex.FixedSizeListVector;
7375
import org.apache.arrow.vector.complex.LargeListVector;
@@ -130,6 +132,9 @@ public static ArrowFlightJdbcAccessor createAccessor(
130132
} else if (vector instanceof VarBinaryVector) {
131133
return new ArrowFlightJdbcBinaryVectorAccessor(
132134
(VarBinaryVector) vector, getCurrentRow, setCursorWasNull);
135+
} else if (vector instanceof ViewVarBinaryVector) {
136+
return new ArrowFlightJdbcBinaryVectorAccessor(
137+
(ViewVarBinaryVector) vector, getCurrentRow, setCursorWasNull);
133138
} else if (vector instanceof LargeVarBinaryVector) {
134139
return new ArrowFlightJdbcBinaryVectorAccessor(
135140
(LargeVarBinaryVector) vector, getCurrentRow, setCursorWasNull);
@@ -163,6 +168,9 @@ public static ArrowFlightJdbcAccessor createAccessor(
163168
} else if (vector instanceof LargeVarCharVector) {
164169
return new ArrowFlightJdbcVarCharVectorAccessor(
165170
(LargeVarCharVector) vector, getCurrentRow, setCursorWasNull);
171+
} else if (vector instanceof ViewVarCharVector) {
172+
return new ArrowFlightJdbcVarCharVectorAccessor(
173+
(ViewVarCharVector) vector, getCurrentRow, setCursorWasNull);
166174
} else if (vector instanceof DurationVector) {
167175
return new ArrowFlightJdbcDurationVectorAccessor(
168176
(DurationVector) vector, getCurrentRow, setCursorWasNull);

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/binary/ArrowFlightJdbcBinaryVectorAccessor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.arrow.vector.FixedSizeBinaryVector;
2828
import org.apache.arrow.vector.LargeVarBinaryVector;
2929
import org.apache.arrow.vector.VarBinaryVector;
30+
import org.apache.arrow.vector.ViewVarBinaryVector;
3031

3132
/**
3233
* Accessor for the Arrow types: {@link FixedSizeBinaryVector}, {@link VarBinaryVector} and {@link
@@ -61,6 +62,13 @@ public ArrowFlightJdbcBinaryVectorAccessor(
6162
this(vector::get, currentRowSupplier, setCursorWasNull);
6263
}
6364

65+
public ArrowFlightJdbcBinaryVectorAccessor(
66+
ViewVarBinaryVector vector,
67+
IntSupplier currentRowSupplier,
68+
ArrowFlightJdbcAccessorFactory.WasNullConsumer setCursorWasNull) {
69+
this(vector::get, currentRowSupplier, setCursorWasNull);
70+
}
71+
6472
private ArrowFlightJdbcBinaryVectorAccessor(
6573
ByteArrayGetter getter,
6674
IntSupplier currentRowSupplier,

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/accessor/impl/text/ArrowFlightJdbcVarCharVectorAccessor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.arrow.driver.jdbc.utils.DateTimeUtils;
3636
import org.apache.arrow.vector.LargeVarCharVector;
3737
import org.apache.arrow.vector.VarCharVector;
38+
import org.apache.arrow.vector.ViewVarCharVector;
3839
import org.apache.arrow.vector.util.Text;
3940

4041
/** Accessor for the Arrow types: {@link VarCharVector} and {@link LargeVarCharVector}. */
@@ -62,6 +63,13 @@ public ArrowFlightJdbcVarCharVectorAccessor(
6263
this(vector::get, currentRowSupplier, setCursorWasNull);
6364
}
6465

66+
public ArrowFlightJdbcVarCharVectorAccessor(
67+
ViewVarCharVector vector,
68+
IntSupplier currentRowSupplier,
69+
ArrowFlightJdbcAccessorFactory.WasNullConsumer setCursorWasNull) {
70+
this(vector::get, currentRowSupplier, setCursorWasNull);
71+
}
72+
6573
ArrowFlightJdbcVarCharVectorAccessor(
6674
Getter getter,
6775
IntSupplier currentRowSupplier,

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/converter/impl/BinaryViewAvaticaParameterConverter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.apache.arrow.driver.jdbc.converter.impl;
1818

1919
import org.apache.arrow.vector.FieldVector;
20+
import org.apache.arrow.vector.ViewVarBinaryVector;
2021
import org.apache.arrow.vector.types.pojo.ArrowType;
2122
import org.apache.arrow.vector.types.pojo.Field;
2223
import org.apache.calcite.avatica.AvaticaParameter;
@@ -29,7 +30,12 @@ public BinaryViewAvaticaParameterConverter(ArrowType.BinaryView type) {}
2930

3031
@Override
3132
public boolean bindParameter(FieldVector vector, TypedValue typedValue, int index) {
32-
throw new UnsupportedOperationException("Not implemented");
33+
byte[] value = (byte[]) typedValue.toJdbc(null);
34+
if (vector instanceof ViewVarBinaryVector) {
35+
((ViewVarBinaryVector) vector).setSafe(index, value);
36+
return true;
37+
}
38+
return false;
3339
}
3440

3541
@Override

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/converter/impl/Utf8ViewAvaticaParameterConverter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
package org.apache.arrow.driver.jdbc.converter.impl;
1818

1919
import org.apache.arrow.vector.FieldVector;
20+
import org.apache.arrow.vector.ViewVarCharVector;
2021
import org.apache.arrow.vector.types.pojo.ArrowType;
2122
import org.apache.arrow.vector.types.pojo.Field;
23+
import org.apache.arrow.vector.util.Text;
2224
import org.apache.calcite.avatica.AvaticaParameter;
2325
import org.apache.calcite.avatica.remote.TypedValue;
2426

@@ -29,7 +31,12 @@ public Utf8ViewAvaticaParameterConverter(ArrowType.Utf8View type) {}
2931

3032
@Override
3133
public boolean bindParameter(FieldVector vector, TypedValue typedValue, int index) {
32-
throw new UnsupportedOperationException("Utf8View not supported");
34+
String value = (String) typedValue.toLocal();
35+
if (vector instanceof ViewVarCharVector) {
36+
((ViewVarCharVector) vector).setSafe(index, new Text(value));
37+
return true;
38+
}
39+
return false;
3340
}
3441

3542
@Override

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/AvaticaParameterBinder.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler.PreparedStatement;
2121
import org.apache.arrow.driver.jdbc.converter.impl.BinaryAvaticaParameterConverter;
22+
import org.apache.arrow.driver.jdbc.converter.impl.BinaryViewAvaticaParameterConverter;
2223
import org.apache.arrow.driver.jdbc.converter.impl.BoolAvaticaParameterConverter;
2324
import org.apache.arrow.driver.jdbc.converter.impl.DateAvaticaParameterConverter;
2425
import org.apache.arrow.driver.jdbc.converter.impl.DecimalAvaticaParameterConverter;
@@ -39,6 +40,7 @@
3940
import org.apache.arrow.driver.jdbc.converter.impl.TimestampAvaticaParameterConverter;
4041
import org.apache.arrow.driver.jdbc.converter.impl.UnionAvaticaParameterConverter;
4142
import org.apache.arrow.driver.jdbc.converter.impl.Utf8AvaticaParameterConverter;
43+
import org.apache.arrow.driver.jdbc.converter.impl.Utf8ViewAvaticaParameterConverter;
4244
import org.apache.arrow.memory.BufferAllocator;
4345
import org.apache.arrow.vector.FieldVector;
4446
import org.apache.arrow.vector.VectorSchemaRoot;
@@ -208,7 +210,7 @@ public Boolean visit(ArrowType.Utf8 type) {
208210

209211
@Override
210212
public Boolean visit(ArrowType.Utf8View type) {
211-
throw new UnsupportedOperationException("Utf8View is unsupported");
213+
return new Utf8ViewAvaticaParameterConverter(type).bindParameter(vector, typedValue, index);
212214
}
213215

214216
@Override
@@ -223,7 +225,7 @@ public Boolean visit(ArrowType.Binary type) {
223225

224226
@Override
225227
public Boolean visit(ArrowType.BinaryView type) {
226-
throw new UnsupportedOperationException("BinaryView is unsupported");
228+
return new BinaryViewAvaticaParameterConverter(type).bindParameter(vector, typedValue, index);
227229
}
228230

229231
@Override

flight/flight-sql-jdbc-core/src/main/java/org/apache/arrow/driver/jdbc/utils/SqlTypes.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,14 @@ public static int getSqlTypeIdFromArrowType(ArrowType arrowType) {
107107
}
108108
break;
109109
case Binary:
110+
case BinaryView:
110111
return Types.VARBINARY;
111112
case FixedSizeBinary:
112113
return Types.BINARY;
113114
case LargeBinary:
114115
return Types.LONGVARBINARY;
115116
case Utf8:
117+
case Utf8View:
116118
return Types.VARCHAR;
117119
case LargeUtf8:
118120
return Types.LONGVARCHAR;

flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/ArrowFlightJdbcAccessorFactoryTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
import org.apache.arrow.vector.LargeVarCharVector;
4747
import org.apache.arrow.vector.ValueVector;
4848
import org.apache.arrow.vector.VarCharVector;
49+
import org.apache.arrow.vector.ViewVarBinaryVector;
50+
import org.apache.arrow.vector.ViewVarCharVector;
4951
import org.apache.arrow.vector.complex.DenseUnionVector;
5052
import org.apache.arrow.vector.complex.MapVector;
5153
import org.apache.arrow.vector.complex.StructVector;
@@ -239,6 +241,18 @@ public void createAccessorForFixedSizeBinaryVector() {
239241
}
240242
}
241243

244+
@Test
245+
public void createAccessorForViewVarBinaryVector() {
246+
try (ValueVector valueVector =
247+
new ViewVarBinaryVector("", rootAllocatorTestExtension.getRootAllocator())) {
248+
ArrowFlightJdbcAccessor accessor =
249+
ArrowFlightJdbcAccessorFactory.createAccessor(
250+
valueVector, GET_CURRENT_ROW, (boolean wasNull) -> {});
251+
252+
assertTrue(accessor instanceof ArrowFlightJdbcBinaryVectorAccessor);
253+
}
254+
}
255+
242256
@Test
243257
public void createAccessorForTimeStampVector() {
244258
try (ValueVector valueVector = rootAllocatorTestExtension.createTimeStampMilliVector()) {
@@ -340,6 +354,18 @@ public void createAccessorForLargeVarCharVector() {
340354
}
341355
}
342356

357+
@Test
358+
public void createAccessorForViewVarCharVector() {
359+
try (ValueVector valueVector =
360+
new ViewVarCharVector("", rootAllocatorTestExtension.getRootAllocator())) {
361+
ArrowFlightJdbcAccessor accessor =
362+
ArrowFlightJdbcAccessorFactory.createAccessor(
363+
valueVector, GET_CURRENT_ROW, (boolean wasNull) -> {});
364+
365+
assertTrue(accessor instanceof ArrowFlightJdbcVarCharVectorAccessor);
366+
}
367+
}
368+
343369
@Test
344370
public void createAccessorForDurationVector() {
345371
try (ValueVector valueVector =

flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/accessor/impl/text/ArrowFlightJdbcVarCharVectorAccessorTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import static org.hamcrest.CoreMatchers.instanceOf;
2525
import static org.hamcrest.MatcherAssert.assertThat;
2626
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
27+
import static org.junit.jupiter.api.Assertions.assertEquals;
28+
import static org.junit.jupiter.api.Assertions.assertNull;
2729
import static org.junit.jupiter.api.Assertions.assertThrows;
2830
import static org.mockito.Mockito.when;
2931

@@ -46,6 +48,8 @@
4648
import org.apache.arrow.vector.DateMilliVector;
4749
import org.apache.arrow.vector.TimeMilliVector;
4850
import org.apache.arrow.vector.TimeStampVector;
51+
import org.apache.arrow.vector.VarCharVector;
52+
import org.apache.arrow.vector.ViewVarCharVector;
4953
import org.apache.arrow.vector.util.Text;
5054
import org.junit.jupiter.api.BeforeEach;
5155
import org.junit.jupiter.api.Test;
@@ -695,4 +699,26 @@ public void testShouldGetObjectClassReturnString() {
695699
final Class<?> clazz = accessor.getObjectClass();
696700
assertThat(clazz, equalTo(String.class));
697701
}
702+
703+
@Test
704+
public void testViewVarcharVector() throws Exception {
705+
try (VarCharVector varCharVector =
706+
new VarCharVector("", rootAllocatorTestExtension.getRootAllocator());
707+
ViewVarCharVector viewVarCharVector =
708+
new ViewVarCharVector("", rootAllocatorTestExtension.getRootAllocator())) {
709+
varCharVector.allocateNew(1);
710+
viewVarCharVector.allocateNew(1);
711+
712+
ArrowFlightJdbcVarCharVectorAccessor varCharVectorAccessor =
713+
new ArrowFlightJdbcVarCharVectorAccessor(varCharVector, () -> 0, (boolean wasNull) -> {});
714+
ArrowFlightJdbcVarCharVectorAccessor viewVarcharVectorAccessor =
715+
new ArrowFlightJdbcVarCharVectorAccessor(
716+
viewVarCharVector, () -> 0, (boolean wasNull) -> {});
717+
assertNull(viewVarcharVectorAccessor.getString());
718+
719+
varCharVector.set(0, new Text("looooong_string"));
720+
viewVarCharVector.set(0, new Text("looooong_string"));
721+
assertEquals(varCharVectorAccessor.getString(), viewVarcharVectorAccessor.getString());
722+
}
723+
}
698724
}

flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/utils/ConvertUtilsTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ public void testShouldConvertArrowFieldsToColumnMetaDataList() {
6969
.tableName("table1")
7070
.build()
7171
.getMetadataMap()),
72+
null),
73+
new Field(
74+
"col2",
75+
new FieldType(
76+
true,
77+
ArrowType.Utf8View.INSTANCE,
78+
null,
79+
new FlightSqlColumnMetadata.Builder()
80+
.catalogName("catalog1")
81+
.schemaName("schema1")
82+
.tableName("table1")
83+
.build()
84+
.getMetadataMap()),
7285
null));
7386

7487
final List<ColumnMetaData> expectedColumnMetaData =
@@ -78,6 +91,25 @@ public void testShouldConvertArrowFieldsToColumnMetaDataList() {
7891
.setCatalogName("catalog1")
7992
.setSchemaName("schema1")
8093
.setTableName("table1")
94+
.setColumnName("col1")
95+
.setType(
96+
Common.AvaticaType.newBuilder()
97+
.setId(SqlTypes.getSqlTypeIdFromArrowType(ArrowType.Utf8.INSTANCE))
98+
.setName(SqlTypes.getSqlTypeNameFromArrowType(ArrowType.Utf8.INSTANCE))
99+
.build())
100+
.build()),
101+
ColumnMetaData.fromProto(
102+
Common.ColumnMetaData.newBuilder()
103+
.setCatalogName("catalog1")
104+
.setSchemaName("schema1")
105+
.setTableName("table1")
106+
.setColumnName("col2")
107+
.setType(
108+
Common.AvaticaType.newBuilder()
109+
.setId(SqlTypes.getSqlTypeIdFromArrowType(ArrowType.Utf8View.INSTANCE))
110+
.setName(
111+
SqlTypes.getSqlTypeNameFromArrowType(ArrowType.Utf8View.INSTANCE))
112+
.build())
81113
.build()));
82114

83115
final List<ColumnMetaData> actualColumnMetaData =
@@ -95,6 +127,8 @@ private void assertColumnMetaData(
95127
assertThat(expectedColumnMetaData.catalogName, equalTo(actualColumnMetaData.catalogName));
96128
assertThat(expectedColumnMetaData.schemaName, equalTo(actualColumnMetaData.schemaName));
97129
assertThat(expectedColumnMetaData.tableName, equalTo(actualColumnMetaData.tableName));
130+
assertThat(expectedColumnMetaData.columnName, equalTo(actualColumnMetaData.columnName));
131+
assertThat(expectedColumnMetaData.type, equalTo(actualColumnMetaData.type));
98132
assertThat(expectedColumnMetaData.readOnly, equalTo(actualColumnMetaData.readOnly));
99133
assertThat(expectedColumnMetaData.autoIncrement, equalTo(actualColumnMetaData.autoIncrement));
100134
assertThat(expectedColumnMetaData.precision, equalTo(actualColumnMetaData.precision));

0 commit comments

Comments
 (0)