Skip to content

Commit 1c83d62

Browse files
committed
Test and bug fixes
1 parent 89bc5ea commit 1c83d62

3 files changed

Lines changed: 375 additions & 6 deletions

File tree

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

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import javax.annotation.Nonnull;
3535
import javax.annotation.concurrent.GuardedBy;
3636
import javax.sql.DataSource;
37+
import java.math.BigDecimal;
3738
import java.nio.ByteBuffer;
3839
import java.sql.Connection;
3940
import java.sql.PreparedStatement;
@@ -331,7 +332,8 @@ public <Record> VectorSearchResults<Record> search(String collectionName, List<F
331332
List<Object> parameters = getFilterParameters(options.getVectorSearchFilter());
332333

333334
String selectQuery = "SELECT "
334-
+ formatQuery("VECTOR_DISTANCE(%s, ?, %s) distance, ", vectorField.getEffectiveStorageName(), toOracleDistanceFunction(distanceFunction))
335+
+ (vector == null ? "0 as distance, " :
336+
formatQuery("VECTOR_DISTANCE(%s, ?, %s) distance, ", vectorField.getEffectiveStorageName(), toOracleDistanceFunction(distanceFunction)))
335337
+ getQueryColumnsFromFields(fields)
336338
+ " FROM " + getCollectionTableName(collectionName)
337339
+ (filter != null && !filter.isEmpty() ? " WHERE " + filter : "")
@@ -345,12 +347,16 @@ public <Record> VectorSearchResults<Record> search(String collectionName, List<F
345347
PreparedStatement statement = connection.prepareStatement(selectQuery)) {
346348
// set parameters from filters
347349
int parameterIndex = 1;
348-
System.out.println("Set vector parameter with index " + parameterIndex +" to: " + objectMapper.writeValueAsString(vector));
349-
statement.setString(parameterIndex++,
350-
objectMapper.writeValueAsString(vector));
350+
if (vector != null) {
351+
System.out.println("Set vector parameter with index " + parameterIndex + " to: "
352+
+ objectMapper.writeValueAsString(vector));
353+
statement.setString(parameterIndex++,
354+
objectMapper.writeValueAsString(vector));
355+
}
351356
for (Object parameter : parameters) {
352-
System.out.println("Set parameter " + parameterIndex + " to: " + parameter);
353-
statement.setObject(parameterIndex++, parameter);
357+
if (parameter != null) {
358+
setSearchParameter(statement, parameterIndex++, parameter.getClass(), parameter);
359+
}
354360
}
355361

356362
// Calls to defineColumnType reduce the number of network requests. When Oracle JDBC knows that it is
@@ -391,6 +397,58 @@ public <Record> VectorSearchResults<Record> search(String collectionName, List<F
391397
return new VectorSearchResults<>(records);
392398
}
393399

400+
private void setSearchParameter(PreparedStatement statement, int index, Class<?> type, Object value) {
401+
402+
try {
403+
if (List.class.equals(type)) {
404+
statement.setObject(index, objectMapper.writeValueAsString(value));
405+
System.out.println(
406+
"Set values: " + objectMapper.writeValueAsString(value));
407+
return;
408+
}
409+
if (UUID.class.equals(type)) {
410+
if (value == null) {
411+
statement.setNull(index, OracleTypes.RAW);
412+
} else {
413+
UUID uuid = (UUID)value;
414+
ByteBuffer bb = ByteBuffer.allocate(16);
415+
bb.putLong(uuid.getMostSignificantBits());
416+
bb.putLong(uuid.getLeastSignificantBits());
417+
statement.setBytes(index, bb.array());
418+
System.out.println("Set values: " + uuid);
419+
}
420+
return;
421+
}
422+
if (OffsetDateTime.class.equals(type)) {
423+
if (value == null) {
424+
statement.setNull(index, OracleTypes.TIMESTAMPTZ);
425+
} else {
426+
OffsetDateTime offsetDateTime = (OffsetDateTime) value;
427+
((OraclePreparedStatement) statement).setTIMESTAMPTZ(index,
428+
TIMESTAMPTZ.of(offsetDateTime));
429+
System.out.println("Set values: " + offsetDateTime);
430+
}
431+
return;
432+
}
433+
if (BigDecimal.class.equals(type)) {
434+
if (value == null) {
435+
statement.setNull(index, OracleTypes.DECIMAL);
436+
} else {
437+
BigDecimal bigDecimal = (BigDecimal) value;
438+
((OraclePreparedStatement) statement).setBigDecimal(index,
439+
bigDecimal);
440+
System.out.println("Set values: " + bigDecimal);
441+
}
442+
return;
443+
}
444+
System.out.println("Set parameter " + index + " to: " + value);
445+
statement.setObject(index, value);
446+
447+
} catch (Exception ex) {
448+
throw new RuntimeException(ex);
449+
}
450+
}
451+
394452

395453
private void defineDataColumnType(int columnIndex, OracleStatement statement, Class<?> fieldType) throws SQLException {
396454
// swich between supported classes and define the column type on the statement
@@ -481,6 +539,19 @@ public List<Object> getFilterParameters(VectorSearchFilter filter) {
481539
}).collect(Collectors.toList());
482540
}
483541

542+
@Override
543+
public String getEqualToFilter(EqualToFilterClause filterClause) {
544+
String fieldName = JDBCVectorStoreQueryProvider
545+
.validateSQLidentifier(filterClause.getFieldName());
546+
Object value = filterClause.getValue();
547+
548+
if (value == null) {
549+
return String.format("%s is NULL", fieldName);
550+
} else {
551+
return String.format("%s = ?", fieldName);
552+
}
553+
}
554+
484555
@Override
485556
public String getAnyTagEqualToFilter(AnyTagEqualToFilterClause filterClause) {
486557
String fieldName = JDBCVectorStoreQueryProvider

0 commit comments

Comments
 (0)