@brightchain/db 0.20.0

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.
Files changed (56) hide show
  1. package/README.md +81 -0
  2. package/package.json +18 -0
  3. package/src/__tests__/helpers/mockBlockStore.d.ts +113 -0
  4. package/src/__tests__/helpers/mockBlockStore.js +380 -0
  5. package/src/__tests__/helpers/mockBlockStore.js.map +1 -0
  6. package/src/index.d.ts +31 -0
  7. package/src/index.js +78 -0
  8. package/src/index.js.map +1 -0
  9. package/src/lib/aggregation.d.ts +18 -0
  10. package/src/lib/aggregation.js +407 -0
  11. package/src/lib/aggregation.js.map +1 -0
  12. package/src/lib/cblIndex.d.ts +268 -0
  13. package/src/lib/cblIndex.js +856 -0
  14. package/src/lib/cblIndex.js.map +1 -0
  15. package/src/lib/collection.d.ts +305 -0
  16. package/src/lib/collection.js +991 -0
  17. package/src/lib/collection.js.map +1 -0
  18. package/src/lib/cursor.d.ts +8 -0
  19. package/src/lib/cursor.js +13 -0
  20. package/src/lib/cursor.js.map +1 -0
  21. package/src/lib/database.d.ts +158 -0
  22. package/src/lib/database.js +332 -0
  23. package/src/lib/database.js.map +1 -0
  24. package/src/lib/errors.d.ts +85 -0
  25. package/src/lib/errors.js +103 -0
  26. package/src/lib/errors.js.map +1 -0
  27. package/src/lib/expressMiddleware.d.ts +57 -0
  28. package/src/lib/expressMiddleware.js +488 -0
  29. package/src/lib/expressMiddleware.js.map +1 -0
  30. package/src/lib/headRegistry.d.ts +60 -0
  31. package/src/lib/headRegistry.js +216 -0
  32. package/src/lib/headRegistry.js.map +1 -0
  33. package/src/lib/indexing.d.ts +7 -0
  34. package/src/lib/indexing.js +14 -0
  35. package/src/lib/indexing.js.map +1 -0
  36. package/src/lib/model.d.ts +162 -0
  37. package/src/lib/model.js +260 -0
  38. package/src/lib/model.js.map +1 -0
  39. package/src/lib/pooledStoreAdapter.d.ts +44 -0
  40. package/src/lib/pooledStoreAdapter.js +109 -0
  41. package/src/lib/pooledStoreAdapter.js.map +1 -0
  42. package/src/lib/queryEngine.d.ts +48 -0
  43. package/src/lib/queryEngine.js +461 -0
  44. package/src/lib/queryEngine.js.map +1 -0
  45. package/src/lib/schemaValidation.d.ts +80 -0
  46. package/src/lib/schemaValidation.js +353 -0
  47. package/src/lib/schemaValidation.js.map +1 -0
  48. package/src/lib/transaction.d.ts +7 -0
  49. package/src/lib/transaction.js +12 -0
  50. package/src/lib/transaction.js.map +1 -0
  51. package/src/lib/types.d.ts +360 -0
  52. package/src/lib/types.js +6 -0
  53. package/src/lib/types.js.map +1 -0
  54. package/src/lib/updateEngine.d.ts +7 -0
  55. package/src/lib/updateEngine.js +13 -0
  56. package/src/lib/updateEngine.js.map +1 -0
