@forestadmin/datasource-mongoose 1.2.5 → 1.3.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/dist/collection.d.ts +3 -3
- package/dist/collection.js +56 -46
- package/dist/datasource.d.ts +10 -4
- package/dist/datasource.js +65 -17
- package/dist/index.js +2 -2
- package/dist/mongoose/schema.d.ts +10 -1
- package/dist/mongoose/schema.js +82 -13
- package/dist/types.d.ts +33 -2
- package/dist/utils/helpers.d.ts +20 -0
- package/dist/utils/helpers.js +54 -2
- package/dist/utils/options.d.ts +9 -0
- package/dist/utils/options.js +80 -0
- package/dist/utils/pipeline/filter.d.ts +3 -1
- package/dist/utils/pipeline/filter.js +24 -7
- package/dist/utils/pipeline/lookup.d.ts +2 -1
- package/dist/utils/pipeline/lookup.js +3 -3
- package/dist/utils/pipeline/reparent.d.ts +6 -1
- package/dist/utils/pipeline/reparent.js +25 -18
- package/dist/utils/pipeline/virtual-fields.d.ts +3 -3
- package/dist/utils/pipeline/virtual-fields.js +27 -38
- package/dist/utils/schema/fields.d.ts +3 -2
- package/dist/utils/schema/fields.js +7 -9
- package/dist/utils/schema/relations.js +22 -10
- package/package.json +2 -2
package/dist/utils/helpers.d.ts
CHANGED
|
@@ -15,6 +15,16 @@ export declare function escape(str: string): string;
|
|
|
15
15
|
* a == { field: { subfield: 42 } }
|
|
16
16
|
*/
|
|
17
17
|
export declare function recursiveSet(target: any, path: string, value: unknown): void;
|
|
18
|
+
/**
|
|
19
|
+
* Remove a value in a plain object recursively
|
|
20
|
+
* If the value is an object and is empty, it will be removed.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const a = { field: { subfield: 42 } };
|
|
24
|
+
* recursiveDelete(a, 'field.subfield');
|
|
25
|
+
* a == { }
|
|
26
|
+
*/
|
|
27
|
+
export declare function recursiveDelete(target: any, path: string): void;
|
|
18
28
|
/**
|
|
19
29
|
* Compare two ids.
|
|
20
30
|
* This is useful to ensure we perform array operations in the right order.
|
|
@@ -59,4 +69,14 @@ export declare function replaceMongoTypes(records: any): any;
|
|
|
59
69
|
* == { 'authors.1.name': 'Asimov' }
|
|
60
70
|
*/
|
|
61
71
|
export declare function buildSubdocumentPatch(path: string, patch: RecordData, isLeaf: boolean): RecordData;
|
|
72
|
+
/**
|
|
73
|
+
* Unflattend patches and records
|
|
74
|
+
*/
|
|
75
|
+
export declare function unflattenRecord(record: RecordData, asFields: string[], patchMode?: boolean): RecordData;
|
|
76
|
+
/**
|
|
77
|
+
* Similar to projection.unnest
|
|
78
|
+
* @example
|
|
79
|
+
* unnest(['firstname', 'book.title', 'book.author'], 'book') == ['title', 'author']
|
|
80
|
+
*/
|
|
81
|
+
export declare function unnest(strings: string[], prefix: string): string[];
|
|
62
82
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/utils/helpers.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildSubdocumentPatch = exports.replaceMongoTypes = exports.groupIdsByPath = exports.splitId = exports.compareIds = exports.recursiveSet = exports.escape = void 0;
|
|
3
|
+
exports.unnest = exports.unflattenRecord = exports.buildSubdocumentPatch = exports.replaceMongoTypes = exports.groupIdsByPath = exports.splitId = exports.compareIds = exports.recursiveDelete = exports.recursiveSet = exports.escape = void 0;
|
|
4
4
|
const mongoose_1 = require("mongoose");
|
|
5
5
|
/**
|
|
6
6
|
* Replace dots by underscores.
|
|
@@ -33,6 +33,30 @@ function recursiveSet(target, path, value) {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
exports.recursiveSet = recursiveSet;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a value in a plain object recursively
|
|
38
|
+
* If the value is an object and is empty, it will be removed.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const a = { field: { subfield: 42 } };
|
|
42
|
+
* recursiveDelete(a, 'field.subfield');
|
|
43
|
+
* a == { }
|
|
44
|
+
*/
|
|
45
|
+
function recursiveDelete(target, path) {
|
|
46
|
+
const index = path.indexOf('.');
|
|
47
|
+
if (index !== -1) {
|
|
48
|
+
const prefix = path.substring(0, index);
|
|
49
|
+
const suffix = path.substring(index + 1);
|
|
50
|
+
recursiveDelete(target[prefix], suffix);
|
|
51
|
+
if (Object.keys(target[prefix]).length === 0) {
|
|
52
|
+
delete target[prefix];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
delete target[path];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.recursiveDelete = recursiveDelete;
|
|
36
60
|
/**
|
|
37
61
|
* Compare two ids.
|
|
38
62
|
* This is useful to ensure we perform array operations in the right order.
|
|
@@ -129,4 +153,32 @@ function buildSubdocumentPatch(path, patch, isLeaf) {
|
|
|
129
153
|
return cleanPatch;
|
|
130
154
|
}
|
|
131
155
|
exports.buildSubdocumentPatch = buildSubdocumentPatch;
|
|
132
|
-
|
|
156
|
+
/**
|
|
157
|
+
* Unflattend patches and records
|
|
158
|
+
*/
|
|
159
|
+
function unflattenRecord(record, asFields, patchMode = false) {
|
|
160
|
+
const newRecord = { ...record };
|
|
161
|
+
for (const field of asFields) {
|
|
162
|
+
const alias = field.replace(/\./g, '@@@');
|
|
163
|
+
const value = newRecord[alias];
|
|
164
|
+
if (value !== undefined) {
|
|
165
|
+
if (patchMode)
|
|
166
|
+
newRecord[field] = value;
|
|
167
|
+
else
|
|
168
|
+
recursiveSet(newRecord, field, value);
|
|
169
|
+
delete newRecord[alias];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return newRecord;
|
|
173
|
+
}
|
|
174
|
+
exports.unflattenRecord = unflattenRecord;
|
|
175
|
+
/**
|
|
176
|
+
* Similar to projection.unnest
|
|
177
|
+
* @example
|
|
178
|
+
* unnest(['firstname', 'book.title', 'book.author'], 'book') == ['title', 'author']
|
|
179
|
+
*/
|
|
180
|
+
function unnest(strings, prefix) {
|
|
181
|
+
return strings.filter(f => f.startsWith(`${prefix}.`)).map(f => f.substring(prefix.length + 1));
|
|
182
|
+
}
|
|
183
|
+
exports.unnest = unnest;
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHVDQUFrRDtBQUVsRDs7Ozs7R0FLRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxHQUFXO0lBQ2hDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUZELHdCQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFlBQVksQ0FBQyxNQUFXLEVBQUUsSUFBWSxFQUFFLEtBQWM7SUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsTUFBTSxNQUFiLE1BQU0sQ0FBQyxNQUFNLElBQU0sRUFBRSxFQUFDO1FBRXRCLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdDO1NBQU07UUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0tBQ3RCO0FBQ0gsQ0FBQztBQVpELG9DQVlDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixlQUFlLENBQUMsTUFBVyxFQUFFLElBQVk7SUFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVoQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLE1BQU0sR0FBRyxJ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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Model } from 'mongoose';
|
|
2
|
+
import { FlattenOptions, MongooseOptions } from '../types';
|
|
3
|
+
export default class OptionsParser {
|
|
4
|
+
static parseOptions(model: Model<unknown>, options: MongooseOptions): FlattenOptions;
|
|
5
|
+
private static getAutoFlattenOptions;
|
|
6
|
+
private static getManualFlattenOptions;
|
|
7
|
+
private static getLegacyFlattenOptions;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const schema_1 = __importDefault(require("../mongoose/schema"));
|
|
7
|
+
class OptionsParser {
|
|
8
|
+
static parseOptions(model, options) {
|
|
9
|
+
const schema = schema_1.default.fromModel(model);
|
|
10
|
+
switch (options.flattenMode) {
|
|
11
|
+
case 'auto':
|
|
12
|
+
return this.getAutoFlattenOptions(schema);
|
|
13
|
+
case 'manual':
|
|
14
|
+
return this.getManualFlattenOptions(schema, options, model.modelName);
|
|
15
|
+
case 'none':
|
|
16
|
+
return { asFields: [], asModels: [] };
|
|
17
|
+
default:
|
|
18
|
+
return this.getLegacyFlattenOptions(schema, options, model.modelName);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
static getAutoFlattenOptions(schema) {
|
|
22
|
+
// Split on all arrays of objects and arrays of references.
|
|
23
|
+
const asModels = schema
|
|
24
|
+
.listPathsMatching((_, s) => s.isArray && (!s.isLeaf || s.schemaNode?.options?.ref))
|
|
25
|
+
.sort();
|
|
26
|
+
// flatten all fields which are nested
|
|
27
|
+
const asFields = schema.listPathsMatching((field, pathSchema) => {
|
|
28
|
+
// on veut flatten si on est à plus de 1 niveau de profondeur par rapport au asModels
|
|
29
|
+
const minDistance = asModels.reduce((acc, asModel) => {
|
|
30
|
+
return field.startsWith(`${asModel}.`)
|
|
31
|
+
? Math.min(acc, field.split('.').length - asModel.split('.').length)
|
|
32
|
+
: acc;
|
|
33
|
+
}, field.split('.').length);
|
|
34
|
+
return !asModels.includes(field) && pathSchema.isLeaf && minDistance > 1;
|
|
35
|
+
});
|
|
36
|
+
return { asFields, asModels };
|
|
37
|
+
}
|
|
38
|
+
static getManualFlattenOptions(schema, options, modelName) {
|
|
39
|
+
// If the user specified either asModels or asFields for this model, we apply it.
|
|
40
|
+
const asModels = (options?.flattenOptions?.[modelName]?.asModels ?? [])
|
|
41
|
+
.map(f => f.replace(/:/g, '.'))
|
|
42
|
+
.sort();
|
|
43
|
+
const asFields = (options?.flattenOptions?.[modelName]?.asFields ?? [])
|
|
44
|
+
.flatMap(item => {
|
|
45
|
+
const field = (typeof item === 'string' ? item : item.field).replace(/:/g, '.');
|
|
46
|
+
const level = typeof item === 'string' ? 99 : item.level;
|
|
47
|
+
const subSchema = schema.getSubSchema(field);
|
|
48
|
+
return subSchema.isLeaf ? [field] : subSchema.listFields(level).map(f => `${field}.${f}`);
|
|
49
|
+
})
|
|
50
|
+
.filter(f => !asModels.includes(f)) // asModels takes precedence over asFields
|
|
51
|
+
.sort(); // sort so that subfields appear after their parent
|
|
52
|
+
return { asFields, asModels };
|
|
53
|
+
}
|
|
54
|
+
static getLegacyFlattenOptions(schema, options, modelName) {
|
|
55
|
+
let asFields;
|
|
56
|
+
let asModels;
|
|
57
|
+
if (options?.asModels?.[modelName]) {
|
|
58
|
+
// [legacy mode] retro-compatibility when customer provided asModels
|
|
59
|
+
const cuts = new Set(options.asModels[modelName].map(f => f.replace(/:/g, '.')));
|
|
60
|
+
for (let field of cuts) {
|
|
61
|
+
while (field.lastIndexOf('.') !== -1) {
|
|
62
|
+
field = field.substring(0, field.lastIndexOf('.'));
|
|
63
|
+
cuts.add(field);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
asFields = [];
|
|
67
|
+
asModels = [...cuts].sort();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// [legacy mode] retro-compatibility when customer did not provice anything
|
|
71
|
+
asFields = [];
|
|
72
|
+
asModels = Object.keys(schema.fields)
|
|
73
|
+
.filter(field => schema.fields[field]?.['[]']?.options?.ref)
|
|
74
|
+
.sort();
|
|
75
|
+
}
|
|
76
|
+
return { asFields, asModels };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.default = OptionsParser;
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsZ0VBQWdEO0FBUWhELE1BQXFCLGFBQWE7SUFDaEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFxQixFQUFFLE9BQXdCO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLGdCQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9DLFFBQVEsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUMzQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hFLEtBQUssTUFBTTtnQkFDVCxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDeEM7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDekU7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQXNCO1FBQ3pELDJEQUEyRDtRQUMzRCxNQUFNLFFBQVEsR0FBRyxNQUFNO2FBQ3BCLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQzthQUNuRixJQUFJLEVBQUUsQ0FBQztRQUVWLHNDQUFzQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsaUJB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
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { PaginatedFilter } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Model, PipelineStage } from 'mongoose';
|
|
3
|
+
import { Stack } from '../../types';
|
|
3
4
|
/** Transform a forest admin filter into mongo pipeline */
|
|
4
5
|
export default class FilterGenerator {
|
|
5
|
-
static filter(model: Model<unknown>,
|
|
6
|
+
static filter(model: Model<unknown>, stack: Stack, filter: PaginatedFilter): PipelineStage[];
|
|
6
7
|
private static computeMatch;
|
|
7
8
|
private static formatAndCastLeafValue;
|
|
8
9
|
private static buildMatchCondition;
|
|
@@ -12,5 +13,6 @@ export default class FilterGenerator {
|
|
|
12
13
|
private static computeFields;
|
|
13
14
|
private static formatNestedFieldPath;
|
|
14
15
|
private static formatStringFieldName;
|
|
16
|
+
private static getFieldMetadata;
|
|
15
17
|
}
|
|
16
18
|
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -10,11 +10,10 @@ const schema_1 = __importDefault(require("../../mongoose/schema"));
|
|
|
10
10
|
const STRING_OPERATORS = ['Like', 'ILike', 'NotContains', 'LongerThan', 'ShorterThan'];
|
|
11
11
|
/** Transform a forest admin filter into mongo pipeline */
|
|
12
12
|
class FilterGenerator {
|
|
13
|
-
static filter(model,
|
|
14
|
-
const schema = schema_1.default.fromModel(model).getSubSchema(prefix, true);
|
|
13
|
+
static filter(model, stack, filter) {
|
|
15
14
|
const fields = new Set();
|
|
16
15
|
const tree = filter?.conditionTree;
|
|
17
|
-
const match = this.computeMatch(
|
|
16
|
+
const match = this.computeMatch(model, stack, tree, fields);
|
|
18
17
|
const sort = this.computeSort(filter?.sort);
|
|
19
18
|
const pipeline = [];
|
|
20
19
|
if (fields.size)
|
|
@@ -29,10 +28,11 @@ class FilterGenerator {
|
|
|
29
28
|
pipeline.push({ $limit: filter.page.limit });
|
|
30
29
|
return pipeline;
|
|
31
30
|
}
|
|
32
|
-
static computeMatch(
|
|
31
|
+
static computeMatch(model, stack, tree, fields) {
|
|
32
|
+
const schema = schema_1.default.fromModel(model).applyStack(stack, true);
|
|
33
33
|
if (tree instanceof datasource_toolkit_1.ConditionTreeBranch) {
|
|
34
34
|
return {
|
|
35
|
-
[`$${tree.aggregator.toLowerCase()}`]: tree.conditions.map(condition => this.computeMatch(
|
|
35
|
+
[`$${tree.aggregator.toLowerCase()}`]: tree.conditions.map(condition => this.computeMatch(model, stack, condition, fields)),
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
if (tree instanceof datasource_toolkit_1.ConditionTreeLeaf) {
|
|
@@ -48,7 +48,7 @@ class FilterGenerator {
|
|
|
48
48
|
// is used after the request (for instance for "after hooks").
|
|
49
49
|
let { value } = leaf;
|
|
50
50
|
leaf.field = this.formatNestedFieldPath(leaf.field);
|
|
51
|
-
const
|
|
51
|
+
const [isArray, instance] = this.getFieldMetadata(schema, leaf.field);
|
|
52
52
|
// @fixme I'm really not sure that this can work in all cases.
|
|
53
53
|
// It assumes that the type of the value is the same than the type of the column
|
|
54
54
|
// which is not the case for many operators.
|
|
@@ -140,6 +140,23 @@ class FilterGenerator {
|
|
|
140
140
|
parts.push(`string_${parts.pop()}`);
|
|
141
141
|
return parts.join('.');
|
|
142
142
|
}
|
|
143
|
+
static getFieldMetadata(schema, field) {
|
|
144
|
+
// nested _ids are strings
|
|
145
|
+
let isArray;
|
|
146
|
+
let instance;
|
|
147
|
+
try {
|
|
148
|
+
// This may crash when we query virtual one to one relationships, because their virtual
|
|
149
|
+
// fields are not in the schema (This is documented in MongooseSchema)
|
|
150
|
+
const subSchema = schema.getSubSchema(field);
|
|
151
|
+
isArray = subSchema.isArray;
|
|
152
|
+
instance = subSchema.schemaType.instance;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
isArray = false;
|
|
156
|
+
instance = 'String';
|
|
157
|
+
}
|
|
158
|
+
return [isArray, instance];
|
|
159
|
+
}
|
|
143
160
|
}
|
|
144
161
|
exports.default = FilterGenerator;
|
|
145
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3BpcGVsaW5lL2ZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQU15QztBQUN6QyxpQ0FBaUM7QUFDakMsdUNBQXdFO0FBRXhFLG1FQUFtRDtBQUduRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRXZGLDBEQUEwRDtBQUMxRCxNQUFxQixlQUFlO0lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBcUIsRUFBRSxLQUFZLEVBQUUsTUFBdUI7UUFDeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsYUFBYSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFNUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLElBQUk7WUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLEtBQUs7WUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxJQUFJO1lBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUssU0FBUztZQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLElBQUksTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEtBQUssU0FBUztZQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXBGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxNQUFNLENBQUMsWUFBWSxDQUN6QixLQUFxQixFQUNyQixLQUFZLEVBQ1osSUFBbUIsRUFDbkIsTUFBbUI7UUFFbkIsTUFBTSxNQUFNLEdBQUcsZ0JBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2RSxJQUFJLElBQUksWUFBWSx3Q0FBbUIsRUFBRTtZQUN2QyxPQUFPO2dCQUNMLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUNuRDthQUNGLENBQUM7U0FDSDtRQUVELElBQUksSUFBSSxZQUFZLHNDQUFpQixFQUFFO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWpFLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNoRTtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDbkMsTUFBc0IsRUFDdEIsSUFBdUIsRUFDdkIsTUFBbUI7UUFFbkIsNkRBQTZEO1FBQzdELHNGQUFzRjtRQUN0Riw4REFBOEQ7UUFFOUQsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0RSw4REFBOEQ7UUFDOUQsZ0ZBQWdGO1FBQ2hGLDRDQUE0QztRQUU1QyxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQ0UsUUFBUSxLQUFLLE1BQU07Z0JBQ25CLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQzdDO2dCQUNBLEtBQUssR0FBSSxLQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEQ7aUJBQU0sSUFDTCxRQUFRLEtBQUssVUFBVTtnQkFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDBCQUFlLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFDcEM7Z0JBQ0EsS0FBSyxHQUFJLEtBQXVCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxnQkFBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3BFO1NBQ0Y7YUFBTSxJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDbEMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3JEO2lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBQSwwQkFBZSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZFLEtBQUssR0FBSSxLQUF1QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksZ0JBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNwRTtpQkFBTSxJQUFJLElBQUEsMEJBQWUsRUFBQyxLQUFLLENBQUMsRUFBRTtnQkFDakMsS0FBSyxHQUFHLElBQUksZ0JBQUssQ0FBQyxRQUFRLENBQUMsS0FBZSxDQUFDLENBQUM7YUFDN0M7U0FDRjthQUFNLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUM5QixLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7U0FDbkM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxNQUFNLENBQUMsbUJBQW1CLENBQ2hDLFFBQWtCLEVBQ2xCLGtCQUEyQjtRQUUzQixRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLGFBQWE7Z0JBQ2hCLE9BQU8sRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztZQUNyQyxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JDLEtBQUssT0FBTztnQkFDVixPQUFPLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLENBQUM7WUFDckMsS0FBSyxVQUFVO2dCQUNiLE9BQU8sRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztZQUNyQyxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JDLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RDLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLGtCQUFrQixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNELEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQTRCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkQsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3RDO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLFFBQVEsWUFBWSxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBRUQsd0RBQXdEO0lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBZSxFQUFFLGFBQXNCO1FBQ3pELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUVyQiw2Q0FBNkM7UUFDN0MsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0NBQStDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakYsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdkQsT0FBTyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBOEI7UUFDdkQsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU5QyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFbEIsS0FBSyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEtBQUssRUFBRTtZQUN4QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQW1CO1FBQzlDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQzlCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUU5RCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLEVBQ0QsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQ25CLENBQUM7SUFDSixDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQWE7UUFDaEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQWE7UUFDaEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFzQixFQUFFLEtBQWE7UUFDbkUsMEJBQTBCO1FBQzFCLElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFJLFFBQWdCLENBQUM7UUFFckIsSUFBSTtZQUNGLHVGQUF1RjtZQUN2RixzRUFBc0U7WUFDdEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUM1QixRQUFRLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDMUM7UUFBQyxNQUFNO1lBQ04sT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQ3JCO1FBRUQsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUExTEQsa0NBMExDIn0=
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Projection } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Model, PipelineStage } from 'mongoose';
|
|
3
|
+
import { Stack } from '../../types';
|
|
3
4
|
/**
|
|
4
5
|
* Transform a forest admin projection into a mongo pipeline that performs the lookups
|
|
5
6
|
* and transformations to target them
|
|
6
7
|
*/
|
|
7
8
|
export default class LookupGenerator {
|
|
8
|
-
static lookup(model: Model<unknown>,
|
|
9
|
+
static lookup(model: Model<unknown>, stack: Stack, projection: Projection): PipelineStage[];
|
|
9
10
|
private static lookupProjection;
|
|
10
11
|
private static lookupRelation;
|
|
11
12
|
}
|
|
@@ -9,8 +9,8 @@ const schema_1 = __importDefault(require("../../mongoose/schema"));
|
|
|
9
9
|
* and transformations to target them
|
|
10
10
|
*/
|
|
11
11
|
class LookupGenerator {
|
|
12
|
-
static lookup(model,
|
|
13
|
-
const childSchema = schema_1.default.fromModel(model).
|
|
12
|
+
static lookup(model, stack, projection) {
|
|
13
|
+
const childSchema = schema_1.default.fromModel(model).applyStack(stack, true).fields;
|
|
14
14
|
return this.lookupProjection(model.db.models, null, childSchema, projection);
|
|
15
15
|
}
|
|
16
16
|
static lookupProjection(models, currentPath, schema, projection) {
|
|
@@ -46,4 +46,4 @@ class LookupGenerator {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
exports.default = LookupGenerator;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3BpcGVsaW5lL2xvb2t1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLG1FQUFtRTtBQUduRTs7O0dBR0c7QUFDSCxNQUFxQixlQUFlO0lBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBcUIsRUFBRSxLQUFZLEVBQUUsVUFBc0I7UUFDdkUsTUFBTSxXQUFXLEdBQUcsZ0JBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFbkYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUM3QixNQUFzQyxFQUN0QyxXQUFtQixFQUNuQixNQUFrQixFQUNsQixVQUFzQjtRQUV0QixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFcEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUN0RSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUUxRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWMsQ0FDM0IsTUFBc0MsRUFDdEMsV0FBbUIsRUFDbkIsTUFBa0IsRUFDbEIsSUFBWSxFQUNaLGFBQXlCO1FBRXpCLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUV6RCw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXpELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDO1lBQzdDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUNyRixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUM7WUFFM0IsTUFBTSxTQUFTLEdBQUcsZ0JBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBRXpELE9BQU87Z0JBQ0wsMEJBQTBCO2dCQUMxQixFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUNuRCxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxFQUFFO2dCQUVqRSx3Q0FBd0M7Z0JBQ3hDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQzthQUMvRCxDQUFDO1NBQ0g7UUFFRCw0Q0FBNEM7UUFDNUMsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN2RTtRQUVELDZDQUE2QztRQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQTNERCxrQ0EyREMifQ==
|
|
@@ -6,8 +6,13 @@ import { Model, PipelineStage } from 'mongoose';
|
|
|
6
6
|
* without loosing the parent (which may be needed later on).
|
|
7
7
|
*/
|
|
8
8
|
export default class ReparentGenerator {
|
|
9
|
-
static reparent(model: Model<unknown>,
|
|
9
|
+
static reparent(model: Model<unknown>, stack: {
|
|
10
|
+
prefix: string | null;
|
|
11
|
+
asFields: string[];
|
|
12
|
+
asModels: string[];
|
|
13
|
+
}[]): PipelineStage[];
|
|
10
14
|
private static reparentArray;
|
|
11
15
|
private static reparentObject;
|
|
16
|
+
static unflatten(asFields: string[]): PipelineStage[];
|
|
12
17
|
}
|
|
13
18
|
//# sourceMappingURL=reparent.d.ts.map
|
|
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const mongoose_1 = require("mongoose");
|
|
7
6
|
const schema_1 = __importDefault(require("../../mongoose/schema"));
|
|
8
7
|
/**
|
|
9
8
|
* Generate pipeline to query submodels.
|
|
@@ -12,22 +11,22 @@ const schema_1 = __importDefault(require("../../mongoose/schema"));
|
|
|
12
11
|
* without loosing the parent (which may be needed later on).
|
|
13
12
|
*/
|
|
14
13
|
class ReparentGenerator {
|
|
15
|
-
static reparent(model,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
static reparent(model, stack) {
|
|
15
|
+
const schema = schema_1.default.fromModel(model);
|
|
16
|
+
return stack.flatMap((step, index) => {
|
|
17
|
+
if (index === 0)
|
|
18
|
+
return this.unflatten(step.asFields);
|
|
19
|
+
const localSchema = schema.getSubSchema(step.prefix);
|
|
20
|
+
const relativePrefix = stack[index - 1].prefix !== null
|
|
21
|
+
? step.prefix.substring(stack[index - 1].prefix.length + 1)
|
|
22
|
+
: step.prefix;
|
|
23
|
+
return [
|
|
24
|
+
...(localSchema.isArray
|
|
25
|
+
? this.reparentArray(relativePrefix, localSchema.isLeaf)
|
|
26
|
+
: this.reparentObject(relativePrefix, localSchema.isLeaf)),
|
|
27
|
+
...this.unflatten(step.asFields),
|
|
28
|
+
];
|
|
29
|
+
});
|
|
31
30
|
}
|
|
32
31
|
static reparentArray(prefix, inDoc) {
|
|
33
32
|
return [
|
|
@@ -66,6 +65,14 @@ class ReparentGenerator {
|
|
|
66
65
|
},
|
|
67
66
|
];
|
|
68
67
|
}
|
|
68
|
+
static unflatten(asFields) {
|
|
69
|
+
return asFields.length
|
|
70
|
+
? [
|
|
71
|
+
{ $addFields: Object.fromEntries(asFields.map(f => [f.replace(/\./g, '@@@'), `$${f}`])) },
|
|
72
|
+
{ $project: Object.fromEntries(asFields.map(f => [f, 0])) },
|
|
73
|
+
]
|
|
74
|
+
: [];
|
|
75
|
+
}
|
|
69
76
|
}
|
|
70
77
|
exports.default = ReparentGenerator;
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwYXJlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcGlwZWxpbmUvcmVwYXJlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxtRUFBbUQ7QUFFbkQ7Ozs7O0dBS0c7QUFDSCxNQUFxQixpQkFBaUI7SUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FDYixLQUFxQixFQUNyQixLQUEwRTtRQUUxRSxNQUFNLE1BQU0sR0FBRyxnQkFBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxLQUFLLEtBQUssQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXRELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELE1BQU0sY0FBYyxHQUNsQixLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDM0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFbEIsT0FBTztnQkFDTCxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU87b0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDO29CQUN4RCxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1RCxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNqQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFjLEVBQUUsS0FBYztRQUN6RCxPQUFPO1lBQ0wsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMvRDtnQkFDRSxZQUFZLEVBQUU7b0JBQ1osT0FBTyxFQUFFO3dCQUNQLGFBQWEsRUFBRTs0QkFDYixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7NEJBQ2hEO2dDQUNFLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRTtnQ0FDakYsUUFBUSxFQUFFLE1BQU07Z0NBQ2hCLE1BQU0sRUFBRSxRQUFROzZCQUNqQjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQWMsRUFBRSxLQUFjO1FBQzFELE9BQU87WUFDTDtnQkFDRSxZQUFZLEVBQUU7b0JBQ1osT0FBTyxFQUFFO3dCQUNQLGFBQWEsRUFBRTs0QkFDYixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7NEJBQ2hEO2dDQUNFLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLENBQUMsRUFBRTtnQ0FDdkQsUUFBUSxFQUFFLE1BQU07Z0NBQ2hCLE1BQU0sRUFBRSxRQUFROzZCQUNqQjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQWtCO1FBQ2pDLE9BQU8sUUFBUSxDQUFDLE1BQU07WUFDcEIsQ0FBQyxDQUFDO2dCQUNFLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekYsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2FBQzVEO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7Q0FDRjtBQXhFRCxvQ0F3RUMifQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Projection } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Model, PipelineStage } from 'mongoose';
|
|
3
|
-
import
|
|
3
|
+
import { Stack } from '../../types';
|
|
4
4
|
/**
|
|
5
5
|
* When using the `asModel` options, users can request/filter on the virtual _id and parentId fields
|
|
6
6
|
* of children (using the generated OneToOne relation).
|
|
@@ -15,7 +15,7 @@ import MongooseSchema from '../../mongoose/schema';
|
|
|
15
15
|
* injected to save resources.
|
|
16
16
|
*/
|
|
17
17
|
export default class VirtualFieldsGenerator {
|
|
18
|
-
static addVirtual(model: Model<unknown>,
|
|
19
|
-
static
|
|
18
|
+
static addVirtual(model: Model<unknown>, stack: Stack, projection: Projection): PipelineStage[];
|
|
19
|
+
private static getPath;
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=virtual-fields.d.ts.map
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const schema_1 = __importDefault(require("../../mongoose/schema"));
|
|
7
3
|
/**
|
|
8
4
|
* When using the `asModel` options, users can request/filter on the virtual _id and parentId fields
|
|
9
5
|
* of children (using the generated OneToOne relation).
|
|
@@ -18,48 +14,41 @@ const schema_1 = __importDefault(require("../../mongoose/schema"));
|
|
|
18
14
|
* injected to save resources.
|
|
19
15
|
*/
|
|
20
16
|
class VirtualFieldsGenerator {
|
|
21
|
-
static addVirtual(model,
|
|
22
|
-
const schema = schema_1.default.fromModel(model).getSubSchema(prefix, true);
|
|
17
|
+
static addVirtual(model, stack, projection) {
|
|
23
18
|
const set = {};
|
|
24
|
-
for (const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
set[key] = value;
|
|
30
|
-
}
|
|
19
|
+
for (const colonField of projection) {
|
|
20
|
+
const field = colonField.replace(/:/g, '.');
|
|
21
|
+
const isFromOneToOne = stack[stack.length - 1].asModels.some(f => field.startsWith(`${f}.`));
|
|
22
|
+
if (isFromOneToOne) {
|
|
23
|
+
set[field] = this.getPath(field);
|
|
31
24
|
}
|
|
32
25
|
}
|
|
33
26
|
return Object.keys(set).length ? [{ $addFields: set }] : [];
|
|
34
27
|
}
|
|
35
|
-
static
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
static getPath(field) {
|
|
29
|
+
if (field.endsWith('._id')) {
|
|
30
|
+
const suffix = field.substring(0, field.length - 4);
|
|
31
|
+
return { $concat: [{ $toString: '$_id' }, `.${suffix}`] };
|
|
39
32
|
}
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
for (const [relation, subProjection] of Object.entries(projection.relations)) {
|
|
51
|
-
// If we're asking for data that is inside of this mongo document (and not a __manyToOne)
|
|
52
|
-
// This condition should be equivalent to `!relation.endWith('__manyToOne')` but we want
|
|
53
|
-
// to get rid of the fact that the code depends on the naming.
|
|
54
|
-
if (schema.fields[relation]) {
|
|
55
|
-
const subVirtuals = this.getVirtuals(`${path}.${relation}`, schema.getSubSchema(relation, true), subProjection);
|
|
56
|
-
for (const [key, value] of Object.entries(subVirtuals)) {
|
|
57
|
-
result[key] = value;
|
|
58
|
-
}
|
|
33
|
+
if (field.endsWith('.parentId')) {
|
|
34
|
+
if (field.split('.').length > 2) {
|
|
35
|
+
// Implementing this would require us to have knowledge of the value of asModel for
|
|
36
|
+
// for virtual models under the current one, which the `stack` variable does not have.
|
|
37
|
+
// If the expcetion causes issues we could simply return
|
|
38
|
+
// `$${field.substring(0, field.length - 9)}._id` but that would not work if the customer
|
|
39
|
+
// jumped over multiple levels of nesting.
|
|
40
|
+
// As this is a use case that never happens from the UI, and that can be worked around when
|
|
41
|
+
// using the API, we decided to not implement it.
|
|
42
|
+
throw new Error('Fetching virtual parentId deeper than 1 level is not supported.');
|
|
59
43
|
}
|
|
44
|
+
return '$_id';
|
|
45
|
+
}
|
|
46
|
+
if (field.endsWith('.content')) {
|
|
47
|
+
// FIXME: we should check that this is really a leaf field because "content" can't
|
|
48
|
+
// really be used as a reserved word
|
|
49
|
+
return `$${field.substring(0, field.length - 8)}`;
|
|
60
50
|
}
|
|
61
|
-
return result;
|
|
62
51
|
}
|
|
63
52
|
}
|
|
64
53
|
exports.default = VirtualFieldsGenerator;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1maWVsZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcGlwZWxpbmUvdmlydHVhbC1maWVsZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFxQixzQkFBc0I7SUFDekMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFxQixFQUFFLEtBQVksRUFBRSxVQUFzQjtRQUMzRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFZixLQUFLLE1BQU0sVUFBVSxJQUFJLFVBQVUsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU3RixJQUFJLGNBQWMsRUFBRTtnQkFDbEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEM7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWE7UUFDbEMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQzNEO1FBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQy9CLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixtRkFBbUY7Z0JBQ25GLHNGQUFzRjtnQkFFdEYsd0RBQXdEO2dCQUN4RCx5RkFBeUY7Z0JBQ3pGLDBDQUEwQztnQkFFMUMsMkZBQTJGO2dCQUMzRixpREFBaUQ7Z0JBRWpELE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQzthQUNwRjtZQUVELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDOUIsa0ZBQWtGO1lBQ2xGLG9DQUFvQztZQUNwQyxPQUFPLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztDQUNGO0FBL0NELHlDQStDQyJ9
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { CollectionSchema
|
|
1
|
+
import { CollectionSchema } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { Model } from 'mongoose';
|
|
3
|
+
import { Stack } from '../../types';
|
|
3
4
|
/** Generate forest admin schema from mongoose schema */
|
|
4
5
|
export default class FieldsGenerator {
|
|
5
|
-
static buildFieldsSchema(model: Model<
|
|
6
|
+
static buildFieldsSchema(model: Model<unknown>, stack?: Stack): CollectionSchema['fields'];
|
|
6
7
|
/** Fake primary key that will be used when we're flattening collections */
|
|
7
8
|
private static buildVirtualPrimaryKey;
|
|
8
9
|
private static buildManyToOne;
|