Complete redo of content indexing and querying (#517)

Complete redo of data store
Introduces live queries and live templates
This commit is contained in:
Zef Hemel
2023-10-03 14:16:33 +02:00
committed by GitHub
parent 7af98e7c7b
commit 0313565610
200 changed files with 4675 additions and 4363 deletions
+30 -18
View File
@@ -6,15 +6,17 @@ import { KvPrimitives } from "./kv_primitives.ts";
import { assertEquals } from "https://deno.land/std@0.165.0/testing/asserts.ts";
async function test(db: KvPrimitives) {
const dataStore = new DataStore(db);
await dataStore.set(["user", "peter"], { name: "Peter" });
await dataStore.set(["user", "hank"], { name: "Hank" });
let results = await dataStore.query({
const datastore = new DataStore(db, ["ds"], {
count: (arr: any[]) => arr.length,
});
await datastore.set(["user", "peter"], { name: "Peter" });
await datastore.set(["user", "hank"], { name: "Hank" });
let results = await datastore.query({
prefix: ["user"],
filter: ["=", "name", "Peter"],
filter: ["=", ["attr", "name"], ["string", "Peter"]],
});
assertEquals(results, [{ key: ["user", "peter"], value: { name: "Peter" } }]);
await dataStore.batchSet([
await datastore.batchSet<any>([
{ key: ["kv", "name"], value: "Zef" },
{ key: ["kv", "data"], value: new Uint8Array([1, 2, 3]) },
{
@@ -29,32 +31,42 @@ async function test(db: KvPrimitives) {
},
},
]);
assertEquals(await dataStore.get(["kv", "name"]), "Zef");
assertEquals(await dataStore.get(["kv", "data"]), new Uint8Array([1, 2, 3]));
results = await dataStore.query({
assertEquals(await datastore.get(["kv", "name"]), "Zef");
assertEquals(await datastore.get(["kv", "data"]), new Uint8Array([1, 2, 3]));
results = await datastore.query({
prefix: ["kv"],
filter: ["=", "", "Zef"],
filter: ["=~", ["attr", ""], ["regexp", "Z.f", "i"]],
});
assertEquals(results, [{ key: ["kv", "name"], value: "Zef" }]);
results = await dataStore.query({
results = await datastore.query({
prefix: ["kv"],
filter: ["and", ["=", "parents", "John"], [
filter: ["and", ["=", ["attr", "parents"], ["string", "John"]], [
"=",
"address.city",
"San Francisco",
["attr", ["attr", "address"], "city"],
["string", "San Francisco"],
]],
select: ["name"],
select: [
{ name: "parents" },
{
name: "name",
expr: ["+", ["attr", "name"], ["string", "!"]],
},
{
name: "parentCount",
expr: ["call", "count", [["attr", "parents"]]],
},
],
});
assertEquals(results.length, 1);
assertEquals(results[0], {
key: ["kv", "complicated"],
value: { name: "Frank" },
value: { name: "Frank!", parentCount: 2, parents: ["John", "Jane"] },
});
}
Deno.test("Test Deno KV DataStore", async () => {
const tmpFile = await Deno.makeTempFile();
const db = new DenoKvPrimitives(tmpFile);
await db.init();
const db = new DenoKvPrimitives(await Deno.openKv(tmpFile));
await test(db);
db.close();
await Deno.remove(tmpFile);