@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.
- package/README.md +81 -0
- package/package.json +18 -0
- package/src/__tests__/helpers/mockBlockStore.d.ts +113 -0
- package/src/__tests__/helpers/mockBlockStore.js +380 -0
- package/src/__tests__/helpers/mockBlockStore.js.map +1 -0
- package/src/index.d.ts +31 -0
- package/src/index.js +78 -0
- package/src/index.js.map +1 -0
- package/src/lib/aggregation.d.ts +18 -0
- package/src/lib/aggregation.js +407 -0
- package/src/lib/aggregation.js.map +1 -0
- package/src/lib/cblIndex.d.ts +268 -0
- package/src/lib/cblIndex.js +856 -0
- package/src/lib/cblIndex.js.map +1 -0
- package/src/lib/collection.d.ts +305 -0
- package/src/lib/collection.js +991 -0
- package/src/lib/collection.js.map +1 -0
- package/src/lib/cursor.d.ts +8 -0
- package/src/lib/cursor.js +13 -0
- package/src/lib/cursor.js.map +1 -0
- package/src/lib/database.d.ts +158 -0
- package/src/lib/database.js +332 -0
- package/src/lib/database.js.map +1 -0
- package/src/lib/errors.d.ts +85 -0
- package/src/lib/errors.js +103 -0
- package/src/lib/errors.js.map +1 -0
- package/src/lib/expressMiddleware.d.ts +57 -0
- package/src/lib/expressMiddleware.js +488 -0
- package/src/lib/expressMiddleware.js.map +1 -0
- package/src/lib/headRegistry.d.ts +60 -0
- package/src/lib/headRegistry.js +216 -0
- package/src/lib/headRegistry.js.map +1 -0
- package/src/lib/indexing.d.ts +7 -0
- package/src/lib/indexing.js +14 -0
- package/src/lib/indexing.js.map +1 -0
- package/src/lib/model.d.ts +162 -0
- package/src/lib/model.js +260 -0
- package/src/lib/model.js.map +1 -0
- package/src/lib/pooledStoreAdapter.d.ts +44 -0
- package/src/lib/pooledStoreAdapter.js +109 -0
- package/src/lib/pooledStoreAdapter.js.map +1 -0
- package/src/lib/queryEngine.d.ts +48 -0
- package/src/lib/queryEngine.js +461 -0
- package/src/lib/queryEngine.js.map +1 -0
- package/src/lib/schemaValidation.d.ts +80 -0
- package/src/lib/schemaValidation.js +353 -0
- package/src/lib/schemaValidation.js.map +1 -0
- package/src/lib/transaction.d.ts +7 -0
- package/src/lib/transaction.js +12 -0
- package/src/lib/transaction.js.map +1 -0
- package/src/lib/types.d.ts +360 -0
- package/src/lib/types.js +6 -0
- package/src/lib/types.js.map +1 -0
- package/src/lib/updateEngine.d.ts +7 -0
- package/src/lib/updateEngine.js +13 -0
- 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
|
package/src/index.js.map
ADDED
|
@@ -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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"}
|