package/src/index.js ADDED
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * @brightchain/db
4
+ *
5
+ * A MongoDB-like document database backed by BrightChain's block store.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.validateDocument = exports.applyDefaults = exports.WriteConcernError = exports.ValidationError = exports.TransactionError = exports.IndexError = exports.DocumentNotFoundError = exports.BulkWriteError = exports.BrightChainDbError = exports.createDbRouter = exports.DbSession = exports.IndexManager = exports.DuplicateKeyError = exports.CollectionIndex = exports.runAggregation = exports.isOperatorUpdate = exports.applyUpdate = exports.tokenize = exports.sortDocuments = exports.setTextSearchFields = exports.matchesFilter = exports.getTextSearchFields = exports.deepEquals = exports.compareValues = exports.applyProjection = exports.Cursor = exports.TypedCursor = exports.Model = exports.CBLIndex = exports.createDefaultUuidGenerator = exports.InMemoryDatabase = exports.PooledStoreAdapter = exports.PersistentHeadRegistry = exports.InMemoryHeadRegistry = exports.BrightChainDb = exports.calculateBlockId = exports.HeadRegistry = exports.Collection = void 0;
9
+ // Database & Collection
10
+ var collection_1 = require("./lib/collection");
11
+ Object.defineProperty(exports, "Collection", { enumerable: true, get: function () { return collection_1.Collection; } });
12
+ Object.defineProperty(exports, "HeadRegistry", { enumerable: true, get: function () { return collection_1.HeadRegistry; } });
13
+ Object.defineProperty(exports, "calculateBlockId", { enumerable: true, get: function () { return collection_1.calculateBlockId; } });
14
+ var database_1 = require("./lib/database");
15
+ Object.defineProperty(exports, "BrightChainDb", { enumerable: true, get: function () { return database_1.BrightChainDb; } });
16
+ // Head registries
17
+ var headRegistry_1 = require("./lib/headRegistry");
18
+ Object.defineProperty(exports, "InMemoryHeadRegistry", { enumerable: true, get: function () { return headRegistry_1.InMemoryHeadRegistry; } });
19
+ Object.defineProperty(exports, "PersistentHeadRegistry", { enumerable: true, get: function () { return headRegistry_1.PersistentHeadRegistry; } });
20
+ // Pooled store adapter
21
+ var pooledStoreAdapter_1 = require("./lib/pooledStoreAdapter");
22
+ Object.defineProperty(exports, "PooledStoreAdapter", { enumerable: true, get: function () { return pooledStoreAdapter_1.PooledStoreAdapter; } });
23
+ // Re-exports from brightchain-lib for backward compatibility
24
+ var brightchain_lib_1 = require("@brightchain/brightchain-lib");
25
+ Object.defineProperty(exports, "InMemoryDatabase", { enumerable: true, get: function () { return brightchain_lib_1.InMemoryDatabase; } });
26
+ Object.defineProperty(exports, "createDefaultUuidGenerator", { enumerable: true, get: function () { return brightchain_lib_1.createDefaultUuidGenerator; } });
27
+ // CBL Index
28
+ var cblIndex_1 = require("./lib/cblIndex");
29
+ Object.defineProperty(exports, "CBLIndex", { enumerable: true, get: function () { return cblIndex_1.CBLIndex; } });
30
+ // Model
31
+ var model_1 = require("./lib/model");
32
+ Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return model_1.Model; } });
33
+ Object.defineProperty(exports, "TypedCursor", { enumerable: true, get: function () { return model_1.TypedCursor; } });
34
+ // Cursor
35
+ var cursor_1 = require("./lib/cursor");
36
+ Object.defineProperty(exports, "Cursor", { enumerable: true, get: function () { return cursor_1.Cursor; } });
37
+ // Query engine
38
+ var queryEngine_1 = require("./lib/queryEngine");
39
+ Object.defineProperty(exports, "applyProjection", { enumerable: true, get: function () { return queryEngine_1.applyProjection; } });
40
+ Object.defineProperty(exports, "compareValues", { enumerable: true, get: function () { return queryEngine_1.compareValues; } });
41
+ Object.defineProperty(exports, "deepEquals", { enumerable: true, get: function () { return queryEngine_1.deepEquals; } });
42
+ Object.defineProperty(exports, "getTextSearchFields", { enumerable: true, get: function () { return queryEngine_1.getTextSearchFields; } });
43
+ Object.defineProperty(exports, "matchesFilter", { enumerable: true, get: function () { return queryEngine_1.matchesFilter; } });
44
+ Object.defineProperty(exports, "setTextSearchFields", { enumerable: true, get: function () { return queryEngine_1.setTextSearchFields; } });
45
+ Object.defineProperty(exports, "sortDocuments", { enumerable: true, get: function () { return queryEngine_1.sortDocuments; } });
46
+ Object.defineProperty(exports, "tokenize", { enumerable: true, get: function () { return queryEngine_1.tokenize; } });
47
+ // Update engine
48
+ var updateEngine_1 = require("./lib/updateEngine");
49
+ Object.defineProperty(exports, "applyUpdate", { enumerable: true, get: function () { return updateEngine_1.applyUpdate; } });
50
+ Object.defineProperty(exports, "isOperatorUpdate", { enumerable: true, get: function () { return updateEngine_1.isOperatorUpdate; } });
51
+ // Aggregation
52
+ var aggregation_1 = require("./lib/aggregation");
53
+ Object.defineProperty(exports, "runAggregation", { enumerable: true, get: function () { return aggregation_1.runAggregation; } });
54
+ // Indexing
55
+ var indexing_1 = require("./lib/indexing");
56
+ Object.defineProperty(exports, "CollectionIndex", { enumerable: true, get: function () { return indexing_1.CollectionIndex; } });
57
+ Object.defineProperty(exports, "DuplicateKeyError", { enumerable: true, get: function () { return indexing_1.DuplicateKeyError; } });
58
+ Object.defineProperty(exports, "IndexManager", { enumerable: true, get: function () { return indexing_1.IndexManager; } });
59
+ // Transactions
60
+ var transaction_1 = require("./lib/transaction");
61
+ Object.defineProperty(exports, "DbSession", { enumerable: true, get: function () { return transaction_1.DbSession; } });
62
+ // Express middleware
63
+ var expressMiddleware_1 = require("./lib/expressMiddleware");
64
+ Object.defineProperty(exports, "createDbRouter", { enumerable: true, get: function () { return expressMiddleware_1.createDbRouter; } });
65
+ // Errors
66
+ var errors_1 = require("./lib/errors");
67
+ Object.defineProperty(exports, "BrightChainDbError", { enumerable: true, get: function () { return errors_1.BrightChainDbError; } });
68
+ Object.defineProperty(exports, "BulkWriteError", { enumerable: true, get: function () { return errors_1.BulkWriteError; } });
69
+ Object.defineProperty(exports, "DocumentNotFoundError", { enumerable: true, get: function () { return errors_1.DocumentNotFoundError; } });
70
+ Object.defineProperty(exports, "IndexError", { enumerable: true, get: function () { return errors_1.IndexError; } });
71
+ Object.defineProperty(exports, "TransactionError", { enumerable: true, get: function () { return errors_1.TransactionError; } });
72
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
73
+ Object.defineProperty(exports, "WriteConcernError", { enumerable: true, get: function () { return errors_1.WriteConcernError; } });
74
+ // Schema validation
75
+ var schemaValidation_1 = require("./lib/schemaValidation");
76
+ Object.defineProperty(exports, "applyDefaults", { enumerable: true, get: function () { return schemaValidation_1.applyDefaults; } });
77
+ Object.defineProperty(exports, "validateDocument", { enumerable: true, get: function () { return schemaValidation_1.validateDocument; } });
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../brightchain-db/src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAsCH,wBAAwB;AACxB,+CAA8E;AAArE,wGAAA,UAAU,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AAKnD,2CAA+C;AAAtC,yGAAA,aAAa,OAAA;AAGtB,kBAAkB;AAClB,mDAG4B;AAF1B,oHAAA,oBAAoB,OAAA;AACpB,sHAAA,sBAAsB,OAAA;AAIxB,uBAAuB;AACvB,+DAA8D;AAArD,wHAAA,kBAAkB,OAAA;AAE3B,6DAA6D;AAC7D,gEAGsC;AAFpC,mHAAA,gBAAgB,OAAA;AAChB,6HAAA,0BAA0B,OAAA;AAG5B,YAAY;AACZ,2CAA0C;AAAjC,oGAAA,QAAQ,OAAA;AAGjB,QAAQ;AACR,qCAAiD;AAAxC,8FAAA,KAAK,OAAA;AAAE,oGAAA,WAAW,OAAA;AAG3B,SAAS;AACT,uCAAsC;AAA7B,gGAAA,MAAM,OAAA;AAEf,eAAe;AACf,iDAS2B;AARzB,8GAAA,eAAe,OAAA;AACf,4GAAA,aAAa,OAAA;AACb,yGAAA,UAAU,OAAA;AACV,kHAAA,mBAAmB,OAAA;AACnB,4GAAA,aAAa,OAAA;AACb,kHAAA,mBAAmB,OAAA;AACnB,4GAAA,aAAa,OAAA;AACb,uGAAA,QAAQ,OAAA;AAGV,gBAAgB;AAChB,mDAAmE;AAA1D,2GAAA,WAAW,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAEtC,cAAc;AACd,iDAAmD;AAA1C,6GAAA,cAAc,OAAA;AAEvB,WAAW;AACX,2CAIwB;AAHtB,2GAAA,eAAe,OAAA;AACf,6GAAA,iBAAiB,OAAA;AACjB,wGAAA,YAAY,OAAA;AAGd,eAAe;AACf,iDAA8C;AAArC,wGAAA,SAAS,OAAA;AAOlB,qBAAqB;AACrB,6DAAyD;AAAhD,mHAAA,cAAc,OAAA;AAGvB,SAAS;AACT,uCAQsB;AAPpB,4GAAA,kBAAkB,OAAA;AAClB,wGAAA,cAAc,OAAA;AACd,+GAAA,qBAAqB,OAAA;AACrB,oGAAA,UAAU,OAAA;AACV,0GAAA,gBAAgB,OAAA;AAChB,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AAQnB,oBAAoB;AACpB,2DAAyE;AAAhE,iHAAA,aAAa,OAAA;AAAE,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Aggregation pipeline engine.
3
+ *
4
+ * Supports stages:
5
+ * $match, $group, $sort, $limit, $skip, $project,
6
+ * $unwind, $count, $addFields, $lookup, $replaceRoot, $sample
7
+ */
8
+ import { AggregationStage, BsonDocument } from './types';
9
+ type LookupResolver = (collectionName: string) => Promise<BsonDocument[]>;
10
+ /**
11
+ * Run an aggregation pipeline over an array of documents.
12
+ *
13
+ * @param docs - Input documents
14
+ * @param pipeline - Array of aggregation stages
15
+ * @param lookupResolver - Optional resolver for $lookup stages (fetches docs from another collection)
16
+ */
17
+ export declare function runAggregation(docs: BsonDocument[], pipeline: AggregationStage[], lookupResolver?: LookupResolver): Promise<BsonDocument[]>;
18
+ export {};
@@ -0,0 +1,407 @@
1
+ "use strict";
2
+ /**
3
+ * Aggregation pipeline engine.
4
+ *
5
+ * Supports stages:
6
+ * $match, $group, $sort, $limit, $skip, $project,
7
+ * $unwind, $count, $addFields, $lookup, $replaceRoot, $sample
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.runAggregation = runAggregation;
11
+ const queryEngine_1 = require("./queryEngine");
12
+ /**
13
+ * Run an aggregation pipeline over an array of documents.
14
+ *
15
+ * @param docs - Input documents
16
+ * @param pipeline - Array of aggregation stages
17
+ * @param lookupResolver - Optional resolver for $lookup stages (fetches docs from another collection)
18
+ */
19
+ async function runAggregation(docs, pipeline, lookupResolver) {
20
+ let result = [...docs];
21
+ for (const stage of pipeline) {
22
+ const [op] = Object.keys(stage);
23
+ switch (op) {
24
+ case '$match':
25
+ result = stageMatch(result, stage.$match);
26
+ break;
27
+ case '$group':
28
+ result = stageGroup(result, stage.$group);
29
+ break;
30
+ case '$sort':
31
+ result = stageSort(result, stage.$sort);
32
+ break;
33
+ case '$limit':
34
+ result = stageLimit(result, stage.$limit);
35
+ break;
36
+ case '$skip':
37
+ result = stageSkip(result, stage.$skip);
38
+ break;
39
+ case '$project':
40
+ result = stageProject(result, stage.$project);
41
+ break;
42
+ case '$unwind':
43
+ result = stageUnwind(result, stage.$unwind);
44
+ break;
45
+ case '$count':
46
+ result = stageCount(result, stage.$count);
47
+ break;
48
+ case '$addFields':
49
+ result = stageAddFields(result, stage.$addFields);
50
+ break;
51
+ case '$lookup':
52
+ result = await stageLookup(result, stage.$lookup, lookupResolver);
53
+ break;
54
+ case '$replaceRoot':
55
+ result = stageReplaceRoot(result, stage.$replaceRoot);
56
+ break;
57
+ case '$sample':
58
+ result = stageSample(result, stage.$sample);
59
+ break;
60
+ case '$facet':
61
+ result = await stageFacet(result, stage.$facet, lookupResolver);
62
+ break;
63
+ default:
64
+ // Unknown stage – skip
65
+ break;
66
+ }
67
+ }
68
+ return result;
69
+ }
70
+ // ── Stage implementations ──
71
+ function stageMatch(docs, filter) {
72
+ return docs.filter((doc) => (0, queryEngine_1.matchesFilter)(doc, filter));
73
+ }
74
+ function stageSort(docs, sort) {
75
+ return (0, queryEngine_1.sortDocuments)(docs, sort);
76
+ }
77
+ function stageLimit(docs, limit) {
78
+ return docs.slice(0, limit);
79
+ }
80
+ function stageSkip(docs, skip) {
81
+ return docs.slice(skip);
82
+ }
83
+ function stageProject(docs, projection) {
84
+ return docs.map((doc) => {
85
+ const result = {};
86
+ const isInclusion = Object.values(projection).some((v) => v === 1 ||
87
+ v === true ||
88
+ (typeof v === 'object' && v !== null) ||
89
+ (typeof v === 'string' && v.startsWith('$')));
90
+ if (isInclusion) {
91
+ if (projection['_id'] !== 0)
92
+ result['_id'] = doc['_id'];
93
+ for (const [key, spec] of Object.entries(projection)) {
94
+ if (key === '_id')
95
+ continue;
96
+ if (spec === 1 || spec === true) {
97
+ result[key] = getNestedValue(doc, key);
98
+ }
99
+ else if (typeof spec === 'string' && spec.startsWith('$')) {
100
+ // Field reference: $fieldName
101
+ result[key] = getNestedValue(doc, spec.slice(1));
102
+ }
103
+ else if (typeof spec === 'object' && spec !== null) {
104
+ // Expression object – basic support
105
+ result[key] = evaluateExpression(spec, doc);
106
+ }
107
+ }
108
+ }
109
+ else {
110
+ // Exclusion mode
111
+ for (const [k, v] of Object.entries(doc)) {
112
+ if (projection[k] === 0 || projection[k] === false)
113
+ continue;
114
+ result[k] = v;
115
+ }
116
+ }
117
+ return result;
118
+ });
119
+ }
120
+ function stageUnwind(docs, unwindSpec) {
121
+ const path = typeof unwindSpec === 'string' ? unwindSpec : unwindSpec.path;
122
+ const preserveNulls = typeof unwindSpec === 'object' && unwindSpec.preserveNullAndEmptyArrays;
123
+ const fieldPath = path.startsWith('$') ? path.slice(1) : path;
124
+ const result = [];
125
+ for (const doc of docs) {
126
+ const value = getNestedValue(doc, fieldPath);
127
+ if (Array.isArray(value)) {
128
+ if (value.length === 0 && preserveNulls) {
129
+ const unwound = { ...doc };
130
+ setNestedValue(unwound, fieldPath, null);
131
+ result.push(unwound);
132
+ }
133
+ else {
134
+ for (const item of value) {
135
+ const unwound = { ...doc };
136
+ setNestedValue(unwound, fieldPath, item);
137
+ result.push(unwound);
138
+ }
139
+ }
140
+ }
141
+ else if (value === undefined || value === null) {
142
+ if (preserveNulls) {
143
+ result.push({ ...doc });
144
+ }
145
+ }
146
+ else {
147
+ result.push({ ...doc });
148
+ }
149
+ }
150
+ return result;
151
+ }
152
+ function stageCount(docs, countField) {
153
+ return [{ [countField]: docs.length }];
154
+ }
155
+ function stageAddFields(docs, fields) {
156
+ return docs.map((doc) => {
157
+ const result = { ...doc };
158
+ for (const [key, spec] of Object.entries(fields)) {
159
+ if (typeof spec === 'string' && spec.startsWith('$')) {
160
+ result[key] = getNestedValue(doc, spec.slice(1));
161
+ }
162
+ else if (typeof spec === 'object' && spec !== null) {
163
+ result[key] = evaluateExpression(spec, doc);
164
+ }
165
+ else {
166
+ result[key] = spec;
167
+ }
168
+ }
169
+ return result;
170
+ });
171
+ }
172
+ async function stageLookup(docs, lookup, resolver) {
173
+ if (!resolver) {
174
+ // Without a resolver, $lookup is a no-op
175
+ return docs.map((doc) => ({ ...doc, [lookup.as]: [] }));
176
+ }
177
+ const foreignDocs = await resolver(lookup.from);
178
+ return docs.map((doc) => {
179
+ const localVal = getNestedValue(doc, lookup.localField);
180
+ const matched = foreignDocs.filter((fd) => {
181
+ const foreignVal = getNestedValue(fd, lookup.foreignField);
182
+ return deepEq(localVal, foreignVal);
183
+ });
184
+ return { ...doc, [lookup.as]: matched };
185
+ });
186
+ }
187
+ function stageReplaceRoot(docs, spec) {
188
+ return docs.map((doc) => {
189
+ if (typeof spec.newRoot === 'string' && spec.newRoot.startsWith('$')) {
190
+ const val = getNestedValue(doc, spec.newRoot.slice(1));
191
+ if (typeof val === 'object' && val !== null && !Array.isArray(val)) {
192
+ return val;
193
+ }
194
+ return doc;
195
+ }
196
+ // TODO: expression evaluation
197
+ return doc;
198
+ });
199
+ }
200
+ async function stageFacet(docs, facets, lookupResolver) {
201
+ const result = {};
202
+ for (const [name, pipeline] of Object.entries(facets)) {
203
+ result[name] = await runAggregation([...docs], pipeline, lookupResolver);
204
+ }
205
+ return [result];
206
+ }
207
+ function stageSample(docs, spec) {
208
+ const shuffled = [...docs];
209
+ // Fisher-Yates shuffle
210
+ for (let i = shuffled.length - 1; i > 0; i--) {
211
+ const j = Math.floor(Math.random() * (i + 1));
212
+ [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
213
+ }
214
+ return shuffled.slice(0, spec.size);
215
+ }
216
+ function stageGroup(docs, spec) {
217
+ const idExpr = spec['_id'];
218
+ const groups = new Map();
219
+ for (const doc of docs) {
220
+ const groupKey = resolveGroupId(doc, idExpr);
221
+ const keyStr = JSON.stringify(groupKey);
222
+ if (!groups.has(keyStr)) {
223
+ groups.set(keyStr, []);
224
+ }
225
+ groups.get(keyStr).push(doc);
226
+ }
227
+ const result = [];
228
+ for (const [keyStr, groupDocs] of groups.entries()) {
229
+ const groupId = JSON.parse(keyStr);
230
+ const outputDoc = { _id: groupId };
231
+ for (const [field, accumulator] of Object.entries(spec)) {
232
+ if (field === '_id')
233
+ continue;
234
+ if (typeof accumulator === 'object' && accumulator !== null) {
235
+ const accObj = accumulator;
236
+ const [accOp, accExpr] = Object.entries(accObj)[0] ?? [];
237
+ outputDoc[field] = applyAccumulator(accOp, accExpr, groupDocs);
238
+ }
239
+ }
240
+ result.push(outputDoc);
241
+ }
242
+ return result;
243
+ }
244
+ // ── Helpers ──
245
+ function resolveGroupId(doc, idExpr) {
246
+ if (idExpr === null)
247
+ return null;
248
+ if (typeof idExpr === 'string' && idExpr.startsWith('$')) {
249
+ return getNestedValue(doc, idExpr.slice(1));
250
+ }
251
+ if (typeof idExpr === 'object' && idExpr !== null) {
252
+ const result = {};
253
+ for (const [key, expr] of Object.entries(idExpr)) {
254
+ if (typeof expr === 'string' && expr.startsWith('$')) {
255
+ result[key] = getNestedValue(doc, expr.slice(1));
256
+ }
257
+ else {
258
+ result[key] = expr;
259
+ }
260
+ }
261
+ return result;
262
+ }
263
+ return idExpr;
264
+ }
265
+ function applyAccumulator(op, expr, docs) {
266
+ const values = docs.map((d) => resolveFieldRef(d, expr));
267
+ switch (op) {
268
+ case '$sum': {
269
+ if (typeof expr === 'number')
270
+ return expr * docs.length;
271
+ return values.reduce((acc, v) => acc + (typeof v === 'number' ? v : 0), 0);
272
+ }
273
+ case '$avg': {
274
+ const nums = values.filter((v) => typeof v === 'number');
275
+ return nums.length > 0
276
+ ? nums.reduce((a, b) => a + b, 0) / nums.length
277
+ : null;
278
+ }
279
+ case '$min': {
280
+ const nums = values.filter((v) => v !== undefined && v !== null);
281
+ return nums.length > 0
282
+ ? nums.reduce((a, b) => (a !== undefined && a < b ? a : b))
283
+ : null;
284
+ }
285
+ case '$max': {
286
+ const nums = values.filter((v) => v !== undefined && v !== null);
287
+ return nums.length > 0
288
+ ? nums.reduce((a, b) => (a !== undefined && a > b ? a : b))
289
+ : null;
290
+ }
291
+ case '$first':
292
+ return values.length > 0 ? values[0] : null;
293
+ case '$last':
294
+ return values.length > 0 ? values[values.length - 1] : null;
295
+ case '$push':
296
+ return values;
297
+ case '$addToSet':
298
+ return [...new Set(values.map((v) => JSON.stringify(v)))].map((s) => JSON.parse(s));
299
+ case '$count':
300
+ return docs.length;
301
+ default:
302
+ return null;
303
+ }
304
+ }
305
+ function resolveFieldRef(doc, expr) {
306
+ if (typeof expr === 'string' && expr.startsWith('$')) {
307
+ return getNestedValue(doc, expr.slice(1));
308
+ }
309
+ if (typeof expr === 'number')
310
+ return expr;
311
+ return expr;
312
+ }
313
+ function evaluateExpression(expr, doc) {
314
+ // Basic expression support
315
+ if ('$concat' in expr) {
316
+ const parts = expr['$concat'];
317
+ return parts
318
+ .map((p) => {
319
+ if (typeof p === 'string' && p.startsWith('$'))
320
+ return String(getNestedValue(doc, p.slice(1)) ?? '');
321
+ return String(p);
322
+ })
323
+ .join('');
324
+ }
325
+ if ('$toLower' in expr) {
326
+ const val = resolveFieldRef(doc, expr['$toLower']);
327
+ return typeof val === 'string' ? val.toLowerCase() : val;
328
+ }
329
+ if ('$toUpper' in expr) {
330
+ const val = resolveFieldRef(doc, expr['$toUpper']);
331
+ return typeof val === 'string' ? val.toUpperCase() : val;
332
+ }
333
+ if ('$add' in expr) {
334
+ const parts = expr['$add'];
335
+ return parts.reduce((acc, p) => {
336
+ const v = typeof p === 'number' ? p : Number(resolveFieldRef(doc, p));
337
+ return acc + (isNaN(v) ? 0 : v);
338
+ }, 0);
339
+ }
340
+ if ('$subtract' in expr) {
341
+ const [a, b] = expr['$subtract'];
342
+ const va = typeof a === 'number' ? a : Number(resolveFieldRef(doc, a));
343
+ const vb = typeof b === 'number' ? b : Number(resolveFieldRef(doc, b));
344
+ return va - vb;
345
+ }
346
+ if ('$multiply' in expr) {
347
+ const parts = expr['$multiply'];
348
+ return parts.reduce((acc, p) => {
349
+ const v = typeof p === 'number' ? p : Number(resolveFieldRef(doc, p));
350
+ return acc * (isNaN(v) ? 0 : v);
351
+ }, 1);
352
+ }
353
+ if ('$divide' in expr) {
354
+ const [a, b] = expr['$divide'];
355
+ const va = typeof a === 'number' ? a : Number(resolveFieldRef(doc, a));
356
+ const vb = typeof b === 'number' ? b : Number(resolveFieldRef(doc, b));
357
+ return vb !== 0 ? va / vb : null;
358
+ }
359
+ if ('$cond' in expr) {
360
+ const cond = expr['$cond'];
361
+ if (Array.isArray(cond) && cond.length === 3) {
362
+ const [ifExpr, thenExpr, elseExpr] = cond;
363
+ const test = resolveFieldRef(doc, ifExpr);
364
+ return test
365
+ ? resolveFieldRef(doc, thenExpr)
366
+ : resolveFieldRef(doc, elseExpr);
367
+ }
368
+ }
369
+ return expr;
370
+ }
371
+ function getNestedValue(doc, path) {
372
+ const parts = path.split('.');
373
+ let current = doc;
374
+ for (const part of parts) {
375
+ if (current === null || current === undefined)
376
+ return undefined;
377
+ if (typeof current === 'object') {
378
+ current = current[part];
379
+ }
380
+ else {
381
+ return undefined;
382
+ }
383
+ }
384
+ return current;
385
+ }
386
+ function setNestedValue(obj, path, value) {
387
+ const parts = path.split('.');
388
+ let current = obj;
389
+ for (let i = 0; i < parts.length - 1; i++) {
390
+ const part = parts[i];
391
+ if (!(part in current) ||
392
+ typeof current[part] !== 'object' ||
393
+ current[part] === null) {
394
+ current[part] = {};
395
+ }
396
+ current = current[part];
397
+ }
398
+ current[parts[parts.length - 1]] = value;
399
+ }
400
+ function deepEq(a, b) {
401
+ if (a === b)
402
+ return true;
403
+ if (a === null || b === null || a === undefined || b === undefined)
404
+ return a === b;
405
+ return JSON.stringify(a) === JSON.stringify(b);
406
+ }
407
+ //# sourceMappingURL=aggregation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregation.js","sourceRoot":"","sources":["../../../../brightchain-db/src/lib/aggregation.ts"],"names":[],"mappings":"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"}