pure-orm 4.0.2 → 4.1.4

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 (209) hide show
  1. package/.benchmarks/bench-core-baseline.json +303 -0
  2. package/.eslintrc.json +20 -10
  3. package/README.md +0 -7
  4. package/coverage/clover.xml +1493 -1232
  5. package/coverage/coverage-final.json +103 -103
  6. package/coverage/lcov-report/dist/src/core.js.html +590 -383
  7. package/coverage/lcov-report/dist/src/driver-integrations/index.html +20 -20
  8. package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +52 -52
  9. package/coverage/lcov-report/dist/src/index.html +28 -28
  10. package/coverage/lcov-report/dist/src/index.js.html +2 -2
  11. package/coverage/lcov-report/dist/src/orm.js.html +392 -209
  12. package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
  13. package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
  14. package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +15 -15
  15. package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +2 -2
  16. package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
  17. package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +13 -13
  18. package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
  19. package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
  20. package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
  21. package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
  22. package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +4 -4
  23. package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +3 -3
  24. package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +6 -6
  25. package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +7 -7
  26. package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +2 -2
  27. package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +1 -1
  28. package/coverage/lcov-report/dist/test-utils/fourteen/index.html +1 -1
  29. package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +1 -1
  30. package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +1 -1
  31. package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +1 -1
  32. package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
  33. package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
  34. package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +6 -6
  35. package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
  36. package/coverage/lcov-report/dist/test-utils/order/entities.js.html +9 -9
  37. package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
  38. package/coverage/lcov-report/dist/test-utils/order/models/index.html +14 -14
  39. package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +11 -11
  40. package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +41 -41
  41. package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +18 -18
  42. package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +17 -17
  43. package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +12 -12
  44. package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
  45. package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
  46. package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +3 -3
  47. package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +6 -6
  48. package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +3 -3
  49. package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +4 -4
  50. package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +23 -23
  51. package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +11 -11
  52. package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +15 -15
  53. package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +39 -39
  54. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +6 -6
  55. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +7 -7
  56. package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +2 -2
  57. package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +12 -12
  58. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +7 -7
  59. package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +22 -22
  60. package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +11 -11
  61. package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +11 -11
  62. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +9 -9
  63. package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +4 -4
  64. package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +4 -4
  65. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +15 -15
  66. package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +17 -17
  67. package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
  68. package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
  69. package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +3 -3
  70. package/coverage/lcov-report/dist/test-utils/six/models/index.html +21 -21
  71. package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +10 -10
  72. package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +13 -13
  73. package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +2 -2
  74. package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +2 -2
  75. package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
  76. package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
  77. package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +2 -2
  78. package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +2 -2
  79. package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
  80. package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +14 -14
  81. package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +2 -2
  82. package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +2 -2
  83. package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +10 -10
  84. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +2 -2
  85. package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +2 -2
  86. package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
  87. package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
  88. package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
  89. package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
  90. package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
  91. package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
  92. package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +2 -2
  93. package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
  94. package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
  95. package/coverage/lcov-report/index.html +103 -103
  96. package/coverage/lcov-report/src/core.ts.html +841 -415
  97. package/coverage/lcov-report/src/driver-integrations/index.html +20 -20
  98. package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +63 -63
  99. package/coverage/lcov-report/src/index.html +28 -28
  100. package/coverage/lcov-report/src/index.ts.html +1 -1
  101. package/coverage/lcov-report/src/orm.ts.html +388 -298
  102. package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
  103. package/coverage/lcov-report/test-utils/blog/index.html +1 -1
  104. package/coverage/lcov-report/test-utils/blog/models/article.ts.html +15 -15
  105. package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +2 -2
  106. package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
  107. package/coverage/lcov-report/test-utils/blog/models/person.ts.html +13 -13
  108. package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
  109. package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
  110. package/coverage/lcov-report/test-utils/five/index.html +1 -1
  111. package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
  112. package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +4 -4
  113. package/coverage/lcov-report/test-utils/five/models/order.ts.html +3 -3
  114. package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +6 -6
  115. package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +7 -7
  116. package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +2 -2
  117. package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +1 -1
  118. package/coverage/lcov-report/test-utils/fourteen/index.html +1 -1
  119. package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +1 -1
  120. package/coverage/lcov-report/test-utils/fourteen/models/index.html +1 -1
  121. package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +1 -1
  122. package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
  123. package/coverage/lcov-report/test-utils/nine/index.html +1 -1
  124. package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +8 -8
  125. package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
  126. package/coverage/lcov-report/test-utils/order/entities.ts.html +2 -2
  127. package/coverage/lcov-report/test-utils/order/index.html +1 -1
  128. package/coverage/lcov-report/test-utils/order/models/index.html +14 -14
  129. package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +5 -5
  130. package/coverage/lcov-report/test-utils/order/models/order.ts.html +36 -36
  131. package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +13 -13
  132. package/coverage/lcov-report/test-utils/order/models/product.ts.html +13 -13
  133. package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +8 -8
  134. package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
  135. package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
  136. package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +3 -3
  137. package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +6 -6
  138. package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +3 -3
  139. package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +4 -4
  140. package/coverage/lcov-report/test-utils/order-more/models/index.html +23 -23
  141. package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +11 -11
  142. package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +15 -15
  143. package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +45 -45
  144. package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +6 -6
  145. package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +7 -7
  146. package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +2 -2
  147. package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +12 -12
  148. package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +7 -7
  149. package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +22 -22
  150. package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +11 -11
  151. package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +11 -11
  152. package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +9 -9
  153. package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +4 -4
  154. package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +4 -4
  155. package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +15 -15
  156. package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +17 -17
  157. package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
  158. package/coverage/lcov-report/test-utils/six/index.html +1 -1
  159. package/coverage/lcov-report/test-utils/six/models/customer.ts.html +3 -3
  160. package/coverage/lcov-report/test-utils/six/models/index.html +21 -21
  161. package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +10 -10
  162. package/coverage/lcov-report/test-utils/six/models/order.ts.html +13 -13
  163. package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +2 -2
  164. package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +2 -2
  165. package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
  166. package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
  167. package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +2 -2
  168. package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +2 -2
  169. package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
  170. package/coverage/lcov-report/test-utils/thirteen/models/index.html +14 -14
  171. package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +2 -2
  172. package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +2 -2
  173. package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +10 -10
  174. package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +2 -2
  175. package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +2 -2
  176. package/coverage/lcov-report/test-utils/three/index.html +1 -1
  177. package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
  178. package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
  179. package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
  180. package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
  181. package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
  182. package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +2 -2
  183. package/coverage/lcov-report/test-utils/two/index.html +1 -1
  184. package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
  185. package/coverage/lcov.info +2136 -1991
  186. package/dist/example/data-access/person.d.ts +1 -1
  187. package/dist/src/core.d.ts +13 -7
  188. package/dist/src/core.js +258 -189
  189. package/dist/src/core.spec.js +413 -0
  190. package/dist/src/driver-integrations/index.d.ts +5 -5
  191. package/dist/src/driver-integrations/pgp.spec.d.ts +1 -0
  192. package/dist/src/driver-integrations/pgp.spec.js +376 -0
  193. package/dist/src/orm.d.ts +9 -9
  194. package/dist/src/orm.js +137 -76
  195. package/dist/src/orm.spec.js +535 -85
  196. package/dist/test-utils/nine/models/feature-switch.d.ts +2 -2
  197. package/dist/test-utils/nine/models/feature-switch.ts +2 -2
  198. package/example/data-access/person.ts +1 -1
  199. package/package.json +9 -6
  200. package/scripts/bench-core.js +636 -0
  201. package/scripts/check-bench-scenarios.js +47 -0
  202. package/src/core.spec.ts +485 -2
  203. package/src/core.ts +369 -227
  204. package/src/driver-integrations/index.ts +5 -5
  205. package/src/driver-integrations/pgp.spec.ts +444 -0
  206. package/src/driver-integrations/pgp.ts +5 -5
  207. package/src/orm.spec.ts +592 -88
  208. package/src/orm.ts +173 -143
  209. package/test-utils/nine/models/feature-switch.ts +2 -2
