diff --git a/dist/lib/grab-duplicate-safe-insert-sql.d.ts b/dist/lib/grab-duplicate-safe-insert-sql.d.ts index 00db688..8e6211e 100644 --- a/dist/lib/grab-duplicate-safe-insert-sql.d.ts +++ b/dist/lib/grab-duplicate-safe-insert-sql.d.ts @@ -1,7 +1,7 @@ type Params = { sql: string; table: string; - data: any[]; + data: any | any[]; }; export default function ({ sql: passed_sql, table, data }: Params): Promise; export {}; diff --git a/dist/lib/grab-duplicate-safe-insert-sql.js b/dist/lib/grab-duplicate-safe-insert-sql.js index a867bfb..c13fd87 100644 --- a/dist/lib/grab-duplicate-safe-insert-sql.js +++ b/dist/lib/grab-duplicate-safe-insert-sql.js @@ -5,7 +5,7 @@ export default async function ({ sql: passed_sql, table, data }) { const table_schema = dbSchema.tables.find((t) => t.tableName == table); const now = Date.now(); if (table_schema?.tableName) { - const set_sql_arr = Object.keys(data[0]).map((field) => `${field} = excluded.${field}`); + const set_sql_arr = Object.keys(Array.isArray(data) ? data[0] : data).map((field) => `${field} = excluded.${field}`); set_sql_arr.push(`updated_at = ${now}`); const set_sql = set_sql_arr.join(", "); const unique_fields = table_schema.fields.filter((f) => f.unique); diff --git a/dist/lib/sqlite/db-delete.js b/dist/lib/sqlite/db-delete.js index 5a89bfe..a23a327 100644 --- a/dist/lib/sqlite/db-delete.js +++ b/dist/lib/sqlite/db-delete.js @@ -21,6 +21,7 @@ export default async function DbDelete({ table, query, targetId, }) { const whereClause = sqlObj.string.match(/WHERE .*/)?.[0]; if (whereClause) { let sql = `DELETE FROM ${table} ${whereClause}`; + sqlObj.string = sql; const res = DbClient.run(sql, sqlObj.values); return { success: Boolean(res.changes), diff --git a/dist/lib/sqlite/db-schema-manager.js b/dist/lib/sqlite/db-schema-manager.js index 65941cc..b306fc7 100644 --- a/dist/lib/sqlite/db-schema-manager.js +++ b/dist/lib/sqlite/db-schema-manager.js @@ -308,6 +308,9 @@ class SQLiteSchemaManager { if (field.unique && !field.primaryKey) { parts.push("UNIQUE"); } + if (field.vectorDistanceMetric) { + parts.push(`distance_metric=${field.vectorDistanceMetric}`); + } // Default value if (field.defaultValue !== undefined) { if (typeof field.defaultValue === "string") { diff --git a/dist/lib/sqlite/db-sql.js b/dist/lib/sqlite/db-sql.js index d348c2b..33fd427 100644 --- a/dist/lib/sqlite/db-sql.js +++ b/dist/lib/sqlite/db-sql.js @@ -2,9 +2,10 @@ import DbClient from "."; import _ from "lodash"; export default async function DbSQL({ sql, values }) { try { - const res = sql.match(/^select/i) - ? DbClient.query(sql).all(...(values || [])) - : DbClient.run(sql, values || []); + const trimmed_sql = sql.trim(); + const res = trimmed_sql.match(/^select/i) + ? DbClient.query(trimmed_sql).all(...(values || [])) + : DbClient.run(trimmed_sql, values || []); return { success: true, payload: Array.isArray(res) ? res : undefined, @@ -17,7 +18,7 @@ export default async function DbSQL({ sql, values }) { }, debug: { sqlObj: { - sql, + sql: trimmed_sql, values, }, sql, diff --git a/dist/types/index.d.ts b/dist/types/index.d.ts index 792a1b8..38c2a5c 100644 --- a/dist/types/index.d.ts +++ b/dist/types/index.d.ts @@ -210,6 +210,10 @@ WHERE embedding MATCH ? AND k = 1; ``` */ sideCar?: boolean; + /** + * Eg. `cosine` + */ + vectorDistanceMetric?: string; } & { [key in (typeof TextFieldTypesArray)[number]["value"]]?: boolean; }; diff --git a/src/lib/grab-duplicate-safe-insert-sql.ts b/src/lib/grab-duplicate-safe-insert-sql.ts index 02e5896..80c02ef 100644 --- a/src/lib/grab-duplicate-safe-insert-sql.ts +++ b/src/lib/grab-duplicate-safe-insert-sql.ts @@ -3,7 +3,7 @@ import init from "../functions/init"; type Params = { sql: string; table: string; - data: any[]; + data: any | any[]; }; export default async function ({ sql: passed_sql, table, data }: Params) { @@ -13,9 +13,9 @@ export default async function ({ sql: passed_sql, table, data }: Params) { const now = Date.now(); if (table_schema?.tableName) { - const set_sql_arr = Object.keys(data[0]).map( - (field) => `${field} = excluded.${field}`, - ); + const set_sql_arr = Object.keys( + Array.isArray(data) ? data[0] : data, + ).map((field) => `${field} = excluded.${field}`); set_sql_arr.push(`updated_at = ${now}`); diff --git a/src/lib/sqlite/db-delete.ts b/src/lib/sqlite/db-delete.ts index d222ec0..e16f22b 100644 --- a/src/lib/sqlite/db-delete.ts +++ b/src/lib/sqlite/db-delete.ts @@ -48,6 +48,8 @@ export default async function DbDelete< if (whereClause) { let sql = `DELETE FROM ${table} ${whereClause}`; + sqlObj.string = sql; + const res = DbClient.run(sql, sqlObj.values); return { diff --git a/src/lib/sqlite/db-schema-manager.ts b/src/lib/sqlite/db-schema-manager.ts index 5fb2706..bd77659 100644 --- a/src/lib/sqlite/db-schema-manager.ts +++ b/src/lib/sqlite/db-schema-manager.ts @@ -456,6 +456,10 @@ class SQLiteSchemaManager { parts.push("UNIQUE"); } + if (field.vectorDistanceMetric) { + parts.push(`distance_metric=${field.vectorDistanceMetric}`); + } + // Default value if (field.defaultValue !== undefined) { if (typeof field.defaultValue === "string") { diff --git a/src/lib/sqlite/db-sql.ts b/src/lib/sqlite/db-sql.ts index 2c247ff..eb89ad2 100644 --- a/src/lib/sqlite/db-sql.ts +++ b/src/lib/sqlite/db-sql.ts @@ -11,9 +11,11 @@ export default async function DbSQL< T extends { [k: string]: any } = { [k: string]: any }, >({ sql, values }: Params): Promise> { try { - const res = sql.match(/^select/i) - ? DbClient.query(sql).all(...(values || [])) - : DbClient.run(sql, values || []); + const trimmed_sql = sql.trim(); + + const res = trimmed_sql.match(/^select/i) + ? DbClient.query(trimmed_sql).all(...(values || [])) + : DbClient.run(trimmed_sql, values || []); return { success: true, @@ -27,7 +29,7 @@ export default async function DbSQL< }, debug: { sqlObj: { - sql, + sql: trimmed_sql, values, }, sql, diff --git a/src/types/index.ts b/src/types/index.ts index 3553323..6db34f8 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -212,6 +212,10 @@ WHERE embedding MATCH ? AND k = 1; ``` */ sideCar?: boolean; + /** + * Eg. `cosine` + */ + vectorDistanceMetric?: string; } & { [key in (typeof TextFieldTypesArray)[number]["value"]]?: boolean; };