From dbc50981144cd0849e43cae97b0dbfc551af8a8b Mon Sep 17 00:00:00 2001 From: Alex Garcia Date: Fri, 24 Jan 2025 13:30:14 -0800 Subject: [PATCH] node:sqlite sample --- examples/simple-node2/.gitignore | 2 ++ examples/simple-node2/demo.mjs | 56 ++++++++++++++++++++++++++++++ examples/simple-node2/package.json | 11 ++++++ examples/simple-node2/tmp.mjs | 12 +++++++ 4 files changed, 81 insertions(+) create mode 100644 examples/simple-node2/.gitignore create mode 100644 examples/simple-node2/demo.mjs create mode 100644 examples/simple-node2/package.json create mode 100644 examples/simple-node2/tmp.mjs diff --git a/examples/simple-node2/.gitignore b/examples/simple-node2/.gitignore new file mode 100644 index 0000000..ccb2c80 --- /dev/null +++ b/examples/simple-node2/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +package-lock.json \ No newline at end of file diff --git a/examples/simple-node2/demo.mjs b/examples/simple-node2/demo.mjs new file mode 100644 index 0000000..cbf2fff --- /dev/null +++ b/examples/simple-node2/demo.mjs @@ -0,0 +1,56 @@ +/** + * This demo Node.js script shows how you can use sqlite-vec with + * the new builtin node:sqlite module. + * Note that this requires Node v23.5.0 or above. + */ +import { DatabaseSync } from "node:sqlite"; +import * as sqliteVec from "sqlite-vec"; + +// allExtension is required to enable extension support +const db = new DatabaseSync(":memory:", { allowExtension: true }); +sqliteVec.load(db); + +const { sqlite_version, vec_version } = db + .prepare( + "select sqlite_version() as sqlite_version, vec_version() as vec_version;", + ) + .get(); + +console.log(`sqlite_version=${sqlite_version}, vec_version=${vec_version}`); + +const items = [ + [1, [0.1, 0.1, 0.1, 0.1]], + [2, [0.2, 0.2, 0.2, 0.2]], + [3, [0.3, 0.3, 0.3, 0.3]], + [4, [0.4, 0.4, 0.4, 0.4]], + [5, [0.5, 0.5, 0.5, 0.5]], +]; +const query = [0.3, 0.3, 0.3, 0.3]; + +db.exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])"); + +const insertStmt = db.prepare( + "INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)", +); + +// TODO node:sqlite doesn't have `.transaction()` support yet +for (const [id, vector] of items) { + // node:sqlite requires Uint8Array for BLOB values, so a bit awkward + insertStmt.run(BigInt(id), new Uint8Array(new Float32Array(vector).buffer)); +} + +const rows = db + .prepare( + ` + SELECT + rowid, + distance + FROM vec_items + WHERE embedding MATCH ? + ORDER BY distance + LIMIT 3 +`, + ) + .all(new Uint8Array(new Float32Array(query).buffer)); + +console.log(rows); diff --git a/examples/simple-node2/package.json b/examples/simple-node2/package.json new file mode 100644 index 0000000..c512a1d --- /dev/null +++ b/examples/simple-node2/package.json @@ -0,0 +1,11 @@ +{ + "name": "simple-node2", + "version": "1.0.0", + "main": "demo.mjs", + "engines": { + "node": ">=23.5.0" + }, + "dependencies": { + "sqlite-vec": "latest" + } +} diff --git a/examples/simple-node2/tmp.mjs b/examples/simple-node2/tmp.mjs new file mode 100644 index 0000000..e447868 --- /dev/null +++ b/examples/simple-node2/tmp.mjs @@ -0,0 +1,12 @@ +import { DatabaseSync } from "node:sqlite"; +import * as sqliteVec from "sqlite-vec"; + +const db = new DatabaseSync(":memory:", { allowExtension: true }); +sqliteVec.load(db); + +const embedding = new Float32Array([0.1, 0.2, 0.3, 0.4]); +const { result } = db + .prepare("select vec_length(?) as result") + .get(new Uint8Array(embedding.buffer)); + +console.log(result); // 4 \ No newline at end of file