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,296 +0,0 @@
1
- 'use strict';
2
-
3
- const { JoinRowGraphInsertAction } = require('./JoinRowGraphInsertAction');
4
- const { DeferredRelationGraphInsertAction } = require('./DeferredRelationGraphInsertAction');
5
- const { GraphInsertAction } = require('./GraphInsertAction');
6
- const { GraphOperation } = require('../GraphOperation');
7
- const { ModelGraphEdge } = require('../../../model/graph/ModelGraphEdge');
8
-
9
- class GraphInsert extends GraphOperation {
10
- constructor(...args) {
11
- super(...args);
12
- this.dependencies = this._createDependencyMap();
13
- this.deferredEdges = new Set();
14
- }
15
-
16
- createActions() {
17
- return [
18
- ...this._createNormalActions(),
19
- ...this._createDeferredRelationActions(),
20
- ...this._createJoinRowActions(),
21
- ];
22
- }
23
-
24
- _createDependencyMap() {
25
- const dependencies = new Map();
26
-
27
- for (const edge of this.graph.edges) {
28
- if (edge.type == ModelGraphEdge.Type.Relation) {
29
- this._createRelationDependency(edge, dependencies);
30
- } else {
31
- this._createReferenceDependency(edge, dependencies);
32
- }
33
- }
34
-
35
- return dependencies;
36
- }
37
-
38
- _createRelationDependency(edge, dependencies) {
39
- if (edge.relatedNode.toBeUnrelatedOrDeleted) {
40
- // Models marked with `#unrelate` or `#delete` are never inserted or
41
- // related, so their keys must not be copied to the owner (or vice versa).
42
- return;
43
- }
44
-
45
- if (edge.relation.isObjectionHasManyRelation) {
46
- // In case of HasManyRelation the related node depends on the owner node
47
- // because the related node has the foreign key.
48
- this._addDependency(edge.relatedNode, edge, dependencies);
49
- } else if (
50
- edge.relation.isObjectionBelongsToOneRelation &&
51
- // Ignored models don't replace the current one, so their keys must not
52
- // be copied to the owner either.
53
- !this.graphOptions.shouldIgnore(edge.relatedNode, this.graphData)
54
- ) {
55
- // In case of BelongsToOneRelation the owner node depends on the related
56
- // node because the owner node has the foreign key.
57
- this._addDependency(edge.ownerNode, edge, dependencies);
58
- }
59
- }
60
-
61
- _createReferenceDependency(edge, dependencies) {
62
- this._addDependency(edge.ownerNode, edge, dependencies);
63
- }
64
-
65
- _addDependency(node, edge, dependencies) {
66
- let edges = dependencies.get(node);
67
-
68
- if (!edges) {
69
- edges = [];
70
- dependencies.set(node, edges);
71
- }
72
-
73
- edges.push(edge);
74
- }
75
-
76
- _createNormalActions() {
77
- const handledNodes = new Set();
78
- const actions = [];
79
-
80
- while (true) {
81
- // At this point, don't care if the nodes have already been inserted before
82
- // given to this class. `GraphInsertAction` will test that and only insert
83
- // new ones. We need to pass all nodes to `GraphInsertActions` so that we
84
- // can resolve all dependencies.
85
- const nodesToInsert = this.graph.nodes.filter((node) => {
86
- return (
87
- !node.isReference && !handledNodes.has(node) && !this._hasDependencies(node, handledNodes)
88
- );
89
- });
90
-
91
- // `#ref` nodes aren't inserted, so they can be resolved in the same
92
- // action as the nodes they depend on, once these are inserted.
93
- const insertedNodes = new Set([...handledNodes, ...nodesToInsert]);
94
- const refNodes = this.graph.nodes.filter((node) => {
95
- return (
96
- node.isReference && !handledNodes.has(node) && !this._hasDependencies(node, insertedNodes)
97
- );
98
- });
99
-
100
- const nodes = [...nodesToInsert, ...refNodes];
101
-
102
- if (nodes.length === 0) {
103
- if (handledNodes.size !== this.graph.nodes.length && this._breakCycle(handledNodes)) {
104
- continue;
105
- }
106
-
107
- break;
108
- }
109
-
110
- actions.push(
111
- new GraphInsertAction(this.graphData, {
112
- nodes: nodesToInsert,
113
- refNodes,
114
- dependencies: this.dependencies,
115
- deferredEdges: this.deferredEdges,
116
- }),
117
- );
118
-
119
- for (const node of nodes) {
120
- handledNodes.add(node);
121
- }
122
- }
123
-
124
- if (handledNodes.size !== this.graph.nodes.length) {
125
- throw new Error('the object graph contains cyclic references');
126
- }
127
-
128
- return actions;
129
- }
130
-
131
- // Tries to break a dependency cycle by deferring one `BelongsToOneRelation`
132
- // edge that points to a `#ref` node. The owner node is then inserted without
133
- // the foreign key, which is patched in by `DeferredRelationGraphInsertAction`
134
- // once the referenced node has been inserted. Cycles can only exist through
135
- // `#ref` nodes, since the graph is a tree otherwise.
136
- _breakCycle(handledNodes) {
137
- for (const node of this.graph.nodes) {
138
- if (handledNodes.has(node)) {
139
- continue;
140
- }
141
-
142
- for (const edge of this._pendingDependencyEdges(node, handledNodes)) {
143
- if (
144
- this._canDeferEdge(edge, node) &&
145
- this._isBlockedBy(edge.relatedNode, node, handledNodes, new Set())
146
- ) {
147
- this.deferredEdges.add(edge);
148
- return true;
149
- }
150
- }
151
- }
152
-
153
- return false;
154
- }
155
-
156
- _canDeferEdge(edge, node) {
157
- return (
158
- edge.type === ModelGraphEdge.Type.Relation &&
159
- edge.relation.isObjectionBelongsToOneRelation &&
160
- edge.isOwnerNode(node) &&
161
- edge.relatedNode.isReference &&
162
- // The owner is patched by its id, which models without one don't have (#2305).
163
- node.modelClass.getIdColumnArray().length > 0 &&
164
- // Both ends need to be inserted for the foreign key to be patched in later.
165
- this.graphOptions.shouldInsert(node, this.graphData) &&
166
- this.graphOptions.shouldInsert(edge.relatedNode.referencedNode, this.graphData) &&
167
- !this._isReadByPropertyReference(node, edge.relation.ownerProp)
168
- );
169
- }
170
-
171
- // Returns true if a `#ref{}` property reference reads one of the `props` of
172
- // `node`. Such references may be resolved before a deferred prop is set,
173
- // which would resolve them to `undefined`.
174
- _isReadByPropertyReference(node, props) {
175
- return node.refEdges.some((edge) => {
176
- return (
177
- edge.refType === ModelGraphEdge.ReferenceType.Property &&
178
- edge.isRelatedNode(node) &&
179
- props.props.includes(edge.refRelatedDataPath[0])
180
- );
181
- });
182
- }
183
-
184
- // Returns true if `node` (transitively) waits for `blockingNode` to be handled.
185
- _isBlockedBy(node, blockingNode, handledNodes, visitedNodes) {
186
- if (node === blockingNode) {
187
- return true;
188
- }
189
-
190
- if (visitedNodes.has(node)) {
191
- return false;
192
- }
193
-
194
- visitedNodes.add(node);
195
-
196
- for (const edge of this._pendingDependencyEdges(node, handledNodes)) {
197
- if (this._isBlockedBy(edge.getOtherNode(node), blockingNode, handledNodes, visitedNodes)) {
198
- return true;
199
- }
200
- }
201
-
202
- return false;
203
- }
204
-
205
- _createDeferredRelationActions() {
206
- if (this.deferredEdges.size === 0) {
207
- return [];
208
- }
209
-
210
- return [
211
- new DeferredRelationGraphInsertAction(this.graphData, {
212
- edges: [...this.deferredEdges],
213
- }),
214
- ];
215
- }
216
-
217
- _hasDependencies(node, handledNodes) {
218
- return this._pendingDependencyEdges(node, handledNodes).length > 0;
219
- }
220
-
221
- // Returns the dependency edges of `node` whose other node still needs to be
222
- // handled first. Deferred edges are ignored.
223
- _pendingDependencyEdges(node, handledNodes) {
224
- const edges = this.dependencies.get(node) || [];
225
-
226
- return edges.filter((edge) => {
227
- const dependencyNode = edge.getOtherNode(node);
228
-
229
- return (
230
- !this.deferredEdges.has(edge) &&
231
- !handledNodes.has(dependencyNode) &&
232
- (!this.currentGraph.nodeForNode(dependencyNode) ||
233
- this._readsFilledProps(edge, dependencyNode))
234
- );
235
- });
236
- }
237
-
238
- // Returns true if the reference `edge` reads props that the graph fills into
239
- // `node`. The keys of existing models are known right away, but these props
240
- // only once they're filled in (#356).
241
- _readsFilledProps(edge, node) {
242
- if (edge.type === ModelGraphEdge.Type.Relation) {
243
- return false;
244
- }
245
-
246
- const filledProps = this._getFilledProps(node);
247
- // A `#ref` node stands in for `node` in its relations, which read only
248
- // their keys from it:
249
- const readProps =
250
- edge.refType === ModelGraphEdge.ReferenceType.Property
251
- ? [edge.refRelatedDataPath[0]]
252
- : this._getRelationProps(edge.ownerNode.edges, edge.ownerNode);
253
-
254
- return readProps.some((prop) => filledProps.includes(prop));
255
- }
256
-
257
- // Returns the props of `node` that the graph fills in from other models,
258
- // through its relations and its property references.
259
- _getFilledProps(node) {
260
- const edges = this.dependencies.get(node) || [];
261
-
262
- return [
263
- ...this._getRelationProps(edges, node),
264
- ...edges
265
- .filter((edge) => edge.refType === ModelGraphEdge.ReferenceType.Property)
266
- .map((edge) => edge.refOwnerDataPath[0]),
267
- ];
268
- }
269
-
270
- // Returns the props of `node` that the relation edges among `edges` join on.
271
- _getRelationProps(edges, node) {
272
- return edges
273
- .filter((edge) => edge.type === ModelGraphEdge.Type.Relation)
274
- .flatMap((edge) => {
275
- return (edge.isOwnerNode(node) ? edge.relation.ownerProp : edge.relation.relatedProp).props;
276
- });
277
- }
278
-
279
- _createJoinRowActions() {
280
- return [
281
- new JoinRowGraphInsertAction(this.graphData, {
282
- nodes: this.graph.nodes.filter((node) => {
283
- return (
284
- this.currentGraph.nodeForNode(node) === null &&
285
- node.parentEdge &&
286
- node.parentEdge.relation.isObjectionManyToManyRelation
287
- );
288
- }),
289
- }),
290
- ];
291
- }
292
- }
293
-
294
- module.exports = {
295
- GraphInsert,
296
- };
@@ -1,233 +0,0 @@
1
- 'use strict';
2
-
3
- const { GraphAction } = require('../GraphAction');
4
- const { groupBy, chunk, get, set } = require('../../../utils/objectUtils');
5
- const { ModelGraphEdge } = require('../../../model/graph/ModelGraphEdge');
6
- const promiseUtils = require('../../../utils/promiseUtils');
7
-
8
- /**
9
- * Inserts a batch of nodes for a GraphInsert.
10
- *
11
- * One of these is created for each batch of nodes that can be inserted at once.
12
- * However, the nodes can have a different table and not all databases support
13
- * batch inserts, so this class splits the inserts into further sub batches
14
- * when needed.
15
- */
16
- class GraphInsertAction extends GraphAction {
17
- constructor(graphData, { nodes, refNodes, dependencies, deferredEdges }) {
18
- super(graphData);
19
-
20
- // Nodes to insert, and `#ref` nodes to resolve once they are inserted.
21
- this.nodes = nodes;
22
- this.refNodes = refNodes;
23
- this.dependencies = dependencies;
24
- // Dependency edges that are resolved once the dependency node has been
25
- // inserted, and are patched in by `DeferredRelationGraphInsertAction`.
26
- this.deferredEdges = deferredEdges;
27
- }
28
-
29
- async run(builder) {
30
- const batches = this._createInsertBatches(builder);
31
- const concurrency = this._getConcurrency(builder, this.nodes);
32
-
33
- await promiseUtils.map(batches, (batch) => this._insertBatch(builder, batch), { concurrency });
34
- this._resolveDependencies(this.refNodes);
35
- }
36
-
37
- _createInsertBatches(builder) {
38
- const batches = [];
39
- const batchSize = this._getBatchSize(builder);
40
- const nodesByModelClass = groupBy(this.nodes, getModelClass);
41
-
42
- for (const nodes of nodesByModelClass.values()) {
43
- for (const nodeBatch of chunk(nodes, batchSize)) {
44
- batches.push(nodeBatch);
45
- }
46
- }
47
-
48
- return batches;
49
- }
50
-
51
- async _insertBatch(parentBuilder, nodes) {
52
- await this._beforeInsert(nodes);
53
- await this._insert(parentBuilder, nodes);
54
- }
55
-
56
- _beforeInsert(nodes) {
57
- this._resolveDependencies(nodes);
58
- this._omitManyToManyExtraProps(nodes);
59
- this._copyRelationPropsFromCurrentIfNeeded(nodes);
60
-
61
- return Promise.resolve();
62
- }
63
-
64
- _resolveDependencies(nodes) {
65
- for (const node of nodes) {
66
- const edges = this.dependencies.get(node);
67
-
68
- if (edges) {
69
- for (const edge of edges) {
70
- if (this.deferredEdges.has(edge)) {
71
- continue;
72
- }
73
-
74
- // `node` needs `dependencyNode` to have been inserted (and it has been).
75
- const dependencyNode = edge.getOtherNode(node);
76
-
77
- this._resolveDependency(dependencyNode, edge);
78
- }
79
- }
80
- }
81
- }
82
-
83
- _resolveDependency(dependencyNode, edge) {
84
- if (edge.type === ModelGraphEdge.Type.Relation && !edge.relation.joinTable) {
85
- this._resolveRelationDependency(dependencyNode, edge);
86
- } else if (edge.refType === ModelGraphEdge.ReferenceType.Object) {
87
- this._resolveReferences(edge.getOtherNode(dependencyNode));
88
- } else if (edge.refType === ModelGraphEdge.ReferenceType.Property) {
89
- this._resolvePropertyReferenceNode(dependencyNode, edge);
90
- }
91
- }
92
-
93
- _resolveRelationDependency(dependencyNode, edge) {
94
- const dependentNode = edge.getOtherNode(dependencyNode);
95
-
96
- let sourceProp;
97
- let targetProp;
98
-
99
- if (edge.isOwnerNode(dependencyNode)) {
100
- sourceProp = edge.relation.ownerProp;
101
- targetProp = edge.relation.relatedProp;
102
- } else {
103
- targetProp = edge.relation.ownerProp;
104
- sourceProp = edge.relation.relatedProp;
105
- }
106
-
107
- this._resolveReferences(dependencyNode);
108
-
109
- targetProp.forEach((i) => {
110
- targetProp.setProp(dependentNode.obj, i, sourceProp.getProp(dependencyNode.obj, i));
111
- });
112
- }
113
-
114
- _resolvePropertyReferenceNode(dependencyNode, edge) {
115
- const dependentNode = edge.getOtherNode(dependencyNode);
116
-
117
- let sourcePath;
118
- let targetPath;
119
-
120
- if (edge.isOwnerNode(dependencyNode)) {
121
- sourcePath = edge.refOwnerDataPath;
122
- targetPath = edge.refRelatedDataPath;
123
- } else {
124
- targetPath = edge.refOwnerDataPath;
125
- sourcePath = edge.refRelatedDataPath;
126
- }
127
-
128
- const sourceValue = get(dependencyNode.obj, sourcePath);
129
- const targetValue = get(dependentNode.obj, targetPath);
130
-
131
- if (targetValue === edge.refMatch) {
132
- set(dependentNode.obj, targetPath, sourceValue);
133
- } else {
134
- set(dependentNode.obj, targetPath, targetValue.replace(edge.refMatch, sourceValue));
135
- }
136
- }
137
-
138
- _omitManyToManyExtraProps(nodes) {
139
- for (const node of nodes) {
140
- if (
141
- node.parentEdge &&
142
- node.parentEdge.type === ModelGraphEdge.Type.Relation &&
143
- node.parentEdge.relation.joinTableExtras.length > 0
144
- ) {
145
- node.parentEdge.relation.omitExtraProps([node.obj]);
146
- }
147
- }
148
- }
149
-
150
- _copyRelationPropsFromCurrentIfNeeded(nodes) {
151
- for (const node of nodes) {
152
- const currentNode = this.currentGraph.nodeForNode(node);
153
-
154
- if (!currentNode) {
155
- continue;
156
- }
157
-
158
- for (const edge of node.edges) {
159
- if (edge.type !== ModelGraphEdge.Type.Relation) {
160
- continue;
161
- }
162
-
163
- const prop = edge.isOwnerNode(node) ? edge.relation.ownerProp : edge.relation.relatedProp;
164
-
165
- prop.forEach((i) => {
166
- const value = prop.getProp(node.obj, i);
167
-
168
- if (value !== undefined) {
169
- return;
170
- }
171
-
172
- prop.setProp(node.obj, i, prop.getProp(currentNode.obj, i));
173
- });
174
- }
175
- }
176
- }
177
-
178
- _insert(parentBuilder, nodes) {
179
- const [{ modelClass }] = nodes;
180
-
181
- nodes = nodes.filter((node) => {
182
- return this.graphOptions.shouldInsert(node, this.graphData);
183
- });
184
-
185
- for (const node of nodes) {
186
- delete node.obj[modelClass.uidProp];
187
- delete node.obj[modelClass.graphUnrelateProp];
188
- delete node.obj[modelClass.graphDeleteProp];
189
- node.obj.$validate(null, { dataPath: node.dataPathKey });
190
- }
191
-
192
- if (nodes.length === 0) {
193
- return;
194
- }
195
-
196
- for (const node of nodes) {
197
- node.userData.inserted = true;
198
- }
199
-
200
- return this._runRelationBeforeInsertMethods(parentBuilder, nodes).then(() => {
201
- return modelClass
202
- .query()
203
- .insert(nodes.map((node) => node.obj))
204
- .childQueryOf(parentBuilder)
205
- .copyFrom(parentBuilder, GraphAction.ReturningAllSelector)
206
- .execute();
207
- });
208
- }
209
-
210
- _runRelationBeforeInsertMethods(parentBuilder, nodes) {
211
- return Promise.all(
212
- nodes.map((node) => {
213
- if (node.parentEdge) {
214
- return node.parentEdge.relation.beforeInsert(
215
- node.obj,
216
- parentBuilder.context(),
217
- node.parentNode.obj,
218
- );
219
- } else {
220
- return null;
221
- }
222
- }),
223
- );
224
- }
225
- }
226
-
227
- function getModelClass(node) {
228
- return node.modelClass;
229
- }
230
-
231
- module.exports = {
232
- GraphInsertAction,
233
- };
@@ -1,92 +0,0 @@
1
- 'use strict';
2
-
3
- const { GraphAction } = require('../GraphAction');
4
- const { groupBy, chunk } = require('../../../utils/objectUtils');
5
- const promiseUtils = require('../../../utils/promiseUtils');
6
-
7
- class JoinRowGraphInsertAction extends GraphAction {
8
- constructor(graphData, { nodes }) {
9
- super(graphData);
10
- this.nodes = nodes;
11
- }
12
-
13
- run(builder) {
14
- const batches = this._createInsertBatches(builder);
15
- const concurrency = this._getConcurrency(builder, this.nodes);
16
-
17
- return promiseUtils.map(batches, (batch) => this._insertBatch(builder, batch), { concurrency });
18
- }
19
-
20
- _createInsertBatches(builder) {
21
- const batches = [];
22
- const batchSize = this._getBatchSize(builder);
23
- const nodesByModel = groupBy(this.nodes, (node) => getJoinTableModel(builder, node));
24
-
25
- for (const [joinTableModelClass, nodes] of nodesByModel.entries()) {
26
- for (const nodeBatch of chunk(nodes, batchSize)) {
27
- batches.push(this._createBatch(joinTableModelClass, nodeBatch));
28
- }
29
- }
30
-
31
- return batches;
32
- }
33
-
34
- _createBatch(joinTableModelClass, nodes) {
35
- return nodes
36
- .filter((node) => {
37
- return this.graphOptions.shouldRelate(node, this.graphData) || node.userData.inserted;
38
- })
39
- .map((node) => ({
40
- node,
41
- joinTableModelClass,
42
- joinTableObj: this._createJoinTableObj(joinTableModelClass, node),
43
- }));
44
- }
45
-
46
- _createJoinTableObj(joinTableModelClass, node) {
47
- const { parentEdge, parentNode } = node;
48
- const { relation } = parentEdge;
49
-
50
- this._resolveReferences(node);
51
-
52
- return joinTableModelClass.fromJson(
53
- relation.createJoinModel(relation.ownerProp.getProps(parentNode.obj), node.obj),
54
- );
55
- }
56
-
57
- _insertBatch(parentBuilder, batch) {
58
- return this._beforeInsert(parentBuilder, batch).then(() => this._insert(parentBuilder, batch));
59
- }
60
-
61
- _beforeInsert(parentBuilder, batch) {
62
- return Promise.all(
63
- batch.map(({ node, joinTableObj }) => {
64
- if (node.parentEdge) {
65
- return node.parentEdge.relation.joinTableBeforeInsert(
66
- joinTableObj,
67
- parentBuilder.context(),
68
- );
69
- } else {
70
- return null;
71
- }
72
- }),
73
- );
74
- }
75
-
76
- _insert(parentBuilder, batch) {
77
- if (batch.length > 0) {
78
- return batch[0].joinTableModelClass
79
- .query()
80
- .childQueryOf(parentBuilder)
81
- .insert(batch.map((it) => it.joinTableObj));
82
- }
83
- }
84
- }
85
-
86
- function getJoinTableModel(builder, node) {
87
- return node.parentEdge.relation.getJoinModelClass(builder.unsafeKnex());
88
- }
89
-
90
- module.exports = {
91
- JoinRowGraphInsertAction,
92
- };
@@ -1,20 +0,0 @@
1
- 'use strict';
2
-
3
- const { GraphOperation } = require('../GraphOperation');
4
- const { GraphPatchAction } = require('./GraphPatchAction');
5
-
6
- class GraphPatch extends GraphOperation {
7
- createActions() {
8
- return [
9
- new GraphPatchAction(this.graphData, {
10
- nodes: this.graph.nodes.filter((node) =>
11
- this.graphOptions.shouldPatchOrUpdateIgnoreDisable(node, this.graphData),
12
- ),
13
- }),
14
- ];
15
- }
16
- }
17
-
18
- module.exports = {
19
- GraphPatch,
20
- };