@abedmurrar/objection 4.0.0-alpha.0 → 4.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -67
- package/lib/index.mjs +6 -0
- package/lib/initialize.js +6 -9
- package/lib/model/AjvValidator.js +235 -282
- package/lib/model/Model.js +653 -823
- package/lib/model/ModifierNotFoundError.js +5 -7
- package/lib/model/NotFoundError.js +14 -18
- package/lib/model/RelationDoesNotExistError.js +6 -9
- package/lib/model/ValidationError.js +33 -41
- package/lib/model/Validator.js +15 -21
- package/lib/model/getModel.js +1 -3
- package/lib/model/graph/ModelGraph.js +44 -64
- package/lib/model/graph/ModelGraphBuilder.js +164 -217
- package/lib/model/graph/ModelGraphEdge.js +31 -43
- package/lib/model/graph/ModelGraphNode.js +192 -231
- package/lib/model/inheritModel.js +9 -18
- package/lib/model/modelBindKnex.js +48 -62
- package/lib/model/modelClone.js +79 -98
- package/lib/model/modelColPropMap.js +16 -26
- package/lib/model/modelConcurrency.js +24 -0
- package/lib/model/modelId.js +44 -49
- package/lib/model/modelJsonAttributes.js +56 -76
- package/lib/model/modelParseRelations.js +68 -67
- package/lib/model/modelQueryProps.js +76 -107
- package/lib/model/modelSet.js +92 -112
- package/lib/model/modelTableMetadata.js +60 -72
- package/lib/model/modelToJson.js +120 -150
- package/lib/model/modelUtils.js +30 -37
- package/lib/model/modelValidate.js +34 -42
- package/lib/model/modelValues.js +78 -91
- package/lib/model/modelVisitor.js +22 -29
- package/lib/objection.js +42 -67
- package/lib/queryBuilder/FunctionBuilder.js +231 -279
- package/lib/queryBuilder/InternalOptions.js +19 -24
- package/lib/queryBuilder/JoinBuilder.js +116 -149
- package/lib/queryBuilder/QueryBuilder.js +1009 -1271
- package/lib/queryBuilder/QueryBuilderBase.js +647 -865
- package/lib/queryBuilder/QueryBuilderContext.js +14 -21
- package/lib/queryBuilder/QueryBuilderContextBase.js +20 -29
- package/lib/queryBuilder/QueryBuilderOperationSupport.js +462 -536
- package/lib/queryBuilder/QueryBuilderUserContext.js +19 -25
- package/lib/queryBuilder/RawBuilder.js +58 -73
- package/lib/queryBuilder/ReferenceBuilder.js +232 -270
- package/lib/queryBuilder/RelationExpression.js +322 -380
- package/lib/queryBuilder/StaticHookArguments.js +94 -106
- package/lib/queryBuilder/ValueBuilder.js +100 -112
- package/lib/queryBuilder/expressions.js +86 -116
- package/lib/queryBuilder/functions/mysql.js +642 -697
- package/lib/queryBuilder/graph/GraphAction.js +44 -59
- package/lib/queryBuilder/graph/GraphData.js +7 -9
- package/lib/queryBuilder/graph/GraphFetcher.js +115 -151
- package/lib/queryBuilder/graph/GraphNodeDbExistence.js +114 -152
- package/lib/queryBuilder/graph/GraphOperation.js +16 -22
- package/lib/queryBuilder/graph/GraphOptions.js +143 -185
- package/lib/queryBuilder/graph/GraphUpsert.js +167 -241
- package/lib/queryBuilder/graph/delete/GraphDelete.js +8 -13
- package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +44 -62
- package/lib/queryBuilder/graph/insert/GraphInsert.js +99 -128
- package/lib/queryBuilder/graph/insert/GraphInsertAction.js +151 -193
- package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +57 -79
- package/lib/queryBuilder/graph/patch/GraphPatch.js +8 -13
- package/lib/queryBuilder/graph/patch/GraphPatchAction.js +181 -234
- package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +16 -21
- package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +80 -110
- package/lib/queryBuilder/join/JoinResultColumn.js +14 -18
- package/lib/queryBuilder/join/JoinResultParser.js +88 -101
- package/lib/queryBuilder/join/RelationJoiner.js +205 -288
- package/lib/queryBuilder/join/TableNode.js +117 -144
- package/lib/queryBuilder/join/TableTree.js +60 -76
- package/lib/queryBuilder/join/utils.js +10 -16
- package/lib/queryBuilder/operations/DelegateOperation.js +93 -133
- package/lib/queryBuilder/operations/DeleteOperation.js +33 -37
- package/lib/queryBuilder/operations/FindByIdOperation.js +20 -28
- package/lib/queryBuilder/operations/FindByIdsOperation.js +17 -23
- package/lib/queryBuilder/operations/FindOperation.js +114 -131
- package/lib/queryBuilder/operations/FirstOperation.js +14 -19
- package/lib/queryBuilder/operations/FromOperation.js +69 -88
- package/lib/queryBuilder/operations/InsertAndFetchOperation.js +28 -39
- package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +25 -35
- package/lib/queryBuilder/operations/InsertGraphOperation.js +77 -98
- package/lib/queryBuilder/operations/InsertOperation.js +132 -165
- package/lib/queryBuilder/operations/InstanceDeleteOperation.js +27 -36
- package/lib/queryBuilder/operations/InstanceFindOperation.js +9 -13
- package/lib/queryBuilder/operations/InstanceInsertOperation.js +13 -17
- package/lib/queryBuilder/operations/InstanceUpdateOperation.js +32 -46
- package/lib/queryBuilder/operations/JoinRelatedOperation.js +66 -86
- package/lib/queryBuilder/operations/KnexOperation.js +4 -7
- package/lib/queryBuilder/operations/MergeOperation.js +32 -45
- package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +131 -150
- package/lib/queryBuilder/operations/OnBuildKnexOperation.js +17 -23
- package/lib/queryBuilder/operations/OnBuildOperation.js +17 -23
- package/lib/queryBuilder/operations/OnErrorOperation.js +17 -23
- package/lib/queryBuilder/operations/QueryBuilderOperation.js +231 -270
- package/lib/queryBuilder/operations/RangeOperation.js +30 -40
- package/lib/queryBuilder/operations/RelateOperation.js +14 -21
- package/lib/queryBuilder/operations/ReturningOperation.js +12 -18
- package/lib/queryBuilder/operations/RunAfterOperation.js +17 -23
- package/lib/queryBuilder/operations/RunBeforeOperation.js +17 -23
- package/lib/queryBuilder/operations/UnrelateOperation.js +12 -17
- package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +48 -65
- package/lib/queryBuilder/operations/UpdateOperation.js +104 -129
- package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +25 -35
- package/lib/queryBuilder/operations/UpsertGraphOperation.js +36 -55
- package/lib/queryBuilder/operations/WhereCompositeOperation.js +30 -39
- package/lib/queryBuilder/operations/WhereInOperation.js +34 -36
- package/lib/queryBuilder/operations/eager/EagerOperation.js +37 -52
- package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +34 -44
- package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +4 -7
- package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +193 -251
- package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +18 -25
- package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectOperation.js +25 -41
- package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +19 -20
- package/lib/queryBuilder/operations/jsonApi/WhereJsonOverlapsOperation.js +23 -21
- package/lib/queryBuilder/operations/jsonApi/mysqlJsonApi.js +106 -118
- package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +79 -108
- package/lib/queryBuilder/operations/select/SelectOperation.js +37 -53
- package/lib/queryBuilder/operations/select/Selection.js +94 -105
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +68 -101
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +65 -75
- package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +75 -84
- package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +760 -859
- package/lib/queryBuilder/parsers/relationExpressionParser.js +840 -952
- package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +10 -15
- package/lib/queryBuilder/transformations/QueryTransformation.js +4 -6
- package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +35 -49
- package/lib/queryBuilder/transformations/index.js +3 -9
- package/lib/queryBuilder/whereScopes.js +158 -186
- package/lib/relations/Relation.js +293 -375
- package/lib/relations/RelationDeleteOperation.js +24 -28
- package/lib/relations/RelationFindOperation.js +108 -138
- package/lib/relations/RelationInsertOperation.js +24 -32
- package/lib/relations/RelationOwner.js +175 -209
- package/lib/relations/RelationProperty.js +186 -223
- package/lib/relations/RelationUpdateOperation.js +23 -29
- package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +16 -21
- package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +30 -41
- package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +36 -47
- package/lib/relations/belongsToOne/BelongsToOneRelation.js +42 -50
- package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +43 -58
- package/lib/relations/hasMany/HasManyInsertOperation.js +40 -56
- package/lib/relations/hasMany/HasManyRelateOperation.js +45 -61
- package/lib/relations/hasMany/HasManyRelation.js +38 -46
- package/lib/relations/hasMany/HasManyUnrelateOperation.js +25 -32
- package/lib/relations/hasOne/HasOneRelation.js +9 -12
- package/lib/relations/hasOneThrough/HasOneThroughRelation.js +9 -12
- package/lib/relations/manyToMany/ManyToManyModifyMixin.js +73 -95
- package/lib/relations/manyToMany/ManyToManyRelation.js +374 -473
- package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +23 -30
- package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +8 -10
- package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +20 -25
- package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +8 -12
- package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +77 -100
- package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +37 -49
- package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +58 -74
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +10 -13
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +26 -33
- package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +10 -15
- package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +8 -10
- package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +61 -78
- package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +8 -12
- package/lib/transaction.js +53 -83
- package/lib/utils/assert.js +15 -21
- package/lib/utils/buildUtils.js +17 -19
- package/lib/utils/classUtils.js +7 -11
- package/lib/utils/cloneDeep.js +365 -0
- package/lib/utils/createModifier.js +36 -41
- package/lib/utils/deprecate.js +8 -12
- package/lib/utils/identifierMapping.js +153 -192
- package/lib/utils/internalPropUtils.js +4 -8
- package/lib/utils/knexUtils.js +61 -56
- package/lib/utils/mixin.js +16 -23
- package/lib/utils/mysqlJsonPath.js +55 -40
- package/lib/utils/normalizeIds.js +110 -127
- package/lib/utils/objectUtils.js +236 -338
- package/lib/utils/parseFieldExpression.js +66 -44
- package/lib/utils/postgresJsonPath.js +48 -62
- package/lib/utils/promiseUtils/after.js +10 -13
- package/lib/utils/promiseUtils/afterReturn.js +10 -13
- package/lib/utils/promiseUtils/index.js +15 -17
- package/lib/utils/promiseUtils/isPromise.js +6 -9
- package/lib/utils/promiseUtils/map.js +75 -89
- package/lib/utils/promiseUtils/mapAfterAllReturn.js +17 -23
- package/lib/utils/promiseUtils/try.js +15 -18
- package/lib/utils/resolveModel.js +91 -94
- package/lib/utils/tmpColumnUtils.js +4 -13
- package/package.json +50 -23
- package/typings/objection/index.d.mts +362 -0
- package/typings/objection/index.d.ts +36 -9
- package/lib/.eslintrc.json +0 -8
- package/lib/queryBuilder/parsers/jsonFieldExpressionParser.pegjs +0 -97
- package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +0 -141
- package/lib/utils/clone.js +0 -2329
package/lib/model/modelClone.js
CHANGED
|
@@ -1,121 +1,102 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
2
|
const { isObject, cloneDeep } = require('../utils/objectUtils');
|
|
4
3
|
const { hiddenProps } = require('./modelUtils');
|
|
5
4
|
const { defineNonEnumerableProperty } = require('./modelUtils');
|
|
6
5
|
const { isInternalProp } = require('../utils/internalPropUtils');
|
|
7
|
-
|
|
8
6
|
function clone(model, shallow, stripInternal) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
clone
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
clone = copyHiddenProps(model, clone);
|
|
29
|
-
return clone;
|
|
7
|
+
let clone = null;
|
|
8
|
+
const omitFromJson = model.$omitFromJson();
|
|
9
|
+
const omitFromDatabaseJson = model.$omitFromDatabaseJson();
|
|
10
|
+
if (!shallow && !stripInternal) {
|
|
11
|
+
clone = cloneSimple(model);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
clone = cloneWithOpt(model, shallow, stripInternal);
|
|
15
|
+
}
|
|
16
|
+
if (omitFromJson) {
|
|
17
|
+
clone.$omitFromJson(omitFromJson);
|
|
18
|
+
}
|
|
19
|
+
if (omitFromDatabaseJson) {
|
|
20
|
+
clone.$omitFromDatabaseJson(omitFromDatabaseJson);
|
|
21
|
+
}
|
|
22
|
+
clone = copyHiddenProps(model, clone);
|
|
23
|
+
return clone;
|
|
30
24
|
}
|
|
31
|
-
|
|
32
25
|
function cloneSimple(model) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
26
|
+
const clone = new model.constructor();
|
|
27
|
+
const keys = Object.keys(model);
|
|
28
|
+
for (let i = 0, l = keys.length; i < l; ++i) {
|
|
29
|
+
const key = keys[i];
|
|
30
|
+
const value = model[key];
|
|
31
|
+
if (isObject(value)) {
|
|
32
|
+
clone[key] = cloneObject(value);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
clone[key] = value;
|
|
36
|
+
}
|
|
44
37
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return clone;
|
|
38
|
+
return clone;
|
|
48
39
|
}
|
|
49
|
-
|
|
50
40
|
function cloneWithOpt(model, shallow, stripInternal) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
41
|
+
const clone = new model.constructor();
|
|
42
|
+
const keys = Object.keys(model);
|
|
43
|
+
const relationNames = model.constructor.getRelationNames();
|
|
44
|
+
for (let i = 0, l = keys.length; i < l; ++i) {
|
|
45
|
+
const key = keys[i];
|
|
46
|
+
const value = model[key];
|
|
47
|
+
if (shallow && relationNames.includes(key)) {
|
|
48
|
+
// The constructor may have given default values for relations.
|
|
49
|
+
delete clone[key];
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (stripInternal && isInternalProp(key)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (isObject(value)) {
|
|
56
|
+
clone[key] = cloneObject(value);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
clone[key] = value;
|
|
60
|
+
}
|
|
67
61
|
}
|
|
68
|
-
|
|
69
|
-
if (isObject(value)) {
|
|
70
|
-
clone[key] = cloneObject(value);
|
|
71
|
-
} else {
|
|
72
|
-
clone[key] = value;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return clone;
|
|
62
|
+
return clone;
|
|
77
63
|
}
|
|
78
|
-
|
|
79
64
|
function cloneObject(value) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
65
|
+
if (Array.isArray(value)) {
|
|
66
|
+
return cloneArray(value);
|
|
67
|
+
}
|
|
68
|
+
else if (value.$isObjectionModel) {
|
|
69
|
+
return clone(value, false, false);
|
|
70
|
+
}
|
|
71
|
+
else if (Buffer.isBuffer(value)) {
|
|
72
|
+
return Buffer.from(value);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return cloneDeep(value);
|
|
76
|
+
}
|
|
89
77
|
}
|
|
90
|
-
|
|
91
78
|
function cloneArray(value) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
79
|
+
const ret = new Array(value.length);
|
|
80
|
+
for (let i = 0, l = ret.length; i < l; ++i) {
|
|
81
|
+
const item = value[i];
|
|
82
|
+
if (isObject(item)) {
|
|
83
|
+
ret[i] = cloneObject(item);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
ret[i] = item;
|
|
87
|
+
}
|
|
101
88
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return ret;
|
|
89
|
+
return ret;
|
|
105
90
|
}
|
|
106
|
-
|
|
107
91
|
function copyHiddenProps(model, clone) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
92
|
+
for (let i = 0, l = hiddenProps.length; i < l; ++i) {
|
|
93
|
+
const prop = hiddenProps[i];
|
|
94
|
+
if (Object.hasOwn(model, prop)) {
|
|
95
|
+
defineNonEnumerableProperty(clone, prop, model[prop]);
|
|
96
|
+
}
|
|
113
97
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return clone;
|
|
98
|
+
return clone;
|
|
117
99
|
}
|
|
118
|
-
|
|
119
100
|
module.exports = {
|
|
120
|
-
|
|
101
|
+
clone,
|
|
121
102
|
};
|
|
@@ -1,34 +1,24 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
2
|
const { difference } = require('../utils/objectUtils');
|
|
4
|
-
|
|
5
3
|
function columnNameToPropertyName(modelClass, columnName) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const propertyName = difference(props, addedProps)[0];
|
|
14
|
-
|
|
15
|
-
return propertyName || columnName;
|
|
4
|
+
const model = new modelClass();
|
|
5
|
+
const addedProps = Object.keys(model.$parseDatabaseJson({}));
|
|
6
|
+
const row = {};
|
|
7
|
+
row[columnName] = null;
|
|
8
|
+
const props = Object.keys(model.$parseDatabaseJson(row));
|
|
9
|
+
const propertyName = difference(props, addedProps)[0];
|
|
10
|
+
return propertyName || columnName;
|
|
16
11
|
}
|
|
17
|
-
|
|
18
12
|
function propertyNameToColumnName(modelClass, propertyName) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const columnName = difference(cols, addedCols)[0];
|
|
27
|
-
|
|
28
|
-
return columnName || propertyName;
|
|
13
|
+
const model = new modelClass();
|
|
14
|
+
const addedCols = Object.keys(model.$formatDatabaseJson({}));
|
|
15
|
+
const obj = {};
|
|
16
|
+
obj[propertyName] = null;
|
|
17
|
+
const cols = Object.keys(model.$formatDatabaseJson(obj));
|
|
18
|
+
const columnName = difference(cols, addedCols)[0];
|
|
19
|
+
return columnName || propertyName;
|
|
29
20
|
}
|
|
30
|
-
|
|
31
21
|
module.exports = {
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
columnNameToPropertyName,
|
|
23
|
+
propertyNameToColumnName,
|
|
34
24
|
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const { isMsSql } = require('../utils/knexUtils');
|
|
3
|
+
const DEFAULT_CONCURRENCY = 4;
|
|
4
|
+
let defaultGetConcurrency = null;
|
|
5
|
+
// Called by Model.js with Model.getConcurrency.
|
|
6
|
+
function setDefaultGetConcurrency(getConcurrency) {
|
|
7
|
+
defaultGetConcurrency = getConcurrency;
|
|
8
|
+
}
|
|
9
|
+
// The concurrency of the queries that only read, like the queries of
|
|
10
|
+
// `withGraphFetched()`. By default `getConcurrency()` is 1 on MySQL, because
|
|
11
|
+
// concurrent graph updates and deletes deadlock there, but reads don't. The
|
|
12
|
+
// concurrency a model sets with `concurrency` or `getConcurrency()` is used as
|
|
13
|
+
// is.
|
|
14
|
+
function getReadConcurrency(modelClass, knex) {
|
|
15
|
+
if (modelClass.concurrency !== null || modelClass.getConcurrency !== defaultGetConcurrency) {
|
|
16
|
+
return modelClass.getConcurrency(knex);
|
|
17
|
+
}
|
|
18
|
+
// The mssql driver can't run concurrent queries.
|
|
19
|
+
return knex && isMsSql(knex) ? 1 : DEFAULT_CONCURRENCY;
|
|
20
|
+
}
|
|
21
|
+
module.exports = {
|
|
22
|
+
setDefaultGetConcurrency,
|
|
23
|
+
getReadConcurrency,
|
|
24
|
+
};
|
package/lib/model/modelId.js
CHANGED
|
@@ -1,62 +1,57 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
2
|
function getSetId(model, maybeId) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
if (maybeId !== undefined) {
|
|
4
|
+
return setId(model, maybeId);
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
return getId(model);
|
|
8
|
+
}
|
|
9
9
|
}
|
|
10
|
-
|
|
11
10
|
function hasId(model) {
|
|
12
|
-
|
|
11
|
+
return model.$hasProps(model.constructor.getIdPropertyArray());
|
|
13
12
|
}
|
|
14
|
-
|
|
15
13
|
function setId(model, id) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
model[idProp] = id[0];
|
|
14
|
+
const idProp = model.constructor.getIdProperty();
|
|
15
|
+
const isCompositeId = Array.isArray(idProp);
|
|
16
|
+
if (Array.isArray(id)) {
|
|
17
|
+
if (isCompositeId) {
|
|
18
|
+
if (id.length !== idProp.length) {
|
|
19
|
+
throw new Error('trying to set an invalid identifier for a model');
|
|
20
|
+
}
|
|
21
|
+
for (let i = 0; i < id.length; ++i) {
|
|
22
|
+
model[idProp[i]] = id[i];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
if (id.length !== 1) {
|
|
27
|
+
throw new Error('trying to set an invalid identifier for a model');
|
|
28
|
+
}
|
|
29
|
+
model[idProp] = id[0];
|
|
30
|
+
}
|
|
34
31
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
else {
|
|
33
|
+
if (isCompositeId) {
|
|
34
|
+
if (idProp.length > 1) {
|
|
35
|
+
throw new Error('trying to set an invalid identifier for a model');
|
|
36
|
+
}
|
|
37
|
+
model[idProp[0]] = id;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
model[idProp] = id;
|
|
41
|
+
}
|
|
44
42
|
}
|
|
45
|
-
}
|
|
46
43
|
}
|
|
47
|
-
|
|
48
44
|
function getId(model) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
const idProp = model.constructor.getIdProperty();
|
|
46
|
+
const isCompositeId = Array.isArray(idProp);
|
|
47
|
+
if (isCompositeId) {
|
|
48
|
+
return model.$values(idProp);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return model[idProp];
|
|
52
|
+
}
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
module.exports = {
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
getSetId,
|
|
56
|
+
hasId,
|
|
62
57
|
};
|
|
@@ -1,92 +1,72 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
|
|
3
2
|
const { asArray, isObject, flatten, isString } = require('../utils/objectUtils');
|
|
4
|
-
|
|
5
3
|
function parseJsonAttributes(json, modelClass) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
json[attr] = parsed;
|
|
4
|
+
const jsonAttr = modelClass.getJsonAttributes();
|
|
5
|
+
if (jsonAttr.length) {
|
|
6
|
+
// JSON attributes may be returned as strings depending on the database and
|
|
7
|
+
// the database client. Convert them to objects here.
|
|
8
|
+
for (let i = 0, l = jsonAttr.length; i < l; ++i) {
|
|
9
|
+
const attr = jsonAttr[i];
|
|
10
|
+
const value = json[attr];
|
|
11
|
+
if (isString(value)) {
|
|
12
|
+
const parsed = tryParseJson(value);
|
|
13
|
+
// tryParseJson returns undefined if parsing failed.
|
|
14
|
+
if (parsed !== undefined) {
|
|
15
|
+
json[attr] = parsed;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
21
18
|
}
|
|
22
|
-
}
|
|
23
19
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return json;
|
|
20
|
+
return json;
|
|
27
21
|
}
|
|
28
|
-
|
|
29
22
|
function formatJsonAttributes(json, modelClass) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
23
|
+
const jsonAttr = modelClass.getJsonAttributes();
|
|
24
|
+
if (jsonAttr.length) {
|
|
25
|
+
// All database clients want JSON columns as strings. Do the conversion here.
|
|
26
|
+
for (let i = 0, l = jsonAttr.length; i < l; ++i) {
|
|
27
|
+
const attr = jsonAttr[i];
|
|
28
|
+
const value = json[attr];
|
|
29
|
+
if (value != null) {
|
|
30
|
+
json[attr] = JSON.stringify(value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
41
33
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return json;
|
|
34
|
+
return json;
|
|
45
35
|
}
|
|
46
|
-
|
|
47
36
|
function getJsonAttributes(modelClass) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
types = flatten(prop.oneOf.map((it) => it.type));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (types.indexOf('object') !== -1 || types.indexOf('array') !== -1) {
|
|
72
|
-
jsonAttributes.push(propName);
|
|
73
|
-
}
|
|
37
|
+
let jsonAttributes = modelClass.jsonAttributes;
|
|
38
|
+
if (Array.isArray(jsonAttributes)) {
|
|
39
|
+
return jsonAttributes;
|
|
40
|
+
}
|
|
41
|
+
jsonAttributes = [];
|
|
42
|
+
if (modelClass.getJsonSchema()) {
|
|
43
|
+
const props = modelClass.getJsonSchema().properties || {};
|
|
44
|
+
for (const propName of Object.keys(props)) {
|
|
45
|
+
const prop = props[propName];
|
|
46
|
+
let types = asArray(prop.type).filter((it) => !!it);
|
|
47
|
+
if (types.length === 0 && Array.isArray(prop.anyOf)) {
|
|
48
|
+
types = flatten(prop.anyOf.map((it) => it.type));
|
|
49
|
+
}
|
|
50
|
+
if (types.length === 0 && Array.isArray(prop.oneOf)) {
|
|
51
|
+
types = flatten(prop.oneOf.map((it) => it.type));
|
|
52
|
+
}
|
|
53
|
+
if (types.indexOf('object') !== -1 || types.indexOf('array') !== -1) {
|
|
54
|
+
jsonAttributes.push(propName);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
74
57
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return jsonAttributes;
|
|
58
|
+
return jsonAttributes;
|
|
78
59
|
}
|
|
79
|
-
|
|
80
60
|
function tryParseJson(maybeJsonStr) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(maybeJsonStr);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
86
67
|
}
|
|
87
|
-
|
|
88
68
|
module.exports = {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
69
|
+
parseJsonAttributes,
|
|
70
|
+
formatJsonAttributes,
|
|
71
|
+
getJsonAttributes,
|
|
92
72
|
};
|