3434import javax .annotation .Nonnull ;
3535import javax .annotation .concurrent .GuardedBy ;
3636import javax .sql .DataSource ;
37+ import java .math .BigDecimal ;
3738import java .nio .ByteBuffer ;
3839import java .sql .Connection ;
3940import 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