Skip to content

Commit cf99cf7

Browse files
fmeheustpsilberk
authored andcommitted
Added constants for type mapping and matched ODP type mapping when possible.
1 parent 2f421a8 commit cf99cf7

3 files changed

Lines changed: 84 additions & 30 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.microsoft.semantickernel.data.jdbc.oracle;
2+
3+
public class OracleDataTypesMapping {
4+
public static final String STRING_VARCHAR = "NVARCHAR2(%s)";
5+
public static final String STRING_CLOB = "CLOB";
6+
public static final String BOOLEAN = "BOOLEAN";
7+
public static final String BYTE = "NUMBER(3)";
8+
public static final String BYTE_ARRAY = "RAW(2000)";
9+
public static final String SHORT = "NUMBER(5)";
10+
public static final String INTEGER = "NUMBER(10)";
11+
public static final String LONG = "NUMBER(19)";
12+
public static final String FLOAT = "BINARY_FLOAT";
13+
public static final String DOUBLE = "BINARY_DOUBLE";
14+
public static final String DECIMAL = "NUMBER(18,2)";
15+
public static final String OFFSET_DATE_TIME = "TIMESTAMP(7) WITH TIME ZONE";
16+
public static final String UUID = "RAW(16)";
17+
public static final String JSON = "JSON";
18+
}

data/semantickernel-data-oracle/src/main/java/com/microsoft/semantickernel/data/jdbc/oracle/OracleVectorStoreQueryProvider.java

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import javax.annotation.Nonnull;
3131
import javax.sql.DataSource;
32+
import java.math.BigDecimal;
3233
import java.sql.Connection;
3334
import java.sql.PreparedStatement;
3435
import java.sql.ResultSet;
@@ -41,6 +42,7 @@
4142
import java.util.HashMap;
4243
import java.util.List;
4344
import java.util.Map;
45+
import java.util.UUID;
4446
import java.util.logging.Logger;
4547
import java.util.stream.Collectors;
4648
import java.util.stream.StreamSupport;
@@ -81,17 +83,25 @@ private OracleVectorStoreQueryProvider(
8183
prefixForCollectionTables,
8284
buildSupportedKeyTypes(),
8385
buildSupportedDataTypes(stringTypeMapping, defaultVarcharSize),
84-
buildSupportedVectorTypes(defaultVarcharSize));
86+
buildSupportedVectorTypes());
8587
this.collectionsTable = collectionsTable;
8688
this.objectMapper = objectMapper;
8789
}
8890

