trellis 3.1.35 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -5
- package/README.md +63 -156
- package/bin/trellis.mjs +2 -75
- package/dist/{better-sqlite-backend-ahx5p0br.js → better-sqlite-backend-2P4F6AOJ.js} +91 -29
- package/dist/boot-middleware-MHLHFCUC.js +9 -0
- package/dist/browser/index.d.ts +18 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +95 -0
- package/dist/{index-53f3b8p8.js → chunk-2W3MHTMG.js} +552 -213
- package/dist/chunk-44FFQKQX.js +142 -0
- package/dist/chunk-4HYPLFJD.js +150 -0
- package/dist/chunk-4XIVMVHC.js +361 -0
- package/dist/{index-yp88he8n.js → chunk-6CTA6MCE.js} +88 -64
- package/dist/chunk-6GEZ6DN5.js +394 -0
- package/dist/chunk-7ZFRVCUE.js +211 -0
- package/dist/chunk-CAG4FULI.js +121 -0
- package/dist/chunk-FF36CQHZ.js +61 -0
- package/dist/{index-h32txmxe.js → chunk-FKQO5A3H.js} +6 -13
- package/dist/{index-nq520y6k.js → chunk-FWRS4CSC.js} +46 -32
- package/dist/chunk-GFZCJ4EH.js +108 -0
- package/dist/chunk-GLM4HGN4.js +55 -0
- package/dist/{index-4cdr7x2x.js → chunk-GU374KWZ.js} +182 -111
- package/dist/chunk-H6JB3PZ3.js +45 -0
- package/dist/chunk-IZX2PLIB.js +1240 -0
- package/dist/chunk-J2TXUFCZ.js +289 -0
- package/dist/chunk-J3WYZO3Q.js +211 -0
- package/dist/{index-xzym9w0m.js → chunk-JA7AIHRK.js} +12 -7
- package/dist/chunk-JHHEXEDM.js +162 -0
- package/dist/chunk-JUEMDWLU.js +233 -0
- package/dist/chunk-KFQGP6VL.js +33 -0
- package/dist/chunk-KIJITUZB.js +419 -0
- package/dist/{index-4wxa8xz4.js → chunk-KQ4A2D2P.js} +162 -23
- package/dist/chunk-KSU2GW22.js +958 -0
- package/dist/{index-rv1p47gp.js → chunk-L5N5PR2S.js} +3015 -2480
- package/dist/{index-h9e2efx4.js → chunk-LNUIGRDZ.js} +71 -55
- package/dist/{index-skhn0agf.js → chunk-MLC5BUYO.js} +19 -20
- package/dist/chunk-MPXUVGT3.js +104 -0
- package/dist/chunk-N6MYZT4O.js +68 -0
- package/dist/chunk-O2AV5WMN.js +48 -0
- package/dist/chunk-PZ4XYZ4J.js +143 -0
- package/dist/chunk-QB5ISE47.js +419 -0
- package/dist/chunk-RSWUFTO2.js +857 -0
- package/dist/chunk-S3XLFZ27.js +1095 -0
- package/dist/{index-w5wccer3.js → chunk-S6GBJ2ZB.js} +28 -12
- package/dist/{index-7pjz3tsy.js → chunk-SGMDTWJJ.js} +57 -15
- package/dist/chunk-SPSPV5BC.js +390 -0
- package/dist/chunk-TCKXSOBP.js +123 -0
- package/dist/chunk-UBGUDMUV.js +59 -0
- package/dist/{index-wt8rz4gn.js → chunk-UQISRW6T.js} +97 -26
- package/dist/chunk-USEINYUL.js +12 -0
- package/dist/{index-bmyt7k8n.js → chunk-UZRUP7QW.js} +12 -4
- package/dist/{index-xhcp6xrn.js → chunk-VBYUTRXX.js} +695 -514
- package/dist/{index-vkpkfwhq.js → chunk-VDAKEOML.js} +234 -194
- package/dist/chunk-WXSWA3MV.js +0 -0
- package/dist/{index-n9f2qyh5.js → chunk-X5FLTRUB.js} +55 -33
- package/dist/{index-h7zxhhhh.js → chunk-XMQ7G77X.js} +46 -38
- package/dist/{index-w7ng765c.js → chunk-YCM7ZYEZ.js} +102 -49
- package/dist/cli/deploy-cli.d.ts +18 -0
- package/dist/cli/deploy-cli.d.ts.map +1 -0
- package/dist/cli/errors.d.ts +6 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/examples.d.ts +23 -0
- package/dist/cli/examples.d.ts.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2426 -6225
- package/dist/client/index.browser.d.ts +29 -0
- package/dist/client/index.browser.d.ts.map +1 -0
- package/dist/client/index.browser.js +64 -0
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +41 -21
- package/dist/client/live.d.ts +67 -0
- package/dist/client/live.d.ts.map +1 -0
- package/dist/client/reactive.d.ts +31 -0
- package/dist/client/reactive.d.ts.map +1 -0
- package/dist/client/sdk.browser.d.ts +104 -0
- package/dist/client/sdk.browser.d.ts.map +1 -0
- package/dist/client/sdk.browser.js +9 -0
- package/dist/client/sdk.d.ts +26 -2
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +9 -0
- package/dist/client/vcs-client.d.ts +129 -0
- package/dist/client/vcs-client.d.ts.map +1 -0
- package/dist/cms/index.js +171 -163
- package/dist/{config-8hczw0rs.js → config-PFTP67TR.js} +8 -9
- package/dist/core/computation/index.d.ts +5 -0
- package/dist/core/computation/index.d.ts.map +1 -0
- package/dist/core/computation/rollup.d.ts +18 -0
- package/dist/core/computation/rollup.d.ts.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +171 -104
- package/dist/core/kernel/boot-middleware.d.ts +10 -0
- package/dist/core/kernel/boot-middleware.d.ts.map +1 -0
- package/dist/core/kernel/logic-middleware.d.ts +7 -1
- package/dist/core/kernel/logic-middleware.d.ts.map +1 -1
- package/dist/core/kernel/trellis-kernel.d.ts.map +1 -1
- package/dist/core/ontology/types.d.ts +5 -0
- package/dist/core/ontology/types.d.ts.map +1 -1
- package/dist/core/persist/better-sqlite-backend.d.ts +9 -2
- package/dist/core/persist/better-sqlite-backend.d.ts.map +1 -1
- package/dist/core/persist/factory.d.ts +6 -7
- package/dist/core/persist/factory.d.ts.map +1 -1
- package/dist/core/persist/factory.js +2 -3
- package/dist/core/persist/sqljs-backend.js +2 -3
- package/dist/db/index.d.ts +4 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +67 -54
- package/dist/db/inspector.js +11 -19
- package/dist/db/trellis.css +1 -1
- package/dist/decisions/index.js +9 -10
- package/dist/deploy-LQ7GUGJ5.js +9 -0
- package/dist/deploy-YNVG5E4E.js +9 -0
- package/dist/deploy-cli-24BCHAXY.js +67 -0
- package/dist/deploy-cli-C35HTITO.js +67 -0
- package/dist/embeddings/auto-embed.d.ts +2 -2
- package/dist/embeddings/auto-embed.d.ts.map +1 -1
- package/dist/embeddings/index.js +20 -22
- package/dist/embeddings/search.d.ts +2 -1
- package/dist/embeddings/search.d.ts.map +1 -1
- package/dist/embeddings/store.d.ts +25 -4
- package/dist/embeddings/store.d.ts.map +1 -1
- package/dist/engine.d.ts +59 -19
- package/dist/engine.d.ts.map +1 -1
- package/dist/import-UZEKXU3B.js +10 -0
- package/dist/index.js +102 -93
- package/dist/launch-explorer-HZ4ZJA4X.js +95 -0
- package/dist/links/index.js +24 -26
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/plugins/agent-memory/index.js +316 -0
- package/dist/plugins/idea-garden/index.js +165 -0
- package/dist/plugins/plan-approval/index.js +579 -0
- package/dist/plugins/proactive-watcher/index.js +194 -0
- package/dist/{index-2r4jxwnb.js → query-XYLTJYSA.js} +14 -15
- package/dist/react/index.js +39 -70
- package/dist/react/realtime.js +11 -0
- package/dist/react/schema-hooks.js +87 -0
- package/dist/realtime/broadcast-channel-transport.d.ts +43 -0
- package/dist/realtime/broadcast-channel-transport.d.ts.map +1 -0
- package/dist/realtime/durable-object-relay-transport.d.ts +96 -0
- package/dist/realtime/durable-object-relay-transport.d.ts.map +1 -0
- package/dist/realtime/index.d.ts +44 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +40 -0
- package/dist/realtime/memory-hub.d.ts +32 -0
- package/dist/realtime/memory-hub.d.ts.map +1 -0
- package/dist/realtime/persistent-channel.d.ts +105 -0
- package/dist/realtime/persistent-channel.d.ts.map +1 -0
- package/dist/realtime/presence.d.ts +73 -0
- package/dist/realtime/presence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.d.ts +37 -0
- package/dist/realtime/relay-persistence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.js +107 -0
- package/dist/realtime/relay-server.d.ts +103 -0
- package/dist/realtime/relay-server.d.ts.map +1 -0
- package/dist/realtime/room.d.ts +98 -0
- package/dist/realtime/room.d.ts.map +1 -0
- package/dist/realtime/text.d.ts +73 -0
- package/dist/realtime/text.d.ts.map +1 -0
- package/dist/realtime/types.d.ts +89 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/websocket-relay-transport.d.ts +28 -0
- package/dist/realtime/websocket-relay-transport.d.ts.map +1 -0
- package/dist/realtime.bundle.js +1100 -0
- package/dist/{remote-manager-xvbg4230.js → remote-manager-ODE3T2KR.js} +25 -15
- package/dist/scaffold/seed.d.ts.map +1 -1
- package/dist/scaffold/write.d.ts +1 -1
- package/dist/scaffold/write.d.ts.map +1 -1
- package/dist/schema/define.d.ts +137 -0
- package/dist/schema/define.d.ts.map +1 -0
- package/dist/schema/entity-projection.d.ts +34 -0
- package/dist/schema/entity-projection.d.ts.map +1 -0
- package/dist/schema/eql.d.ts +46 -0
- package/dist/schema/eql.d.ts.map +1 -0
- package/dist/schema/index.d.ts +21 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +46 -0
- package/dist/schema/kernel-resolve.d.ts +21 -0
- package/dist/schema/kernel-resolve.d.ts.map +1 -0
- package/dist/schema/mutations.d.ts +20 -0
- package/dist/schema/mutations.d.ts.map +1 -0
- package/dist/schema/resolve.d.ts +21 -0
- package/dist/schema/resolve.d.ts.map +1 -0
- package/dist/server/deploy-meta.d.ts +25 -0
- package/dist/server/deploy-meta.d.ts.map +1 -0
- package/dist/server/deploy.d.ts +7 -2
- package/dist/server/deploy.d.ts.map +1 -1
- package/dist/server/index.d.ts +7 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +100 -58
- package/dist/server/node-adapter.js +5 -104
- package/dist/server/realtime.d.ts +14 -3
- package/dist/server/realtime.d.ts.map +1 -1
- package/dist/server/server.d.ts +8 -16
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/sprites.d.ts +18 -1
- package/dist/server/sprites.d.ts.map +1 -1
- package/dist/server/tenancy.d.ts +4 -0
- package/dist/server/tenancy.d.ts.map +1 -1
- package/dist/server/usage-meter.d.ts +53 -0
- package/dist/server/usage-meter.d.ts.map +1 -0
- package/dist/server-MB3OPSPI.js +18 -0
- package/dist/server-ZVWGLLRF.js +18 -0
- package/dist/sprites-KQGTGM6W.js +27 -0
- package/dist/{sprites-vc4qbrp1.js → sprites-RU3E4XQN.js} +6 -7
- package/dist/svelte/index.d.ts +17 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +51 -0
- package/dist/svelte/schema-hooks.d.ts +45 -0
- package/dist/svelte/schema-hooks.d.ts.map +1 -0
- package/dist/svelte/schema-hooks.js +71 -0
- package/dist/svelte/stores.d.ts +78 -0
- package/dist/svelte/stores.d.ts.map +1 -0
- package/dist/sync/http-transport.d.ts +3 -3
- package/dist/sync/http-transport.d.ts.map +1 -1
- package/dist/sync/index.d.ts +15 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +617 -0
- package/dist/sync/memory-room.d.ts +37 -0
- package/dist/sync/memory-room.d.ts.map +1 -0
- package/dist/sync/memory-transport.d.ts +3 -3
- package/dist/sync/memory-transport.d.ts.map +1 -1
- package/dist/sync/partykit-room.d.ts +40 -0
- package/dist/sync/partykit-room.d.ts.map +1 -0
- package/dist/sync/partykit-transport.d.ts +84 -0
- package/dist/sync/partykit-transport.d.ts.map +1 -0
- package/dist/sync/room-core.d.ts +53 -0
- package/dist/sync/room-core.d.ts.map +1 -0
- package/dist/sync/sync-engine.d.ts +40 -2
- package/dist/sync/sync-engine.d.ts.map +1 -1
- package/dist/sync/sync-room-server.d.ts +39 -0
- package/dist/sync/sync-room-server.d.ts.map +1 -0
- package/dist/sync/types.d.ts +70 -3
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/vcs-sync-peer.d.ts +63 -0
- package/dist/sync/vcs-sync-peer.d.ts.map +1 -0
- package/dist/sync/ws-transport.d.ts +2 -2
- package/dist/sync/ws-transport.d.ts.map +1 -1
- package/dist/tenancy-NBLLGCNJ.js +14 -0
- package/dist/tenancy-POMWQP6M.js +16 -0
- package/dist/ui/client.html +355 -67
- package/dist/ui/launch-explorer.d.ts +22 -0
- package/dist/ui/launch-explorer.d.ts.map +1 -0
- package/dist/ui/server.d.ts +1 -1
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/vcs/blob-store.d.ts.map +1 -1
- package/dist/vcs/idb-op-log.d.ts +67 -0
- package/dist/vcs/idb-op-log.d.ts.map +1 -0
- package/dist/vcs/index.d.ts +1 -0
- package/dist/vcs/index.d.ts.map +1 -1
- package/dist/vcs/index.js +81 -72
- package/dist/vcs/issue.d.ts +22 -5
- package/dist/vcs/issue.d.ts.map +1 -1
- package/dist/vcs/lane-materialize.d.ts +5 -0
- package/dist/vcs/lane-materialize.d.ts.map +1 -1
- package/dist/vcs/op-log.d.ts +28 -2
- package/dist/vcs/op-log.d.ts.map +1 -1
- package/dist/vcs/ops.d.ts +10 -0
- package/dist/vcs/ops.d.ts.map +1 -1
- package/dist/vcs/types.d.ts +2 -0
- package/dist/vcs/types.d.ts.map +1 -1
- package/dist/{vm-config-6xhsj6b3.js → vm-config-JI4OXKDQ.js} +9 -10
- package/dist/vue/hooks.d.ts +64 -0
- package/dist/vue/hooks.d.ts.map +1 -0
- package/dist/vue/index.d.ts +19 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +59 -0
- package/dist/vue/schema-hooks.d.ts +41 -0
- package/dist/vue/schema-hooks.d.ts.map +1 -0
- package/dist/vue/schema-hooks.js +64 -0
- package/package.json +130 -17
- package/dist/deploy-999q207z.js +0 -10
- package/dist/engine-y0724kjq.js +0 -8
- package/dist/import-s2b8e0ft.js +0 -11
- package/dist/index-a76rekgs.js +0 -67
- package/dist/index-c9h37r6h.js +0 -1
- package/dist/index-hr9qvv77.js +0 -860
- package/dist/index-k5b0xskw.js +0 -1
- package/dist/index-nzb3am4f.js +0 -80
- package/dist/index-wncptktd.js +0 -292
- package/dist/index-y6a4kj0p.js +0 -43
- package/dist/index-yhwjgfvj.js +0 -342
- package/dist/sdk-bepky0xs.js +0 -16
- package/dist/server-szdjx0nt.js +0 -13
- package/dist/sqlite-backend-0vsmc6qj.js +0 -8
- package/dist/tenancy-pjm32b4v.js +0 -14
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @bun
|
|
2
1
|
// src/core/query/types.ts
|
|
3
2
|
function isVariable(t) {
|
|
4
3
|
return t.kind === "variable";
|
|
@@ -14,13 +13,13 @@ function literal(value) {
|
|
|
14
13
|
}
|
|
15
14
|
|
|
16
15
|
// src/core/query/engine.ts
|
|
17
|
-
|
|
18
|
-
store;
|
|
19
|
-
rules = new Map;
|
|
20
|
-
maxRuleDepth = 32;
|
|
16
|
+
var QueryEngine = class {
|
|
21
17
|
constructor(store) {
|
|
22
18
|
this.store = store;
|
|
23
19
|
}
|
|
20
|
+
rules = /* @__PURE__ */ new Map();
|
|
21
|
+
maxRuleDepth = 32;
|
|
22
|
+
/** Register a Datalog rule. Multiple rules with the same name = union. */
|
|
24
23
|
addRule(rule) {
|
|
25
24
|
const existing = this.rules.get(rule.name) ?? [];
|
|
26
25
|
existing.push(rule);
|
|
@@ -29,9 +28,10 @@ class QueryEngine {
|
|
|
29
28
|
removeRule(name) {
|
|
30
29
|
this.rules.delete(name);
|
|
31
30
|
}
|
|
31
|
+
/** Execute a query against the store. */
|
|
32
32
|
execute(query) {
|
|
33
33
|
const start = performance.now();
|
|
34
|
-
let results = this._evaluatePatterns(query.where, [new Map]);
|
|
34
|
+
let results = this._evaluatePatterns(query.where, [/* @__PURE__ */ new Map()]);
|
|
35
35
|
for (const filter of query.filters) {
|
|
36
36
|
results = results.filter((b) => this._evalFilter(filter, b));
|
|
37
37
|
}
|
|
@@ -41,10 +41,8 @@ class QueryEngine {
|
|
|
41
41
|
if (query.orderBy.length > 0) {
|
|
42
42
|
results = this._order(results, query.orderBy);
|
|
43
43
|
}
|
|
44
|
-
if (query.offset > 0)
|
|
45
|
-
|
|
46
|
-
if (query.limit > 0)
|
|
47
|
-
results = results.slice(0, query.limit);
|
|
44
|
+
if (query.offset > 0) results = results.slice(query.offset);
|
|
45
|
+
if (query.limit > 0) results = results.slice(0, query.limit);
|
|
48
46
|
const projected = this._project(results, query.select);
|
|
49
47
|
return {
|
|
50
48
|
bindings: projected,
|
|
@@ -52,11 +50,13 @@ class QueryEngine {
|
|
|
52
50
|
count: projected.length
|
|
53
51
|
};
|
|
54
52
|
}
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
// Pattern evaluation
|
|
55
|
+
// -------------------------------------------------------------------------
|
|
55
56
|
_evaluatePatterns(patterns, bindings) {
|
|
56
57
|
let current = bindings;
|
|
57
58
|
for (const pattern of patterns) {
|
|
58
|
-
if (current.length === 0)
|
|
59
|
-
break;
|
|
59
|
+
if (current.length === 0) break;
|
|
60
60
|
current = this._evaluatePattern(pattern, current);
|
|
61
61
|
}
|
|
62
62
|
return current;
|
|
@@ -82,18 +82,18 @@ class QueryEngine {
|
|
|
82
82
|
const aResolved = this._resolve(p.attribute, b);
|
|
83
83
|
const vResolved = this._resolve(p.value, b);
|
|
84
84
|
let facts;
|
|
85
|
-
if (eResolved !==
|
|
85
|
+
if (eResolved !== void 0 && aResolved !== void 0) {
|
|
86
86
|
facts = this.store.getFactsByEntity(String(eResolved)).filter((f) => f.a === aResolved);
|
|
87
|
-
} else if (eResolved !==
|
|
87
|
+
} else if (eResolved !== void 0) {
|
|
88
88
|
facts = this.store.getFactsByEntity(String(eResolved));
|
|
89
|
-
} else if (aResolved !==
|
|
89
|
+
} else if (aResolved !== void 0 && vResolved !== void 0) {
|
|
90
90
|
facts = this.store.getFactsByValue(String(aResolved), vResolved);
|
|
91
|
-
} else if (aResolved !==
|
|
91
|
+
} else if (aResolved !== void 0) {
|
|
92
92
|
facts = this.store.getFactsByAttribute(String(aResolved));
|
|
93
93
|
} else {
|
|
94
94
|
facts = this.store.getAllFacts();
|
|
95
95
|
}
|
|
96
|
-
if (vResolved !==
|
|
96
|
+
if (vResolved !== void 0) {
|
|
97
97
|
facts = facts.filter((f) => f.v === vResolved);
|
|
98
98
|
}
|
|
99
99
|
for (const fact of facts) {
|
|
@@ -112,16 +112,19 @@ class QueryEngine {
|
|
|
112
112
|
const attrResolved = this._resolve(p.attribute, b);
|
|
113
113
|
const tgtResolved = this._resolve(p.target, b);
|
|
114
114
|
let links;
|
|
115
|
-
if (srcResolved !==
|
|
116
|
-
links = this.store.getLinksByEntityAndAttribute(
|
|
117
|
-
|
|
115
|
+
if (srcResolved !== void 0 && attrResolved !== void 0) {
|
|
116
|
+
links = this.store.getLinksByEntityAndAttribute(
|
|
117
|
+
String(srcResolved),
|
|
118
|
+
String(attrResolved)
|
|
119
|
+
);
|
|
120
|
+
} else if (srcResolved !== void 0) {
|
|
118
121
|
links = this.store.getLinksByEntity(String(srcResolved));
|
|
119
|
-
} else if (attrResolved !==
|
|
122
|
+
} else if (attrResolved !== void 0) {
|
|
120
123
|
links = this.store.getLinksByAttribute(String(attrResolved));
|
|
121
124
|
} else {
|
|
122
125
|
links = this.store.getAllLinks();
|
|
123
126
|
}
|
|
124
|
-
if (tgtResolved !==
|
|
127
|
+
if (tgtResolved !== void 0) {
|
|
125
128
|
links = links.filter((l) => l.e2 === tgtResolved);
|
|
126
129
|
}
|
|
127
130
|
for (const link of links) {
|
|
@@ -148,34 +151,32 @@ class QueryEngine {
|
|
|
148
151
|
return this._dedup(results);
|
|
149
152
|
}
|
|
150
153
|
_evalRuleApplication(p, bindings, depth = 0) {
|
|
151
|
-
if (depth > this.maxRuleDepth)
|
|
152
|
-
return [];
|
|
154
|
+
if (depth > this.maxRuleDepth) return [];
|
|
153
155
|
const ruleDefs = this.rules.get(p.name);
|
|
154
|
-
if (!ruleDefs)
|
|
155
|
-
return [];
|
|
156
|
+
if (!ruleDefs) return [];
|
|
156
157
|
const results = [];
|
|
157
158
|
for (const b of bindings) {
|
|
158
159
|
for (const rule of ruleDefs) {
|
|
159
160
|
const ruleBindings = new Map(b);
|
|
160
161
|
let ok = true;
|
|
161
|
-
for (let i = 0;i < rule.params.length && i < p.args.length; i++) {
|
|
162
|
+
for (let i = 0; i < rule.params.length && i < p.args.length; i++) {
|
|
162
163
|
const resolved = this._resolve(p.args[i], b);
|
|
163
|
-
if (resolved !==
|
|
164
|
+
if (resolved !== void 0) {
|
|
164
165
|
ruleBindings.set(rule.params[i], resolved);
|
|
165
|
-
} else if (isVariable(p.args[i])) {
|
|
166
|
+
} else if (isVariable(p.args[i])) {
|
|
167
|
+
}
|
|
166
168
|
}
|
|
167
|
-
if (!ok)
|
|
168
|
-
continue;
|
|
169
|
+
if (!ok) continue;
|
|
169
170
|
let bodyResults = this._evaluatePatterns(rule.body, [ruleBindings]);
|
|
170
171
|
for (const f of rule.filters) {
|
|
171
172
|
bodyResults = bodyResults.filter((rb) => this._evalFilter(f, rb));
|
|
172
173
|
}
|
|
173
174
|
for (const rb of bodyResults) {
|
|
174
175
|
const nb = new Map(b);
|
|
175
|
-
for (let i = 0;i < rule.params.length && i < p.args.length; i++) {
|
|
176
|
+
for (let i = 0; i < rule.params.length && i < p.args.length; i++) {
|
|
176
177
|
if (isVariable(p.args[i])) {
|
|
177
178
|
const val = rb.get(rule.params[i]);
|
|
178
|
-
if (val !==
|
|
179
|
+
if (val !== void 0)
|
|
179
180
|
nb.set(p.args[i].name, val);
|
|
180
181
|
}
|
|
181
182
|
}
|
|
@@ -185,11 +186,13 @@ class QueryEngine {
|
|
|
185
186
|
}
|
|
186
187
|
return this._dedup(results);
|
|
187
188
|
}
|
|
189
|
+
// -------------------------------------------------------------------------
|
|
190
|
+
// Filtering
|
|
191
|
+
// -------------------------------------------------------------------------
|
|
188
192
|
_evalFilter(filter, b) {
|
|
189
193
|
const left = this._resolve(filter.left, b);
|
|
190
194
|
const right = this._resolve(filter.right, b);
|
|
191
|
-
if (left ===
|
|
192
|
-
return false;
|
|
195
|
+
if (left === void 0 || right === void 0) return false;
|
|
193
196
|
switch (filter.op) {
|
|
194
197
|
case "=":
|
|
195
198
|
return left === right;
|
|
@@ -215,12 +218,15 @@ class QueryEngine {
|
|
|
215
218
|
return false;
|
|
216
219
|
}
|
|
217
220
|
}
|
|
221
|
+
// -------------------------------------------------------------------------
|
|
222
|
+
// Aggregation
|
|
223
|
+
// -------------------------------------------------------------------------
|
|
218
224
|
_aggregate(bindings, aggregates, groupBy) {
|
|
219
225
|
const aggVarNames = new Set(aggregates.map((a) => a.as));
|
|
220
226
|
const groupVars = groupBy.filter((v) => !aggVarNames.has(v));
|
|
221
|
-
const groups = new Map;
|
|
227
|
+
const groups = /* @__PURE__ */ new Map();
|
|
222
228
|
for (const b of bindings) {
|
|
223
|
-
const key = groupVars.map((v) => String(b.get(v) ?? "")).join("\
|
|
229
|
+
const key = groupVars.map((v) => String(b.get(v) ?? "")).join("\0");
|
|
224
230
|
const group = groups.get(key) ?? [];
|
|
225
231
|
group.push(b);
|
|
226
232
|
groups.set(key, group);
|
|
@@ -229,7 +235,7 @@ class QueryEngine {
|
|
|
229
235
|
for (const [, group] of groups) {
|
|
230
236
|
const nb = new Map(group[0]);
|
|
231
237
|
for (const agg of aggregates) {
|
|
232
|
-
const vals = group.map((b) => b.get(agg.variable)).filter((v) => v !==
|
|
238
|
+
const vals = group.map((b) => b.get(agg.variable)).filter((v) => v !== void 0);
|
|
233
239
|
nb.set(agg.as, this._computeAggregate(agg.op, vals));
|
|
234
240
|
}
|
|
235
241
|
results.push(nb);
|
|
@@ -241,76 +247,94 @@ class QueryEngine {
|
|
|
241
247
|
case "count":
|
|
242
248
|
return vals.length;
|
|
243
249
|
case "sum":
|
|
244
|
-
return vals.reduce(
|
|
250
|
+
return vals.reduce(
|
|
251
|
+
(s, v) => s + (Number(v) || 0),
|
|
252
|
+
0
|
|
253
|
+
);
|
|
245
254
|
case "avg":
|
|
246
|
-
return vals.length ? vals.reduce(
|
|
255
|
+
return vals.length ? vals.reduce(
|
|
256
|
+
(s, v) => s + (Number(v) || 0),
|
|
257
|
+
0
|
|
258
|
+
) / vals.length : 0;
|
|
247
259
|
case "min":
|
|
248
|
-
return vals.reduce(
|
|
260
|
+
return vals.reduce(
|
|
261
|
+
(m, v) => v < m ? v : m,
|
|
262
|
+
vals[0]
|
|
263
|
+
);
|
|
249
264
|
case "max":
|
|
250
|
-
return vals.reduce(
|
|
265
|
+
return vals.reduce(
|
|
266
|
+
(m, v) => v > m ? v : m,
|
|
267
|
+
vals[0]
|
|
268
|
+
);
|
|
251
269
|
case "collect":
|
|
252
270
|
return JSON.stringify(vals);
|
|
253
271
|
default:
|
|
254
272
|
return vals.length;
|
|
255
273
|
}
|
|
256
274
|
}
|
|
275
|
+
// -------------------------------------------------------------------------
|
|
276
|
+
// Ordering
|
|
277
|
+
// -------------------------------------------------------------------------
|
|
257
278
|
_order(bindings, orderBy) {
|
|
258
279
|
return [...bindings].sort((a, b) => {
|
|
259
280
|
for (const o of orderBy) {
|
|
260
281
|
const va = a.get(o.variable);
|
|
261
282
|
const vb = b.get(o.variable);
|
|
262
|
-
if (va === vb)
|
|
263
|
-
|
|
264
|
-
if (
|
|
265
|
-
return 1;
|
|
266
|
-
if (vb === undefined)
|
|
267
|
-
return -1;
|
|
283
|
+
if (va === vb) continue;
|
|
284
|
+
if (va === void 0) return 1;
|
|
285
|
+
if (vb === void 0) return -1;
|
|
268
286
|
const cmp = va < vb ? -1 : 1;
|
|
269
287
|
return o.direction === "asc" ? cmp : -cmp;
|
|
270
288
|
}
|
|
271
289
|
return 0;
|
|
272
290
|
});
|
|
273
291
|
}
|
|
292
|
+
// -------------------------------------------------------------------------
|
|
293
|
+
// Projection
|
|
294
|
+
// -------------------------------------------------------------------------
|
|
274
295
|
_project(bindings, select) {
|
|
275
296
|
return bindings.map((b) => {
|
|
276
297
|
const row = {};
|
|
277
298
|
if (select.length === 0) {
|
|
278
|
-
for (const [k, v] of b)
|
|
279
|
-
row[k] = v;
|
|
299
|
+
for (const [k, v] of b) row[k] = v;
|
|
280
300
|
} else {
|
|
281
301
|
for (const s of select) {
|
|
282
302
|
const v = b.get(s);
|
|
283
|
-
if (v !==
|
|
284
|
-
row[s] = v;
|
|
303
|
+
if (v !== void 0) row[s] = v;
|
|
285
304
|
}
|
|
286
305
|
}
|
|
287
306
|
return row;
|
|
288
307
|
});
|
|
289
308
|
}
|
|
309
|
+
// -------------------------------------------------------------------------
|
|
310
|
+
// Helpers
|
|
311
|
+
// -------------------------------------------------------------------------
|
|
290
312
|
_resolve(term, bindings) {
|
|
291
|
-
if (isLiteral(term))
|
|
292
|
-
return term.value;
|
|
313
|
+
if (isLiteral(term)) return term.value;
|
|
293
314
|
return bindings.get(term.name);
|
|
294
315
|
}
|
|
295
316
|
_bind(term, value, bindings) {
|
|
296
|
-
if (isLiteral(term))
|
|
297
|
-
return term.value === value;
|
|
317
|
+
if (isLiteral(term)) return term.value === value;
|
|
298
318
|
const existing = bindings.get(term.name);
|
|
299
|
-
if (existing !==
|
|
300
|
-
return existing === value;
|
|
319
|
+
if (existing !== void 0) return existing === value;
|
|
301
320
|
bindings.set(term.name, value);
|
|
302
321
|
return true;
|
|
303
322
|
}
|
|
304
323
|
_dedup(bindings) {
|
|
305
|
-
const seen = new Set;
|
|
324
|
+
const seen = /* @__PURE__ */ new Set();
|
|
306
325
|
return bindings.filter((b) => {
|
|
307
|
-
const key = [...b.entries()].sort(([a], [b2]) => a.localeCompare(b2)).map(([k, v]) => `${k}=${v}`).join("\
|
|
308
|
-
if (seen.has(key))
|
|
309
|
-
return false;
|
|
326
|
+
const key = [...b.entries()].sort(([a], [b2]) => a.localeCompare(b2)).map(([k, v]) => `${k}=${v}`).join("\0");
|
|
327
|
+
if (seen.has(key)) return false;
|
|
310
328
|
seen.add(key);
|
|
311
329
|
return true;
|
|
312
330
|
});
|
|
313
331
|
}
|
|
314
|
-
}
|
|
332
|
+
};
|
|
315
333
|
|
|
316
|
-
export {
|
|
334
|
+
export {
|
|
335
|
+
isVariable,
|
|
336
|
+
isLiteral,
|
|
337
|
+
variable,
|
|
338
|
+
literal,
|
|
339
|
+
QueryEngine
|
|
340
|
+
};
|