objection 3.9.1 → 4.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/lib/dbErrors/LICENSE +21 -0
  2. package/lib/dbErrors/errorCodes/mssql.js +19 -0
  3. package/lib/dbErrors/errorCodes/mysql.js +805 -0
  4. package/lib/dbErrors/errorCodes/postgres.js +241 -0
  5. package/lib/dbErrors/errors/CheckViolationError.js +10 -0
  6. package/lib/dbErrors/errors/ConstraintViolationError.js +3 -0
  7. package/lib/dbErrors/errors/DBError.js +9 -0
  8. package/lib/dbErrors/errors/DataError.js +3 -0
  9. package/lib/dbErrors/errors/ForeignKeyViolationError.js +11 -0
  10. package/lib/dbErrors/errors/NotNullViolationError.js +12 -0
  11. package/lib/dbErrors/errors/UniqueViolationError.js +12 -0
  12. package/lib/dbErrors/index.js +59 -0
  13. package/lib/dbErrors/parsers/mssql/DBError/CheckViolationError/parser.js +28 -0
  14. package/lib/dbErrors/parsers/mssql/DBError/DataError/parser.js +25 -0
  15. package/lib/dbErrors/parsers/mssql/DBError/ForeignKeyViolationError/parser.js +39 -0
  16. package/lib/dbErrors/parsers/mssql/DBError/NotNullViolationError/parser.js +30 -0
  17. package/lib/dbErrors/parsers/mssql/DBError/UniqueViolationError/parser.js +53 -0
  18. package/lib/dbErrors/parsers/mssql/DBError/parser.js +51 -0
  19. package/lib/dbErrors/parsers/mssql/DBError/util.js +16 -0
  20. package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/ForeignKeyViolationError/parser.js +43 -0
  21. package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/NotNullViolationError/parser.js +29 -0
  22. package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/UniqueViolationError/parser.js +27 -0
  23. package/lib/dbErrors/parsers/mysql/DBError/ConstraintViolationError/parser.js +23 -0
  24. package/lib/dbErrors/parsers/mysql/DBError/DataError/parser.js +24 -0
  25. package/lib/dbErrors/parsers/mysql/DBError/parser.js +28 -0
  26. package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/CheckViolationError/parser.js +18 -0
  27. package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/ForeignKeyViolationError/parser.js +18 -0
  28. package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/NotNullViolationError/parser.js +18 -0
  29. package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/UniqueViolationError/parser.js +40 -0
  30. package/lib/dbErrors/parsers/postgres/DBError/ConstraintViolationError/parser.js +25 -0
  31. package/lib/dbErrors/parsers/postgres/DBError/DataError/parser.js +16 -0
  32. package/lib/dbErrors/parsers/postgres/DBError/parser.js +27 -0
  33. package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/CheckViolationError/parser.js +20 -0
  34. package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/ForeignKeyViolationError/parser.js +20 -0
  35. package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/NotNullViolationError/parser.js +27 -0
  36. package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/UniqueViolationError/parser.js +28 -0
  37. package/lib/dbErrors/parsers/sqlite/DBError/ConstraintViolationError/parser.js +24 -0
  38. package/lib/dbErrors/parsers/sqlite/DBError/parser.js +23 -0
  39. package/lib/dbErrors/utils/sqlState.js +3 -0
  40. package/lib/initialize.js +1 -7
  41. package/lib/model/AjvValidator.js +51 -117
  42. package/lib/model/Model.js +84 -59
  43. package/lib/model/ModifierNotFoundError.js +1 -7
  44. package/lib/model/NotFoundError.js +1 -7
  45. package/lib/model/RelationDoesNotExistError.js +1 -7
  46. package/lib/model/ValidationError.js +3 -10
  47. package/lib/model/Validator.js +1 -7
  48. package/lib/model/getModel.js +7 -6
  49. package/lib/model/inheritModel.js +1 -7
  50. package/lib/model/modelBindKnex.js +4 -10
  51. package/lib/model/modelClone.js +5 -11
  52. package/lib/model/modelColPropMap.js +3 -10
  53. package/lib/model/modelId.js +3 -10
  54. package/lib/model/modelJsonAttributes.js +35 -16
  55. package/lib/model/modelParseRelations.js +2 -8
  56. package/lib/model/modelQueryProps.js +11 -23
  57. package/lib/model/modelSet.js +89 -41
  58. package/lib/model/modelTableMetadata.js +4 -11
  59. package/lib/model/modelToJson.js +6 -13
  60. package/lib/model/modelUtils.js +14 -13
  61. package/lib/model/modelValidate.js +3 -9
  62. package/lib/model/modelValues.js +5 -14
  63. package/lib/model/modelVisitor.js +1 -7
  64. package/lib/objection.js +33 -71
  65. package/lib/queryBuilder/FunctionBuilder.js +4 -11
  66. package/lib/queryBuilder/InternalOptions.js +4 -9
  67. package/lib/queryBuilder/JoinBuilder.js +5 -8
  68. package/lib/queryBuilder/QueryBuilder.js +126 -95
  69. package/lib/queryBuilder/QueryBuilderBase.js +41 -123
  70. package/lib/queryBuilder/QueryBuilderContext.js +2 -8
  71. package/lib/queryBuilder/QueryBuilderContextBase.js +2 -8
  72. package/lib/queryBuilder/QueryBuilderOperationSupport.js +7 -21
  73. package/lib/queryBuilder/QueryBuilderUserContext.js +1 -7
  74. package/lib/queryBuilder/RawBuilder.js +5 -13
  75. package/lib/queryBuilder/ReferenceBuilder.js +20 -48
  76. package/lib/queryBuilder/RelationExpression.js +18 -16
  77. package/lib/queryBuilder/StaticHookArguments.js +74 -16
  78. package/lib/queryBuilder/ValueBuilder.js +11 -13
  79. package/lib/queryBuilder/getJoinBuilder.js +10 -0
  80. package/lib/queryBuilder/graph/GraphLoader.js +314 -0
  81. package/lib/queryBuilder/graph/GraphNode.js +241 -0
  82. package/lib/queryBuilder/graph/GraphOptions.js +55 -248
  83. package/lib/queryBuilder/graph/GraphPlan.js +431 -0
  84. package/lib/queryBuilder/graph/GraphSchedule.js +513 -0
  85. package/lib/queryBuilder/graph/GraphUpsert.js +519 -412
  86. package/lib/queryBuilder/graph/GraphWriter.js +508 -0
  87. package/lib/queryBuilder/graph/graphKeys.js +929 -0
  88. package/lib/queryBuilder/join/JoinResultColumn.js +1 -7
  89. package/lib/queryBuilder/join/JoinResultParser.js +6 -11
  90. package/lib/queryBuilder/join/RelationJoiner.js +66 -84
  91. package/lib/queryBuilder/join/TableNode.js +2 -8
  92. package/lib/queryBuilder/join/TableTree.js +3 -9
  93. package/lib/queryBuilder/join/utils.js +5 -15
  94. package/lib/queryBuilder/jsonDialects/JsonDialect.js +51 -0
  95. package/lib/queryBuilder/jsonDialects/MySqlJsonDialect.js +81 -0
  96. package/lib/queryBuilder/jsonDialects/PostgresJsonDialect.js +45 -0
  97. package/lib/queryBuilder/jsonDialects/SqliteJsonDialect.js +67 -0
  98. package/lib/queryBuilder/jsonDialects/index.js +44 -0
  99. package/lib/queryBuilder/operations/DelegateOperation.js +2 -8
  100. package/lib/queryBuilder/operations/DeleteOperation.js +10 -39
  101. package/lib/queryBuilder/operations/FindByIdOperation.js +7 -12
  102. package/lib/queryBuilder/operations/FindByIdsOperation.js +4 -8
  103. package/lib/queryBuilder/operations/FindOperation.js +14 -34
  104. package/lib/queryBuilder/operations/FirstOperation.js +6 -10
  105. package/lib/queryBuilder/operations/FromOperation.js +3 -9
  106. package/lib/queryBuilder/operations/InsertAndFetchOperation.js +13 -12
  107. package/lib/queryBuilder/operations/InsertGraphAndFetchOperation.js +4 -10
  108. package/lib/queryBuilder/operations/InsertGraphOperation.js +7 -18
  109. package/lib/queryBuilder/operations/InsertOperation.js +118 -45
  110. package/lib/queryBuilder/operations/InstanceDeleteOperation.js +5 -12
  111. package/lib/queryBuilder/operations/InstanceFindOperation.js +4 -11
  112. package/lib/queryBuilder/operations/InstanceInsertOperation.js +2 -8
  113. package/lib/queryBuilder/operations/InstanceUpdateOperation.js +7 -14
  114. package/lib/queryBuilder/operations/JoinRelatedOperation.js +5 -11
  115. package/lib/queryBuilder/operations/KnexOperation.js +2 -8
  116. package/lib/queryBuilder/operations/LimitPerParentOperation.js +7 -69
  117. package/lib/queryBuilder/operations/MergeOperation.js +5 -11
  118. package/lib/queryBuilder/operations/NoneOperation.js +2 -8
  119. package/lib/queryBuilder/operations/ObjectionToKnexConvertingOperation.js +20 -49
  120. package/lib/queryBuilder/operations/OnBuildKnexOperation.js +2 -8
  121. package/lib/queryBuilder/operations/OnBuildOperation.js +2 -8
  122. package/lib/queryBuilder/operations/OnErrorOperation.js +2 -8
  123. package/lib/queryBuilder/operations/QueryBuilderOperation.js +1 -7
  124. package/lib/queryBuilder/operations/RangeOperation.js +11 -26
  125. package/lib/queryBuilder/operations/RelateOperation.js +2 -8
  126. package/lib/queryBuilder/operations/ReturningOperation.js +3 -9
  127. package/lib/queryBuilder/operations/RunAfterOperation.js +2 -12
  128. package/lib/queryBuilder/operations/RunBeforeOperation.js +2 -8
  129. package/lib/queryBuilder/operations/UnrelateOperation.js +2 -8
  130. package/lib/queryBuilder/operations/UpdateAndFetchOperation.js +14 -17
  131. package/lib/queryBuilder/operations/UpdateOperation.js +32 -132
  132. package/lib/queryBuilder/operations/UpsertGraphAndFetchOperation.js +8 -11
  133. package/lib/queryBuilder/operations/UpsertGraphOperation.js +6 -12
  134. package/lib/queryBuilder/operations/WhereCompositeOperation.js +3 -9
  135. package/lib/queryBuilder/operations/WhereGroupOperation.js +2 -8
  136. package/lib/queryBuilder/operations/eager/EagerOperation.js +3 -9
  137. package/lib/queryBuilder/operations/eager/JoinEagerOperation.js +72 -10
  138. package/lib/queryBuilder/operations/eager/NaiveEagerOperation.js +2 -8
  139. package/lib/queryBuilder/operations/eager/WhereInEagerOperation.js +23 -44
  140. package/lib/queryBuilder/operations/fieldExpressions.js +122 -0
  141. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasOperation.js +20 -0
  142. package/lib/queryBuilder/operations/jsonApi/WhereJsonOperation.js +44 -0
  143. package/lib/queryBuilder/operations/jsonApi/WhereJsonTypeOperation.js +14 -0
  144. package/lib/queryBuilder/operations/select/SelectOperation.js +11 -21
  145. package/lib/queryBuilder/operations/select/Selection.js +19 -17
  146. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeMsSqlOperation.js +4 -10
  147. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeOperation.js +4 -10
  148. package/lib/queryBuilder/operations/whereInComposite/WhereInCompositeSqliteOperation.js +4 -10
  149. package/lib/queryBuilder/operations/windowOrder.js +56 -0
  150. package/lib/queryBuilder/parsers/jsonFieldExpressionParser.js +3 -7
  151. package/lib/queryBuilder/parsers/relationExpressionParser.js +42 -43
  152. package/lib/queryBuilder/parsers/relationExpressionParser.pegjs +39 -36
  153. package/lib/queryBuilder/transformations/CompositeQueryTransformation.js +2 -8
  154. package/lib/queryBuilder/transformations/QueryTransformation.js +1 -7
  155. package/lib/queryBuilder/transformations/WrapMysqlModifySubqueryTransformation.js +3 -9
  156. package/lib/queryBuilder/transformations/index.js +3 -11
  157. package/lib/queryBuilder/whereGroups.js +9 -24
  158. package/lib/queryBuilder/withoutOrder.js +4 -11
  159. package/lib/relations/Relation.js +47 -28
  160. package/lib/relations/RelationDeleteOperation.js +4 -14
  161. package/lib/relations/RelationFindOperation.js +119 -90
  162. package/lib/relations/RelationInsertOperation.js +2 -8
  163. package/lib/relations/RelationOwner.js +5 -11
  164. package/lib/relations/RelationProperty.js +4 -10
  165. package/lib/relations/RelationUpdateOperation.js +4 -14
  166. package/lib/relations/RelationWriteResultOperation.js +15 -0
  167. package/lib/relations/belongsToMany/BelongsToManyDeleteOperation.js +23 -0
  168. package/lib/relations/belongsToMany/BelongsToManyFindOperation.js +35 -0
  169. package/lib/relations/belongsToMany/BelongsToManyInsertOperation.js +28 -0
  170. package/lib/relations/belongsToMany/BelongsToManyRelateOperation.js +16 -0
  171. package/lib/relations/belongsToMany/BelongsToManyRelation.js +276 -0
  172. package/lib/relations/belongsToMany/BelongsToManyUnrelateOperation.js +11 -0
  173. package/lib/relations/belongsToOne/BelongsToOneDeleteOperation.js +2 -8
  174. package/lib/relations/belongsToOne/BelongsToOneInsertOperation.js +6 -11
  175. package/lib/relations/belongsToOne/BelongsToOneRelateOperation.js +3 -9
  176. package/lib/relations/belongsToOne/BelongsToOneRelation.js +8 -19
  177. package/lib/relations/belongsToOne/BelongsToOneUnrelateOperation.js +53 -27
  178. package/lib/relations/hasMany/HasManyInsertOperation.js +5 -10
  179. package/lib/relations/hasMany/HasManyRelateOperation.js +5 -11
  180. package/lib/relations/hasMany/HasManyRelation.js +9 -11
  181. package/lib/relations/hasMany/HasManyUnrelateOperation.js +3 -9
  182. package/lib/relations/hasOne/HasOneRelation.js +2 -8
  183. package/lib/relations/hasOneThrough/HasOneThroughRelation.js +2 -8
  184. package/lib/relations/manyToMany/ManyToManyModifyMixin.js +10 -15
  185. package/lib/relations/manyToMany/ManyToManyMySqlModifyMixin.js +2 -8
  186. package/lib/relations/manyToMany/ManyToManyRelation.js +82 -50
  187. package/lib/relations/manyToMany/ManyToManySqliteModifyMixin.js +2 -8
  188. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperation.js +5 -9
  189. package/lib/relations/manyToMany/delete/ManyToManyDeleteOperationBase.js +2 -8
  190. package/lib/relations/manyToMany/delete/ManyToManyDeleteSqliteOperation.js +3 -9
  191. package/lib/relations/manyToMany/find/ManyToManyFindOperation.js +20 -59
  192. package/lib/relations/manyToMany/insert/ManyToManyInsertOperation.js +6 -11
  193. package/lib/relations/manyToMany/relate/ManyToManyRelateOperation.js +4 -10
  194. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateMySqlOperation.js +3 -9
  195. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperation.js +5 -9
  196. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateOperationBase.js +3 -9
  197. package/lib/relations/manyToMany/unrelate/ManyToManyUnrelateSqliteOperation.js +3 -9
  198. package/lib/relations/manyToMany/update/ManyToManyUpdateMySqlOperation.js +3 -9
  199. package/lib/relations/manyToMany/update/ManyToManyUpdateOperation.js +5 -9
  200. package/lib/relations/manyToMany/update/ManyToManyUpdateOperationBase.js +64 -72
  201. package/lib/relations/manyToMany/update/ManyToManyUpdateSqliteOperation.js +3 -9
  202. package/lib/transaction.js +3 -9
  203. package/lib/utils/assert.js +3 -11
  204. package/lib/utils/buildUtils.js +2 -8
  205. package/lib/utils/classUtils.js +1 -7
  206. package/lib/utils/createModifier.js +2 -8
  207. package/lib/utils/identifierMapping.js +23 -27
  208. package/lib/utils/internalPropUtils.js +1 -7
  209. package/lib/utils/knexUtils.js +84 -40
  210. package/lib/utils/mixin.js +3 -10
  211. package/lib/utils/normalizeIds.js +2 -8
  212. package/lib/utils/objectUtils.js +41 -60
  213. package/lib/utils/parseFieldExpression.js +16 -16
  214. package/lib/utils/promiseUtils/after.js +2 -8
  215. package/lib/utils/promiseUtils/afterReturn.js +2 -8
  216. package/lib/utils/promiseUtils/index.js +7 -16
  217. package/lib/utils/promiseUtils/isPromise.js +2 -8
  218. package/lib/utils/promiseUtils/map.js +2 -8
  219. package/lib/utils/promiseUtils/mapAfterAllReturn.js +2 -8
  220. package/lib/utils/promiseUtils/try.js +2 -8
  221. package/lib/utils/resolveModel.js +10 -17
  222. package/lib/utils/tmpColumnUtils.js +2 -9
  223. package/lib/utils/warnings.js +2 -14
  224. package/package.json +25 -17
  225. package/typings/objection/index.d.ts +3217 -2179
  226. package/lib/.eslintrc.json +0 -8
  227. package/lib/model/graph/ModelGraph.js +0 -80
  228. package/lib/model/graph/ModelGraphBuilder.js +0 -241
  229. package/lib/model/graph/ModelGraphEdge.js +0 -52
  230. package/lib/model/graph/ModelGraphNode.js +0 -238
  231. package/lib/queryBuilder/graph/GraphAction.js +0 -69
  232. package/lib/queryBuilder/graph/GraphData.js +0 -53
  233. package/lib/queryBuilder/graph/GraphFetcher.js +0 -197
  234. package/lib/queryBuilder/graph/GraphNodeDbExistence.js +0 -184
  235. package/lib/queryBuilder/graph/GraphOperation.js +0 -27
  236. package/lib/queryBuilder/graph/delete/GraphDelete.js +0 -73
  237. package/lib/queryBuilder/graph/delete/GraphDeleteAction.js +0 -88
  238. package/lib/queryBuilder/graph/insert/DeferredRelationGraphInsertAction.js +0 -58
  239. package/lib/queryBuilder/graph/insert/GraphInsert.js +0 -296
  240. package/lib/queryBuilder/graph/insert/GraphInsertAction.js +0 -233
  241. package/lib/queryBuilder/graph/insert/JoinRowGraphInsertAction.js +0 -92
  242. package/lib/queryBuilder/graph/patch/GraphPatch.js +0 -20
  243. package/lib/queryBuilder/graph/patch/GraphPatchAction.js +0 -289
  244. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsert.js +0 -31
  245. package/lib/queryBuilder/graph/recursiveUpsert/GraphRecursiveUpsertAction.js +0 -126
  246. package/lib/queryBuilder/operations/jsonApi/WhereJsonHasPostgresOperation.js +0 -30
  247. package/lib/queryBuilder/operations/jsonApi/WhereJsonNotObjectPostgresOperation.js +0 -37
  248. package/lib/queryBuilder/operations/jsonApi/WhereJsonPostgresOperation.js +0 -62
  249. package/lib/queryBuilder/operations/jsonApi/postgresJsonApi.js +0 -192
  250. package/lib/utils/wrapDbError.js +0 -64
