@goatlab/fluent 0.7.6 → 0.7.11
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/BaseConnector.d.ts +8 -31
- package/dist/BaseConnector.js +11 -104
- package/dist/FluentConnectorInterface.d.ts +17 -0
- package/dist/FluentConnectorInterface.js +2 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +8 -12
- package/dist/TypeOrmConnector/TypeOrmConnector.js +183 -546
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.d.ts +7 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoBaseAggregations.js +148 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoFindAggregatedQuery.js +34 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.d.ts +4 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoSelect.js +12 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/mongodb/getMongoWhere.js +166 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.d.ts +8 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getQueryBuilderWhere.js +200 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.d.ts +6 -0
- package/dist/TypeOrmConnector/queryBuilder/sql/getTypeOrmWhere.js +207 -0
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +164 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +3 -3
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +1 -1
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +1 -1
- package/dist/TypeOrmConnector/test/docker/docker.js +3 -4
- package/dist/TypeOrmConnector/test/docker/mongo.d.ts +16 -0
- package/dist/TypeOrmConnector/test/docker/mongo.js +93 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +1 -1
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +4 -2
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +6 -1
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +3 -2
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +3 -1
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +2 -2
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +2 -1
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -2
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +10 -1
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +1 -1
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +3 -2
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +3 -1
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +2 -2
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +2 -1
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +0 -1
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +0 -8
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.d.ts +511 -0
- package/dist/TypeOrmConnector/test/relations/car/car.output.schema.js +8 -0
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +4 -2
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +6 -1
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +2 -25
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +3 -8
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +1 -1
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +435 -35
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.d.ts +152 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.output.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +2 -25
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +2 -10
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -2
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +3 -1
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +2 -2
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +2 -1
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +465 -69
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +54 -5
- package/dist/TypeOrmConnector/util/clearEmpties.d.ts +1 -0
- package/dist/TypeOrmConnector/util/clearEmpties.js +25 -0
- package/dist/TypeOrmConnector/util/extractConditions.d.ts +6 -0
- package/dist/TypeOrmConnector/util/extractConditions.js +80 -0
- package/dist/TypeOrmConnector/util/extractInclude.d.ts +2 -0
- package/dist/TypeOrmConnector/util/extractInclude.js +25 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.d.ts +12 -0
- package/dist/TypeOrmConnector/util/extractMetadataFromKeys.js +42 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.d.ts +4 -0
- package/dist/TypeOrmConnector/util/extractOrderBy.js +18 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.d.ts +19 -0
- package/dist/TypeOrmConnector/util/getRelationsFromModelGenerator.js +26 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.d.ts +1 -0
- package/dist/TypeOrmConnector/util/getSelectedKeysFromRawSql.js +20 -0
- package/dist/TypeOrmConnector/util/isAnyObject.d.ts +1 -0
- package/dist/TypeOrmConnector/util/isAnyObject.js +7 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.d.ts +2 -0
- package/dist/TypeOrmConnector/util/nestQueryResults.js +31 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.js +15 -2
- package/dist/loadRelations.js +8 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +37 -20
- package/package.json +4 -3
- package/CHANGELOG.md +0 -1072
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +0 -4
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +0 -43
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AnyObject, FluentQuery } from '../../../types';
|
|
2
|
+
export interface getMongoBaseAggregationParams {
|
|
3
|
+
include: FluentQuery<AnyObject>['include'];
|
|
4
|
+
self: any;
|
|
5
|
+
alias?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const getMongoBaseAggregation: ({ include, self }: getMongoBaseAggregationParams) => any[];
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMongoBaseAggregation = void 0;
|
|
4
|
+
const getMongoWhere_1 = require("./getMongoWhere");
|
|
5
|
+
const getMongoBaseAggregation = ({ include, self }) => {
|
|
6
|
+
if (!include) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
const modelRelations = self.modelRelations;
|
|
10
|
+
const aggregations = [];
|
|
11
|
+
for (const relation of Object.keys(include)) {
|
|
12
|
+
if (!modelRelations[relation]) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const innerLookups = [];
|
|
16
|
+
const dbRelation = modelRelations[relation];
|
|
17
|
+
if (include[relation]['include']) {
|
|
18
|
+
const newSelf = self[relation] && self[relation]();
|
|
19
|
+
const innerRelations = (0, exports.getMongoBaseAggregation)({
|
|
20
|
+
include: include[relation]['include'],
|
|
21
|
+
self: newSelf
|
|
22
|
+
});
|
|
23
|
+
innerLookups.push(...innerRelations);
|
|
24
|
+
}
|
|
25
|
+
const where = (0, getMongoWhere_1.getMongoWhere)({
|
|
26
|
+
where: include[relation]['where']
|
|
27
|
+
});
|
|
28
|
+
if (dbRelation.isManyToOne) {
|
|
29
|
+
const localField = dbRelation.joinColumns[0].propertyPath;
|
|
30
|
+
aggregations.push({
|
|
31
|
+
$addFields: {
|
|
32
|
+
[`${localField}_object`]: { $toObjectId: `$${localField}` }
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
|
|
36
|
+
aggregations.push({
|
|
37
|
+
$lookup: {
|
|
38
|
+
from: dbRelation.tableName,
|
|
39
|
+
localField: `${localField}_object`,
|
|
40
|
+
foreignField: '_id',
|
|
41
|
+
as: dbRelation.propertyName,
|
|
42
|
+
pipeline: [
|
|
43
|
+
{
|
|
44
|
+
$match: where
|
|
45
|
+
},
|
|
46
|
+
{ $addFields: { id: { $toString: '$_id' } } },
|
|
47
|
+
...innerLookups
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
aggregations.push({
|
|
52
|
+
$unwind: {
|
|
53
|
+
path: `$${dbRelation.propertyName}`,
|
|
54
|
+
preserveNullAndEmptyArrays: true
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (dbRelation.isOneToMany) {
|
|
59
|
+
aggregations.push({ $addFields: { string_id: { $toString: '$_id' } } });
|
|
60
|
+
aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
|
|
61
|
+
aggregations.push({
|
|
62
|
+
$lookup: {
|
|
63
|
+
from: dbRelation.tableName,
|
|
64
|
+
localField: 'string_id',
|
|
65
|
+
foreignField: dbRelation.inverseSidePropertyPath,
|
|
66
|
+
as: dbRelation.propertyName,
|
|
67
|
+
pipeline: [
|
|
68
|
+
{
|
|
69
|
+
$match: where
|
|
70
|
+
},
|
|
71
|
+
{ $addFields: { id: { $toString: '$_id' } } },
|
|
72
|
+
...innerLookups
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (dbRelation.isManyToMany) {
|
|
78
|
+
const relatedTableName = dbRelation.tableName;
|
|
79
|
+
const pivotTableName = dbRelation.joinColumns[0].relationMetadata.joinTableName;
|
|
80
|
+
const pivotForeignField = dbRelation.joinColumns[0].propertyPath;
|
|
81
|
+
const inverseForeignField = dbRelation.inverseJoinColumns[0].propertyPath;
|
|
82
|
+
if (!relatedTableName ||
|
|
83
|
+
!pivotTableName ||
|
|
84
|
+
!pivotForeignField ||
|
|
85
|
+
!inverseForeignField) {
|
|
86
|
+
throw new Error(`Your many to many relation is not properly set up. Please check both your models and schema for relation: ${relation}`);
|
|
87
|
+
}
|
|
88
|
+
aggregations.push({ $addFields: { id: { $toString: '$_id' } } });
|
|
89
|
+
aggregations.push({
|
|
90
|
+
$addFields: { parent_string_id: { $toString: '$_id' } }
|
|
91
|
+
});
|
|
92
|
+
aggregations.push({
|
|
93
|
+
$lookup: {
|
|
94
|
+
from: pivotTableName,
|
|
95
|
+
localField: 'parent_string_id',
|
|
96
|
+
foreignField: pivotForeignField,
|
|
97
|
+
as: dbRelation.propertyName,
|
|
98
|
+
pipeline: [
|
|
99
|
+
{ $addFields: { id: { $toString: '$_id' } } },
|
|
100
|
+
{
|
|
101
|
+
$addFields: {
|
|
102
|
+
[`${inverseForeignField}_object`]: {
|
|
103
|
+
$toObjectId: `$${inverseForeignField}`
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
$lookup: {
|
|
109
|
+
from: relatedTableName,
|
|
110
|
+
localField: `${inverseForeignField}_object`,
|
|
111
|
+
foreignField: '_id',
|
|
112
|
+
pipeline: [
|
|
113
|
+
{
|
|
114
|
+
$match: where
|
|
115
|
+
},
|
|
116
|
+
{ $addFields: { id: { $toString: '$_id' } } }
|
|
117
|
+
],
|
|
118
|
+
as: dbRelation.propertyName
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
$unwind: {
|
|
123
|
+
path: `$${dbRelation.propertyName}`,
|
|
124
|
+
preserveNullAndEmptyArrays: true
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
$project: {
|
|
129
|
+
[dbRelation.propertyName]: `$${dbRelation.propertyName}`,
|
|
130
|
+
pivot: '$$ROOT'
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
$replaceRoot: {
|
|
135
|
+
newRoot: {
|
|
136
|
+
$mergeObjects: ['$$ROOT', `$${dbRelation.propertyName}`]
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{ $project: { [dbRelation.propertyName]: 0 } }
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return aggregations;
|
|
147
|
+
};
|
|
148
|
+
exports.getMongoBaseAggregation = getMongoBaseAggregation;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FluentQuery } from '../../../types';
|
|
2
|
+
export declare type getFindAggregateQueryParams<T extends FluentQuery<any>> = {
|
|
3
|
+
query?: T;
|
|
4
|
+
self?: any;
|
|
5
|
+
};
|
|
6
|
+
export declare const getMongoFindAggregatedQuery: ({ query, self }: getFindAggregateQueryParams<any>) => any[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMongoFindAggregatedQuery = void 0;
|
|
4
|
+
const getMongoBaseAggregations_1 = require("./getMongoBaseAggregations");
|
|
5
|
+
const getMongoSelect_1 = require("./getMongoSelect");
|
|
6
|
+
const getMongoWhere_1 = require("./getMongoWhere");
|
|
7
|
+
const getMongoFindAggregatedQuery = ({ query, self }) => {
|
|
8
|
+
const selected = (0, getMongoSelect_1.getMongoSelect)(query?.select);
|
|
9
|
+
const where = (0, getMongoWhere_1.getMongoWhere)({
|
|
10
|
+
where: query?.where
|
|
11
|
+
});
|
|
12
|
+
const baseAggregations = (0, getMongoBaseAggregations_1.getMongoBaseAggregation)({
|
|
13
|
+
include: query?.include,
|
|
14
|
+
self
|
|
15
|
+
});
|
|
16
|
+
const aggregate = [
|
|
17
|
+
{
|
|
18
|
+
$match: where
|
|
19
|
+
}
|
|
20
|
+
];
|
|
21
|
+
if (query?.limit) {
|
|
22
|
+
aggregate.push({ $limit: query.limit });
|
|
23
|
+
}
|
|
24
|
+
for (const lookup of baseAggregations) {
|
|
25
|
+
aggregate.push(lookup);
|
|
26
|
+
}
|
|
27
|
+
if (selected && Object.keys(selected).length) {
|
|
28
|
+
aggregate.push({
|
|
29
|
+
$project: selected
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return aggregate;
|
|
33
|
+
};
|
|
34
|
+
exports.getMongoFindAggregatedQuery = getMongoFindAggregatedQuery;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMongoSelect = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const getMongoSelect = (select) => {
|
|
6
|
+
const selected = js_utils_1.Objects.flatten(select || {});
|
|
7
|
+
for (const k of Object.keys(selected)) {
|
|
8
|
+
selected[k] = 1;
|
|
9
|
+
}
|
|
10
|
+
return selected;
|
|
11
|
+
};
|
|
12
|
+
exports.getMongoSelect = getMongoSelect;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FindManyOptions } from 'typeorm';
|
|
2
|
+
import { AnyObject, FluentQuery } from '../../../types';
|
|
3
|
+
export interface getTypeOrmMongoWhereParams {
|
|
4
|
+
where?: FluentQuery<AnyObject>['where'];
|
|
5
|
+
}
|
|
6
|
+
export declare const getMongoWhere: ({ where }: getTypeOrmMongoWhereParams) => FindManyOptions['where'];
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMongoWhere = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const clearEmpties_1 = require("../../util/clearEmpties");
|
|
6
|
+
const types_1 = require("../../../types");
|
|
7
|
+
const extractConditions_1 = require("../../util/extractConditions");
|
|
8
|
+
const getMongoWhere = ({ where }) => {
|
|
9
|
+
if (!where || Object.keys(where).length === 0) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
const Filters = {
|
|
13
|
+
where: { $or: [{ $and: [] }] }
|
|
14
|
+
};
|
|
15
|
+
const orConditions = (0, extractConditions_1.extractConditions)(where['OR']);
|
|
16
|
+
const andConditions = (0, extractConditions_1.extractConditions)(where['AND']);
|
|
17
|
+
const copy = js_utils_1.Objects.clone(where);
|
|
18
|
+
if (!!copy['AND']) {
|
|
19
|
+
delete copy['AND'];
|
|
20
|
+
}
|
|
21
|
+
if (!!copy['OR']) {
|
|
22
|
+
delete copy['OR'];
|
|
23
|
+
}
|
|
24
|
+
const rootLevelConditions = (0, extractConditions_1.extractConditions)([copy]);
|
|
25
|
+
for (const condition of andConditions) {
|
|
26
|
+
let { element, operator, value } = condition;
|
|
27
|
+
if (element === 'id') {
|
|
28
|
+
element = '_id';
|
|
29
|
+
value = (Array.isArray(value)
|
|
30
|
+
? value.map(v => js_utils_1.Ids.objectID(v))
|
|
31
|
+
: js_utils_1.Ids.objectID(value));
|
|
32
|
+
}
|
|
33
|
+
switch (operator) {
|
|
34
|
+
case types_1.LogicOperator.equals:
|
|
35
|
+
Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
|
|
36
|
+
break;
|
|
37
|
+
case types_1.LogicOperator.isNot:
|
|
38
|
+
Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
|
|
39
|
+
break;
|
|
40
|
+
case types_1.LogicOperator.greaterThan:
|
|
41
|
+
Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
|
|
42
|
+
break;
|
|
43
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
44
|
+
Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
|
|
45
|
+
break;
|
|
46
|
+
case types_1.LogicOperator.lessThan:
|
|
47
|
+
Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
|
|
48
|
+
break;
|
|
49
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
50
|
+
Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
|
|
51
|
+
break;
|
|
52
|
+
case types_1.LogicOperator.in:
|
|
53
|
+
Filters.where.$or[0].$and.push({ [element]: { $in: value } });
|
|
54
|
+
break;
|
|
55
|
+
case types_1.LogicOperator.notIn:
|
|
56
|
+
Filters.where.$or[0].$and.push({
|
|
57
|
+
[element]: { $not: { $in: value } }
|
|
58
|
+
});
|
|
59
|
+
break;
|
|
60
|
+
case types_1.LogicOperator.exists:
|
|
61
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
|
|
62
|
+
break;
|
|
63
|
+
case types_1.LogicOperator.notExists:
|
|
64
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
|
|
65
|
+
break;
|
|
66
|
+
case types_1.LogicOperator.regexp:
|
|
67
|
+
Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
for (const condition of rootLevelConditions) {
|
|
72
|
+
let { element, operator, value } = condition;
|
|
73
|
+
if (element === 'id') {
|
|
74
|
+
element = '_id';
|
|
75
|
+
value = (Array.isArray(value)
|
|
76
|
+
? value.map(v => js_utils_1.Ids.objectID(v))
|
|
77
|
+
: js_utils_1.Ids.objectID(value));
|
|
78
|
+
}
|
|
79
|
+
switch (operator) {
|
|
80
|
+
case types_1.LogicOperator.equals:
|
|
81
|
+
Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
|
|
82
|
+
break;
|
|
83
|
+
case types_1.LogicOperator.isNot:
|
|
84
|
+
Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
|
|
85
|
+
break;
|
|
86
|
+
case types_1.LogicOperator.greaterThan:
|
|
87
|
+
Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
|
|
88
|
+
break;
|
|
89
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
90
|
+
Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
|
|
91
|
+
break;
|
|
92
|
+
case types_1.LogicOperator.lessThan:
|
|
93
|
+
Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
|
|
94
|
+
break;
|
|
95
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
96
|
+
Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
|
|
97
|
+
break;
|
|
98
|
+
case types_1.LogicOperator.in:
|
|
99
|
+
Filters.where.$or[0].$and.push({ [element]: { $in: value } });
|
|
100
|
+
break;
|
|
101
|
+
case types_1.LogicOperator.notIn:
|
|
102
|
+
Filters.where.$or[0].$and.push({
|
|
103
|
+
[element]: { $not: { $in: value } }
|
|
104
|
+
});
|
|
105
|
+
break;
|
|
106
|
+
case types_1.LogicOperator.exists:
|
|
107
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
|
|
108
|
+
break;
|
|
109
|
+
case types_1.LogicOperator.notExists:
|
|
110
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
|
|
111
|
+
break;
|
|
112
|
+
case types_1.LogicOperator.regexp:
|
|
113
|
+
Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const condition of orConditions) {
|
|
118
|
+
let { element, operator, value } = condition;
|
|
119
|
+
if (element === 'id') {
|
|
120
|
+
element = '_id';
|
|
121
|
+
value = (Array.isArray(value)
|
|
122
|
+
? value.map(v => js_utils_1.Ids.objectID(v))
|
|
123
|
+
: js_utils_1.Ids.objectID(value));
|
|
124
|
+
}
|
|
125
|
+
switch (operator) {
|
|
126
|
+
case types_1.LogicOperator.equals:
|
|
127
|
+
Filters.where.$or.push({ [element]: { $eq: value } });
|
|
128
|
+
break;
|
|
129
|
+
case types_1.LogicOperator.isNot:
|
|
130
|
+
Filters.where.$or.push({ [element]: { $neq: value } });
|
|
131
|
+
break;
|
|
132
|
+
case types_1.LogicOperator.greaterThan:
|
|
133
|
+
Filters.where.$or.push({ [element]: { $gt: value } });
|
|
134
|
+
break;
|
|
135
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
136
|
+
Filters.where.$or.push({ [element]: { $gte: value } });
|
|
137
|
+
break;
|
|
138
|
+
case types_1.LogicOperator.lessThan:
|
|
139
|
+
Filters.where.$or.push({ [element]: { $lt: value } });
|
|
140
|
+
break;
|
|
141
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
142
|
+
Filters.where.$or.push({ [element]: { $lte: value } });
|
|
143
|
+
break;
|
|
144
|
+
case types_1.LogicOperator.in:
|
|
145
|
+
Filters.where.$or.push({ [element]: { $in: value } });
|
|
146
|
+
break;
|
|
147
|
+
case types_1.LogicOperator.notIn:
|
|
148
|
+
Filters.where.$or.push({
|
|
149
|
+
[element]: { $not: { $in: value } }
|
|
150
|
+
});
|
|
151
|
+
break;
|
|
152
|
+
case types_1.LogicOperator.exists:
|
|
153
|
+
Filters.where.$or.push({ [element]: { $exists: true } });
|
|
154
|
+
break;
|
|
155
|
+
case types_1.LogicOperator.notExists:
|
|
156
|
+
Filters.where.$or.push({ [element]: { $exists: false } });
|
|
157
|
+
break;
|
|
158
|
+
case types_1.LogicOperator.regexp:
|
|
159
|
+
Filters.where.$or.push({ [element]: { $regex: value } });
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const filtered = (0, clearEmpties_1.clearEmpties)(Filters.where);
|
|
164
|
+
return filtered;
|
|
165
|
+
};
|
|
166
|
+
exports.getMongoWhere = getMongoWhere;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SelectQueryBuilder } from 'typeorm';
|
|
2
|
+
import { AnyObject, FluentQuery } from '../../../types';
|
|
3
|
+
export interface getQueryBuilderWhereParams {
|
|
4
|
+
where?: FluentQuery<AnyObject>['where'];
|
|
5
|
+
queryBuilder: SelectQueryBuilder<any>;
|
|
6
|
+
queryAlias: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const getQueryBuilderWhere: ({ where, queryAlias, queryBuilder }: getQueryBuilderWhereParams) => SelectQueryBuilder<any>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getQueryBuilderWhere = void 0;
|
|
4
|
+
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const extractConditions_1 = require("../../util/extractConditions");
|
|
7
|
+
const types_1 = require("../../../types");
|
|
8
|
+
const queryId = js_utils_1.Ids.customId('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
|
|
9
|
+
const getQueryBuilderWhere = ({ where, queryAlias, queryBuilder }) => {
|
|
10
|
+
if (!where || Object.keys(where).length === 0) {
|
|
11
|
+
return queryBuilder;
|
|
12
|
+
}
|
|
13
|
+
const orConditions = (0, extractConditions_1.extractConditions)(where['OR']);
|
|
14
|
+
const andConditions = (0, extractConditions_1.extractConditions)(where['AND']);
|
|
15
|
+
const copy = js_utils_1.Objects.clone(where);
|
|
16
|
+
if (!!copy['AND']) {
|
|
17
|
+
delete copy['AND'];
|
|
18
|
+
}
|
|
19
|
+
if (!!copy['OR']) {
|
|
20
|
+
delete copy['OR'];
|
|
21
|
+
}
|
|
22
|
+
const rootLevelConditions = (0, extractConditions_1.extractConditions)([copy]);
|
|
23
|
+
queryBuilder.andWhere(new typeorm_1.Brackets(qbAnd => {
|
|
24
|
+
for (const condition of andConditions) {
|
|
25
|
+
const { element, operator, value } = condition;
|
|
26
|
+
const customId = queryId(4);
|
|
27
|
+
switch (operator) {
|
|
28
|
+
case types_1.LogicOperator.equals:
|
|
29
|
+
qbAnd.andWhere(`${queryAlias}.${element} = :${element}_${customId}`, {
|
|
30
|
+
[`${element}_${customId}`]: value
|
|
31
|
+
});
|
|
32
|
+
break;
|
|
33
|
+
case types_1.LogicOperator.isNot:
|
|
34
|
+
qbAnd.andWhere(`${queryAlias}.${element} != :${element}_${customId}`, {
|
|
35
|
+
[`${element}_${customId}`]: value
|
|
36
|
+
});
|
|
37
|
+
break;
|
|
38
|
+
case types_1.LogicOperator.greaterThan:
|
|
39
|
+
qbAnd.andWhere(`${queryAlias}.${element} > :${element}_${customId}`, {
|
|
40
|
+
[`${element}_${customId}`]: value
|
|
41
|
+
});
|
|
42
|
+
break;
|
|
43
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
44
|
+
qbAnd.andWhere(`${queryAlias}.${element} >= :${element}_${customId}`, {
|
|
45
|
+
[`${element}_${customId}`]: value
|
|
46
|
+
});
|
|
47
|
+
break;
|
|
48
|
+
case types_1.LogicOperator.lessThan:
|
|
49
|
+
qbAnd.andWhere(`${queryAlias}.${element} < :${element}_${customId}`, {
|
|
50
|
+
[`${element}_${customId}`]: value
|
|
51
|
+
});
|
|
52
|
+
break;
|
|
53
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
54
|
+
qbAnd.andWhere(`${queryAlias}.${element} <= :${element}_${customId}`, {
|
|
55
|
+
[`${element}_${customId}`]: value
|
|
56
|
+
});
|
|
57
|
+
break;
|
|
58
|
+
case types_1.LogicOperator.in:
|
|
59
|
+
qbAnd.andWhere(`${queryAlias}.${element} IN :${element}_${customId}`, {
|
|
60
|
+
[`${element}_${customId}`]: value
|
|
61
|
+
});
|
|
62
|
+
break;
|
|
63
|
+
case types_1.LogicOperator.notIn:
|
|
64
|
+
qbAnd.andWhere(`${queryAlias}.${element} NOT IN :${element}_${customId}`, {
|
|
65
|
+
[`${element}_${customId}`]: value
|
|
66
|
+
});
|
|
67
|
+
break;
|
|
68
|
+
case types_1.LogicOperator.exists:
|
|
69
|
+
qbAnd.andWhere(`${queryAlias}.${element} IS NOT NULL`);
|
|
70
|
+
break;
|
|
71
|
+
case types_1.LogicOperator.notExists:
|
|
72
|
+
qbAnd.andWhere(`${queryAlias}.${element} IS NULL`);
|
|
73
|
+
break;
|
|
74
|
+
case types_1.LogicOperator.regexp:
|
|
75
|
+
qbAnd.andWhere(`${queryAlias}.${element} LIKE :${element}_${customId}`, {
|
|
76
|
+
[`${element}_${customId}`]: value
|
|
77
|
+
});
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const condition of rootLevelConditions) {
|
|
82
|
+
const { element, operator, value } = condition;
|
|
83
|
+
const customId = queryId(4);
|
|
84
|
+
switch (operator) {
|
|
85
|
+
case types_1.LogicOperator.equals:
|
|
86
|
+
qbAnd.andWhere(`${queryAlias}.${element} = :${element}_${customId}`, {
|
|
87
|
+
[`${element}_${customId}`]: value
|
|
88
|
+
});
|
|
89
|
+
break;
|
|
90
|
+
case types_1.LogicOperator.isNot:
|
|
91
|
+
qbAnd.andWhere(`${queryAlias}.${element} != :${element}_${customId}`, {
|
|
92
|
+
[`${element}_${customId}`]: value
|
|
93
|
+
});
|
|
94
|
+
break;
|
|
95
|
+
case types_1.LogicOperator.greaterThan:
|
|
96
|
+
qbAnd.andWhere(`${queryAlias}.${element} > :${element}_${customId}`, {
|
|
97
|
+
[`${element}_${customId}`]: value
|
|
98
|
+
});
|
|
99
|
+
break;
|
|
100
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
101
|
+
qbAnd.andWhere(`${queryAlias}.${element} >= :${element}_${customId}`, {
|
|
102
|
+
[`${element}_${customId}`]: value
|
|
103
|
+
});
|
|
104
|
+
break;
|
|
105
|
+
case types_1.LogicOperator.lessThan:
|
|
106
|
+
qbAnd.andWhere(`${queryAlias}.${element} < :${element}_${customId}`, {
|
|
107
|
+
[`${element}_${customId}`]: value
|
|
108
|
+
});
|
|
109
|
+
break;
|
|
110
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
111
|
+
qbAnd.andWhere(`${queryAlias}.${element} <= :${element}_${customId}`, {
|
|
112
|
+
[`${element}_${customId}`]: value
|
|
113
|
+
});
|
|
114
|
+
break;
|
|
115
|
+
case types_1.LogicOperator.in:
|
|
116
|
+
qbAnd.andWhere(`${queryAlias}.${element} IN :${element}_${customId}`, {
|
|
117
|
+
[`${element}_${customId}`]: value
|
|
118
|
+
});
|
|
119
|
+
break;
|
|
120
|
+
case types_1.LogicOperator.notIn:
|
|
121
|
+
qbAnd.andWhere(`${queryAlias}.${element} NOT IN :${element}_${customId}`, {
|
|
122
|
+
[`${element}_${customId}`]: value
|
|
123
|
+
});
|
|
124
|
+
break;
|
|
125
|
+
case types_1.LogicOperator.exists:
|
|
126
|
+
qbAnd.andWhere(`${queryAlias}.${element} IS NOT NULL`);
|
|
127
|
+
break;
|
|
128
|
+
case types_1.LogicOperator.notExists:
|
|
129
|
+
qbAnd.andWhere(`${queryAlias}.${element} IS NULL`);
|
|
130
|
+
break;
|
|
131
|
+
case types_1.LogicOperator.regexp:
|
|
132
|
+
qbAnd.andWhere(`${queryAlias}.${element} LIKE :${element}_${customId}`, {
|
|
133
|
+
[`${element}_${customId}`]: value
|
|
134
|
+
});
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
qbAnd.andWhere(new typeorm_1.Brackets(qbOr => {
|
|
139
|
+
for (const condition of orConditions) {
|
|
140
|
+
const { element, operator, value } = condition;
|
|
141
|
+
const customId = queryId(4);
|
|
142
|
+
switch (operator) {
|
|
143
|
+
case types_1.LogicOperator.equals:
|
|
144
|
+
qbOr.andWhere(`${queryAlias}.${element} = :${element}_${customId}`, {
|
|
145
|
+
[`${element}_${customId}`]: value
|
|
146
|
+
});
|
|
147
|
+
break;
|
|
148
|
+
case types_1.LogicOperator.isNot:
|
|
149
|
+
qbOr.andWhere(`${queryAlias}.${element} != :${element}_${customId}`, {
|
|
150
|
+
[`${element}_${customId}`]: value
|
|
151
|
+
});
|
|
152
|
+
break;
|
|
153
|
+
case types_1.LogicOperator.greaterThan:
|
|
154
|
+
qbOr.andWhere(`${queryAlias}.${element} > :${element}_${customId}`, {
|
|
155
|
+
[`${element}_${customId}`]: value
|
|
156
|
+
});
|
|
157
|
+
break;
|
|
158
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
159
|
+
qbOr.andWhere(`${queryAlias}.${element} >= :${element}_${customId}`, {
|
|
160
|
+
[`${element}_${customId}`]: value
|
|
161
|
+
});
|
|
162
|
+
break;
|
|
163
|
+
case types_1.LogicOperator.lessThan:
|
|
164
|
+
qbOr.andWhere(`${queryAlias}.${element} < :${element}_${customId}`, {
|
|
165
|
+
[`${element}_${customId}`]: value
|
|
166
|
+
});
|
|
167
|
+
break;
|
|
168
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
169
|
+
qbOr.andWhere(`${queryAlias}.${element} <= :${element}_${customId}`, {
|
|
170
|
+
[`${element}_${customId}`]: value
|
|
171
|
+
});
|
|
172
|
+
break;
|
|
173
|
+
case types_1.LogicOperator.in:
|
|
174
|
+
qbOr.andWhere(`${queryAlias}.${element} IN :${element}_${customId}`, {
|
|
175
|
+
[`${element}_${customId}`]: value
|
|
176
|
+
});
|
|
177
|
+
break;
|
|
178
|
+
case types_1.LogicOperator.notIn:
|
|
179
|
+
qbOr.andWhere(`${queryAlias}.${element} NOT IN :${element}_${customId}`, {
|
|
180
|
+
[`${element}_${customId}`]: value
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
case types_1.LogicOperator.exists:
|
|
184
|
+
qbOr.andWhere(`${queryAlias}.${element} IS NOT NULL`);
|
|
185
|
+
break;
|
|
186
|
+
case types_1.LogicOperator.notExists:
|
|
187
|
+
qbOr.andWhere(`${queryAlias}.${element} IS NULL`);
|
|
188
|
+
break;
|
|
189
|
+
case types_1.LogicOperator.regexp:
|
|
190
|
+
qbOr.andWhere(`${queryAlias}.${element} LIKE :${element}_${customId}`, {
|
|
191
|
+
[`${element}_${customId}`]: value
|
|
192
|
+
});
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}));
|
|
197
|
+
}));
|
|
198
|
+
return queryBuilder;
|
|
199
|
+
};
|
|
200
|
+
exports.getQueryBuilderWhere = getQueryBuilderWhere;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FindManyOptions } from 'typeorm';
|
|
2
|
+
import { AnyObject, FluentQuery } from '../../../types';
|
|
3
|
+
export interface getTypeOrmWhereParams {
|
|
4
|
+
where?: FluentQuery<AnyObject>['where'];
|
|
5
|
+
}
|
|
6
|
+
export declare const getTypeOrmWhere: ({ where }: getTypeOrmWhereParams) => FindManyOptions['where'];
|