Skip to content

Commit 0b74b75

Browse files
committed
Adding Struct Support
1 parent 17db733 commit 0b74b75

File tree

6 files changed

+110
-1
lines changed

6 files changed

+110
-1
lines changed

src/main/java/org/opensearch/jdbc/ConnectionImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.sql.Savepoint;
4242
import java.sql.Statement;
4343
import java.sql.Struct;
44+
import java.util.Arrays;
4445
import java.util.Map;
4546
import java.util.Properties;
4647
import java.util.concurrent.Executor;
@@ -436,7 +437,7 @@ public Array createArrayOf(String typeName, Object[] elements) throws SQLExcepti
436437

437438
@Override
438439
public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
439-
throw new SQLFeatureNotSupportedException("Struct is not supported.");
440+
return new StructImpl(typeName, attributes);
440441
}
441442

442443
@Override
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
7+
package org.opensearch.jdbc;
8+
9+
import java.sql.SQLException;
10+
import java.sql.Struct;
11+
import java.util.Map;
12+
13+
public class StructImpl implements Struct{
14+
private final String typeName;
15+
private final Object[] attributes;
16+
17+
public StructImpl(String typeName, Object[] attributes) {
18+
this.typeName = typeName;
19+
this.attributes = attributes;
20+
}
21+
22+
public String getSQLTypeName() throws SQLException {
23+
return this.typeName;
24+
}
25+
26+
public Object[] getAttributes() throws SQLException {
27+
return attributes;
28+
}
29+
30+
public Object[] getAttributes(Map<String,Class<?>> map) throws SQLException {
31+
throw new java.lang.UnsupportedOperationException("Not supported yet.");
32+
}
33+
}

src/main/java/org/opensearch/jdbc/types/BaseTypeConverter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.sql.Date;
1010
import java.sql.SQLException;
11+
import java.sql.Struct;
1112
import java.sql.Time;
1213
import java.sql.Timestamp;
1314
import java.util.HashMap;
@@ -35,6 +36,9 @@ public abstract class BaseTypeConverter implements TypeConverter {
3536
typeHandlerMap.put(Date.class, DateType.INSTANCE);
3637
typeHandlerMap.put(Time.class, TimeType.INSTANCE);
3738

39+
// Adding Struct Support
40+
typeHandlerMap.put(Struct.class, StructType.INSTANCE);
41+
3842
}
3943

4044
@Override

src/main/java/org/opensearch/jdbc/types/OpenSearchType.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ public enum OpenSearchType {
9090
jdbcTypeToOpenSearchTypeMap.put(JDBCType.TIME, TIME);
9191
jdbcTypeToOpenSearchTypeMap.put(JDBCType.DATE, DATE);
9292
jdbcTypeToOpenSearchTypeMap.put(JDBCType.VARBINARY, BINARY);
93+
94+
// Adding Struct Support
95+
jdbcTypeToOpenSearchTypeMap.put(JDBCType.STRUCT, OBJECT);
9396
}
9497

9598
/**
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package org.opensearch.jdbc.types;
6+
7+
import java.sql.Struct;
8+
import java.util.Map;
9+
import java.util.ArrayList;
10+
import java.util.Arrays;
11+
import java.util.List;
12+
import java.util.LinkedHashMap;
13+
14+
15+
16+
import org.opensearch.jdbc.StructImpl;
17+
18+
public class StructType implements TypeHelper<Struct> {
19+
20+
public static final StructType INSTANCE = new StructType();
21+
22+
private StructType() {
23+
24+
}
25+
26+
@Override
27+
public String getTypeName() {
28+
return "Struct";
29+
}
30+
31+
@Override
32+
public Struct fromValue(Object value, Map<String, Object> conversionParams) {
33+
int i = 0;
34+
Map<String, Object> structKeyValues = (Map<String, Object>) value;
35+
Object[] attributes = new Map.Entry[structKeyValues.size()];
36+
37+
for(Map.Entry<String, Object> entry: structKeyValues.entrySet()) {
38+
attributes[i++] = entry;
39+
}
40+
return new StructImpl(getTypeName(), attributes);
41+
}
42+
}

src/main/java/org/opensearch/jdbc/types/TypeConverters.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.sql.Date;
1010
import java.sql.JDBCType;
1111
import java.sql.SQLException;
12+
import java.sql.Struct;
1213
import java.sql.Time;
1314
import java.sql.Timestamp;
1415
import java.util.Arrays;
@@ -56,12 +57,37 @@ public class TypeConverters {
5657
tcMap.put(JDBCType.BINARY, new BinaryTypeConverter());
5758

5859
tcMap.put(JDBCType.NULL, new NullTypeConverter());
60+
61+
// Adding Struct Support
62+
tcMap.put(JDBCType.STRUCT, new StructTypeConverter());
5963
}
6064

6165
public static TypeConverter getInstance(JDBCType jdbcType) {
6266
return tcMap.get(jdbcType);
6367
}
6468

69+
public static class StructTypeConverter extends BaseTypeConverter {
70+
71+
private static final Set<Class> supportedJavaClasses = Collections.unmodifiableSet(
72+
new HashSet<>(Arrays.asList(
73+
Struct.class
74+
)));
75+
76+
StructTypeConverter() {
77+
78+
}
79+
80+
@Override
81+
public Class getDefaultJavaClass() {
82+
return Struct.class;
83+
}
84+
85+
@Override
86+
public Set<Class> getSupportedJavaClasses() {
87+
return supportedJavaClasses;
88+
}
89+
}
90+
6591
public static class TimestampTypeConverter extends BaseTypeConverter {
6692

6793
private static final Set<Class> supportedJavaClasses = Collections.unmodifiableSet(

0 commit comments

Comments
 (0)