Skip to content

Commit 2c611c7

Browse files
SNOW-974575 Fixes after code review
SNOW-974575 Fixes after code review SNOW-974575 Fixes after code review SNOW-974575 Fixes after code review SNOW-974575 Fixes after code review SNOW-974575 Fixes after code review SNOW-974575 Fixes after code review
1 parent 20987ed commit 2c611c7

19 files changed

+497
-399
lines changed

src/main/java/net/snowflake/client/core/ConvertersFactory.java

-25
This file was deleted.

src/main/java/net/snowflake/client/core/SFArrowResultSet.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -511,15 +511,8 @@ public Object getObject(int columnIndex) throws SFException {
511511

512512
@Override
513513
public Array getArray(int columnIndex) throws SFException {
514-
ArrowVectorConverter converter = currentChunkIterator.getCurrentConverter(columnIndex - 1);
515-
int index = currentChunkIterator.getCurrentRowInRecordBatch();
516-
wasNull = converter.isNull(index);
517-
converter.setTreatNTZAsUTC(treatNTZAsUTC);
518-
converter.setUseSessionTimezone(useSessionTimezone);
519-
converter.setSessionTimeZone(timeZone);
520-
Object obj = converter.toObject(index);
521514
// TODO: handleArray SNOW-969794
522-
return null;
515+
throw new SFException(ErrorCode.FEATURE_UNSUPPORTED, "data type ARRAY");
523516
}
524517

525518
private Object handleObjectType(int columnIndex, Object obj) throws SFException {

src/main/java/net/snowflake/client/core/SFBaseResultSet.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ public abstract class SFBaseResultSet {
6464
// The serializable object which can serialize the metadata for this
6565
// result set
6666
protected SnowflakeResultSetSerializableV1 resultSetSerializable;
67-
protected Converters converters;
6867

6968
public abstract boolean isLast();
7069

@@ -199,7 +198,9 @@ public List<SnowflakeResultSetSerializable> getResultSetSerializables(long maxSi
199198
return this.resultSetSerializable.splitBySize(maxSizeInBytes);
200199
}
201200

201+
@SnowflakeJdbcInternalApi
202202
public Converters getConverters() {
203-
return converters;
203+
logger.debug("Json converters weren't created");
204+
return null;
204205
}
205206
}

src/main/java/net/snowflake/client/core/SFJsonResultSet.java

+67-90
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
package net.snowflake.client.core;
66

7-
import static net.snowflake.client.jdbc.SnowflakeUtil.getTimestampFromType;
8-
97
import com.fasterxml.jackson.core.JsonProcessingException;
108
import com.fasterxml.jackson.databind.JsonNode;
119
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -16,9 +14,6 @@
1614
import java.sql.Time;
1715
import java.sql.Timestamp;
1816
import java.sql.Types;
19-
import java.time.Instant;
20-
import java.time.ZoneOffset;
21-
import java.util.HashMap;
2217
import java.util.Iterator;
2318
import java.util.Map;
2419
import java.util.Spliterator;
@@ -33,9 +28,7 @@
3328
import net.snowflake.client.jdbc.SnowflakeColumnMetadata;
3429
import net.snowflake.client.log.SFLogger;
3530
import net.snowflake.client.log.SFLoggerFactory;
36-
import net.snowflake.client.util.TypeConverter;
37-
import net.snowflake.common.core.SFTimestamp;
38-
import net.snowflake.common.core.SnowflakeDateTimeFormat;
31+
import net.snowflake.client.util.JsonStringToTypeConverter;
3932

4033
/** Abstract class used to represent snowflake result set in json format */
4134
public abstract class SFJsonResultSet extends SFBaseResultSet {
@@ -102,13 +95,13 @@ public Object getObject(int columnIndex) throws SFException {
10295
return getBoolean(columnIndex);
10396

10497
case Types.STRUCT:
105-
if (Boolean.valueOf(System.getProperty(STRUCTURED_TYPE_ENABLED_PROPERTY_NAME))) {
98+
if (Boolean.parseBoolean(System.getProperty(STRUCTURED_TYPE_ENABLED_PROPERTY_NAME))) {
10699
return getSqlInput((String) obj, columnIndex);
107100
} else {
108101
throw new SFException(ErrorCode.FEATURE_UNSUPPORTED, "data type: " + type);
109102
}
110103
case Types.ARRAY:
111-
if (Boolean.valueOf(System.getProperty(STRUCTURED_TYPE_ENABLED_PROPERTY_NAME))) {
104+
if (Boolean.parseBoolean(System.getProperty(STRUCTURED_TYPE_ENABLED_PROPERTY_NAME))) {
112105
return getArray(columnIndex);
113106
} else {
114107
throw new SFException(ErrorCode.FEATURE_UNSUPPORTED, "data type: " + type);
@@ -122,7 +115,7 @@ public Object getObject(int columnIndex) throws SFException {
122115
@Override
123116
public Array getArray(int columnIndex) throws SFException {
124117
Object obj = getObjectInternal(columnIndex);
125-
return getArrayInternal((String) obj);
118+
return getArrayInternal((String) obj, columnIndex);
126119
}
127120

128121
@Override
@@ -257,6 +250,8 @@ private Timestamp getTimestamp(int columnIndex) throws SFException {
257250
return getTimestamp(columnIndex, TimeZone.getDefault());
258251
}
259252

253+
@Override
254+
@SnowflakeJdbcInternalApi
260255
public Converters getConverters() {
261256
return converters;
262257
}
@@ -274,134 +269,116 @@ private Object getSqlInput(String input, int columnIndex) throws SFException {
274269
}
275270
}
276271

277-
private SfSqlArray getArrayInternal(String obj) throws SFException {
272+
private SfSqlArray getArrayInternal(String obj, int columnIndex) throws SFException {
278273
try {
279-
SnowflakeColumnMetadata arrayMetadata = resultSetMetaData.getColumnMetadata().get(0);
280-
FieldMetadata fieldMetadata = arrayMetadata.getField(1);
274+
SnowflakeColumnMetadata arrayMetadata =
275+
resultSetMetaData.getColumnMetadata().get(columnIndex - 1);
276+
FieldMetadata fieldMetadata = arrayMetadata.getFields().get(0);
281277

282278
int columnSubType = fieldMetadata.getType();
283279
int columnType = ColumnTypeHelper.getColumnType(columnSubType, session);
284280
int scale = fieldMetadata.getScale();
285281

286282
ArrayNode arrayNode = (ArrayNode) OBJECT_MAPPER.readTree(obj);
287-
288-
Iterator nodeElements = arrayNode.elements();
283+
Iterator<JsonNode> nodeElements = arrayNode.elements();
289284

290285
switch (columnSubType) {
291286
case Types.INTEGER:
287+
return new SfSqlArray(
288+
columnSubType,
289+
getStream(nodeElements, converters.integerConverter(columnType))
290+
.toArray(Integer[]::new));
292291
case Types.SMALLINT:
292+
return new SfSqlArray(
293+
columnSubType,
294+
getStream(nodeElements, converters.smallIntConverter(columnType))
295+
.toArray(Short[]::new));
293296
case Types.TINYINT:
294-
TypeConverter integerConverter =
295-
value -> converters.getNumberConverter().getInt(value, Types.INTEGER);
296297
return new SfSqlArray(
297-
columnSubType, getStream(nodeElements, integerConverter).toArray(Integer[]::new));
298+
columnSubType,
299+
getStream(nodeElements, converters.tinyIntConverter(columnType))
300+
.toArray(Byte[]::new));
298301
case Types.BIGINT:
302+
return new SfSqlArray(
303+
columnSubType,
304+
getStream(nodeElements, converters.bigIntConverter(columnType)).toArray(Long[]::new));
299305
case Types.DECIMAL:
300306
case Types.NUMERIC:
301-
TypeConverter bigIntConverter =
302-
value -> converters.getNumberConverter().getBigInt(value, Types.BIGINT);
303307
return new SfSqlArray(
304-
columnSubType, convertToNumericArray(nodeElements, bigIntConverter));
308+
columnSubType,
309+
convertToFixedArray(nodeElements, converters.bigDecimalConverter(columnType)));
305310
case Types.CHAR:
306311
case Types.VARCHAR:
307312
case Types.LONGNVARCHAR:
308-
TypeConverter varcharConverter = value -> value.toString();
309313
return new SfSqlArray(
310-
columnSubType, getStream(nodeElements, varcharConverter).toArray(String[]::new));
314+
columnSubType,
315+
getStream(nodeElements, converters.varcharConverter(columnType, columnSubType, scale))
316+
.toArray(String[]::new));
311317
case Types.BINARY:
312-
TypeConverter bytesConverter =
313-
value ->
314-
converters.getBytesConverter().getBytes(value, columnType, Types.BINARY, scale);
315318
return new SfSqlArray(
316-
columnSubType, getStream(nodeElements, bytesConverter).toArray(Object[]::new));
319+
columnSubType,
320+
getStream(nodeElements, converters.bytesConverter(columnType, scale))
321+
.toArray(Byte[][]::new));
317322
case Types.FLOAT:
323+
case Types.REAL:
324+
return new SfSqlArray(
325+
columnSubType,
326+
getStream(nodeElements, converters.floatConverter(columnType)).toArray(Float[]::new));
318327
case Types.DOUBLE:
319-
TypeConverter doubleConverter =
320-
value -> converters.getNumberConverter().getDouble(value, Types.DOUBLE);
321328
return new SfSqlArray(
322-
columnSubType, getStream(nodeElements, doubleConverter).toArray(Double[]::new));
329+
columnSubType,
330+
getStream(nodeElements, converters.doubleConverter(columnType))
331+
.toArray(Double[]::new));
323332
case Types.DATE:
324-
TypeConverter dateConverter =
325-
value -> {
326-
SnowflakeDateTimeFormat formatter =
327-
SnowflakeDateTimeFormat.fromSqlFormat(
328-
(String) session.getCommonParameters().get("DATE_OUTPUT_FORMAT"));
329-
SFTimestamp timestamp = formatter.parse((String) value);
330-
return Date.valueOf(
331-
Instant.ofEpochMilli(timestamp.getTime()).atZone(ZoneOffset.UTC).toLocalDate());
332-
};
333333
return new SfSqlArray(
334-
columnSubType, getStream(nodeElements, dateConverter).toArray(Date[]::new));
334+
columnSubType,
335+
getStream(nodeElements, converters.dateConverter(session)).toArray(Date[]::new));
335336
case Types.TIME:
336-
TypeConverter timeConverter =
337-
value -> {
338-
SnowflakeDateTimeFormat formatter =
339-
SnowflakeDateTimeFormat.fromSqlFormat(
340-
(String) session.getCommonParameters().get("TIME_OUTPUT_FORMAT"));
341-
SFTimestamp timestamp = formatter.parse((String) value);
342-
return Time.valueOf(
343-
Instant.ofEpochMilli(timestamp.getTime()).atZone(ZoneOffset.UTC).toLocalTime());
344-
};
345337
return new SfSqlArray(
346-
columnSubType, getStream(nodeElements, timeConverter).toArray(Time[]::new));
338+
columnSubType,
339+
getStream(nodeElements, converters.timeConverter(session)).toArray(Time[]::new));
347340
case Types.TIMESTAMP:
348-
TypeConverter timestampConverter =
349-
value -> {
350-
Timestamp result = getTimestampFromType(columnSubType, (String) value, session);
351-
if (result != null) {
352-
return result;
353-
}
354-
return converters
355-
.getDateTimeConverter()
356-
.getTimestamp(value, columnType, columnSubType, null, scale);
357-
};
358341
return new SfSqlArray(
359-
columnSubType, getStream(nodeElements, timestampConverter).toArray(Timestamp[]::new));
342+
columnSubType,
343+
getStream(
344+
nodeElements,
345+
converters.timestampConverter(columnSubType, columnType, scale, session))
346+
.toArray(Timestamp[]::new));
360347
case Types.BOOLEAN:
361-
TypeConverter booleanConverter =
362-
value -> converters.getBooleanConverter().getBoolean(value, columnType);
363348
return new SfSqlArray(
364-
columnSubType, getStream(nodeElements, booleanConverter).toArray(Boolean[]::new));
349+
columnSubType,
350+
getStream(nodeElements, converters.booleanConverter(columnType))
351+
.toArray(Boolean[]::new));
365352
case Types.STRUCT:
366-
TypeConverter structConverter =
367-
value -> {
368-
try {
369-
return OBJECT_MAPPER.readValue(value, Map.class);
370-
} catch (JsonProcessingException e) {
371-
throw new SFException(e, ErrorCode.INVALID_STRUCT_DATA);
372-
}
373-
};
374353
return new SfSqlArray(
375-
columnSubType, getStream(nodeElements, structConverter).toArray(Map[]::new));
354+
columnSubType,
355+
getStream(nodeElements, converters.structConverter(OBJECT_MAPPER))
356+
.toArray(Map[]::new));
376357
case Types.ARRAY:
377-
TypeConverter arrayConverter =
378-
value -> {
379-
try {
380-
return OBJECT_MAPPER.readValue(value, HashMap[].class);
381-
} catch (JsonProcessingException e) {
382-
throw new SFException(e, ErrorCode.INVALID_STRUCT_DATA);
383-
}
384-
};
385358
return new SfSqlArray(
386-
columnSubType, getStream(nodeElements, arrayConverter).toArray(Map[][]::new));
359+
columnSubType,
360+
getStream(nodeElements, converters.arrayConverter(OBJECT_MAPPER))
361+
.toArray(Map[][]::new));
387362
default:
388-
return null;
363+
throw new SFException(
364+
ErrorCode.FEATURE_UNSUPPORTED,
365+
"Can't construct array for data type: " + columnSubType);
389366
}
390367
} catch (JsonProcessingException e) {
391368
throw new SFException(e, ErrorCode.INVALID_STRUCT_DATA);
392369
}
393370
}
394371

