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/src/orm.ts CHANGED
@@ -20,14 +20,16 @@ export interface IPureORM extends ICoreIntegratedDriver {
20
20
  * if you want to write these in your data access layer yourself.
21
21
  */
22
22
 
23
- getMatching: <T extends IModel>(model: T) => T;
24
- getOneOrNoneMatching: <T extends IModel>(model: T) => T | void;
25
- getAnyMatching: <T extends ICollection<IModel>>(model: IModel) => T | void;
26
- getAllMatching: <T extends ICollection<IModel>>(model: IModel) => T;
27
- create: <T extends IModel>(model: T) => T;
28
- update: <T extends IModel>(model: T, options: { on: string }) => T;
29
- delete: <T extends IModel>(model: T) => void;
30
- deleteMatching: <T extends IModel>(model: T) => void;
23
+ getMatching: <T extends IModel>(model: T) => Promise<T>;
24
+ getOneOrNoneMatching: <T extends IModel>(model: T) => Promise<T | void>;
25
+ getAnyMatching: <T extends ICollection<IModel>>(
26
+ model: IModel
27
+ ) => Promise<T | void>;
28
+ getAllMatching: <T extends ICollection<IModel>>(model: IModel) => Promise<T>;
29
+ create: <T extends IModel>(model: T) => Promise<T>;
30
+ update: <T extends IModel>(model: T, options?: { on: string }) => Promise<T>;
31
+ delete: <T extends IModel>(model: T) => Promise<void>;
32
+ deleteMatching: <T extends IModel>(model: T) => Promise<void>;
31
33
 
32
34
  /* ------------------------------------------------------------------------*/
33
35
  /* Helper Utility Functions -----------------------------------------------*/
@@ -75,30 +77,61 @@ export const create = ({
75
77
  /* Helper Utilities for CRUD functions ------------------------------------*/
76
78
  /* ------------------------------------------------------------------------*/
77
79
 
80
+ interface IOrmHelperPlan {
81
+ quotedColumns: Array<string>;
82
+ updateClausePrefixes: Array<string>;
83
+ wherePositionalPrefixes: Array<string>;
84
+ whereNamedPrefixes: Array<string>;
85
+ }
86
+
87
+ const helperPlanByEntity = new Map<any, IOrmHelperPlan>();
88
+ const getHelperPlan = (entity: any): IOrmHelperPlan => {
89
+ let plan = helperPlanByEntity.get(entity);
90
+ if (!plan) {
91
+ const quotedColumns = new Array(entity.columnNames.length);
92
+ const updateClausePrefixes = new Array(entity.columnNames.length);
93
+ const wherePositionalPrefixes = new Array(entity.columnNames.length);
94
+ const whereNamedPrefixes = new Array(entity.columnNames.length);
95
+ for (let i = 0; i < entity.columnNames.length; i++) {
96
+ const column = entity.columnNames[i];
97
+ quotedColumns[i] = `"${column}"`;
98
+ updateClausePrefixes[i] = `"${column}" = $`;
99
+ wherePositionalPrefixes[i] = `"${entity.tableName}"."${column}" = $`;
100
+ whereNamedPrefixes[i] = `"${entity.tableName}"."${column}" = $(`;
101
+ }
102
+ plan = {
103
+ quotedColumns,
104
+ updateClausePrefixes,
105
+ wherePositionalPrefixes,
106
+ whereNamedPrefixes
107
+ };
108
+ helperPlanByEntity.set(entity, plan);
109
+ }
110
+ return plan;
111
+ };
112
+
78
113
  const getSqlInsertParts = (
79
114
  model: IModel
80
115
  ): { columns: string; values: Array<string>; valuesVar: Array<string> } => {
81
- const columns = orm
82
- .getEntityByModel(model)
83
- .columnNames.filter(
84
- (column: string, index: number) =>
85
- model[
86
- orm.getEntityByModel(model).propertyNames[
87
- index
88
- ] as keyof typeof model
89
- ] !== void 0
90
- )
91
- .map((col: string) => `"${col}"`)
92
- .join(', ');
93
- const values = orm
94
- .getEntityByModel(model)
95
- .propertyNames.map(
96
- (property: string) => model[property as keyof typeof model]
97
- )
98
- .filter((value: any) => value !== void 0);
99
- const valuesVar = values.map(
100
- (value: any, index: number) => `$${index + 1}`
101
- );
116
+ const entity = orm.getEntityByModel(model);
117
+ const { columnNames, propertyNames } = entity;
118
+ const helperPlan = getHelperPlan(entity);
119
+ let columns = '';
120
+ const values: Array<any> = [];
121
+ const valuesVar: Array<string> = [];
122
+ let paramIndex = 1;
123
+ for (let i = 0; i < columnNames.length; i++) {
124
+ const val = model[propertyNames[i] as keyof typeof model];
125
+ if (val !== void 0) {
126
+ if (columns) {
127
+ columns += ', ';
128
+ }
129
+ columns += helperPlan.quotedColumns[i];
130
+ values.push(val);
131
+ valuesVar.push(`$${paramIndex}`);
132
+ paramIndex++;
133
+ }
134
+ }
102
135
  return { columns, values, valuesVar };
103
136
  };
104
137
 
@@ -106,54 +139,48 @@ export const create = ({
106
139
  model: IModel,
107
140
  on = 'id'
108
141
  ): { clause: string; idVar: string; values: Array<string> } => {
109
- const clauseArray = orm
110
- .getEntityByModel(model)
111
- .columnNames.filter(
112
- (sqlColumn: string, index: number) =>
113
- model[
114
- orm.getEntityByModel(model).propertyNames[
115
- index
116
- ] as keyof typeof model
117
- ] !== void 0
118
- )
119
- .map(
120
- (sqlColumn: string, index: number) => `"${sqlColumn}" = $${index + 1}`
121
- );
122
- const clause = clauseArray.join(', ');
123
- const idVar = `$${clauseArray.length + 1}`;
124
- const _values = orm
125
- .getEntityByModel(model)
126
- .propertyNames.map(
127
- (property: string) => model[property as keyof typeof model]
128
- )
129
- .filter((value: any) => value !== void 0);
130
- const values = [..._values, model[on as keyof typeof model]];
142
+ const entity = orm.getEntityByModel(model);
143
+ const { columnNames, propertyNames } = entity;
144
+ const helperPlan = getHelperPlan(entity);
145
+ let clause = '';
146
+ const values: Array<any> = [];
147
+ let paramIndex = 1;
148
+ for (let i = 0; i < columnNames.length; i++) {
149
+ const val = model[propertyNames[i] as keyof typeof model];
150
+ if (val !== void 0) {
151
+ if (clause) {
152
+ clause += ', ';
153
+ }
154
+ clause += helperPlan.updateClausePrefixes[i] + paramIndex;
155
+ values.push(val);
156
+ paramIndex++;
157
+ }
158
+ }
159
+ const idVar = `$${paramIndex}`;
160
+ values.push(model[on as keyof typeof model]);
131
161
  return { clause, idVar, values };
132
162
  };
133
163
 
134
164
  const getMatchingParts = (
135
165
  model: IModel
136
166
  ): { whereClause: string; values: Array<string> } => {
137
- const whereClause = orm
138
- .getEntityByModel(model)
139
- .propertyNames.map((property: string, index: number) =>
140
- model[property as keyof typeof model] != null
141
- ? `"${orm.getEntityByModel(model).tableName}"."${
142
- orm.getEntityByModel(model).columnNames[index]
143
- }"`
144
- : null
145
- )
146
- .filter((x: string | null) => x != null)
147
- .map((x: string | null, i: number) => `${x} = $${i + 1}`)
148
- .join(' AND ');
149
- const values = orm
150
- .getEntityByModel(model)
151
- .propertyNames.map((property: string) =>
152
- model[property as keyof typeof model] != null
153
- ? model[property as keyof typeof model]
154
- : null
155
- )
156
- .filter((x: any) => x != null);
167
+ const entity = orm.getEntityByModel(model);
168
+ const { propertyNames, columnNames } = entity;
169
+ const helperPlan = getHelperPlan(entity);
170
+ const values: Array<any> = [];
171
+ let paramIndex = 1;
172
+ let whereClause = '';
173
+ for (let i = 0; i < propertyNames.length; i++) {
174
+ const val = model[propertyNames[i] as keyof typeof model];
175
+ if (val != null) {
176
+ if (whereClause) {
177
+ whereClause += ' AND ';
178
+ }
179
+ whereClause += helperPlan.wherePositionalPrefixes[i] + paramIndex;
180
+ values.push(val);
181
+ paramIndex++;
182
+ }
183
+ }
157
184
  return { whereClause, values };
158
185
  };
159
186
 
@@ -162,67 +189,54 @@ export const create = ({
162
189
  const getMatchingPartsObject = (
163
190
  model: IModel
164
191
  ): { whereClause: string; values: Array<string> } => {
165
- const whereClause = orm
166
- .getEntityByModel(model)
167
- .propertyNames.map((property: string, index: number) =>
168
- model[property as keyof typeof model] != null
169
- ? `"${orm.getEntityByModel(model).tableName}"."${
170
- orm.getEntityByModel(model).columnNames[index]
171
- }"`
172
- : null
173
- )
174
- .filter((x: string | null) => x != null)
175
- .map((x: string | null, i: number) => `${x} = $(${i + 1})`)
176
- .join(' AND ');
177
- const values = orm
178
- .getEntityByModel(model)
179
- .propertyNames.map((property: string) =>
180
- model[property as keyof typeof model] != null
181
- ? model[property as keyof typeof model]
182
- : null
183
- )
184
- .filter((x: any) => x != null)
185
- .reduce(
186
- (accum: any, val: any, index: number) =>
187
- Object.assign({}, accum, { [index + 1]: val }),
188
- {}
189
- );
192
+ const entity = orm.getEntityByModel(model);
193
+ const { propertyNames, columnNames } = entity;
194
+ const helperPlan = getHelperPlan(entity);
195
+ const values: any = {};
196
+ let paramIndex = 1;
197
+ let whereClause = '';
198
+ for (let i = 0; i < propertyNames.length; i++) {
199
+ const val = model[propertyNames[i] as keyof typeof model];
200
+ if (val != null) {
201
+ if (whereClause) {
202
+ whereClause += ' AND ';
203
+ }
204
+ whereClause += helperPlan.whereNamedPrefixes[i] + paramIndex + ')';
205
+ values[paramIndex] = val;
206
+ paramIndex++;
207
+ }
208
+ }
190
209
  return { whereClause, values };
191
210
  };
192
211
 
193
212
  const getNewWith = (model: IModel, sqlColumns: any, values: any): IModel => {
194
213
  const Constructor = model.constructor as any;
195
- const modelKeys = sqlColumns.map(
196
- (key: string) =>
197
- orm.getEntityByModel(model).propertyNames[
198
- orm.getEntityByModel(model).columnNames.indexOf(key)
199
- ]
200
- );
201
- const modelData = modelKeys.reduce(
202
- (data: any, key: string, index: number) => {
203
- data[key] = values[index];
204
- return data;
205
- },
206
- {}
207
- );
214
+ const entity = orm.getEntityByModel(model);
215
+ const modelData: any = {};
216
+ for (let i = 0; i < sqlColumns.length; i++) {
217
+ const propertyName = entity.columnToPropertyMap.get(sqlColumns[i]);
218
+ if (propertyName) {
219
+ modelData[propertyName] = values[i];
220
+ }
221
+ }
208
222
  return new Constructor(modelData);
209
223
  };
210
224
 
211
225
  const getValueBySqlColumn = (model: IModel, sqlColumn: string): string => {
212
- return model[
213
- orm.getEntityByModel(model).propertyNames[
214
- orm.getEntityByModel(model).columnNames.indexOf(sqlColumn)
215
- ] as keyof typeof model
216
- ];
226
+ const entity = orm.getEntityByModel(model);
227
+ const propertyName = entity.columnToPropertyMap.get(sqlColumn);
228
+ return propertyName
229
+ ? model[propertyName as keyof typeof model]
230
+ : (undefined as any);
217
231
  };
218
232
 
219
233
  const getSqlColumnForPropertyName = (
220
234
  model: IModel,
221
235
  propertyName: string
222
236
  ): string => {
223
- return orm.getEntityByModel(model).columnNames[
224
- orm.getEntityByModel(model).propertyNames.indexOf(propertyName)
225
- ];
237
+ const entity = orm.getEntityByModel(model);
238
+ const column = entity.propertyToColumnMap.get(propertyName);
239
+ return column as string;
226
240
  };
227
241
 
228
242
  /* ------------------------------------------------------------------------*/
@@ -230,64 +244,76 @@ export const create = ({
230
244
  /* ------------------------------------------------------------------------*/
231
245
 
232
246
  // Standard create
233
- const create = <T extends IModel>(model: T): T => {
247
+ const create = <T extends IModel>(model: T): Promise<T> => {
248
+ const entity = orm.getEntityByModel(model);
234
249
  const { columns, values, valuesVar } = getSqlInsertParts(model);
235
250
  const query = `
236
- INSERT INTO "${orm.getEntityByModel(model).tableName}" ( ${columns} )
251
+ INSERT INTO "${entity.tableName}" ( ${columns} )
237
252
  VALUES ( ${valuesVar} )
238
- RETURNING ${orm.getEntityByModel(model).selectColumnsClause};
253
+ RETURNING ${entity.selectColumnsClause};
239
254
  `;
240
255
  return orm.one<T>(query, values);
241
256
  };
242
257
 
243
258
  // Standard update
244
- const update = <T extends IModel>(model: T, { on = 'id' } = {}): T => {
259
+ const update = <T extends IModel>(
260
+ model: T,
261
+ { on = 'id' } = {}
262
+ ): Promise<T> => {
263
+ const entity = orm.getEntityByModel(model);
245
264
  const { clause, idVar, values } = getSqlUpdateParts(model, on);
246
265
  const query = `
247
- UPDATE "${orm.getEntityByModel(model).tableName}"
266
+ UPDATE "${entity.tableName}"
248
267
  SET ${clause}
249
- WHERE "${
250
- orm.getEntityByModel(model).tableName
251
- }".${getSqlColumnForPropertyName(model, on)} = ${idVar}
252
- RETURNING ${orm.getEntityByModel(model).selectColumnsClause};
268
+ WHERE "${entity.tableName}".${getSqlColumnForPropertyName(
269
+ model,
270
+ on
271
+ )} = ${idVar}
272
+ RETURNING ${entity.selectColumnsClause};
253
273
  `;
254
274
  return orm.one<T>(query, values);
255
275
  };
256
276
 
257
277
  // Standard delete
258
- const _delete = <T extends IModel>(model: T): void => {
278
+ const _delete = <T extends IModel>(model: T): Promise<void> => {
279
+ const entity = orm.getEntityByModel(model);
259
280
  const id = (model as any).id;
260
281
  const query = `
261
- DELETE FROM "${orm.getEntityByModel(model).tableName}"
262
- WHERE "${orm.getEntityByModel(model).tableName}".id = $(id)
282
+ DELETE FROM "${entity.tableName}"
283
+ WHERE "${entity.tableName}".id = $(id)
263
284
  `;
264
285
  return orm.none(query, { id });
265
286
  };
266
287
 
267
- const deleteMatching = <T extends IModel>(model: T) => {
288
+ const deleteMatching = <T extends IModel>(model: T): Promise<void> => {
289
+ const entity = orm.getEntityByModel(model);
268
290
  const { whereClause, values } = getMatchingParts(model);
269
291
  const query = `
270
- DELETE FROM "${orm.getEntityByModel(model).tableName}"
292
+ DELETE FROM "${entity.tableName}"
271
293
  WHERE ${whereClause};
272
294
  `;
273
295
  return orm.none(query, values);
274
296
  };
275
297
 
276
- const getMatching = <T extends IModel>(model: T): T => {
298
+ const getMatching = <T extends IModel>(model: T): Promise<T> => {
299
+ const entity = orm.getEntityByModel(model);
277
300
  const { whereClause, values } = getMatchingParts(model);
278
301
  const query = `
279
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
280
- FROM "${orm.getEntityByModel(model).tableName}"
302
+ SELECT ${entity.selectColumnsClause}
303
+ FROM "${entity.tableName}"
281
304
  WHERE ${whereClause};
282
305
  `;
283
306
  return orm.one<T>(query, values);
284
307
  };
285
308
 
286
- const getOneOrNoneMatching = <T extends IModel>(model: T): T | void => {
309
+ const getOneOrNoneMatching = <T extends IModel>(
310
+ model: T
311
+ ): Promise<T | void> => {
312
+ const entity = orm.getEntityByModel(model);
287
313
  const { whereClause, values } = getMatchingParts(model);
288
314
  const query = `
289
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
290
- FROM "${orm.getEntityByModel(model).tableName}"
315
+ SELECT ${entity.selectColumnsClause}
316
+ FROM "${entity.tableName}"
291
317
  WHERE ${whereClause};
292
318
  `;
293
319
  return orm.oneOrNone<T>(query, values);
@@ -295,21 +321,25 @@ export const create = ({
295
321
 
296
322
  const getAnyMatching = <T extends ICollection<IModel>>(
297
323
  model: IModel
298
- ): T | void => {
324
+ ): Promise<T | void> => {
325
+ const entity = orm.getEntityByModel(model);
299
326
  const { whereClause, values } = getMatchingParts(model);
300
327
  const query = `
301
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
302
- FROM "${orm.getEntityByModel(model).tableName}"
328
+ SELECT ${entity.selectColumnsClause}
329
+ FROM "${entity.tableName}"
303
330
  WHERE ${whereClause};
304
331
  `;
305
332
  return orm.any<T>(query, values);
306
333
  };
307
334
 
308
- const getAllMatching = <T extends ICollection<IModel>>(model: IModel): T => {
335
+ const getAllMatching = <T extends ICollection<IModel>>(
336
+ model: IModel
337
+ ): Promise<T> => {
338
+ const entity = orm.getEntityByModel(model);
309
339
  const { whereClause, values } = getMatchingParts(model);
310
340
  const query = `
311
- SELECT ${orm.getEntityByModel(model).selectColumnsClause}
312
- FROM "${orm.getEntityByModel(model).tableName}"
341
+ SELECT ${entity.selectColumnsClause}
342
+ FROM "${entity.tableName}"
313
343
  WHERE ${whereClause};
314
344
  `;
315
345
  return orm.many<T>(query, values);
@@ -5,13 +5,13 @@ export const tableName: string = 'feature_switch';
5
5
  export const columns: IColumns = ['id', 'label', 'on'];
6
6
 
7
7
  interface IFeatureSwitchProps {
8
- id: number;
8
+ id: string | number;
9
9
  label: string;
10
10
  on: boolean;
11
11
  }
12
12
 
13
13
  export class FeatureSwitch implements IModel {
14
- id: number;
14
+ id: string | number;
15
15
  label: string;
16
16
  on: boolean;
17
17