silverbullet/common/space_lua/query_collection.test.ts

150 lines
3.8 KiB
TypeScript

import { parseExpressionString } from "$common/space_lua/parse.ts";
import { ArrayQueryCollection } from "./query_collection.ts";
import {
LuaEnv,
LuaNativeJSFunction,
LuaStackFrame,
} from "$common/space_lua/runtime.ts";
import { assert, assertEquals } from "@std/assert";
Deno.test("ArrayQueryCollection", async () => {
const rootEnv = new LuaEnv();
rootEnv.setLocal(
"build_name",
new LuaNativeJSFunction((a, b) => {
return Promise.resolve(a + " " + b);
}),
);
const collection = new ArrayQueryCollection([{ x: 1, y: 1 }, { x: 2, y: 2 }, {
x: 3,
y: 3,
}]);
const result = await collection.query(
{
where: parseExpressionString("x >= 2"),
},
rootEnv,
LuaStackFrame.lostFrame,
);
// console.log(result);
assert(result.length === 2);
// Test limit
const result2 = await collection.query(
{
limit: 1,
},
rootEnv,
LuaStackFrame.lostFrame,
);
assert(result2.length === 1);
assert(result2[0].x === 1);
// Test offset
const result3 = await collection.query(
{
offset: 1,
},
rootEnv,
LuaStackFrame.lostFrame,
);
assert(result3.length === 2);
assert(result3[0].x === 2);
// Test order by
const result4 = await collection.query(
{
orderBy: [{ expr: parseExpressionString("x"), desc: false }],
},
rootEnv,
LuaStackFrame.lostFrame,
);
assert(result4.length === 3);
assert(result4[0].x === 1);
assert(result4[1].x === 2);
assert(result4[2].x === 3);
// Test order by desc
const result5 = await collection.query(
{
orderBy: [{ expr: parseExpressionString("x"), desc: true }],
},
rootEnv,
LuaStackFrame.lostFrame,
);
assert(result5.length === 3);
assert(result5[0].x === 3);
assert(result5[1].x === 2);
assert(result5[2].x === 1);
// Test order by multiple fields
const collection2 = new ArrayQueryCollection([
{ firstName: "John", lastName: "Doe" },
{ firstName: "Alice", lastName: "Johnson" },
{ firstName: "Jane", lastName: "Doe" },
{ firstName: "Bob", lastName: "Johnson" },
]);
const result6 = await collection2.query(
{
orderBy: [
{ expr: parseExpressionString("lastName"), desc: false },
{ expr: parseExpressionString("firstName"), desc: true },
],
},
rootEnv,
LuaStackFrame.lostFrame,
);
assertEquals(result6[0].firstName, "John");
assertEquals(result6[0].lastName, "Doe");
assertEquals(result6[1].firstName, "Jane");
assertEquals(result6[1].lastName, "Doe");
assertEquals(result6[2].firstName, "Bob");
assertEquals(result6[2].lastName, "Johnson");
assertEquals(result6[3].firstName, "Alice");
assertEquals(result6[3].lastName, "Johnson");
// Test select
const result7 = await collection2.query(
{
select: [{ name: "firstName" }],
},
rootEnv,
LuaStackFrame.lostFrame,
);
assertEquals(result7[0].firstName, "John");
assertEquals(result7[0].lastName, undefined);
// Test select with expression
const result8 = await collection2.query(
{
select: [{
name: "fullName",
expr: parseExpressionString("firstName .. ' ' .. lastName"),
}],
},
rootEnv,
LuaStackFrame.lostFrame,
);
assertEquals(result8[0].fullName, "John Doe");
assertEquals(result8[1].fullName, "Alice Johnson");
assertEquals(result8[2].fullName, "Jane Doe");
assertEquals(result8[3].fullName, "Bob Johnson");
// Test select with native function
const result9 = await collection2.query(
{
select: [{
name: "fullName",
expr: parseExpressionString("build_name(firstName, lastName)"),
}],
},
rootEnv,
LuaStackFrame.lostFrame,
);
assertEquals(result9[0].fullName, "John Doe");
assertEquals(result9[1].fullName, "Alice Johnson");
assertEquals(result9[2].fullName, "Jane Doe");
assertEquals(result9[3].fullName, "Bob Johnson");
});