@@ -1,289 +0,0 @@
1
- 'use strict';
2
-
3
- const { getModel } = require('../../../model/getModel');
4
- const { GraphAction } = require('../GraphAction');
5
- const { isInternalProp } = require('../../../utils/internalPropUtils');
6
- const { difference, isObject, isPlainObject, jsonEquals } = require('../../../utils/objectUtils');
7
- const promiseUtils = require('../../../utils/promiseUtils');
8
-
9
- class GraphPatchAction extends GraphAction {
10
- constructor(graphData, { nodes }) {
11
- super(graphData);
12
- // Nodes to patch.
13
- this.nodes = nodes;
14
- }
15
-
16
- run(builder) {
17
- return promiseUtils.map(this.nodes, (node) => this._runForNode(builder, node), {
18
- concurrency: this._getConcurrency(builder, this.nodes),
19
- });
20
- }
21
-
22
- _runForNode(builder, node) {
23
- const shouldPatch = this.graphOptions.shouldPatch(node, this.graphData);
24
- const shouldUpdate = this.graphOptions.shouldUpdate(node, this.graphData);
25
-
26
- // BelongsToOneRelation inserts and relates change the parent object's
27
- // properties. That's why we handle them here.
28
- const changedPropsBecauseOfBelongsToOneInsert = this._handleBelongsToOneInserts(node);
29
-
30
- // BelongsToOneRelation deletes and unrelates change the parent object's
31
- // properties. That's why we handle them here.
32
- const changePropsBecauseOfBelongsToOneDelete = this._handleBelongsToOneDeletes(node);
33
-
34
- // HasManyRelation and HasOneRelation relates write the related object's
35
- // foreign keys, also with `noUpdate`.
36
- const changedPropsBecauseOfRelate =
37
- this.graphOptions.shouldRelate(node, this.graphData) &&
38
- node.parentEdge.relation.isObjectionHasManyRelation
39
- ? node.parentEdge.relation.relatedProp.props
40
- : [];
41
-
42
- const handleUpdate = () => {
43
- const { changedProps, unchangedProps } = this._findChanges(node);
44
- const allProps = [...changedProps, ...unchangedProps];
45
-
46
- const propsToUpdate = difference(
47
- shouldPatch || shouldUpdate
48
- ? changedProps
49
- : [
50
- ...changedPropsBecauseOfBelongsToOneInsert,
51
- ...changePropsBecauseOfBelongsToOneDelete,
52
- ...changedPropsBecauseOfRelate,
53
- ],
54
-
55
- // Remove id properties from the props to update. With upsertGraph
56
- // it never makes sense to change the id.
57
- node.modelClass.getIdPropertyArray(),
58
- );
59
-
60
- const update = propsToUpdate.length > 0;
61
- if (update) {
62
- // Don't update the fields that we know not to change.
63
- node.obj.$omitFromDatabaseJson(difference(allProps, propsToUpdate));
64
- node.userData.updated = true;
65
- }
66
-
67
- return update;
68
- };
69
-
70
- const Model = getModel();
71
- // See if the model defines a beforeUpdate or $beforeUpdate hook. If it does
72
- // not, we can check for updated properties now and drop out immediately if
73
- // there is nothing to update. Otherwise, we need to wait for the hook to be
74
- // called before calling handleUpdate, but only if the node contains changes
75
- // that aren't id properties (relates). See issues #2233, #2605.
76
- const hasBeforeUpdate =
77
- node.obj.constructor.beforeUpdate !== Model.beforeUpdate ||
78
- node.obj.$beforeUpdate !== Model.prototype.$beforeUpdate;
79
-
80
- if (
81
- (hasBeforeUpdate && !this._hasNonIdPropertyChanges(node)) ||
82
- (!hasBeforeUpdate && !handleUpdate())
83
- ) {
84
- return null;
85
- }
86
-
87
- delete node.obj[node.modelClass.uidProp];
88
- delete node.obj[node.modelClass.uidRefProp];
89
- delete node.obj[node.modelClass.dbRefProp];
90
- delete node.obj[node.modelClass.graphUnrelateProp];
91
- delete node.obj[node.modelClass.graphDeleteProp];
92
-
93
- node.obj.$validate(null, {
94
- dataPath: node.dataPathKey,
95
- patch: shouldPatch || (!shouldPatch && !shouldUpdate),
96
- });
97
-
98
- const updateBuilder = this._createBuilder(node)
99
- .childQueryOf(builder, childQueryOptions())
100
- // The current graph was fetched through the relations, so the patched
101
- // models are known to be related to their parents.
102
- .internalOptions({ skipRelationFilter: true })
103
- .copyFrom(builder, GraphAction.ReturningAllSelector);
104
-
105
- if (hasBeforeUpdate) {
106
- updateBuilder.internalContext().runBefore.push((result, builder) => {
107
- // Call handleUpdate in the runBefore hook which runs after the
108
- // $beforeUpdate hook, allowing it to modify the object before the
109
- // updated properties are determined. See issue #2233.
110
- if (hasBeforeUpdate && !handleUpdate()) {
111
- builder.internalOptions().returnImmediatelyValue = null;
112
- }
113
- return result;
114
- });
115
- }
116
-
117
- if (shouldPatch) {
118
- updateBuilder.patch(node.obj);
119
- } else {
120
- updateBuilder.update(node.obj);
121
- }
122
-
123
- return updateBuilder.execute().then((result) => {
124
- if (isObject(result) && result.$isObjectionModel) {
125
- // Handle returning('*').
126
- node.obj.$set(result);
127
- }
128
-
129
- return result;
130
- });
131
- }
132
-
133
- _handleBelongsToOneInserts(node) {
134
- const currentNode = this.currentGraph.nodeForNode(node);
135
- const updatedProps = [];
136
-
137
- for (const edge of node.edges) {
138
- if (
139
- edge.isOwnerNode(node) &&
140
- edge.relation &&
141
- edge.relation.isObjectionBelongsToOneRelation &&
142
- edge.relation.relatedProp.hasProps(edge.relatedNode.obj) &&
143
- // Ignored models don't replace the current one, and models marked with
144
- // `#unrelate` or `#delete` are handled below.
145
- !this.graphOptions.shouldIgnore(edge.relatedNode, this.graphData)
146
- ) {
147
- const { relation } = edge;
148
-
149
- relation.ownerProp.forEach((i) => {
150
- const currentValue = currentNode && relation.ownerProp.getProp(currentNode.obj, i);
151
- const relatedValue = relation.relatedProp.getProp(edge.relatedNode.obj, i);
152
-
153
- if (currentValue != relatedValue) {
154
- relation.ownerProp.setProp(node.obj, i, relatedValue);
155
- updatedProps.push(relation.ownerProp.props[i]);
156
- }
157
- });
158
- }
159
- }
160
-
161
- return updatedProps;
162
- }
163
-
164
- _handleBelongsToOneDeletes(node) {
165
- const currentNode = this.currentGraph.nodeForNode(node);
166
- const updatedProps = [];
167
-
168
- if (!currentNode) {
169
- return updatedProps;
170
- }
171
-
172
- for (const edge of currentNode.edges) {
173
- if (
174
- edge.isOwnerNode(currentNode) &&
175
- edge.relation.isObjectionBelongsToOneRelation &&
176
- (node.obj[edge.relation.name] === null ||
177
- isToBeUnrelatedOrDeleted(this.graph.nodeForNode(edge.relatedNode))) &&
178
- this.graphOptions.shouldDeleteOrUnrelate(edge.relatedNode, this.graphData)
179
- ) {
180
- const { relation } = edge;
181
-
182
- relation.ownerProp.forEach((i) => {
183
- const currentValue = relation.ownerProp.getProp(currentNode.obj, i);
184
-
185
- if (currentValue != null) {
186
- relation.ownerProp.setProp(node.obj, i, null);
187
- updatedProps.push(relation.ownerProp.props[i]);
188
- }
189
- });
190
- }
191
- }
192
-
193
- return updatedProps;
194
- }
195
-
196
- _findChanges(node) {
197
- const obj = node.obj;
198
- const currentNode = this.currentGraph.nodeForNode(node);
199
- const currentObj = (currentNode && currentNode.obj) || {};
200
- const relationNames = node.modelClass.getRelationNames();
201
-
202
- const unchangedProps = [];
203
- const changedProps = [];
204
-
205
- for (const prop of Object.keys(obj)) {
206
- if (isInternalProp(prop) || relationNames.includes(prop)) {
207
- continue;
208
- }
209
-
210
- const value = obj[prop];
211
- const currentValue = currentObj[prop];
212
-
213
- // If the current object doesn't have the property, we have to assume
214
- // it changes (we cannot know if it will). If the object does have the
215
- // property, we test non-strict equality. See issue #732.
216
- if (currentValue === undefined || !nonStrictEquals(currentValue, value)) {
217
- changedProps.push(prop);
218
- } else {
219
- unchangedProps.push(prop);
220
- }
221
- }
222
-
223
- // We cannot know if the query properties cause changes to the values.
224
- // We must assume that they do.
225
- if (obj.$$queryProps) {
226
- changedProps.push(...Object.keys(obj.$$queryProps));
227
- }
228
-
229
- return {
230
- changedProps,
231
- unchangedProps,
232
- };
233
- }
234
-
235
- _hasNonIdPropertyChanges(node) {
236
- const idProps = node.modelClass.getIdPropertyArray();
237
- return this._findChanges(node).changedProps.some((prop) => !idProps.includes(prop));
238
- }
239
-
240
- _createBuilder(node) {
241
- if (node.parentEdge && !node.parentEdge.relation.isObjectionHasManyRelation) {
242
- return this._createRelatedBuilder(node);
243
- } else {
244
- return this._createRootBuilder(node);
245
- }
246
- }
247
-
248
- _createRelatedBuilder(node) {
249
- return node.parentNode.obj
250
- .$relatedQuery(node.parentEdge.relation.name)
251
- .findById(node.obj.$id());
252
- }
253
-
254
- _createRootBuilder(node) {
255
- const currentNode = this.currentGraph.nodeForNode(node);
256
- const currentObj = currentNode && currentNode.obj;
257
-
258
- return currentObj ? currentObj.$query() : node.obj.$query();
259
- }
260
- }
261
-
262
- function childQueryOptions() {
263
- return {
264
- fork: true,
265
- isInternalQuery: true,
266
- };
267
- }
268
-
269
- function nonStrictEquals(val1, val2) {
270
- // Only use loose equality for non-JSON values, so that for example `false`
271
- // and `[]` are not considered equal. See issue #1874.
272
- if (!isJsonValue(val1) && !isJsonValue(val2) && val1 == val2) {
273
- return true;
274
- }
275
-
276
- return jsonEquals(val1, val2);
277
- }
278
-
279
- function isJsonValue(value) {
280
- return Array.isArray(value) || isPlainObject(value);
281
- }
282
-
283
- function isToBeUnrelatedOrDeleted(node) {
284
- return !!node && node.toBeUnrelatedOrDeleted;
285
- }
286
-
287
- module.exports = {
288
- GraphPatchAction,
289
- };
@@ -1,31 +0,0 @@
1
- 'use strict';
2
-
3
- const { GraphOperation } = require('../GraphOperation');
4
- const { GraphRecursiveUpsertAction } = require('./GraphRecursiveUpsertAction');
5
-
6
- class GraphRecursiveUpsert extends GraphOperation {
7
- createActions() {
8
- return [
9
- new GraphRecursiveUpsertAction(this.graphData, {
10
- nodes: this.graph.nodes.filter((node) => {
11
- const shouldRelate = this.graphOptions.shouldRelate(node, this.graphData);
12
- return shouldRelate && hasRelations(node.obj);
13
- }),
14
- }),
15
- ];
16
- }
17
- }
18
-
19
- function hasRelations(obj) {
20
- for (const relationName of obj.constructor.getRelationNames()) {
21
- if (obj[relationName] !== undefined) {
22
- return true;
23
- }
24
- }
25
-
26
- return false;
27
- }
28
-
29
- module.exports = {
30
- GraphRecursiveUpsert,
31
- };
@@ -1,126 +0,0 @@
1
- 'use strict';
2
-
3
- const { GraphAction } = require('../GraphAction');
4
- const { groupBy, get, set } = require('../../../utils/objectUtils');
5
- const { forEachPropertyReference } = require('../../../model/graph/ModelGraphBuilder');
6
- const promiseUtils = require('../../../utils/promiseUtils');
7
-
8
- class GraphRecursiveUpsertAction extends GraphAction {
9
- constructor(graphData, { nodes }) {
10
- super(graphData);
11
- // Nodes to upsert.
12
- this.nodes = nodes;
13
- }
14
-
15
- run(builder) {
16
- const builders = this._createUpsertBuilders(builder, this.nodes);
17
-
18
- return promiseUtils.map(builders, (builder) => builder.execute(), {
19
- concurrency: this._getConcurrency(builder, this.nodes),
20
- });
21
- }
22
-
23
- _createUpsertBuilders(parentBuilder, nodesToUpsert) {
24
- const nodesByRelation = groupBy(nodesToUpsert, getRelation);
25
- const builders = [];
26
-
27
- nodesByRelation.forEach((nodes) => {
28
- const nodesByParent = groupBy(nodes, getParent);
29
-
30
- nodesByParent.forEach((nodes) => {
31
- for (const node of nodes) {
32
- this._resolveReferences(node);
33
- node.userData.upserted = true;
34
- }
35
-
36
- builders.push(
37
- nodes[0].modelClass
38
- .query()
39
- .childQueryOf(parentBuilder)
40
- .copyFrom(parentBuilder, GraphAction.ReturningAllSelector)
41
- .upsertGraph(
42
- nodes.map((node) => node.obj),
43
- this.graphOptions.rebasedOptions(nodes[0]),
44
- ),
45
- );
46
- });
47
- });
48
-
49
- return builders;
50
- }
51
-
52
- /**
53
- * The nodes inside the subgraph we are about to recursively upsert may
54
- * have references outside that graph that won't be available during the
55
- * recursive upsertGraph call. This method resolves the references.
56
- *
57
- * TODO: This doesn't work if a recursively upserted node refers to
58
- * a node inside another recursively upsertable graph.
59
- */
60
- _resolveReferences(node) {
61
- node.obj.$traverse((obj) => this._resolveReferencesForObject(obj));
62
- }
63
-
64
- _resolveReferencesForObject(obj) {
65
- this._resolveObjectReference(obj);
66
- this._resolvePropertyReferences(obj);
67
- }
68
-
69
- _resolveObjectReference(obj) {
70
- const modelClass = obj.constructor;
71
- const ref = obj[modelClass.uidRefProp];
72
-
73
- if (!ref) {
74
- return;
75
- }
76
-
77
- const referencedNode = this.graph.nodes.find((it) => it.uid === ref);
78
-
79
- if (!referencedNode) {
80
- return;
81
- }
82
-
83
- const relationNames = referencedNode.modelClass.getRelationNames();
84
-
85
- for (const prop of Object.keys(referencedNode.obj)) {
86
- if (relationNames.includes(prop)) {
87
- continue;
88
- }
89
-
90
- obj[prop] = referencedNode.obj[prop];
91
- }
92
-
93
- delete obj[modelClass.uidRefProp];
94
- }
95
-
96
- _resolvePropertyReferences(obj) {
97
- forEachPropertyReference(obj, ({ path, refMatch, ref, refPath }) => {
98
- const referencedNode = this.graph.nodes.find((it) => it.uid === ref);
99
-
100
- if (!referencedNode) {
101
- return;
102
- }
103
-
104
- const referencedValue = get(referencedNode.obj, refPath);
105
- const value = get(obj, path);
106
-
107
- if (value === refMatch) {
108
- set(obj, path, referencedValue);
109
- } else {
110
- set(obj, path, value.replace(refMatch, referencedValue));
111
- }
112
- });
113
- }
114
- }
115
-
116
- function getRelation(node) {
117
- return node.parentEdge.relation;
118
- }
119
-
120
- function getParent(node) {
121
- return node.parentNode;
122
- }
123
-
124
- module.exports = {
125
- GraphRecursiveUpsertAction,
126
- };
@@ -1,30 +0,0 @@
1
- 'use strict';
2
-
3
- const jsonApi = require('./postgresJsonApi');
4
- const { ObjectionToKnexConvertingOperation } = require('../ObjectionToKnexConvertingOperation');
5
-
6
- class WhereJsonHasPostgresOperation extends ObjectionToKnexConvertingOperation {
7
- onBuildKnex(knexBuilder, builder) {
8
- jsonApi.warnIfNotPostgres(builder.knex());
9
- const args = this.getKnexArgs(builder);
10
-
11
- const rawArgs = jsonApi.whereJsonFieldRightStringArrayOnLeftQuery(
12
- builder.knex(),
13
- args[0],
14
- this.opt.operator,
15
- args[1],
16
- );
17
-
18
- if (this.opt.bool === 'or') {
19
- knexBuilder = knexBuilder.orWhereRaw(...rawArgs);
20
- } else {
21
- knexBuilder = knexBuilder.whereRaw(...rawArgs);
22
- }
23
-
24
- return knexBuilder;
25
- }
26
- }
27
-
28
- module.exports = {
29
- WhereJsonHasPostgresOperation,
30
- };
@@ -1,37 +0,0 @@
1
- 'use strict';
2
-
3
- const jsonApi = require('./postgresJsonApi');
4
- const { ObjectionToKnexConvertingOperation } = require('../ObjectionToKnexConvertingOperation');
5
-
6
- class WhereJsonNotObjectPostgresOperation extends ObjectionToKnexConvertingOperation {
7
- onBuildKnex(knexBuilder, builder) {
8
- jsonApi.warnIfNotPostgres(builder.knex());
9
- return this.whereJsonNotObject(knexBuilder, builder.knex(), this.getKnexArgs(builder)[0]);
10
- }
11
-
12
- whereJsonNotObject(knexBuilder, knex, fieldExpression) {
13
- const innerQuery = (innerQuery) => {
14
- const builder = jsonApi.whereJsonbRefOnLeftJsonbValOrRefOnRight(
15
- innerQuery,
16
- fieldExpression,
17
- '@>',
18
- this.opt.compareValue,
19
- 'not',
20
- );
21
-
22
- builder.orWhereRaw(...jsonApi.whereJsonFieldQuery(knex, fieldExpression, 'IS', null));
23
- };
24
-
25
- if (this.opt.bool === 'or') {
26
- knexBuilder = knexBuilder.orWhere(innerQuery);
27
- } else {
28
- knexBuilder = knexBuilder.where(innerQuery);
29
- }
30
-
31
- return knexBuilder;
32
- }
33
- }
34
-
35
- module.exports = {
36
- WhereJsonNotObjectPostgresOperation,
37
- };
@@ -1,62 +0,0 @@
1
- 'use strict';
2
-
3
- const jsonApi = require('./postgresJsonApi');
4
- const { ObjectionToKnexConvertingOperation } = require('../ObjectionToKnexConvertingOperation');
5
- const { parseFieldExpression } = require('../../../utils/parseFieldExpression');
6
- const { isPlainObject, isString, isFunction } = require('../../../utils/objectUtils');
7
- const { isMySql } = require('../../../utils/knexUtils');
8
-
9
- class WhereJsonPostgresOperation extends ObjectionToKnexConvertingOperation {
10
- onBuildKnex(knexBuilder, builder) {
11
- const knex = builder.knex();
12
-
13
- if (isMySql(knex) && this.canDelegateToKnex(knexBuilder)) {
14
- // On MySQL, knex's version of the method works (ditojs#113). The `or`
15
- // variants are wrapped in `orWhere()`, as knex < 3 ignores their `or`.
16
- const [column, value] = this.getKnexArgs(builder);
17
- const { knexMethod } = this.opt;
18
-
19
- if (this.opt.bool === 'or') {
20
- return knexBuilder.orWhere((qb) => qb[knexMethod](column, value));
21
- } else {
22
- return knexBuilder[knexMethod](column, value);
23
- }
24
- }
25
-
26
- jsonApi.warnIfNotPostgres(knex);
27
- const args = this.getKnexArgs(builder);
28
-
29
- const rawArgs = jsonApi.whereJsonbRefOnLeftJsonbValOrRefOnRightRawQueryParams(
30
- args[0],
31
- this.opt.operator,
32
- args[1],
33
- this.opt.prefix,
34
- );
35
-
36
- if (this.opt.bool === 'or') {
37
- knexBuilder = knexBuilder.orWhereRaw.apply(knexBuilder, rawArgs);
38
- } else {
39
- knexBuilder = knexBuilder.whereRaw.apply(knexBuilder, rawArgs);
40
- }
41
-
42
- return knexBuilder;
43
- }
44
-
45
- // Only the simple form with a plain column and a plain object or array value
46
- // can be passed on to knex, as knex doesn't understand field expressions.
47
- canDelegateToKnex(knexBuilder) {
48
- const [column, value] = this.args;
49
-
50
- return (
51
- !!this.opt.knexMethod &&
52
- isFunction(knexBuilder[this.opt.knexMethod]) &&
53
- isString(column) &&
54
- parseFieldExpression(column).access.length === 0 &&
55
- (isPlainObject(value) || Array.isArray(value))
56
- );
57
- }
58
- }
59
-
60
- module.exports = {
61
- WhereJsonPostgresOperation,
62
- };