@noorm/broccolidb 2.0.1
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/LICENSE +21 -0
- package/README.md +219 -0
- package/dist/TokenCompressionService.d.ts +59 -0
- package/dist/TokenCompressionService.d.ts.map +1 -0
- package/dist/TokenCompressionService.js +179 -0
- package/dist/TokenCompressionService.js.map +1 -0
- package/dist/broccolidb-aggregation.d.ts +14 -0
- package/dist/broccolidb-aggregation.d.ts.map +1 -0
- package/dist/broccolidb-aggregation.js +158 -0
- package/dist/broccolidb-aggregation.js.map +1 -0
- package/dist/broccolidb-cas.d.ts +56 -0
- package/dist/broccolidb-cas.d.ts.map +1 -0
- package/dist/broccolidb-cas.js +285 -0
- package/dist/broccolidb-cas.js.map +1 -0
- package/dist/broccolidb-kernel.d.ts +63 -0
- package/dist/broccolidb-kernel.d.ts.map +1 -0
- package/dist/broccolidb-kernel.js +287 -0
- package/dist/broccolidb-kernel.js.map +1 -0
- package/dist/broccolidb-mutex.d.ts +37 -0
- package/dist/broccolidb-mutex.d.ts.map +1 -0
- package/dist/broccolidb-mutex.js +121 -0
- package/dist/broccolidb-mutex.js.map +1 -0
- package/dist/broccolidb-natural-query.d.ts +13 -0
- package/dist/broccolidb-natural-query.d.ts.map +1 -0
- package/dist/broccolidb-natural-query.js +188 -0
- package/dist/broccolidb-natural-query.js.map +1 -0
- package/dist/broccolidb-table.d.ts +62 -0
- package/dist/broccolidb-table.d.ts.map +1 -0
- package/dist/broccolidb-table.js +893 -0
- package/dist/broccolidb-table.js.map +1 -0
- package/dist/broccolidb-wal.d.ts +49 -0
- package/dist/broccolidb-wal.d.ts.map +1 -0
- package/dist/broccolidb-wal.js +168 -0
- package/dist/broccolidb-wal.js.map +1 -0
- package/dist/broccolidb.contracts.d.ts +232 -0
- package/dist/broccolidb.contracts.d.ts.map +1 -0
- package/dist/broccolidb.contracts.js +7 -0
- package/dist/broccolidb.contracts.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/docs/API.md +208 -0
- package/docs/ARCHITECTURE.md +160 -0
- package/docs/BRIEF.md +56 -0
- package/docs/CONTRIBUTING.md +82 -0
- package/docs/GLOSSARY.md +23 -0
- package/docs/OPERATIONS.md +176 -0
- package/docs/PHILOSOPHY.md +91 -0
- package/docs/README.md +116 -0
- package/docs/RELEASE_NOTES.md +34 -0
- package/docs/TROUBLESHOOTING.md +145 -0
- package/docs/adr/ADR-001-portable-inmemory-kernel.md +74 -0
- package/docs/adr/README.md +38 -0
- package/docs/adr/TEMPLATE.md +35 -0
- package/package.json +43 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GALXAI: BroccoliDB Deterministic Natural Language Query Parser (Zenith Tier)
|
|
3
|
+
* Converts conversational, human-friendly natural search expressions into structured
|
|
4
|
+
* DbQueryOptions without any external LLM roundtrips (< 0.1 ms offline AST parsing).
|
|
5
|
+
*/
|
|
6
|
+
export class BroccoliNaturalQueryParser {
|
|
7
|
+
/**
|
|
8
|
+
* Parses a natural language query string into structured DbQueryOptions and table metadata.
|
|
9
|
+
*/
|
|
10
|
+
static parse(rawText, defaultTable = "default") {
|
|
11
|
+
const text = rawText.trim();
|
|
12
|
+
const where = {};
|
|
13
|
+
const tokensMatched = [];
|
|
14
|
+
let sortBy;
|
|
15
|
+
let sortOrder = "asc";
|
|
16
|
+
let limit;
|
|
17
|
+
let offset;
|
|
18
|
+
let targetTable = defaultTable;
|
|
19
|
+
// 1. Table Detection (e.g., "in audits table", "from shards", "table:sessions")
|
|
20
|
+
const tableMatch = text.match(/(?:in|from|table:)\s+([a-zA-Z0-9_\-]+)(?:\s+table)?/i);
|
|
21
|
+
if (tableMatch) {
|
|
22
|
+
targetTable = tableMatch[1].toLowerCase();
|
|
23
|
+
tokensMatched.push(tableMatch[0]);
|
|
24
|
+
}
|
|
25
|
+
// 2. Limit & Offset (e.g. "limit 10", "top 5", "first 20", "offset 5", "skip 10")
|
|
26
|
+
const limitMatch = text.match(/(?:limit|top|first|max)\s+(\d+)/i);
|
|
27
|
+
if (limitMatch) {
|
|
28
|
+
limit = parseInt(limitMatch[1], 10);
|
|
29
|
+
tokensMatched.push(limitMatch[0]);
|
|
30
|
+
}
|
|
31
|
+
const offsetMatch = text.match(/(?:offset|skip)\s+(\d+)/i);
|
|
32
|
+
if (offsetMatch) {
|
|
33
|
+
offset = parseInt(offsetMatch[1], 10);
|
|
34
|
+
tokensMatched.push(offsetMatch[0]);
|
|
35
|
+
}
|
|
36
|
+
// 3. Sorting (e.g. "sorted by timestamp desc", "order by priority", "latest first", "oldest first")
|
|
37
|
+
if (/latest(?:\s+first)?/i.test(text)) {
|
|
38
|
+
sortBy = "createdAt";
|
|
39
|
+
sortOrder = "desc";
|
|
40
|
+
tokensMatched.push("latest");
|
|
41
|
+
}
|
|
42
|
+
else if (/oldest(?:\s+first)?/i.test(text)) {
|
|
43
|
+
sortBy = "createdAt";
|
|
44
|
+
sortOrder = "asc";
|
|
45
|
+
tokensMatched.push("oldest");
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const sortMatch = text.match(/(?:sort|sorted|order|ordered)\s+by\s+([a-zA-Z0-9_\-]+)(?:\s+(asc|desc|ascending|descending))?/i);
|
|
49
|
+
if (sortMatch) {
|
|
50
|
+
sortBy = sortMatch[1];
|
|
51
|
+
if (sortMatch[2]) {
|
|
52
|
+
sortOrder = sortMatch[2].toLowerCase().startsWith("desc") ? "desc" : "asc";
|
|
53
|
+
}
|
|
54
|
+
tokensMatched.push(sortMatch[0]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// 4. Comparison Operators & Between (e.g. "score between 10 and 20", "tokens > 3000", "latency <= 100")
|
|
58
|
+
const betweenRegex = /([a-zA-Z0-9_\-]+)\s+between\s+(-?\d+(?:\.\d+)?)\s+and\s+(-?\d+(?:\.\d+)?)/gi;
|
|
59
|
+
let bMatch;
|
|
60
|
+
while ((bMatch = betweenRegex.exec(text)) !== null) {
|
|
61
|
+
const field = bMatch[1];
|
|
62
|
+
const min = parseFloat(bMatch[2]);
|
|
63
|
+
const max = parseFloat(bMatch[3]);
|
|
64
|
+
where[field] = { $between: [min, max] };
|
|
65
|
+
tokensMatched.push(bMatch[0]);
|
|
66
|
+
}
|
|
67
|
+
const compRegex = /([a-zA-Z0-9_\-]+)\s*(>=|<=|>|<|!=|=)\s*['"]?([^'"\s,]+)['"]?/g;
|
|
68
|
+
let cMatch;
|
|
69
|
+
while ((cMatch = compRegex.exec(text)) !== null) {
|
|
70
|
+
const field = cMatch[1];
|
|
71
|
+
const op = cMatch[2];
|
|
72
|
+
const rawVal = cMatch[3];
|
|
73
|
+
let val = rawVal;
|
|
74
|
+
const lower = rawVal.toLowerCase();
|
|
75
|
+
if (lower === 'true') {
|
|
76
|
+
val = true;
|
|
77
|
+
}
|
|
78
|
+
else if (lower === 'false') {
|
|
79
|
+
val = false;
|
|
80
|
+
}
|
|
81
|
+
else if (lower === 'null') {
|
|
82
|
+
val = null;
|
|
83
|
+
}
|
|
84
|
+
else if (!Number.isNaN(Number(rawVal)) && rawVal.trim() !== '') {
|
|
85
|
+
val = Number(rawVal);
|
|
86
|
+
}
|
|
87
|
+
const existingFilter = (typeof where[field] === "object" && where[field] !== null)
|
|
88
|
+
? where[field]
|
|
89
|
+
: {};
|
|
90
|
+
let updatedFilter;
|
|
91
|
+
switch (op) {
|
|
92
|
+
case ">=":
|
|
93
|
+
updatedFilter = { ...existingFilter, $gte: val };
|
|
94
|
+
break;
|
|
95
|
+
case "<=":
|
|
96
|
+
updatedFilter = { ...existingFilter, $lte: val };
|
|
97
|
+
break;
|
|
98
|
+
case ">":
|
|
99
|
+
updatedFilter = { ...existingFilter, $gt: val };
|
|
100
|
+
break;
|
|
101
|
+
case "<":
|
|
102
|
+
updatedFilter = { ...existingFilter, $lt: val };
|
|
103
|
+
break;
|
|
104
|
+
case "!=":
|
|
105
|
+
updatedFilter = { ...existingFilter, $ne: val };
|
|
106
|
+
break;
|
|
107
|
+
case "=":
|
|
108
|
+
default:
|
|
109
|
+
updatedFilter = { ...existingFilter, $eq: val };
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
where[field] = updatedFilter;
|
|
113
|
+
tokensMatched.push(cMatch[0]);
|
|
114
|
+
}
|
|
115
|
+
// 5. In / Or List (e.g. "status in [healthy, paused]", "profile is hipaa or gdpr")
|
|
116
|
+
const inListRegex = /([a-zA-Z0-9_\-]+)\s+(?:in\s*\[([a-zA-Z0-9_,\s\-]+)\]|(?:is|are)\s+([a-zA-Z0-9_\-]+)\s+or\s+([a-zA-Z0-9_\-]+))/gi;
|
|
117
|
+
let inMatch;
|
|
118
|
+
while ((inMatch = inListRegex.exec(text)) !== null) {
|
|
119
|
+
const field = inMatch[1];
|
|
120
|
+
let items;
|
|
121
|
+
if (inMatch[2]) {
|
|
122
|
+
items = inMatch[2].split(",").map((s) => s.trim());
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
items = [inMatch[3].trim(), inMatch[4].trim()];
|
|
126
|
+
}
|
|
127
|
+
where[field] = { $in: items };
|
|
128
|
+
tokensMatched.push(inMatch[0]);
|
|
129
|
+
}
|
|
130
|
+
// 6. StartsWith / Prefix (e.g. "userId starts with user_prod", "shardId starting with gpt")
|
|
131
|
+
const startRegex = /([a-zA-Z0-9_\-]+)\s+(?:starts?\s+with|starting\s+with)\s+['"]?([a-zA-Z0-9_\-]+)['"]?/gi;
|
|
132
|
+
let sMatch;
|
|
133
|
+
while ((sMatch = startRegex.exec(text)) !== null) {
|
|
134
|
+
const field = sMatch[1];
|
|
135
|
+
const prefix = sMatch[2];
|
|
136
|
+
where[field] = { $startsWith: prefix };
|
|
137
|
+
tokensMatched.push(sMatch[0]);
|
|
138
|
+
}
|
|
139
|
+
// 7. Contains / Text Search (e.g. "action contains EXFILTRATION", "metadata contains error")
|
|
140
|
+
const containRegex = /([a-zA-Z0-9_\-]+)\s+(?:contains?|containing)\s+['"]?([a-zA-Z0-9_\-]+)['"]?/gi;
|
|
141
|
+
let ctMatch;
|
|
142
|
+
while ((ctMatch = containRegex.exec(text)) !== null) {
|
|
143
|
+
const field = ctMatch[1];
|
|
144
|
+
const substring = ctMatch[2];
|
|
145
|
+
where[field] = { $contains: substring };
|
|
146
|
+
tokensMatched.push(ctMatch[0]);
|
|
147
|
+
}
|
|
148
|
+
// 8. Equality (e.g. "status is healthy", "with action INFERENCE", "region:us")
|
|
149
|
+
const eqRegex = /(?:\bwhere\s+|\bwith\s+|\b)([a-zA-Z0-9_\-]+)\s*(?::|\s+is\s+|=)\s*['"]?([^'"\s,]+)['"]?/gi;
|
|
150
|
+
let eMatch;
|
|
151
|
+
while ((eMatch = eqRegex.exec(text)) !== null) {
|
|
152
|
+
const field = eMatch[1];
|
|
153
|
+
const rawVal = eMatch[2];
|
|
154
|
+
const reserved = ["table", "limit", "offset", "sort", "sorted", "order", "ordered", "by", "asc", "desc", "and", "or", "not", "where", "with", "in", "from", "select"];
|
|
155
|
+
if (!reserved.includes(field.toLowerCase()) && !(field in where)) {
|
|
156
|
+
let parsedVal = rawVal;
|
|
157
|
+
const lower = rawVal.toLowerCase();
|
|
158
|
+
if (lower === 'true')
|
|
159
|
+
parsedVal = true;
|
|
160
|
+
else if (lower === 'false')
|
|
161
|
+
parsedVal = false;
|
|
162
|
+
else if (lower === 'null')
|
|
163
|
+
parsedVal = null;
|
|
164
|
+
else if (!Number.isNaN(Number(rawVal)) && rawVal.trim() !== '')
|
|
165
|
+
parsedVal = Number(rawVal);
|
|
166
|
+
where[field] = { $eq: parsedVal };
|
|
167
|
+
tokensMatched.push(eMatch[0]);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const queryOptions = {
|
|
171
|
+
where: Object.keys(where).length > 0 ? where : undefined,
|
|
172
|
+
sortBy,
|
|
173
|
+
sortOrder: sortBy ? sortOrder : undefined,
|
|
174
|
+
limit,
|
|
175
|
+
offset,
|
|
176
|
+
};
|
|
177
|
+
const matchedChars = tokensMatched.reduce((acc, t) => acc + t.length, 0);
|
|
178
|
+
const confidence = Math.min(1.0, Math.max(0.2, (matchedChars / Math.max(1, text.length)) * 1.2));
|
|
179
|
+
return {
|
|
180
|
+
rawText: text,
|
|
181
|
+
targetTable,
|
|
182
|
+
queryOptions,
|
|
183
|
+
confidence: Math.round(confidence * 100) / 100,
|
|
184
|
+
tokensMatched,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=broccolidb-natural-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broccolidb-natural-query.js","sourceRoot":"","sources":["../src/broccolidb-natural-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GALXAI: BroccoliDB Generic Reactive In-Memory Table (Zenith Tier)
|
|
3
|
+
* Delivers sub-microsecond (<0.5 µs) hotpath lookups, multi-modal secondary indexing,
|
|
4
|
+
* rich operator filtering, aggregation pipeline, reactive CDC subscriptions, and TTL expiration.
|
|
5
|
+
*/
|
|
6
|
+
import type { DbAggregateQuery, DbAggregateResult, DbPutOptions, DbQueryOptions, DbWhereValue, IDbTable, IFluentQueryBuilder, ITableTransaction, QueryExecutionPlan, TableChangeCallback, TableChangeSubscription, WalOperationType } from "./broccolidb.contracts.js";
|
|
7
|
+
export type WalHookFn = (op: WalOperationType, table: string, recordId: string, payload?: Record<string, unknown>) => void;
|
|
8
|
+
export declare class BroccoliDbTable<T extends Record<string, any> = Record<string, any>> implements IDbTable<T> {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
private readonly records;
|
|
11
|
+
private readonly walHook?;
|
|
12
|
+
private readonly equalityIndices;
|
|
13
|
+
private readonly sortedIndices;
|
|
14
|
+
private readonly compositeIndices;
|
|
15
|
+
private readonly prefixIndices;
|
|
16
|
+
private readonly subscriptions;
|
|
17
|
+
private subscriptionSeq;
|
|
18
|
+
private readonly ttlTimers;
|
|
19
|
+
constructor(name: string, walHook?: WalHookFn);
|
|
20
|
+
createIndex(field: keyof T & string): void;
|
|
21
|
+
createSortedIndex(field: keyof T & string): void;
|
|
22
|
+
createCompositeIndex(fields: readonly (keyof T & string)[]): void;
|
|
23
|
+
createPrefixIndex(field: keyof T & string): void;
|
|
24
|
+
get(id: string): T | undefined;
|
|
25
|
+
getAll(): readonly T[];
|
|
26
|
+
put(id: string, record: T, options?: DbPutOptions): T;
|
|
27
|
+
putMany(entries: ReadonlyArray<{
|
|
28
|
+
id: string;
|
|
29
|
+
record: T;
|
|
30
|
+
options?: DbPutOptions;
|
|
31
|
+
}>): readonly T[];
|
|
32
|
+
compareAndSwap(id: string, predicate: (current: T | undefined) => boolean, updater: (current: T) => T, options?: DbPutOptions): {
|
|
33
|
+
success: boolean;
|
|
34
|
+
record?: T;
|
|
35
|
+
};
|
|
36
|
+
delete(id: string): boolean;
|
|
37
|
+
deleteWhere(where: Record<string, DbWhereValue>): number;
|
|
38
|
+
updateWhere(where: Record<string, DbWhereValue>, updater: (record: T) => T): number;
|
|
39
|
+
count(): number;
|
|
40
|
+
clear(): void;
|
|
41
|
+
query(options?: DbQueryOptions): readonly T[];
|
|
42
|
+
aggregate(query: DbAggregateQuery): DbAggregateResult;
|
|
43
|
+
subscribe(callback: TableChangeCallback<T>, filter?: (record: T) => boolean): TableChangeSubscription;
|
|
44
|
+
transaction<R>(fn: (tx: ITableTransaction<T>) => R): R;
|
|
45
|
+
select(): IFluentQueryBuilder<T>;
|
|
46
|
+
explain(options?: DbQueryOptions): QueryExecutionPlan;
|
|
47
|
+
createSnapshot(): Map<string, T>;
|
|
48
|
+
restoreSnapshot(snapshot: Map<string, T>): void;
|
|
49
|
+
private putInternal;
|
|
50
|
+
private deleteInternal;
|
|
51
|
+
private planQuery;
|
|
52
|
+
private evaluateWhere;
|
|
53
|
+
private resolveFieldValue;
|
|
54
|
+
private normalizeSortableValue;
|
|
55
|
+
private insertSortedIndexEntry;
|
|
56
|
+
private buildCompositeKey;
|
|
57
|
+
private insertPrefixIndex;
|
|
58
|
+
private addIndicesForRecord;
|
|
59
|
+
private removeIndicesForRecord;
|
|
60
|
+
private emitChangeEvent;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=broccolidb-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broccolidb-table.d.ts","sourceRoot":"","sources":["../src/broccolidb-table.ts"],"names":[],"mappings":"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"}
|