395-
private Object[] convertToNumericArray(Iterator nodeElements, TypeConverter bigIntConverter) {
372+
private Object[] convertToFixedArray(
373+
Iterator nodeElements, JsonStringToTypeConverter bigIntConverter) {
396374
AtomicInteger bigDecimalCount = new AtomicInteger();
397375
Object[] elements =
398376
getStream(nodeElements, bigIntConverter)
399-
.map(
377+
.peek(
400378
elem -> {
401379
if (elem instanceof BigDecimal) {
402380
bigDecimalCount.incrementAndGet();
403381
}
404-
return elem;
405382
})
406383
.toArray(
407384
size -> {
@@ -413,7 +390,7 @@ private Object[] convertToNumericArray(Iterator nodeElements, TypeConverter bigI
413390
return elements;
414391
}
415392

416-
private Stream getStream(Iterator nodeElements, TypeConverter converter) {
393+
private Stream getStream(Iterator nodeElements, JsonStringToTypeConverter converter) {
417394
return StreamSupport.stream(
418395
Spliterators.spliteratorUnknownSize(nodeElements, Spliterator.ORDERED), false)
419396
.map(
@@ -426,8 +403,8 @@ private Stream getStream(Iterator nodeElements, TypeConverter converter) {
426403
});
427404
}
428405

429-
private static Object convert(TypeConverter converter, JsonNode elem) throws SFException {
430-
JsonNode node = elem;
406+
private static Object convert(JsonStringToTypeConverter converter, JsonNode node)
407+
throws SFException {
431408
if (node.isValueNode()) {
432409
return converter.convert(node.asText());
433410
} else {

src/main/java/net/snowflake/client/core/SFResultSet.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.Arrays;
1313
import java.util.Comparator;
1414
import net.snowflake.client.core.BasicEvent.QueryState;
15+
import net.snowflake.client.core.json.Converters;
1516
import net.snowflake.client.jdbc.ErrorCode;
1617
import net.snowflake.client.jdbc.JsonResultChunk;
1718
import net.snowflake.client.jdbc.SnowflakeResultChunk;
@@ -154,9 +155,7 @@ public SFResultSet(
154155
Telemetry telemetryClient,
155156
boolean sortResult)
156157
throws SQLException {
157-
super(
158-
resultSetSerializable.getTimeZone(),
159-
ConvertersFactory.createJsonConverters(session, resultSetSerializable));
158+
super(resultSetSerializable.getTimeZone(), new Converters(session, resultSetSerializable));
160159
this.resultSetSerializable = resultSetSerializable;
161160
this.columnCount = 0;
162161
this.sortResult = sortResult;

src/main/java/net/snowflake/client/core/SFResultSetMetaData.java

+1
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ public List<Boolean> getIsAutoIncrementList() {
473473
return isAutoIncrementList;
474474
}
475475

476+
@SnowflakeJdbcInternalApi
476477
public List<SnowflakeColumnMetadata> getColumnMetadata() {
477478
return columnMetadata;
478479
}

src/main/java/net/snowflake/client/core/SfSqlArray.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,24 @@
88
import java.util.Map;
99

1010
@SnowflakeJdbcInternalApi
11-
public class SfSqlArray<T> implements Array {
11+
public class SfSqlArray implements Array {
1212

13-
private int base;
13+
private int baseType;
1414
private Object elements;
1515

16-
public SfSqlArray(int base, Object elements) {
17-
this.base = base;
16+
public SfSqlArray(int baseType, Object elements) {
17+
this.baseType = baseType;
1818
this.elements = elements;
1919
}
2020

2121
@Override
2222
public String getBaseTypeName() throws SQLException {
23-
return JDBCType.valueOf(base).getName();
23+
return JDBCType.valueOf(baseType).getName();
2424
}
2525

2626
@Override
2727
public int getBaseType() throws SQLException {
28-
return base;
28+
return baseType;
2929
}
3030

3131
@Override

0 commit comments

Comments
 (0)