2025-01-10 01:22:26 +08:00
|
|
|
import { parseExpressionString } from "$common/space_lua/parse.ts";
|
2025-01-16 22:33:18 +08:00
|
|
|
import {
|
|
|
|
ArrayQueryCollection,
|
|
|
|
findAllQueryVariables,
|
|
|
|
} from "./query_collection.ts";
|
2025-01-10 01:22:26 +08:00
|
|
|
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(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
|
|
|
where: parseExpressionString("p.x >= 2"),
|
2025-01-10 01:22:26 +08:00
|
|
|
},
|
|
|
|
rootEnv,
|
|
|
|
LuaStackFrame.lostFrame,
|
|
|
|
);
|
|
|
|
// console.log(result);
|
|
|
|
assert(result.length === 2);
|
|
|
|
|
|
|
|
// Test limit
|
|
|
|
const result2 = await collection.query(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
2025-01-10 01:22:26 +08:00
|
|
|
limit: 1,
|
|
|
|
},
|
|
|
|
rootEnv,
|
|
|
|
LuaStackFrame.lostFrame,
|
|
|
|
);
|
|
|
|
assert(result2.length === 1);
|
|
|
|
assert(result2[0].x === 1);
|
|
|
|
|
|
|
|
// Test offset
|
|
|
|
const result3 = await collection.query(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
2025-01-10 01:22:26 +08:00
|
|
|
offset: 1,
|
|
|
|
},
|
|
|
|
rootEnv,
|
|
|
|
LuaStackFrame.lostFrame,
|
|
|
|
);
|
|
|
|
assert(result3.length === 2);
|
|
|
|
assert(result3[0].x === 2);
|
|
|
|
|
|
|
|
// Test order by
|
|
|
|
const result4 = await collection.query(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
|
|
|
orderBy: [{ expr: parseExpressionString("p.x"), desc: false }],
|
2025-01-10 01:22:26 +08:00
|
|
|
},
|
|
|
|
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(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
|
|
|
orderBy: [{ expr: parseExpressionString("p.x"), desc: true }],
|
2025-01-10 01:22:26 +08:00
|
|
|
},
|
|
|
|
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(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
2025-01-10 01:22:26 +08:00
|
|
|
orderBy: [
|
2025-01-12 23:54:04 +08:00
|
|
|
{ expr: parseExpressionString("p.lastName"), desc: false },
|
|
|
|
{ expr: parseExpressionString("p.firstName"), desc: true },
|
2025-01-10 01:22:26 +08:00
|
|
|
],
|
|
|
|
},
|
|
|
|
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 with expression
|
|
|
|
const result8 = await collection2.query(
|
|
|
|
{
|
2025-01-12 23:54:04 +08:00
|
|
|
objectVariable: "p",
|
2025-01-14 03:25:39 +08:00
|
|
|
select: parseExpressionString("p.firstName .. ' ' .. p.lastName"),
|
2025-01-10 01:22:26 +08:00
|
|
|
},
|
|
|
|
rootEnv,
|
|
|
|
LuaStackFrame.lostFrame,
|
|
|
|
);
|
2025-01-14 03:25:39 +08:00
|
|
|
assertEquals(result8[0], "John Doe");
|
|
|
|
assertEquals(result8[1], "Alice Johnson");
|
|
|
|
assertEquals(result8[2], "Jane Doe");
|
|
|
|
assertEquals(result8[3], "Bob Johnson");
|
2025-01-10 01:22:26 +08:00
|
|
|
|
2025-01-14 04:17:08 +08:00
|
|
|
// Test select with native function and implicit object variable
|
2025-01-10 01:22:26 +08:00
|
|
|
const result9 = await collection2.query(
|
|
|
|
{
|
2025-01-14 04:17:08 +08:00
|
|
|
select: parseExpressionString("build_name(firstName, lastName)"),
|
2025-01-10 01:22:26 +08:00
|
|
|
},
|
|
|
|
rootEnv,
|
|
|
|
LuaStackFrame.lostFrame,
|
|
|
|
);
|
2025-01-14 03:25:39 +08:00
|
|
|
assertEquals(result9[0], "John Doe");
|
|
|
|
assertEquals(result9[1], "Alice Johnson");
|
|
|
|
assertEquals(result9[2], "Jane Doe");
|
|
|
|
assertEquals(result9[3], "Bob Johnson");
|
2025-01-10 01:22:26 +08:00
|
|
|
});
|
2025-01-16 22:33:18 +08:00
|
|
|
|
|
|
|
Deno.test("findAllQueryVariables", () => {
|
|
|
|
const query = {
|
|
|
|
where: parseExpressionString("p.x >= 2 and b.x >= 2"),
|
|
|
|
select: parseExpressionString("p.x + b.x"),
|
|
|
|
orderBy: [{ expr: parseExpressionString("q.x"), desc: false }],
|
|
|
|
};
|
|
|
|
const variables = findAllQueryVariables(query);
|
|
|
|
assertEquals(variables, ["p", "b", "q"]);
|
|
|
|
});
|