package/dist/src/orm.js CHANGED
@@ -12,161 +12,222 @@ const create = ({ entities: externalEntities, db, logError }) => {
12
12
  else {
13
13
  throw new Error(`You're database driver is not yet supported. You can make a PR to add it, or use the \`createCore\` export which doesn't try to abstract over the database driver, and instead you pass the results of the database driver queries to it.`);
14
14
  }
15
- /* ------------------------------------------------------------------------*/
16
- /* Helper Utilities for CRUD functions ------------------------------------*/
17
- /* ------------------------------------------------------------------------*/
15
+ const helperPlanByEntity = new Map();
16
+ const getHelperPlan = (entity) => {
17
+ let plan = helperPlanByEntity.get(entity);
18
+ if (!plan) {
19
+ const quotedColumns = new Array(entity.columnNames.length);
20
+ const updateClausePrefixes = new Array(entity.columnNames.length);
21
+ const wherePositionalPrefixes = new Array(entity.columnNames.length);
22
+ const whereNamedPrefixes = new Array(entity.columnNames.length);
23
+ for (let i = 0; i < entity.columnNames.length; i++) {
24
+ const column = entity.columnNames[i];
25
+ quotedColumns[i] = `"${column}"`;
26
+ updateClausePrefixes[i] = `"${column}" = $`;
27
+ wherePositionalPrefixes[i] = `"${entity.tableName}"."${column}" = $`;
28
+ whereNamedPrefixes[i] = `"${entity.tableName}"."${column}" = $(`;
29
+ }
30
+ plan = {
31
+ quotedColumns,
32
+ updateClausePrefixes,
33
+ wherePositionalPrefixes,
34
+ whereNamedPrefixes
35
+ };
36
+ helperPlanByEntity.set(entity, plan);
37
+ }
38
+ return plan;
39
+ };
18
40
  const getSqlInsertParts = (model) => {
19
- const columns = orm
20
- .getEntityByModel(model)
21
- .columnNames.filter((column, index) => model[orm.getEntityByModel(model).propertyNames[index]] !== void 0)
22
- .map((col) => `"${col}"`)
23
- .join(', ');
24
- const values = orm
25
- .getEntityByModel(model)
26
- .propertyNames.map((property) => model[property])
27
- .filter((value) => value !== void 0);
28
- const valuesVar = values.map((value, index) => `$${index + 1}`);
41
+ const entity = orm.getEntityByModel(model);
42
+ const { columnNames, propertyNames } = entity;
43
+ const helperPlan = getHelperPlan(entity);
44
+ let columns = '';
45
+ const values = [];
46
+ const valuesVar = [];
47
+ let paramIndex = 1;
48
+ for (let i = 0; i < columnNames.length; i++) {
49
+ const val = model[propertyNames[i]];
50
+ if (val !== void 0) {
51
+ if (columns) {
52
+ columns += ', ';
53
+ }
54
+ columns += helperPlan.quotedColumns[i];
55
+ values.push(val);
56
+ valuesVar.push(`$${paramIndex}`);
57
+ paramIndex++;
58
+ }
59
+ }
29
60
  return { columns, values, valuesVar };
30
61
  };
31
62
  const getSqlUpdateParts = (model, on = 'id') => {
32
- const clauseArray = orm
33
- .getEntityByModel(model)
34
- .columnNames.filter((sqlColumn, index) => model[orm.getEntityByModel(model).propertyNames[index]] !== void 0)
35
- .map((sqlColumn, index) => `"${sqlColumn}" = $${index + 1}`);
36
- const clause = clauseArray.join(', ');
37
- const idVar = `$${clauseArray.length + 1}`;
38
- const _values = orm
39
- .getEntityByModel(model)
40
- .propertyNames.map((property) => model[property])
41
- .filter((value) => value !== void 0);
42
- const values = [..._values, model[on]];
63
+ const entity = orm.getEntityByModel(model);
64
+ const { columnNames, propertyNames } = entity;
65
+ const helperPlan = getHelperPlan(entity);
66
+ let clause = '';
67
+ const values = [];
68
+ let paramIndex = 1;
69
+ for (let i = 0; i < columnNames.length; i++) {
70
+ const val = model[propertyNames[i]];
71
+ if (val !== void 0) {
72
+ if (clause) {
73
+ clause += ', ';
74
+ }
75
+ clause += helperPlan.updateClausePrefixes[i] + paramIndex;
76
+ values.push(val);
77
+ paramIndex++;
78
+ }
79
+ }
80
+ const idVar = `$${paramIndex}`;
81
+ values.push(model[on]);
43
82
  return { clause, idVar, values };
44
83
  };
45
84
  const getMatchingParts = (model) => {
46
- const whereClause = orm
47
- .getEntityByModel(model)
48
- .propertyNames.map((property, index) => model[property] != null
49
- ? `"${orm.getEntityByModel(model).tableName}"."${orm.getEntityByModel(model).columnNames[index]}"`
50
- : null)
51
- .filter((x) => x != null)
52
- .map((x, i) => `${x} = $${i + 1}`)
53
- .join(' AND ');
54
- const values = orm
55
- .getEntityByModel(model)
56
- .propertyNames.map((property) => model[property] != null
57
- ? model[property]
58
- : null)
59
- .filter((x) => x != null);
85
+ const entity = orm.getEntityByModel(model);
86
+ const { propertyNames, columnNames } = entity;
87
+ const helperPlan = getHelperPlan(entity);
88
+ const values = [];
89
+ let paramIndex = 1;
90
+ let whereClause = '';
91
+ for (let i = 0; i < propertyNames.length; i++) {
92
+ const val = model[propertyNames[i]];
93
+ if (val != null) {
94
+ if (whereClause) {
95
+ whereClause += ' AND ';
96
+ }
97
+ whereClause += helperPlan.wherePositionalPrefixes[i] + paramIndex;
98
+ values.push(val);
99
+ paramIndex++;
100
+ }
101
+ }
60
102
  return { whereClause, values };
61
103
  };
62
104
  // This one returns an object, which allows it to be more versatile.
63
105
  // To-do: make this one even better and use it instead of the one above.
64
106
  const getMatchingPartsObject = (model) => {
65
- const whereClause = orm
66
- .getEntityByModel(model)
67
- .propertyNames.map((property, index) => model[property] != null
68
- ? `"${orm.getEntityByModel(model).tableName}"."${orm.getEntityByModel(model).columnNames[index]}"`
69
- : null)
70
- .filter((x) => x != null)
71
- .map((x, i) => `${x} = $(${i + 1})`)
72
- .join(' AND ');
73
- const values = orm
74
- .getEntityByModel(model)
75
- .propertyNames.map((property) => model[property] != null
76
- ? model[property]
77
- : null)
78
- .filter((x) => x != null)
79
- .reduce((accum, val, index) => Object.assign({}, accum, { [index + 1]: val }), {});
107
+ const entity = orm.getEntityByModel(model);
108
+ const { propertyNames, columnNames } = entity;
109
+ const helperPlan = getHelperPlan(entity);
110
+ const values = {};
111
+ let paramIndex = 1;
112
+ let whereClause = '';
113
+ for (let i = 0; i < propertyNames.length; i++) {
114
+ const val = model[propertyNames[i]];
115
+ if (val != null) {
116
+ if (whereClause) {
117
+ whereClause += ' AND ';
118
+ }
119
+ whereClause += helperPlan.whereNamedPrefixes[i] + paramIndex + ')';
120
+ values[paramIndex] = val;
121
+ paramIndex++;
122
+ }
123
+ }
80
124
  return { whereClause, values };
81
125
  };
82
126
  const getNewWith = (model, sqlColumns, values) => {
83
127
  const Constructor = model.constructor;
84
- const modelKeys = sqlColumns.map((key) => orm.getEntityByModel(model).propertyNames[orm.getEntityByModel(model).columnNames.indexOf(key)]);
85
- const modelData = modelKeys.reduce((data, key, index) => {
86
- data[key] = values[index];
87
- return data;
88
- }, {});
128
+ const entity = orm.getEntityByModel(model);
129
+ const modelData = {};
130
+ for (let i = 0; i < sqlColumns.length; i++) {
131
+ const propertyName = entity.columnToPropertyMap.get(sqlColumns[i]);
132
+ if (propertyName) {
133
+ modelData[propertyName] = values[i];
134
+ }
135
+ }
89
136
  return new Constructor(modelData);
90
137
  };
91
138
  const getValueBySqlColumn = (model, sqlColumn) => {
92
- return model[orm.getEntityByModel(model).propertyNames[orm.getEntityByModel(model).columnNames.indexOf(sqlColumn)]];
139
+ const entity = orm.getEntityByModel(model);
140
+ const propertyName = entity.columnToPropertyMap.get(sqlColumn);
141
+ return propertyName
142
+ ? model[propertyName]
143
+ : undefined;
93
144
  };
94
145
  const getSqlColumnForPropertyName = (model, propertyName) => {
95
- return orm.getEntityByModel(model).columnNames[orm.getEntityByModel(model).propertyNames.indexOf(propertyName)];
146
+ const entity = orm.getEntityByModel(model);
147
+ const column = entity.propertyToColumnMap.get(propertyName);
148
+ return column;
96
149
  };
97
150
  /* ------------------------------------------------------------------------*/
98
151
  /* Built-in basic CRUD functions ------------------------------------------*/
99
152
  /* ------------------------------------------------------------------------*/
100
153
  // Standard create
101
154
  const create = (model) => {
155
+ const entity = orm.getEntityByModel(model);
102
156
  const { columns, values, valuesVar } = getSqlInsertParts(model);
103
157
  const query = `
104
- INSERT INTO "${orm.getEntityByModel(model).tableName}" ( ${columns} )
158
+ INSERT INTO "${entity.tableName}" ( ${columns} )
105
159
  VALUES ( ${valuesVar} )
106
- RETURNING ${orm.getEntityByModel(model).selectColumnsClause};
160
+ RETURNING ${entity.selectColumnsClause};
107
161
  `;
108
162
  return orm.one(query, values);
109
163
  };
110
164
  // Standard update
111
165
  const update = (model, { on = 'id' } = {}) => {
166
+ const entity = orm.getEntityByModel(model);
112
167
  const { clause, idVar, values } = getSqlUpdateParts(model, on);
113
168
  const query = `
114
- UPDATE "${orm.getEntityByModel(model).tableName}"
169
+ UPDATE "${entity.tableName}"
115
170
  SET ${clause}
116
- WHERE "${orm.getEntityByModel(model).tableName}".${getSqlColumnForPropertyName(model, on)} = ${idVar}
117
- RETURNING ${orm.getEntityByModel(model).selectColumnsClause};
171
+ WHERE "${entity.tableName}".${getSqlColumnForPropertyName(model, on)} = ${idVar}
172
+ RETURNING ${entity.selectColumnsClause};
118
173
  `;
119
174
  return orm.one(query, values);
120
175
  };
121
176
  // Standard delete
122
177
  const _delete = (model) => {
178
+ const entity = orm.getEntityByModel(model);
123
179
  const id = model.id;
124
180
  const query = `
125
- DELETE FROM "${orm.getEntityByModel(model).tableName}"
126
- WHERE "${orm.getEntityByModel(model).tableName}".id = $(id)
181
+ DELETE FROM "${entity.tableName}"
182
+ WHERE "${entity.tableName}".id = $(id)
127
183
  `;
128
184
  return orm.none(query, { id });
129
185
  };
130
186
  const deleteMatching = (model) => {
187
+ const entity = orm.getEntityByModel(model);
131
188
  const { whereClause, values } = getMatchingParts(model);
132
189
  const query = `
133
- DELETE FROM "${orm.getEntityByModel(model).tableName}"
190
+ DELETE FROM "${entity.tableName}"
134
191
  WHERE ${whereClause};
135
192
  `;
136
193
  return orm.none(query, values);
137
194
  };
138
195
  const getMatching = (model) => {
196
+ const entity = orm.getEntityByModel(model);
139
197
  const { whereClause, values } = getMatchingParts(model);
140
198
  const query = `
141
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
142
- FROM "${orm.getEntityByModel(model).tableName}"
199
+ SELECT ${entity.selectColumnsClause}
200
+ FROM "${entity.tableName}"
143
201
  WHERE ${whereClause};
144
202
  `;
145
203
  return orm.one(query, values);
146
204
  };
147
205
  const getOneOrNoneMatching = (model) => {
206
+ const entity = orm.getEntityByModel(model);
148
207
  const { whereClause, values } = getMatchingParts(model);
149
208
  const query = `
150
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
151
- FROM "${orm.getEntityByModel(model).tableName}"
209
+ SELECT ${entity.selectColumnsClause}
210
+ FROM "${entity.tableName}"
152
211
  WHERE ${whereClause};
153
212
  `;
154
213
  return orm.oneOrNone(query, values);
155
214
  };
156
215
  const getAnyMatching = (model) => {
216
+ const entity = orm.getEntityByModel(model);
157
217
  const { whereClause, values } = getMatchingParts(model);
158
218
  const query = `
159
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
160
- FROM "${orm.getEntityByModel(model).tableName}"
219
+ SELECT ${entity.selectColumnsClause}
220
+ FROM "${entity.tableName}"
161
221
  WHERE ${whereClause};
162
222
  `;
163
223
  return orm.any(query, values);
164
224
  };
165
225
  const getAllMatching = (model) => {
226
+ const entity = orm.getEntityByModel(model);
166
227
  const { whereClause, values } = getMatchingParts(model);
167
228
  const query = `
168
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
169
- FROM "${orm.getEntityByModel(model).tableName}"
229
+ SELECT ${entity.selectColumnsClause}
230
+ FROM "${entity.tableName}"
170
231
  WHERE ${whereClause};
171
232
  `;
172
233
  return orm.many(query, values);