当前位置: 首页 > news >正文

rqlite java sdk 对于sqlite-vec 支持的bug

rqlite java sdk 对于sqlite-vec 支持的bug

sqlite-vec 查询返回的distance 是real 类型的,但是rqlite java sdk 对于类型了check,如果没在代码里边的会直接提示异常

解决方法

实际上real 与包含精度的float 类型是类似的,解决方法就比较简单了,配置兼容就可以了

参考示例代码

具体需改的地方比较多,可以参考完整pr 代码

public static int getJdbcType(String rqliteType) {if (rqliteType == null) {throw new IllegalArgumentException("type cannot be null");}var parts = rqliteType.trim().toUpperCase().split("[(),]");var rqType = parts[0];switch (rqType) {case RQ_INTEGER:    return INTEGER;case RQ_NUMERIC:    return NUMERIC;case RQ_BOOLEAN:    return BOOLEAN;case RQ_TINYINT:    return TINYINT;case RQ_SMALLINT:   return SMALLINT;case RQ_BIGINT:     return BIGINT;case RQ_FLOAT:      return FLOAT;case RQ_DOUBLE:     return DOUBLE;case RQ_TEXT:case RQ_VARCHAR:    return VARCHAR;case RQ_DATE:       return DATE;case RQ_TIME:       return TIME;case RQ_TIMESTAMP:  return TIMESTAMP;case RQ_DATALINK:   return DATALINK;case RQ_CLOB:       return CLOB;case RQ_NCLOB:      return NCLOB;case RQ_NVARCHAR:   return NVARCHAR;case RQ_BLOB:       return BLOB;case RQ_NULL:       return NULL;case RQ_REAL:       return FLOAT; // RQLite uses REAL as an alias for FLOATdefault: return -1;}}

说明

以上是一个示例,参考jdbc 操作代码

package com.dalong;
import java.sql.*;
import java.util.Arrays;
import java.util.UUID;public class App {public static void main(String[] args) {var url = "jdbc:sqlite:http://localhost:8080";var vector = new int[] {1,2,4};System.out.println("vector to " + Arrays.toString(vector));try (Connection conn = DriverManager.getConnection(url)) {var stmt = conn.createStatement();var ps = conn.prepareStatement("insert into dalongrong_vec (id, vector, user_id, type, version) values (?,?,?,?,?)");ps.setString(1, UUID.randomUUID().toString());ps.setString(2, Arrays.toString(vector));ps.setString(3, "user123");ps.setString(4, "text");ps.setString(5, "v1");int result = ps.executeUpdate();System.out.println("Insert result: " + result);var psv2 = conn.prepareStatement("select id, user_id,vector, vec_distance_cosine(vector,?) distance from dalongrong_vec where vector match ? and type = ? and version = ?  and k = 10 order by distance");psv2.setString(1, Arrays.toString(vector));psv2.setString(2, Arrays.toString(vector));psv2.setString(3, "text");psv2.setString(4, "v1");var rs = psv2.executeQuery();while (rs.next()) {System.out.println("ID: " + rs.getString("id") + ", vector: " + rs.getString("vector") +"vector: " + rs.getString("user_id") + ", distance:"+ rs.getFloat("distance"));}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}
}

参考资料

https://github.com/rqlite/rqlite-jdbc

https://github.com/rqlite/rqlite-jdbc/pull/1