8991
private static HashMap<Class<?>, String> buildSupportedKeyTypes() {
9092
HashMap<Class<?>, String> supportedKeyTypes = new HashMap<>();
91-
supportedKeyTypes.put(String.class, "VARCHAR(255)");
93+
supportedKeyTypes.put(String.class, String.format(OracleDataTypesMapping.STRING_VARCHAR, 255));
94+
supportedKeyTypes.put(short.class, OracleDataTypesMapping.SHORT);
95+
supportedKeyTypes.put(Short.class, OracleDataTypesMapping.SHORT);
96+
supportedKeyTypes.put(int.class, OracleDataTypesMapping.INTEGER);
97+
supportedKeyTypes.put(Integer.class, OracleDataTypesMapping.INTEGER);
98+
supportedKeyTypes.put(long.class, OracleDataTypesMapping.LONG);
99+
supportedKeyTypes.put(Long.class, OracleDataTypesMapping.LONG);
100+
supportedKeyTypes.put(UUID.class, OracleDataTypesMapping.UUID);
101+
92102
return supportedKeyTypes;
93103
}
94-
private static Map<Class<?>, String> buildSupportedVectorTypes(int defaultVarCharLength) {
104+
private static Map<Class<?>, String> buildSupportedVectorTypes() {
95105
HashMap<Class<?>, String> supportedVectorTypes = new HashMap<>();
96106
supportedVectorTypes.put(String.class, "VECTOR(%s)");
97107
supportedVectorTypes.put(List.class, "VECTOR(%s)");
@@ -102,22 +112,29 @@ private static Map<Class<?>, String> buildSupportedVectorTypes(int defaultVarCha
102112
private static Map<Class<?>, String> buildSupportedDataTypes(StringTypeMapping stringTypeMapping, int defaultVarCharLength) {
103113
HashMap<Class<?>, String> supportedDataTypes = new HashMap<>();
104114
if (stringTypeMapping.equals(StringTypeMapping.USE_VARCHAR)) {
105-
supportedDataTypes.put(String.class, "VARCHAR(" + defaultVarCharLength + ")");
115+
supportedDataTypes.put(String.class, String.format(OracleDataTypesMapping.STRING_VARCHAR, defaultVarCharLength));
106116
} else {
107-
supportedDataTypes.put(String.class, "CLOB");
117+
supportedDataTypes.put(String.class, OracleDataTypesMapping.STRING_CLOB);
108118
}
109-
supportedDataTypes.put(Integer.class, "INTEGER");
110-
supportedDataTypes.put(int.class, "INTEGER");
111-
supportedDataTypes.put(Long.class, "LONG");
112-
supportedDataTypes.put(long.class, "LONG");
113-
supportedDataTypes.put(Float.class, "REAL");
114-
supportedDataTypes.put(float.class, "REAL");
115-
supportedDataTypes.put(Double.class, "DOUBLE PRECISION");
116-
supportedDataTypes.put(double.class, "DOUBLE PRECISION");
117-
supportedDataTypes.put(Boolean.class, "BOOLEAN");
118-
supportedDataTypes.put(boolean.class, "BOOLEAN");
119-
supportedDataTypes.put(OffsetDateTime.class, "TIMESTAMPTZ");
120-
supportedDataTypes.put(List.class, "JSON");
119+
supportedDataTypes.put(byte.class, OracleDataTypesMapping.BYTE);
120+
supportedDataTypes.put(Byte.class, OracleDataTypesMapping.BYTE);
121+
supportedDataTypes.put(short.class, OracleDataTypesMapping.SHORT);
122+
supportedDataTypes.put(Short.class, OracleDataTypesMapping.SHORT);
123+
supportedDataTypes.put(int.class, OracleDataTypesMapping.INTEGER);
124+
supportedDataTypes.put(Integer.class, OracleDataTypesMapping.INTEGER);
125+
supportedDataTypes.put(long.class, OracleDataTypesMapping.LONG);
126+
supportedDataTypes.put(Long.class, OracleDataTypesMapping.LONG);
127+
supportedDataTypes.put(Float.class, OracleDataTypesMapping.FLOAT);
128+
supportedDataTypes.put(float.class, OracleDataTypesMapping.FLOAT);
129+
supportedDataTypes.put(Double.class, OracleDataTypesMapping.DOUBLE);
130+
supportedDataTypes.put(double.class, OracleDataTypesMapping.DOUBLE);
131+
supportedDataTypes.put(BigDecimal.class, OracleDataTypesMapping.DECIMAL);
132+
supportedDataTypes.put(Boolean.class, OracleDataTypesMapping.BOOLEAN);
133+
supportedDataTypes.put(boolean.class, OracleDataTypesMapping.BOOLEAN);
134+
supportedDataTypes.put(OffsetDateTime.class, OracleDataTypesMapping.OFFSET_DATE_TIME);
135+
supportedDataTypes.put(UUID.class, OracleDataTypesMapping.UUID);
136+
supportedDataTypes.put(byte[].class, OracleDataTypesMapping.BYTE_ARRAY);
137+
supportedDataTypes.put(List.class, OracleDataTypesMapping.JSON);
121138
return supportedDataTypes;
122139
}
123140

@@ -178,11 +195,11 @@ public void createCollection(String collectionName,
178195

179196
List<VectorStoreRecordVectorField> vectorFields = recordDefinition.getVectorFields();
180197
String createStorageTable = formatQuery("CREATE TABLE IF NOT EXISTS %s ("
181-
+ "%s VARCHAR(255) PRIMARY KEY, "
198+
+ "%s PRIMARY KEY, "
182199
+ "%s, "
183200
+ "%s)",
184201
getCollectionTableName(collectionName),
185-
getKeyColumnName(recordDefinition.getKeyField()),
202+
getKeyColumnNameAndType(recordDefinition.getKeyField(), getSupportedDataTypes()),
186203
getColumnNamesAndTypes(new ArrayList<>(recordDefinition.getDataFields()),
187204
getSupportedDataTypes()),
188205
getVectorColumnNamesAndTypes(new ArrayList<>(vectorFields),
@@ -237,6 +254,11 @@ public void createCollection(String collectionName,
237254
}
238255
}
239256

257+
private String getKeyColumnNameAndType(VectorStoreRecordKeyField field, Map<Class<?>, String> types) {
258+
return validateSQLidentifier(field.getEffectiveStorageName()) + " "
259+
+ types.get(field.getFieldType());
260+
}
261+
240262
private String createIndexForDataField(String collectionName, VectorStoreRecordDataField dataField) {
241263
if (supportedDataTypes.get(dataField.getFieldType()) == "JSON") {
242264
String dataFieldIndex = "CREATE MULTIVALUE INDEX %s ON %s t (t.%s.%s)";
@@ -545,7 +567,7 @@ public static class Builder
545567
private String prefixForCollectionTables = DEFAULT_PREFIX_FOR_COLLECTION_TABLES;
546568
private ObjectMapper objectMapper = new ObjectMapper();
547569
private StringTypeMapping stringTypeMapping = StringTypeMapping.USE_VARCHAR;
548-
private int defaultVarcharSize = 4000;
570+
private int defaultVarcharSize = 2000;
549571

550572

551573
@SuppressFBWarnings("EI_EXPOSE_REP2")
@@ -594,7 +616,7 @@ public Builder withStringTypeMapping (StringTypeMapping stringTypeMapping) {
594616
/**
595617
* Sets the default size of the VARHCHAR2 fields.
596618
* @param defaultVarcharSize the default size of the VARHCHAR2 fields. By default, the size
597-
* is 4000.
619+
* is 2000.
598620
* @return then builder
599621
*/
600622
public Builder withDefaultVarcharSize (int defaultVarcharSize) {

data/semantickernel-data-oracle/src/main/java/com/microsoft/semantickernel/data/jdbc/oracle/OracleVectorStoreRecordMapper.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,29 +147,43 @@ public OracleVectorStoreRecordMapper<Record> build() {
147147

148148
Object value;
149149
switch (supportedDataTypesMapping.get(fieldType)) {
150-
case "CLOB":
150+
case OracleDataTypesMapping.STRING_CLOB:
151151
value = resultSet.getString(field.getEffectiveStorageName());
152152
break;
153-
case "INTEGER":
154-
value = resultSet.getInt(field.getEffectiveStorageName());
153+
case OracleDataTypesMapping.BYTE:
154+
value = resultSet.getByte(field.getEffectiveStorageName());
155+
break;
156+
case OracleDataTypesMapping.SHORT:
157+
value = resultSet.getShort(field.getEffectiveStorageName());
155158
break;
156-
case "LONG":
159+
case OracleDataTypesMapping.INTEGER:
157160
value = resultSet.getInt(field.getEffectiveStorageName());
158161
break;
159-
case "REAL":
162+
case OracleDataTypesMapping.LONG:
163+
value = resultSet.getLong(field.getEffectiveStorageName());
164+
break;
165+
case OracleDataTypesMapping.FLOAT:
160166
value = resultSet.getFloat(field.getEffectiveStorageName());
161167
break;
162-
case "DOUBLE PRECISION":
168+
case OracleDataTypesMapping.DOUBLE:
163169
value = resultSet.getDouble(field.getEffectiveStorageName());
164170
break;
165-
case "BOOLEAN":
171+
case OracleDataTypesMapping.DECIMAL:
172+
value = resultSet.getBigDecimal(field.getEffectiveStorageName());
173+
break;
174+
case OracleDataTypesMapping.BOOLEAN:
166175
value = resultSet.getBoolean(field.getEffectiveStorageName());
167176
break;
168-
case "TIMESTAMPTZ":
177+
case OracleDataTypesMapping.OFFSET_DATE_TIME:
169178
value = ((OracleResultSet)resultSet).getTIMESTAMPTZ(field.getEffectiveStorageName())
170179
.offsetDateTimeValue();
171180
break;
172-
case "JSON":
181+
case OracleDataTypesMapping.BYTE_ARRAY:
182+
value = resultSet.getBytes(field.getEffectiveStorageName());
183+
break;
184+
// fallthrough
185+
case OracleDataTypesMapping.UUID:
186+
case OracleDataTypesMapping.JSON:
173187
value = resultSet.getObject(field.getEffectiveStorageName(), fieldType);
174188
break;
175189
default:

0 commit comments

Comments
 (0)