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.
- package/.benchmarks/bench-core-baseline.json +303 -0
- package/.eslintrc.json +20 -10
- package/README.md +0 -7
- package/coverage/clover.xml +1493 -1232
- package/coverage/coverage-final.json +103 -103
- package/coverage/lcov-report/dist/src/core.js.html +590 -383
- package/coverage/lcov-report/dist/src/driver-integrations/index.html +20 -20
- package/coverage/lcov-report/dist/src/driver-integrations/pgp.js.html +52 -52
- package/coverage/lcov-report/dist/src/index.html +28 -28
- package/coverage/lcov-report/dist/src/index.js.html +2 -2
- package/coverage/lcov-report/dist/src/orm.js.html +392 -209
- package/coverage/lcov-report/dist/test-utils/blog/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/article.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/blog/models/article_tag.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/blog/models/person.js.html +13 -13
- package/coverage/lcov-report/dist/test-utils/blog/models/tag.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/five/models/line-item.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/five/models/order.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-event.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/five/models/parcel-line-item.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/five/models/parcel.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/fourteen/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/models/customer.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/fourteen/models/person.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/nine/models/feature-switch.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/entities.js.html +9 -9
- package/coverage/lcov-report/dist/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order/models/index.html +14 -14
- package/coverage/lcov-report/dist/test-utils/order/models/line-item.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order/models/order.js.html +41 -41
- package/coverage/lcov-report/dist/test-utils/order/models/product-variant.js.html +18 -18
- package/coverage/lcov-report/dist/test-utils/order/models/product.js.html +17 -17
- package/coverage/lcov-report/dist/test-utils/order/models/utm-source.js.html +12 -12
- package/coverage/lcov-report/dist/test-utils/order-more/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/order-more/models/actual-product-variant.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/order-more/models/color.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/order-more/models/customer.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/order-more/models/gender.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/order-more/models/index.html +23 -23
- package/coverage/lcov-report/dist/test-utils/order-more/models/inventory-level.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order-more/models/line-item.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/order-more/models/order.js.html +39 -39
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-event.js.html +6 -6
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel-line-item.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/order-more/models/parcel.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/order-more/models/physical-address.js.html +12 -12
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant-image.js.html +7 -7
- package/coverage/lcov-report/dist/test-utils/order-more/models/product-variant.js.html +22 -22
- package/coverage/lcov-report/dist/test-utils/order-more/models/product.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order-more/models/refund.js.html +11 -11
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment-actual-product-variant.js.html +9 -9
- package/coverage/lcov-report/dist/test-utils/order-more/models/shipment.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/order-more/models/size.js.html +4 -4
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-medium.js.html +15 -15
- package/coverage/lcov-report/dist/test-utils/order-more/models/utm-source.js.html +17 -17
- package/coverage/lcov-report/dist/test-utils/six/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/six/models/customer.js.html +3 -3
- package/coverage/lcov-report/dist/test-utils/six/models/index.html +21 -21
- package/coverage/lcov-report/dist/test-utils/six/models/line-item.js.html +10 -10
- package/coverage/lcov-report/dist/test-utils/six/models/order.js.html +13 -13
- package/coverage/lcov-report/dist/test-utils/six/models/parcel-line-item.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/six/models/parcel.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/audience.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/brand.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/category.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/thirteen/models/index.html +14 -14
- package/coverage/lcov-report/dist/test-utils/thirteen/models/member.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/passion.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/product.js.html +10 -10
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation-audience.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/thirteen/models/recommendation.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/entities.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/member.js.html +1 -1
- package/coverage/lcov-report/dist/test-utils/twelve/models/prompt.js.html +2 -2
- package/coverage/lcov-report/dist/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/dist/test-utils/two/results.js.html +1 -1
- package/coverage/lcov-report/index.html +103 -103
- package/coverage/lcov-report/src/core.ts.html +841 -415
- package/coverage/lcov-report/src/driver-integrations/index.html +20 -20
- package/coverage/lcov-report/src/driver-integrations/pgp.ts.html +63 -63
- package/coverage/lcov-report/src/index.html +28 -28
- package/coverage/lcov-report/src/index.ts.html +1 -1
- package/coverage/lcov-report/src/orm.ts.html +388 -298
- package/coverage/lcov-report/test-utils/blog/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/blog/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/article.ts.html +15 -15
- package/coverage/lcov-report/test-utils/blog/models/article_tag.ts.html +2 -2
- package/coverage/lcov-report/test-utils/blog/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/blog/models/person.ts.html +13 -13
- package/coverage/lcov-report/test-utils/blog/models/tag.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/five/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/five/models/line-item.ts.html +4 -4
- package/coverage/lcov-report/test-utils/five/models/order.ts.html +3 -3
- package/coverage/lcov-report/test-utils/five/models/parcel-event.ts.html +6 -6
- package/coverage/lcov-report/test-utils/five/models/parcel-line-item.ts.html +7 -7
- package/coverage/lcov-report/test-utils/five/models/parcel.ts.html +2 -2
- package/coverage/lcov-report/test-utils/fourteen/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/index.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/models/customer.ts.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/fourteen/models/person.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/nine/index.html +1 -1
- package/coverage/lcov-report/test-utils/nine/models/feature-switch.ts.html +8 -8
- package/coverage/lcov-report/test-utils/nine/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/entities.ts.html +2 -2
- package/coverage/lcov-report/test-utils/order/index.html +1 -1
- package/coverage/lcov-report/test-utils/order/models/index.html +14 -14
- package/coverage/lcov-report/test-utils/order/models/line-item.ts.html +5 -5
- package/coverage/lcov-report/test-utils/order/models/order.ts.html +36 -36
- package/coverage/lcov-report/test-utils/order/models/product-variant.ts.html +13 -13
- package/coverage/lcov-report/test-utils/order/models/product.ts.html +13 -13
- package/coverage/lcov-report/test-utils/order/models/utm-source.ts.html +8 -8
- package/coverage/lcov-report/test-utils/order-more/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/index.html +1 -1
- package/coverage/lcov-report/test-utils/order-more/models/actual-product-variant.ts.html +3 -3
- package/coverage/lcov-report/test-utils/order-more/models/color.ts.html +6 -6
- package/coverage/lcov-report/test-utils/order-more/models/customer.ts.html +3 -3
- package/coverage/lcov-report/test-utils/order-more/models/gender.ts.html +4 -4
- package/coverage/lcov-report/test-utils/order-more/models/index.html +23 -23
- package/coverage/lcov-report/test-utils/order-more/models/inventory-level.ts.html +11 -11
- package/coverage/lcov-report/test-utils/order-more/models/line-item.ts.html +15 -15
- package/coverage/lcov-report/test-utils/order-more/models/order.ts.html +45 -45
- package/coverage/lcov-report/test-utils/order-more/models/parcel-event.ts.html +6 -6
- package/coverage/lcov-report/test-utils/order-more/models/parcel-line-item.ts.html +7 -7
- package/coverage/lcov-report/test-utils/order-more/models/parcel.ts.html +2 -2
- package/coverage/lcov-report/test-utils/order-more/models/physical-address.ts.html +12 -12
- package/coverage/lcov-report/test-utils/order-more/models/product-variant-image.ts.html +7 -7
- package/coverage/lcov-report/test-utils/order-more/models/product-variant.ts.html +22 -22
- package/coverage/lcov-report/test-utils/order-more/models/product.ts.html +11 -11
- package/coverage/lcov-report/test-utils/order-more/models/refund.ts.html +11 -11
- package/coverage/lcov-report/test-utils/order-more/models/shipment-actual-product-variant.ts.html +9 -9
- package/coverage/lcov-report/test-utils/order-more/models/shipment.ts.html +4 -4
- package/coverage/lcov-report/test-utils/order-more/models/size.ts.html +4 -4
- package/coverage/lcov-report/test-utils/order-more/models/utm-medium.ts.html +15 -15
- package/coverage/lcov-report/test-utils/order-more/models/utm-source.ts.html +17 -17
- package/coverage/lcov-report/test-utils/six/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/six/index.html +1 -1
- package/coverage/lcov-report/test-utils/six/models/customer.ts.html +3 -3
- package/coverage/lcov-report/test-utils/six/models/index.html +21 -21
- package/coverage/lcov-report/test-utils/six/models/line-item.ts.html +10 -10
- package/coverage/lcov-report/test-utils/six/models/order.ts.html +13 -13
- package/coverage/lcov-report/test-utils/six/models/parcel-line-item.ts.html +2 -2
- package/coverage/lcov-report/test-utils/six/models/parcel.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/index.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/audience.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/brand.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/category.ts.html +1 -1
- package/coverage/lcov-report/test-utils/thirteen/models/index.html +14 -14
- package/coverage/lcov-report/test-utils/thirteen/models/member.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/passion.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/product.ts.html +10 -10
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation-audience.ts.html +2 -2
- package/coverage/lcov-report/test-utils/thirteen/models/recommendation.ts.html +2 -2
- package/coverage/lcov-report/test-utils/three/index.html +1 -1
- package/coverage/lcov-report/test-utils/three/results.js.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/entities.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/index.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/member.ts.html +1 -1
- package/coverage/lcov-report/test-utils/twelve/models/prompt.ts.html +2 -2
- package/coverage/lcov-report/test-utils/two/index.html +1 -1
- package/coverage/lcov-report/test-utils/two/results.js.html +1 -1
- package/coverage/lcov.info +2136 -1991
- package/dist/example/data-access/person.d.ts +1 -1
- package/dist/src/core.d.ts +13 -7
- package/dist/src/core.js +258 -189
- package/dist/src/core.spec.js +413 -0
- package/dist/src/driver-integrations/index.d.ts +5 -5
- package/dist/src/driver-integrations/pgp.spec.d.ts +1 -0
- package/dist/src/driver-integrations/pgp.spec.js +376 -0
- package/dist/src/orm.d.ts +9 -9
- package/dist/src/orm.js +137 -76
- package/dist/src/orm.spec.js +535 -85
- package/dist/test-utils/nine/models/feature-switch.d.ts +2 -2
- package/dist/test-utils/nine/models/feature-switch.ts +2 -2
- package/example/data-access/person.ts +1 -1
- package/package.json +9 -6
- package/scripts/bench-core.js +636 -0
- package/scripts/check-bench-scenarios.js +47 -0
- package/src/core.spec.ts +485 -2
- package/src/core.ts +369 -227
- package/src/driver-integrations/index.ts +5 -5
- package/src/driver-integrations/pgp.spec.ts +444 -0
- package/src/driver-integrations/pgp.ts +5 -5
- package/src/orm.spec.ts +592 -88
- package/src/orm.ts +173 -143
- 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>>(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
224
|
-
|
|
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 "${
|
|
251
|
+
INSERT INTO "${entity.tableName}" ( ${columns} )
|
|
237
252
|
VALUES ( ${valuesVar} )
|
|
238
|
-
RETURNING ${
|
|
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>(
|
|
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 "${
|
|
266
|
+
UPDATE "${entity.tableName}"
|
|
248
267
|
SET ${clause}
|
|
249
|
-
WHERE "${
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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 "${
|
|
262
|
-
WHERE "${
|
|
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 "${
|
|
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 ${
|
|
280
|
-
FROM "${
|
|
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>(
|
|
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 ${
|
|
290
|
-
FROM "${
|
|
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 ${
|
|
302
|
-
FROM "${
|
|
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>>(
|
|
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 ${
|
|
312
|
-
FROM "${
|
|
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
|
|