imodel 0.3.1 → 0.4.0
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/index.d.mts +87 -107
- package/index.mjs +479 -479
- package/migrate.d.mts +7 -7
- package/migrate.mjs +25 -22
- package/package.json +1 -1
package/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* imodel v0.
|
|
2
|
+
* imodel v0.4.0
|
|
3
3
|
* (c) 2019-2025 undefined
|
|
4
4
|
* @license undefined
|
|
5
5
|
*/
|
|
@@ -52,6 +52,7 @@ function isPseudo(model) {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
const now = Symbol();
|
|
55
|
+
const uuid = Symbol();
|
|
55
56
|
const increment$1 = Symbol();
|
|
56
57
|
const decrement$1 = Symbol();
|
|
57
58
|
const multiply$1 = Symbol();
|
|
@@ -63,38 +64,10 @@ var values = /*#__PURE__*/Object.freeze({
|
|
|
63
64
|
divide: divide$1,
|
|
64
65
|
increment: increment$1,
|
|
65
66
|
multiply: multiply$1,
|
|
66
|
-
now: now
|
|
67
|
+
now: now,
|
|
68
|
+
uuid: uuid
|
|
67
69
|
});
|
|
68
70
|
|
|
69
|
-
/** @import { Fields, FieldType } from './types' */
|
|
70
|
-
/**
|
|
71
|
-
*
|
|
72
|
-
* @param {Fields} fields
|
|
73
|
-
* @returns {Fields<keyof FieldType>}
|
|
74
|
-
*/
|
|
75
|
-
function toBaseFields(fields) {
|
|
76
|
-
/** @type {Fields<keyof FieldType>} */
|
|
77
|
-
const allFields = {};
|
|
78
|
-
for (const [k, v] of Object.entries(fields)) {
|
|
79
|
-
const {
|
|
80
|
-
type
|
|
81
|
-
} = v;
|
|
82
|
-
if (typeof type === 'string') {
|
|
83
|
-
// @ts-ignore
|
|
84
|
-
allFields[k] = v;
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
if (!type.table) {
|
|
88
|
-
allFields[k] = {
|
|
89
|
-
...v,
|
|
90
|
-
type: 'object',
|
|
91
|
-
primary: 0
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return allFields;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
71
|
/** @import { Options, Queryable } from '../types' */
|
|
99
72
|
/**
|
|
100
73
|
*
|
|
@@ -162,81 +135,45 @@ async function getSpecificValue(val) {
|
|
|
162
135
|
return value;
|
|
163
136
|
}
|
|
164
137
|
|
|
165
|
-
/** @import { SetValue } from '../../set.mjs' */
|
|
166
|
-
/** @import { Fields, Skip } from '../../types' */
|
|
167
|
-
/**
|
|
168
|
-
*
|
|
169
|
-
* @param {Fields} fields
|
|
170
|
-
* @param {Record<string, SetValue> | null | undefined} [update]
|
|
171
|
-
* @param {boolean | Skip} [skip]
|
|
172
|
-
* @returns {Promise<Record<string, SetValue>>}
|
|
173
|
-
*/
|
|
174
|
-
async function getSetNewValue(fields, update, skip) {
|
|
175
|
-
const data = {
|
|
176
|
-
...update
|
|
177
|
-
};
|
|
178
|
-
if (!(skip === true || skip && skip.specific)) {
|
|
179
|
-
for (const [name, field] of Object.entries(fields)) {
|
|
180
|
-
if (field.primary) {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
const updating = await getSpecificValue(field.updating);
|
|
184
|
-
if (updating !== void 0) {
|
|
185
|
-
data[name] = updating;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
return Object.fromEntries(Object.entries(data).filter(([k, v]) => {
|
|
190
|
-
const field = k in fields && fields[k];
|
|
191
|
-
if (!field) {
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
if (field.immutable) {
|
|
195
|
-
if (!skip) {
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
if (skip !== true && !skip.immutable) {
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return true;
|
|
203
|
-
}));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
138
|
/** @import { Fields } from '../../types' */
|
|
207
139
|
/**
|
|
208
140
|
*
|
|
209
141
|
* @param {Record<string, any>} data
|
|
210
|
-
* @param {Fields}
|
|
142
|
+
* @param {Fields} columns
|
|
143
|
+
* @param {Record<string, string> | null} fieldColumns
|
|
211
144
|
* @returns {Promise<Record<string, any>>}
|
|
212
145
|
*/
|
|
213
|
-
async function getInsertValue(data,
|
|
146
|
+
async function getInsertValue(data, columns, fieldColumns) {
|
|
214
147
|
const insertValue = {};
|
|
215
|
-
for (const [k,
|
|
216
|
-
const
|
|
148
|
+
for (const [k, col] of fieldColumns ? Object.entries(fieldColumns) : Object.keys(columns).map(v => [v, v])) {
|
|
149
|
+
const column = columns[col];
|
|
150
|
+
if (!column) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const creating = await getSpecificValue(column.creating);
|
|
217
154
|
if (creating !== void 0) {
|
|
218
|
-
insertValue[
|
|
155
|
+
insertValue[col] = creating;
|
|
219
156
|
continue;
|
|
220
157
|
}
|
|
221
|
-
const updating = await getSpecificValue(
|
|
158
|
+
const updating = await getSpecificValue(column.updating);
|
|
222
159
|
if (updating !== void 0) {
|
|
223
|
-
insertValue[
|
|
160
|
+
insertValue[col] = updating;
|
|
224
161
|
continue;
|
|
225
162
|
}
|
|
226
163
|
const val = data[k];
|
|
227
164
|
if (val !== undefined) {
|
|
228
|
-
insertValue[
|
|
165
|
+
insertValue[col] = val;
|
|
229
166
|
continue;
|
|
230
167
|
}
|
|
231
|
-
const def =
|
|
168
|
+
const def = column.default;
|
|
232
169
|
if (def === undefined) {
|
|
233
170
|
continue;
|
|
234
171
|
}
|
|
235
172
|
if (typeof def === 'function') {
|
|
236
|
-
insertValue[
|
|
173
|
+
insertValue[col] = def(data);
|
|
237
174
|
continue;
|
|
238
175
|
}
|
|
239
|
-
insertValue[
|
|
176
|
+
insertValue[col] = def;
|
|
240
177
|
}
|
|
241
178
|
return insertValue;
|
|
242
179
|
}
|
|
@@ -288,58 +225,91 @@ function setDefaultOptions(v) {
|
|
|
288
225
|
return v;
|
|
289
226
|
}
|
|
290
227
|
|
|
228
|
+
/**
|
|
229
|
+
*
|
|
230
|
+
* @param {*} item
|
|
231
|
+
* @param {[string, string][]} mapList
|
|
232
|
+
* @returns
|
|
233
|
+
*/
|
|
234
|
+
function createFilter(item, mapList) {
|
|
235
|
+
/** @type {[string, any][]} */
|
|
236
|
+
const values = mapList.map(([k, v]) => [k, item[v]]);
|
|
237
|
+
return sub => {
|
|
238
|
+
for (const [k, v] of values) {
|
|
239
|
+
// eslint-disable-next-line eqeqeq
|
|
240
|
+
if (sub[k] != v) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
291
248
|
/** @import { FieldDefine, Fields, FieldType, TableDefine } from '../../types' */
|
|
292
249
|
/**
|
|
293
250
|
*
|
|
294
251
|
* @param {Fields} fields
|
|
295
|
-
* @returns {[Fields<keyof FieldType>, [string, FieldDefine<TableDefine>][]]}
|
|
252
|
+
* @returns {[columns: Fields<keyof FieldType>, fieldColumns: Record<string, string> | null, [string, FieldDefine<TableDefine>][], baseFields: Fields<keyof FieldType>]}
|
|
296
253
|
*/
|
|
297
|
-
function
|
|
254
|
+
function toColumns(fields) {
|
|
255
|
+
/** @type {Fields<keyof FieldType>} */
|
|
256
|
+
const baseFields = Object.create(null);
|
|
298
257
|
/** @type {Fields<keyof FieldType>} */
|
|
299
|
-
const
|
|
258
|
+
const columns = Object.create(null);
|
|
259
|
+
/** @type {Record<string, string>} */
|
|
260
|
+
const fieldColumns = Object.create(null);
|
|
261
|
+
let named = false;
|
|
300
262
|
/** @type {[string, FieldDefine<TableDefine>][]} */
|
|
301
263
|
const sub = [];
|
|
302
264
|
for (const [k, v] of Object.entries(fields)) {
|
|
303
265
|
const {
|
|
304
266
|
type
|
|
305
267
|
} = v;
|
|
268
|
+
if (!type) {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const column = v.column || k;
|
|
306
272
|
if (typeof type === 'string') {
|
|
307
273
|
// @ts-ignore
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
274
|
+
baseFields[k] = columns[column] = v;
|
|
275
|
+
fieldColumns[k] = column;
|
|
276
|
+
if (k !== column) {
|
|
277
|
+
named = true;
|
|
278
|
+
}
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (!type.table) {
|
|
282
|
+
baseFields[k] = columns[column] = {
|
|
311
283
|
...v,
|
|
312
284
|
type: 'object',
|
|
313
285
|
primary: 0
|
|
314
286
|
};
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
287
|
+
fieldColumns[k] = column;
|
|
288
|
+
if (k !== column) {
|
|
289
|
+
named = true;
|
|
290
|
+
}
|
|
291
|
+
continue;
|
|
318
292
|
}
|
|
293
|
+
// @ts-ignore
|
|
294
|
+
sub.push([k, v]);
|
|
319
295
|
}
|
|
320
|
-
return [
|
|
296
|
+
return [columns, named ? fieldColumns : null, sub, baseFields];
|
|
321
297
|
}
|
|
322
298
|
|
|
323
299
|
/**
|
|
324
300
|
*
|
|
325
|
-
* @param {
|
|
326
|
-
* @param {
|
|
327
|
-
* @returns
|
|
301
|
+
* @param {Record<string, any>[]} list
|
|
302
|
+
* @param {Record<string, string>?} fieldColumns
|
|
328
303
|
*/
|
|
329
|
-
function
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
return false;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
return true;
|
|
339
|
-
};
|
|
304
|
+
function toFieldList(list, fieldColumns) {
|
|
305
|
+
if (!fieldColumns) {
|
|
306
|
+
return list;
|
|
307
|
+
}
|
|
308
|
+
const map = Object.entries(fieldColumns);
|
|
309
|
+
return list.map(it => Object.fromEntries(map.map(([k, v]) => [k, it[v]])));
|
|
340
310
|
}
|
|
341
311
|
|
|
342
|
-
/** @import { Environment, FieldDefine, Fields,
|
|
312
|
+
/** @import { Environment, FieldDefine, Fields, IConnection, TableDefine } from '../types' */
|
|
343
313
|
/**
|
|
344
314
|
*
|
|
345
315
|
* @param {any} p
|
|
@@ -447,13 +417,13 @@ async function createSub(conn, env, fields, newList, list) {
|
|
|
447
417
|
}
|
|
448
418
|
continue;
|
|
449
419
|
}
|
|
450
|
-
const [
|
|
451
|
-
const insertKeys = Object.entries(
|
|
452
|
-
const insertValues = await Promise.all(fieldValues.map(d => getInsertValue(d,
|
|
420
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
421
|
+
const insertKeys = Object.entries(columns).map(v => v[0]);
|
|
422
|
+
const insertValues = await Promise.all(fieldValues.map(d => getInsertValue(d, columns, fieldColumns)));
|
|
453
423
|
const {
|
|
454
424
|
table
|
|
455
425
|
} = type;
|
|
456
|
-
const result = table && typeof table === 'object' ? table.insert(env, conn,
|
|
426
|
+
const result = (table && typeof table === 'object' ? table.insert(env, conn, columns, insertValues, insertKeys) : conn.insert(env, table || '', columns, insertValues, insertKeys)).then(r => toFieldList(r, fieldColumns));
|
|
457
427
|
promises.push(result.then(r => createSub(conn, env, tableFields, fieldValues, r)));
|
|
458
428
|
promises.push(array ? result.then(values => {
|
|
459
429
|
for (const [value] of allList) {
|
|
@@ -498,16 +468,16 @@ async function create(conn, env, model, p, mapDo = defaultMap) {
|
|
|
498
468
|
}
|
|
499
469
|
records.push(data);
|
|
500
470
|
}
|
|
501
|
-
const [
|
|
502
|
-
const insertValues = await Promise.all(records.map(d => getInsertValue(d,
|
|
471
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
472
|
+
const insertValues = await Promise.all(records.map(d => getInsertValue(d, columns, fieldColumns)));
|
|
503
473
|
let insertKeys = [];
|
|
504
474
|
if (!insertKeys.length && !isArray) {
|
|
505
|
-
insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in
|
|
475
|
+
insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in columns).map(([k]) => k);
|
|
506
476
|
}
|
|
507
477
|
if (!insertKeys.length) {
|
|
508
|
-
insertKeys = Object.entries(
|
|
478
|
+
insertKeys = Object.entries(columns).map(([k]) => k);
|
|
509
479
|
}
|
|
510
|
-
const list = table && typeof table === 'object' ? await table.insert(env, conn,
|
|
480
|
+
const list = toFieldList(table && typeof table === 'object' ? await table.insert(env, conn, columns, insertValues, insertKeys) : await conn.insert(env, table || '', columns, insertValues, insertKeys), fieldColumns);
|
|
511
481
|
await createSub(conn, env, tableFields, records, list);
|
|
512
482
|
const value = list.map((v, i) => mapDo(v, getOtherValues(records[i], fields)));
|
|
513
483
|
return isArray ? value : value[0];
|
|
@@ -516,12 +486,12 @@ async function create(conn, env, model, p, mapDo = defaultMap) {
|
|
|
516
486
|
/** @import { Fields } from './types' */
|
|
517
487
|
/**
|
|
518
488
|
*
|
|
519
|
-
* @param {Fields}
|
|
489
|
+
* @param {Fields} fieldsOrColumns
|
|
520
490
|
* @returns {string[]}
|
|
521
491
|
*/
|
|
522
|
-
function getPrimaryKeys(
|
|
523
|
-
const list = Object.entries(
|
|
524
|
-
const primaryKeys = list.filter(([v, o]) => typeof o.type === 'string' && o.primary);
|
|
492
|
+
function getPrimaryKeys(fieldsOrColumns) {
|
|
493
|
+
const list = Object.entries(fieldsOrColumns);
|
|
494
|
+
const primaryKeys = list.filter(([v, o]) => o.type && typeof o.type === 'string' && o.primary);
|
|
525
495
|
if (primaryKeys.length) {
|
|
526
496
|
return primaryKeys.map(([k]) => k);
|
|
527
497
|
}
|
|
@@ -530,8 +500,8 @@ function getPrimaryKeys(fields) {
|
|
|
530
500
|
|
|
531
501
|
/** @import { Constraint, Fields, FieldType } from '../../types' */
|
|
532
502
|
/**
|
|
533
|
-
* @param {Fields
|
|
534
|
-
* @param {
|
|
503
|
+
* @param {Fields} fields
|
|
504
|
+
* @param {Set<string>} parentFields
|
|
535
505
|
* @param {Record<string, string | Constraint> | undefined} constraints
|
|
536
506
|
* @returns {[string, string][]?}
|
|
537
507
|
*/
|
|
@@ -549,7 +519,7 @@ function getMapList(fields, parentFields, constraints) {
|
|
|
549
519
|
if (typeof field !== 'string') {
|
|
550
520
|
continue;
|
|
551
521
|
}
|
|
552
|
-
if (!(field
|
|
522
|
+
if (!parentFields.has(field)) {
|
|
553
523
|
continue;
|
|
554
524
|
}
|
|
555
525
|
where.push([k, field]);
|
|
@@ -564,17 +534,17 @@ function getMapList(fields, parentFields, constraints) {
|
|
|
564
534
|
/**
|
|
565
535
|
*
|
|
566
536
|
* @param {Record<string, Constraint> | undefined} value
|
|
567
|
-
* @param {Fields<keyof FieldType>}
|
|
537
|
+
* @param {Fields<keyof FieldType>} columns
|
|
568
538
|
* @returns {[string, unknown][]}
|
|
569
539
|
*/
|
|
570
|
-
function getValueEntries(value,
|
|
540
|
+
function getValueEntries(value, columns) {
|
|
571
541
|
if (!value) {
|
|
572
542
|
return [];
|
|
573
543
|
}
|
|
574
544
|
/** @type {[string, unknown][]} */
|
|
575
545
|
const where = [];
|
|
576
546
|
for (const [k, v] of Object.entries(value)) {
|
|
577
|
-
if (!(k in
|
|
547
|
+
if (!(k in columns)) {
|
|
578
548
|
continue;
|
|
579
549
|
}
|
|
580
550
|
if (!v || typeof v !== 'object') {
|
|
@@ -620,18 +590,68 @@ function valueEntries2where(value) {
|
|
|
620
590
|
}));
|
|
621
591
|
}
|
|
622
592
|
|
|
623
|
-
/** @import {
|
|
593
|
+
/** @import { WhereValue } from '../../Where.mjs' */
|
|
594
|
+
/**
|
|
595
|
+
*
|
|
596
|
+
* @param {WhereValue['field']} field
|
|
597
|
+
* @param {Record<string, string>} fieldColumns
|
|
598
|
+
* @returns {WhereValue['field']}
|
|
599
|
+
*/
|
|
600
|
+
function field$2(field, fieldColumns) {
|
|
601
|
+
if (!field) {
|
|
602
|
+
return field;
|
|
603
|
+
}
|
|
604
|
+
if (!Array.isArray(field)) {
|
|
605
|
+
if (typeof field === 'string') {
|
|
606
|
+
return fieldColumns[field];
|
|
607
|
+
}
|
|
608
|
+
return {
|
|
609
|
+
...field,
|
|
610
|
+
field: fieldColumns[field.field]
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
return field.map(field => {
|
|
614
|
+
if (typeof field === 'string') {
|
|
615
|
+
return fieldColumns[field];
|
|
616
|
+
}
|
|
617
|
+
return {
|
|
618
|
+
...field,
|
|
619
|
+
field: fieldColumns[field.field]
|
|
620
|
+
};
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
*
|
|
625
|
+
* @param {WhereValue[] | null | undefined} where
|
|
626
|
+
* @param {Record<string, string>?} fieldColumns
|
|
627
|
+
* @returns {WhereValue[]}
|
|
628
|
+
*/
|
|
629
|
+
function where2column(where, fieldColumns) {
|
|
630
|
+
if (!where) {
|
|
631
|
+
return [];
|
|
632
|
+
}
|
|
633
|
+
if (!fieldColumns) {
|
|
634
|
+
return where;
|
|
635
|
+
}
|
|
636
|
+
// @ts-ignore
|
|
637
|
+
return where.map(v => ({
|
|
638
|
+
...v,
|
|
639
|
+
field: field$2(v.field, fieldColumns)
|
|
640
|
+
}));
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/** @import { Environment, FieldDefine, IConnection, Queryable, TableDefine } from '../types' */
|
|
624
644
|
/**
|
|
625
645
|
*
|
|
626
646
|
* @param {IConnection} conn
|
|
627
647
|
* @param {any[]} list
|
|
628
648
|
* @param {[string, FieldDefine<TableDefine>][]} fields
|
|
629
|
-
* @param {
|
|
649
|
+
* @param {Set<string>} baseFieldSet
|
|
630
650
|
* @param {Environment} env
|
|
631
651
|
* @param {boolean} [hasResult]
|
|
632
652
|
* @returns
|
|
633
653
|
*/
|
|
634
|
-
async function deleteSub(conn, list, fields,
|
|
654
|
+
async function deleteSub(conn, list, fields, baseFieldSet, env, hasResult) {
|
|
635
655
|
if (!list.length) {
|
|
636
656
|
return list;
|
|
637
657
|
}
|
|
@@ -646,29 +666,25 @@ async function deleteSub(conn, list, fields, baseFields, env, hasResult) {
|
|
|
646
666
|
const {
|
|
647
667
|
fields
|
|
648
668
|
} = type;
|
|
649
|
-
const [
|
|
650
|
-
const mapList = getMapList(
|
|
669
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
670
|
+
const mapList = getMapList(fields, baseFieldSet, constraints);
|
|
651
671
|
if (!mapList) {
|
|
652
672
|
continue;
|
|
653
673
|
}
|
|
654
|
-
const value = getValueEntries(constraints,
|
|
655
|
-
const where = [subList2where(list, mapList), ...valueEntries2where(value)];
|
|
674
|
+
const value = getValueEntries(constraints, columns);
|
|
675
|
+
const where = where2column([subList2where(list, mapList), ...valueEntries2where(value)], fieldColumns);
|
|
656
676
|
const {
|
|
657
677
|
table
|
|
658
678
|
} = type;
|
|
659
|
-
|
|
660
|
-
const argv = {
|
|
661
|
-
table: typeof table === 'string' ? table : '',
|
|
662
|
-
fields: subfields,
|
|
663
|
-
where
|
|
664
|
-
};
|
|
679
|
+
const tableName = typeof table === 'string' ? table : '';
|
|
665
680
|
if (!tableFields.length && !hasResult) {
|
|
666
|
-
const result = table && typeof table === 'object' ? table.delete(env, conn,
|
|
681
|
+
const result = table && typeof table === 'object' ? table.delete(env, conn, columns, where) : conn.delete(env, tableName, columns, where);
|
|
667
682
|
promises.push(result);
|
|
668
683
|
continue;
|
|
669
684
|
}
|
|
670
|
-
const result = table && typeof table === 'object' ? table.deleteReturn(env, conn,
|
|
671
|
-
|
|
685
|
+
const result = (table && typeof table === 'object' ? table.deleteReturn(env, conn, Object.keys(columns), columns, where) : conn.deleteReturn(env, Object.keys(columns), tableName, columns, where)).then(r => toFieldList(r, fieldColumns));
|
|
686
|
+
const subFieldSet = new Set(Object.keys(fieldColumns || columns));
|
|
687
|
+
promises.push(result.then(l => deleteSub(conn, l, tableFields, subFieldSet, env, hasResult)));
|
|
672
688
|
constraintEntries.find(([k, v]) => v.noField)?.[0];
|
|
673
689
|
promises.push(array ? result.then(subList => {
|
|
674
690
|
for (const item of list) {
|
|
@@ -696,39 +712,93 @@ async function deleteMany(conn, queryable, env) {
|
|
|
696
712
|
table,
|
|
697
713
|
fields
|
|
698
714
|
} = queryable;
|
|
699
|
-
const
|
|
700
|
-
|
|
701
|
-
} = queryable.options;
|
|
702
|
-
const [baseFields, tableFields] = separateFields(fields);
|
|
715
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
716
|
+
const where = where2column(queryable.options.where, fieldColumns);
|
|
703
717
|
if (!tableFields.length) {
|
|
704
|
-
return table && typeof table === 'object' ? table.delete(env, conn,
|
|
705
|
-
table: '',
|
|
706
|
-
fields: baseFields,
|
|
707
|
-
where
|
|
708
|
-
}) : conn.delete(env, {
|
|
709
|
-
table: table || '',
|
|
710
|
-
fields: baseFields,
|
|
711
|
-
where
|
|
712
|
-
});
|
|
718
|
+
return table && typeof table === 'object' ? table.delete(env, conn, columns, where) : conn.delete(env, table || '', columns, where);
|
|
713
719
|
}
|
|
714
|
-
const list = table && typeof table === 'object' ? await table.deleteReturn(env, conn,
|
|
715
|
-
table: '',
|
|
716
|
-
fields: baseFields,
|
|
717
|
-
where
|
|
718
|
-
}, Object.keys(baseFields)) : await conn.deleteReturn(env, {
|
|
719
|
-
table: table || '',
|
|
720
|
-
fields: baseFields,
|
|
721
|
-
where
|
|
722
|
-
}, Object.keys(baseFields));
|
|
720
|
+
const list = toFieldList(table && typeof table === 'object' ? await table.deleteReturn(env, conn, Object.keys(columns), columns, where) : await conn.deleteReturn(env, Object.keys(columns), table || '', columns, where), fieldColumns);
|
|
723
721
|
if (!list) {
|
|
724
722
|
return 0;
|
|
725
723
|
}
|
|
726
|
-
|
|
724
|
+
const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
|
|
725
|
+
await deleteSub(conn, list, tableFields, baseFieldSet, env);
|
|
727
726
|
return list.length;
|
|
728
727
|
}
|
|
729
728
|
|
|
729
|
+
/**
|
|
730
|
+
*
|
|
731
|
+
* @param {string[]} list
|
|
732
|
+
* @param {Record<string, string>?} fieldColumns
|
|
733
|
+
*/
|
|
734
|
+
function field2column(list, fieldColumns) {
|
|
735
|
+
if (!fieldColumns) {
|
|
736
|
+
return list;
|
|
737
|
+
}
|
|
738
|
+
return list.map(k => fieldColumns[k]);
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
/**
|
|
742
|
+
*
|
|
743
|
+
* @param {Record<string, any>[]} list
|
|
744
|
+
* @param {Record<string, string>?} fieldColumns
|
|
745
|
+
*/
|
|
746
|
+
function toColumnList(list, fieldColumns) {
|
|
747
|
+
if (!fieldColumns) {
|
|
748
|
+
return list;
|
|
749
|
+
}
|
|
750
|
+
const map = Object.entries(fieldColumns);
|
|
751
|
+
return list.map(it => Object.fromEntries(map.map(([k, v]) => [v, it[k]])));
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/** @import { SetValue } from '../../set.mjs' */
|
|
755
|
+
/** @import { Fields, Skip, FieldType } from '../../types' */
|
|
756
|
+
/**
|
|
757
|
+
*
|
|
758
|
+
* @param {Fields<keyof FieldType>} columns
|
|
759
|
+
* @param {Record<string, string> | null} fieldColumns
|
|
760
|
+
* @param {Record<string, SetValue> | null | undefined} [update]
|
|
761
|
+
* @param {boolean | Skip} [skip]
|
|
762
|
+
* @returns {Promise<Record<string, SetValue>>}
|
|
763
|
+
*/
|
|
764
|
+
async function getSetValue$1(columns, fieldColumns, update, skip) {
|
|
765
|
+
/** @type {Record<string, SetValue>} */
|
|
766
|
+
const data = {};
|
|
767
|
+
if (update) {
|
|
768
|
+
for (const [k, v] of Object.entries(update)) {
|
|
769
|
+
const key = fieldColumns ? fieldColumns[k] : k;
|
|
770
|
+
const field = columns[key];
|
|
771
|
+
if (!field) {
|
|
772
|
+
continue;
|
|
773
|
+
}
|
|
774
|
+
if (field.immutable) {
|
|
775
|
+
if (!skip) {
|
|
776
|
+
continue;
|
|
777
|
+
}
|
|
778
|
+
if (skip !== true && !skip.immutable) {
|
|
779
|
+
continue;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
data[key] = v;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
if (!(skip === true || skip && skip.specific)) {
|
|
786
|
+
for (const [name, field] of Object.entries(columns)) {
|
|
787
|
+
if (field.primary) {
|
|
788
|
+
continue;
|
|
789
|
+
}
|
|
790
|
+
const updating = await getSpecificValue(field.updating);
|
|
791
|
+
if (updating === void 0) {
|
|
792
|
+
continue;
|
|
793
|
+
}
|
|
794
|
+
data[name] = updating;
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return data;
|
|
798
|
+
}
|
|
799
|
+
|
|
730
800
|
/* eslint-disable no-labels */
|
|
731
|
-
/** @import { Constraint, Environment, FieldDefine,
|
|
801
|
+
/** @import { Constraint, Environment, FieldDefine, IConnection, TableDefine } from '../types' */
|
|
732
802
|
/** @import { WhereValue } from '../Where.mjs' */
|
|
733
803
|
/**
|
|
734
804
|
*
|
|
@@ -743,9 +813,6 @@ function classify(newList, oldList, keys, notFound, found) {
|
|
|
743
813
|
oldValue: for (let i = 0; i < oldList.length; i++) {
|
|
744
814
|
const old = oldList[i];
|
|
745
815
|
for (const k of keys) {
|
|
746
|
-
if (n[k] === undefined) {
|
|
747
|
-
continue;
|
|
748
|
-
}
|
|
749
816
|
if (old[k] !== n[k]) {
|
|
750
817
|
continue oldValue;
|
|
751
818
|
}
|
|
@@ -835,24 +902,23 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
|
|
|
835
902
|
if (!has) {
|
|
836
903
|
return;
|
|
837
904
|
}
|
|
838
|
-
const
|
|
839
|
-
const newList = newListValues.flat();
|
|
840
|
-
const {
|
|
841
|
-
fields
|
|
842
|
-
} = type;
|
|
905
|
+
const [columns, fieldColumns, tableFields, fields] = toColumns(type.fields);
|
|
843
906
|
/** @type {Record<string, any>} */
|
|
844
|
-
const
|
|
845
|
-
for (const [k, v] of
|
|
907
|
+
const commonValues = {};
|
|
908
|
+
for (const [k, v] of constraintEntries) {
|
|
846
909
|
const {
|
|
847
910
|
field,
|
|
848
911
|
value
|
|
849
912
|
} = v;
|
|
850
|
-
if (field
|
|
851
|
-
|
|
913
|
+
if (!field && value !== undefined) {
|
|
914
|
+
commonValues[k] = value;
|
|
852
915
|
}
|
|
853
916
|
}
|
|
854
|
-
const
|
|
855
|
-
const
|
|
917
|
+
const oldList = oldListValues.flat();
|
|
918
|
+
const newList = newListValues.flat();
|
|
919
|
+
const primaryKeys = getPrimaryKeys(fields);
|
|
920
|
+
const fieldKeys = Object.keys(fields);
|
|
921
|
+
const columnKeys = Object.keys(columns);
|
|
856
922
|
// 分离出新建、修改、删除
|
|
857
923
|
// TODO: 优化分离逻辑
|
|
858
924
|
const needDelete = oldList;
|
|
@@ -864,9 +930,9 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
|
|
|
864
930
|
const needUpdate = [];
|
|
865
931
|
/** @type {Record<string, any>[]} */
|
|
866
932
|
const unmatched = [];
|
|
867
|
-
const aKeys =
|
|
933
|
+
const aKeys = fieldKeys.filter(v => !(v in commonValues));
|
|
934
|
+
const pKeys = primaryKeys.filter(v => !(v in commonValues));
|
|
868
935
|
classify(newList, needDelete, aKeys, unmatched, eq);
|
|
869
|
-
const pKeys = primaryKeys.filter(v => !(v in commonKeys));
|
|
870
936
|
classify(unmatched, needDelete, pKeys, needCreate, needUpdate);
|
|
871
937
|
const {
|
|
872
938
|
table
|
|
@@ -874,10 +940,10 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
|
|
|
874
940
|
if (needDelete.length) {
|
|
875
941
|
// 批量删除
|
|
876
942
|
/** @type {WhereValue[]} */
|
|
877
|
-
const where = primaryKeys.filter(v => v in
|
|
943
|
+
const where = primaryKeys.filter(v => v in commonValues).map(k => ({
|
|
878
944
|
field: k,
|
|
879
945
|
operator: '=',
|
|
880
|
-
value:
|
|
946
|
+
value: commonValues[k] ?? null
|
|
881
947
|
}));
|
|
882
948
|
if (pKeys.length === 1) {
|
|
883
949
|
const [key] = pKeys;
|
|
@@ -893,16 +959,8 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
|
|
|
893
959
|
value: needDelete.map(v => pKeys.map(k => v[k] ?? null))
|
|
894
960
|
});
|
|
895
961
|
}
|
|
896
|
-
const promise = typeof table === 'object' ? table.deleteReturn(env, conn,
|
|
897
|
-
|
|
898
|
-
fields: baseFields,
|
|
899
|
-
where
|
|
900
|
-
}, Object.keys(baseFields)) : conn.deleteReturn(env, {
|
|
901
|
-
table: table || '',
|
|
902
|
-
fields: baseFields,
|
|
903
|
-
where
|
|
904
|
-
}, Object.keys(baseFields));
|
|
905
|
-
promises.push(promise.then(list => deleteSub(conn, list, tableFields, baseFields, env)));
|
|
962
|
+
const promise = typeof table === 'object' ? table.deleteReturn(env, conn, columnKeys, columns, where2column(where, fieldColumns)) : conn.deleteReturn(env, columnKeys, table || '', columns, where2column(where, fieldColumns));
|
|
963
|
+
promises.push(promise.then(list => deleteSub(conn, toFieldList(list, fieldColumns), tableFields, new Set(Object.keys(fieldColumns || columns)), env)));
|
|
906
964
|
}
|
|
907
965
|
/** @type {typeof updatedOldNewList} */
|
|
908
966
|
const list = eq.map(([n, o]) => [{
|
|
@@ -914,34 +972,37 @@ async function updateItem(conn, env, updatedOldNewList, key, type, array, constr
|
|
|
914
972
|
const subPromises = [list];
|
|
915
973
|
// 批量修改
|
|
916
974
|
if (needUpdate.length) {
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
keys.delete(k);
|
|
975
|
+
let keysColumn = new Set(needUpdate.map(v => Object.keys(v[0])).flat());
|
|
976
|
+
if (fieldColumns) {
|
|
977
|
+
keysColumn = new Set(field2column([...keysColumn], fieldColumns));
|
|
921
978
|
}
|
|
922
|
-
const
|
|
979
|
+
const updateColumn = await getSetValue$1(columns, fieldColumns);
|
|
980
|
+
for (const k of Object.keys(updateColumn)) {
|
|
981
|
+
keysColumn.delete(k);
|
|
982
|
+
}
|
|
983
|
+
const setKeysColumn = Object.entries(columns).filter(([, v]) => !v.primary && !v.immutable).map(v => v[0]).filter(v => keysColumn.has(v));
|
|
923
984
|
/** @type {WhereValue[]} */
|
|
924
|
-
const where = Object.entries(
|
|
985
|
+
const where = Object.entries(commonValues).filter(([k]) => primaryKeys.includes(k)).map(([k, v]) => ({
|
|
925
986
|
field: k,
|
|
926
987
|
operator: '=',
|
|
927
988
|
value: v
|
|
928
989
|
}));
|
|
929
990
|
for (const [value, old] of needUpdate) {
|
|
930
|
-
for (const key of
|
|
991
|
+
for (const key of fieldKeys) {
|
|
931
992
|
if (value[key] !== undefined) {
|
|
932
993
|
continue;
|
|
933
994
|
}
|
|
934
995
|
value[key] = old[key];
|
|
935
996
|
}
|
|
936
997
|
}
|
|
937
|
-
const list = typeof table === 'object' ? table.updateManyReturn(env, conn,
|
|
998
|
+
const list = (typeof table === 'object' ? table.updateManyReturn(env, conn, columns, updateColumn, field2column(pKeys, fieldColumns), setKeysColumn, toColumnList(needUpdate.map(v => v[0]), fieldColumns), where2column(where, fieldColumns), columnKeys) : conn.updateManyReturn(env, table || '', columns, updateColumn, field2column(pKeys, fieldColumns), setKeysColumn, toColumnList(needUpdate.map(v => v[0]), fieldColumns), where2column(where, fieldColumns), columnKeys)).then(l => toFieldList(l, fieldColumns));
|
|
938
999
|
listPromises.push(list);
|
|
939
1000
|
subPromises.push(list.then(u => u.map((u, i) => [u, ...needUpdate[i]])));
|
|
940
1001
|
}
|
|
941
1002
|
// 批量新建
|
|
942
1003
|
if (needCreate.length) {
|
|
943
|
-
const
|
|
944
|
-
const list = typeof table === 'object' ? table.insert(env, conn,
|
|
1004
|
+
const subColumnData = await Promise.all(needCreate.map(d => getInsertValue(d, columns, fieldColumns)));
|
|
1005
|
+
const list = (typeof table === 'object' ? table.insert(env, conn, columns, subColumnData, Object.keys(columns)) : conn.insert(env, table || '', columns, subColumnData, Object.keys(columns))).then(l => toFieldList(l, fieldColumns));
|
|
945
1006
|
listPromises.push(list);
|
|
946
1007
|
promises.push(list.then(list => createSub(conn, env, tableFields, needCreate, list)));
|
|
947
1008
|
}
|
|
@@ -1014,29 +1075,21 @@ async function updateData (conn, model, data, newData, env) {
|
|
|
1014
1075
|
fields
|
|
1015
1076
|
} = model;
|
|
1016
1077
|
const savedData = data;
|
|
1017
|
-
const has = keys.filter(v => v in fields && (typeof fields[v]?.type === 'string' || !fields[v]?.type.table)).length;
|
|
1078
|
+
const has = keys.filter(v => v in fields && (typeof fields[v]?.type === 'string' || fields[v]?.type && !fields[v]?.type.table)).length;
|
|
1018
1079
|
/** @type {WhereValue[]} */
|
|
1019
1080
|
const where = getPrimaryKeys(fields).map(k => ({
|
|
1020
1081
|
field: k,
|
|
1021
1082
|
operator: '=',
|
|
1022
1083
|
value: savedData[k]
|
|
1023
1084
|
}));
|
|
1024
|
-
const [
|
|
1085
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1025
1086
|
let list = [];
|
|
1026
1087
|
if (!has) {
|
|
1027
1088
|
list = [data];
|
|
1028
1089
|
} else if (table && typeof table === 'object') {
|
|
1029
|
-
list = await table.updateReturn(env, conn,
|
|
1030
|
-
table: '',
|
|
1031
|
-
fields: baseFields,
|
|
1032
|
-
where
|
|
1033
|
-
}, await getSetNewValue(fields, newData), Object.keys(baseFields));
|
|
1090
|
+
list = toFieldList(await table.updateReturn(env, conn, Object.keys(columns), columns, await getSetValue$1(columns, fieldColumns, newData), where2column(where, fieldColumns)), fieldColumns);
|
|
1034
1091
|
} else {
|
|
1035
|
-
list = await conn.updateReturn(env,
|
|
1036
|
-
table: table || '',
|
|
1037
|
-
fields: baseFields,
|
|
1038
|
-
where
|
|
1039
|
-
}, await getSetNewValue(fields, newData), Object.keys(baseFields));
|
|
1092
|
+
list = toFieldList(await conn.updateReturn(env, Object.keys(columns), table || '', columns, await getSetValue$1(columns, fieldColumns, newData), where2column(where, fieldColumns)), fieldColumns);
|
|
1040
1093
|
}
|
|
1041
1094
|
const oldList = [data];
|
|
1042
1095
|
const newList = [newData];
|
|
@@ -1046,16 +1099,31 @@ async function updateData (conn, model, data, newData, env) {
|
|
|
1046
1099
|
return list[0];
|
|
1047
1100
|
}
|
|
1048
1101
|
|
|
1102
|
+
/** @import { SetValue } from '../../set.mjs' */
|
|
1103
|
+
/**
|
|
1104
|
+
*
|
|
1105
|
+
* @param {Record<string, SetValue>} update
|
|
1106
|
+
* @param {Record<string, string>?} fieldColumns
|
|
1107
|
+
* @returns {Record<string, SetValue>}
|
|
1108
|
+
*/
|
|
1109
|
+
function set2column(update, fieldColumns) {
|
|
1110
|
+
if (!fieldColumns) {
|
|
1111
|
+
return update;
|
|
1112
|
+
}
|
|
1113
|
+
// @ts-ignore
|
|
1114
|
+
return Object.fromEntries(Object.entries(update).map(([k, v]) => [fieldColumns[k], v]));
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1049
1117
|
/** @import { SetValue } from '../../set.mjs' */
|
|
1050
1118
|
/** @import { Fields } from '../../types' */
|
|
1051
1119
|
/**
|
|
1052
1120
|
*
|
|
1053
|
-
* @param {Fields}
|
|
1121
|
+
* @param {Fields} columns
|
|
1054
1122
|
* @param {Record<string, SetValue>} update
|
|
1055
1123
|
* @returns
|
|
1056
1124
|
*/
|
|
1057
|
-
async function setDeleteTimestamp(
|
|
1058
|
-
for (const [name, field] of Object.entries(
|
|
1125
|
+
async function setDeleteTimestamp(columns, update) {
|
|
1126
|
+
for (const [name, field] of Object.entries(columns)) {
|
|
1059
1127
|
if (field.primary) {
|
|
1060
1128
|
continue;
|
|
1061
1129
|
}
|
|
@@ -1069,7 +1137,7 @@ async function setDeleteTimestamp(fields, update) {
|
|
|
1069
1137
|
|
|
1070
1138
|
/** @import { WhereValue } from '../Where.mjs' */
|
|
1071
1139
|
/** @import { SetValue } from '../set.mjs' */
|
|
1072
|
-
/** @import { Environment, IConnection,
|
|
1140
|
+
/** @import { Environment, IConnection, TableDefine } from '../types' */
|
|
1073
1141
|
/**
|
|
1074
1142
|
*
|
|
1075
1143
|
* @param {IConnection} conn
|
|
@@ -1084,13 +1152,13 @@ async function pseudoDestroy (conn, tableDef, data, update, env) {
|
|
|
1084
1152
|
table,
|
|
1085
1153
|
fields
|
|
1086
1154
|
} = tableDef;
|
|
1087
|
-
const baseFields = toBaseFields(fields);
|
|
1088
1155
|
/** @type {WhereValue[]} */
|
|
1089
1156
|
const where = getPrimaryKeys(fields).map(k => ({
|
|
1090
1157
|
field: k,
|
|
1091
1158
|
operator: '=',
|
|
1092
1159
|
value: data[k]
|
|
1093
1160
|
}));
|
|
1161
|
+
const [columns, fieldColumns] = toColumns(fields);
|
|
1094
1162
|
const pseudo = tableDef.pseudo || '';
|
|
1095
1163
|
where.push({
|
|
1096
1164
|
field: pseudo,
|
|
@@ -1102,24 +1170,13 @@ async function pseudoDestroy (conn, tableDef, data, update, env) {
|
|
|
1102
1170
|
};
|
|
1103
1171
|
const pseudoValue = Number(new Date());
|
|
1104
1172
|
value[pseudo] = pseudoValue;
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
where
|
|
1110
|
-
}, value, Object.keys(baseFields)) : await conn.updateReturn(env, {
|
|
1111
|
-
table: table || '',
|
|
1112
|
-
fields: baseFields,
|
|
1113
|
-
where
|
|
1114
|
-
}, value, Object.keys(baseFields));
|
|
1115
|
-
if (!dataUpdated) {
|
|
1116
|
-
return null;
|
|
1117
|
-
}
|
|
1118
|
-
return dataUpdated;
|
|
1173
|
+
const set = set2column(value, fieldColumns);
|
|
1174
|
+
await setDeleteTimestamp(columns, set);
|
|
1175
|
+
const dataUpdated = table && typeof table === 'object' ? await table.updateReturn(env, conn, Object.keys(columns), columns, set, where2column(where, fieldColumns)) : await conn.updateReturn(env, Object.keys(columns), table || '', columns, set, where2column(where, fieldColumns));
|
|
1176
|
+
return toFieldList(dataUpdated, fieldColumns)[0] || null;
|
|
1119
1177
|
}
|
|
1120
1178
|
|
|
1121
|
-
/** @import {
|
|
1122
|
-
/** @import { IConnection, TableDefine, Environment, GetName } from '../types' */
|
|
1179
|
+
/** @import { IConnection, TableDefine, Environment } from '../types' */
|
|
1123
1180
|
/**
|
|
1124
1181
|
*
|
|
1125
1182
|
* @param {IConnection} conn
|
|
@@ -1133,23 +1190,15 @@ async function completelyDelete (conn, tableDef, data, env) {
|
|
|
1133
1190
|
table,
|
|
1134
1191
|
fields
|
|
1135
1192
|
} = tableDef;
|
|
1136
|
-
const [
|
|
1137
|
-
|
|
1138
|
-
const where = getPrimaryKeys(fields).map(k => ({
|
|
1193
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1194
|
+
const where = where2column(getPrimaryKeys(fields).map(k => ({
|
|
1139
1195
|
field: k,
|
|
1140
1196
|
operator: '=',
|
|
1141
1197
|
value: data[k]
|
|
1142
|
-
}));
|
|
1143
|
-
const list = table && typeof table === 'object' ? await table.deleteReturn(env, conn,
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
where
|
|
1147
|
-
}, Object.keys(baseFields)) : await conn.deleteReturn(env, {
|
|
1148
|
-
table: table || '',
|
|
1149
|
-
fields: baseFields,
|
|
1150
|
-
where
|
|
1151
|
-
}, Object.keys(baseFields));
|
|
1152
|
-
const [deleted] = await deleteSub(conn, list, tableFields, baseFields, env, true);
|
|
1198
|
+
})), fieldColumns);
|
|
1199
|
+
const list = toFieldList(table && typeof table === 'object' ? await table.deleteReturn(env, conn, Object.keys(columns), columns, where) : await conn.deleteReturn(env, Object.keys(columns), table || '', columns, where), fieldColumns);
|
|
1200
|
+
const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
|
|
1201
|
+
const [deleted] = await deleteSub(conn, list, tableFields, baseFieldSet, env, true);
|
|
1153
1202
|
return deleted || null;
|
|
1154
1203
|
}
|
|
1155
1204
|
|
|
@@ -1159,15 +1208,39 @@ const Save = Symbol();
|
|
|
1159
1208
|
const Create = Symbol();
|
|
1160
1209
|
const Build = Symbol();
|
|
1161
1210
|
|
|
1162
|
-
/** @import { Fields, FieldType, Select } from '
|
|
1211
|
+
/** @import { Fields, FieldType, Select } from '../../types' */
|
|
1163
1212
|
/**
|
|
1164
|
-
* @param {
|
|
1213
|
+
* @param {Select} select
|
|
1214
|
+
* @param {Record<string, string>} fieldColumns
|
|
1215
|
+
* @returns {Select}
|
|
1216
|
+
*/
|
|
1217
|
+
function toSelectItem(select, fieldColumns) {
|
|
1218
|
+
return {
|
|
1219
|
+
...select,
|
|
1220
|
+
field: fieldColumns[select.field]
|
|
1221
|
+
};
|
|
1222
|
+
}
|
|
1223
|
+
/**
|
|
1224
|
+
* @param {Fields<keyof FieldType>} columns
|
|
1225
|
+
* @param {Record<string, string>?} fieldColumns
|
|
1165
1226
|
* @param {Record<string, Select>?} [select]
|
|
1166
1227
|
* @returns {[string, Select][]}
|
|
1167
1228
|
*/
|
|
1168
|
-
function
|
|
1229
|
+
function select2column(columns, fieldColumns, select) {
|
|
1169
1230
|
const list = select ? Object.entries(select) : [];
|
|
1170
|
-
|
|
1231
|
+
if (list.length) {
|
|
1232
|
+
if (!fieldColumns) {
|
|
1233
|
+
return list;
|
|
1234
|
+
}
|
|
1235
|
+
return list.map(([k, s]) => [k, toSelectItem(s, fieldColumns)]);
|
|
1236
|
+
}
|
|
1237
|
+
if (fieldColumns) {
|
|
1238
|
+
return Object.entries(fieldColumns).map(([f, c]) => [f, {
|
|
1239
|
+
field: c
|
|
1240
|
+
}]);
|
|
1241
|
+
}
|
|
1242
|
+
let keys = Object.keys(columns);
|
|
1243
|
+
return keys.map(k => [k, {
|
|
1171
1244
|
field: k
|
|
1172
1245
|
}]);
|
|
1173
1246
|
}
|
|
@@ -1175,32 +1248,45 @@ function toSelect(fields, select) {
|
|
|
1175
1248
|
/** @import { Fields, FieldType } from '../../types' */
|
|
1176
1249
|
/**
|
|
1177
1250
|
*
|
|
1178
|
-
* @param {Fields<keyof FieldType>}
|
|
1179
|
-
* @param {string} [
|
|
1251
|
+
* @param {Fields<keyof FieldType>} columns
|
|
1252
|
+
* @param {string} [noColumn]
|
|
1180
1253
|
* @returns {[string, boolean][]}
|
|
1181
1254
|
*/
|
|
1182
|
-
function getDefaultSort(
|
|
1255
|
+
function getDefaultSort(columns, noColumn) {
|
|
1183
1256
|
/** @type {[string, boolean, number][]} */
|
|
1184
|
-
const sorted = Object.entries(
|
|
1257
|
+
const sorted = Object.entries(columns).map(([f, d]) => [f, (d.sort || 0) < 0, Math.abs(d.sort || 0)]);
|
|
1185
1258
|
/** @type {[string, boolean][]} */
|
|
1186
1259
|
const sort = sorted.filter(v => v[2]).sort(([,, a], [,, b]) => a - b).map(([a, b]) => [a, b]);
|
|
1187
|
-
if (
|
|
1188
|
-
sort.unshift([
|
|
1260
|
+
if (noColumn) {
|
|
1261
|
+
sort.unshift([noColumn, false]);
|
|
1189
1262
|
}
|
|
1190
1263
|
return sort;
|
|
1191
1264
|
}
|
|
1192
1265
|
|
|
1193
|
-
/**
|
|
1266
|
+
/**
|
|
1267
|
+
*
|
|
1268
|
+
* @param {[field: string, desc: boolean][]} sort
|
|
1269
|
+
* @param {Record<string, string>?} fieldColumns
|
|
1270
|
+
* @returns {[field: string, desc: boolean][]}
|
|
1271
|
+
*/
|
|
1272
|
+
function sort2column(sort, fieldColumns) {
|
|
1273
|
+
if (!fieldColumns) {
|
|
1274
|
+
return sort;
|
|
1275
|
+
}
|
|
1276
|
+
return sort.map(([f, d]) => [fieldColumns[f], d]);
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
/** @import { Environment, FieldDefine, Fields, FieldType, IConnection, TableDefine } from '../types' */
|
|
1194
1280
|
/**
|
|
1195
1281
|
*
|
|
1196
1282
|
* @param {IConnection} conn
|
|
1197
1283
|
* @param {any[]} list
|
|
1198
1284
|
* @param {[string, FieldDefine<TableDefine>][]} fields
|
|
1199
|
-
* @param {
|
|
1285
|
+
* @param {Set<string>} baseFieldSet
|
|
1200
1286
|
* @param {Environment} env
|
|
1201
1287
|
* @returns {Promise<any[]>}
|
|
1202
1288
|
*/
|
|
1203
|
-
async function findSub(conn, list, fields,
|
|
1289
|
+
async function findSub(conn, list, fields, baseFieldSet, env) {
|
|
1204
1290
|
if (!list.length) {
|
|
1205
1291
|
return list;
|
|
1206
1292
|
}
|
|
@@ -1216,31 +1302,29 @@ async function findSub(conn, list, fields, baseFields, env) {
|
|
|
1216
1302
|
const {
|
|
1217
1303
|
fields
|
|
1218
1304
|
} = type;
|
|
1219
|
-
const [
|
|
1220
|
-
const
|
|
1305
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1306
|
+
const noColumn = noField && fieldColumns ? fieldColumns[noField] : noField;
|
|
1307
|
+
const mapList = getMapList(fields, baseFieldSet, constraints);
|
|
1221
1308
|
if (!mapList) {
|
|
1222
1309
|
continue;
|
|
1223
1310
|
}
|
|
1224
|
-
const value = getValueEntries(constraints,
|
|
1225
|
-
const where = [subList2where(list, mapList), ...valueEntries2where(value)];
|
|
1311
|
+
const value = getValueEntries(constraints, columns);
|
|
1312
|
+
const where = where2column([subList2where(list, mapList), ...valueEntries2where(value)], fieldColumns);
|
|
1313
|
+
const select = select2column(columns, fieldColumns);
|
|
1226
1314
|
const {
|
|
1227
1315
|
table
|
|
1228
1316
|
} = type;
|
|
1229
1317
|
/** @type {PromiseLike<object[] | object>} */
|
|
1230
|
-
const result = table && typeof table === 'object' ? table.
|
|
1231
|
-
table: '',
|
|
1232
|
-
fields: subfields,
|
|
1318
|
+
const result = table && typeof table === 'object' ? table.find(env, conn, columns, {
|
|
1233
1319
|
where,
|
|
1234
|
-
sort: getDefaultSort(
|
|
1235
|
-
select
|
|
1236
|
-
}) : conn.
|
|
1237
|
-
table: table || '',
|
|
1238
|
-
fields: subfields,
|
|
1320
|
+
sort: getDefaultSort(columns, noColumn),
|
|
1321
|
+
select
|
|
1322
|
+
}) : conn.find(env, table || '', columns, {
|
|
1239
1323
|
where,
|
|
1240
|
-
sort: getDefaultSort(
|
|
1241
|
-
select
|
|
1324
|
+
sort: getDefaultSort(columns, noColumn),
|
|
1325
|
+
select
|
|
1242
1326
|
});
|
|
1243
|
-
promises.push(result.then(list => findSub(conn, list, tableFields,
|
|
1327
|
+
promises.push(result.then(list => findSub(conn, list, tableFields, new Set(Object.keys(fieldColumns || columns)), env)));
|
|
1244
1328
|
promises.push(array ? result.then(subList => {
|
|
1245
1329
|
for (const item of list) {
|
|
1246
1330
|
item[key] = subList.filter(createFilter(item, mapList));
|
|
@@ -1271,33 +1355,27 @@ async function find(conn, p, env) {
|
|
|
1271
1355
|
where,
|
|
1272
1356
|
sort,
|
|
1273
1357
|
offset,
|
|
1274
|
-
limit
|
|
1275
|
-
alias
|
|
1358
|
+
limit
|
|
1276
1359
|
} = getOptions(p);
|
|
1277
|
-
const [
|
|
1278
|
-
const list = table && typeof table === 'object' ? await table.
|
|
1279
|
-
|
|
1280
|
-
fields: baseFields,
|
|
1281
|
-
alias,
|
|
1282
|
-
where,
|
|
1360
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1361
|
+
const list = table && typeof table === 'object' ? await table.find(env, conn, columns, {
|
|
1362
|
+
where: where2column(where, fieldColumns),
|
|
1283
1363
|
offset,
|
|
1284
1364
|
limit,
|
|
1285
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
1286
|
-
select:
|
|
1287
|
-
}) : await conn.
|
|
1288
|
-
|
|
1289
|
-
fields: baseFields,
|
|
1290
|
-
alias,
|
|
1291
|
-
where,
|
|
1365
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
|
|
1366
|
+
select: select2column(columns, fieldColumns)
|
|
1367
|
+
}) : await conn.find(env, table || '', columns, {
|
|
1368
|
+
where: where2column(where, fieldColumns),
|
|
1292
1369
|
offset,
|
|
1293
1370
|
limit,
|
|
1294
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
1295
|
-
select:
|
|
1371
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
|
|
1372
|
+
select: select2column(columns, fieldColumns)
|
|
1296
1373
|
});
|
|
1297
1374
|
if (!list.length) {
|
|
1298
1375
|
return [];
|
|
1299
1376
|
}
|
|
1300
|
-
|
|
1377
|
+
const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
|
|
1378
|
+
await findSub(conn, list, tableFields, baseFieldSet, env);
|
|
1301
1379
|
if (typeof p[Build] !== 'function') {
|
|
1302
1380
|
return list;
|
|
1303
1381
|
}
|
|
@@ -1306,7 +1384,7 @@ async function find(conn, p, env) {
|
|
|
1306
1384
|
return list.map(it => R(it, true, env));
|
|
1307
1385
|
}
|
|
1308
1386
|
|
|
1309
|
-
/** @import { Environment, TableDefine, IConnection
|
|
1387
|
+
/** @import { Environment, TableDefine, IConnection } from '../types' */
|
|
1310
1388
|
/**
|
|
1311
1389
|
*
|
|
1312
1390
|
* @template {TableDefine} T
|
|
@@ -1323,28 +1401,22 @@ async function first(conn, p, env) {
|
|
|
1323
1401
|
// @ts-ignore
|
|
1324
1402
|
const {
|
|
1325
1403
|
where,
|
|
1326
|
-
sort
|
|
1327
|
-
alias
|
|
1404
|
+
sort
|
|
1328
1405
|
} = getOptions(p);
|
|
1329
|
-
const [
|
|
1330
|
-
const list = table && typeof table === 'object' ? await table.
|
|
1331
|
-
|
|
1332
|
-
fields: baseFields,
|
|
1333
|
-
alias,
|
|
1334
|
-
where,
|
|
1406
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1407
|
+
const list = table && typeof table === 'object' ? await table.find(env, conn, columns, {
|
|
1408
|
+
where: where2column(where, fieldColumns),
|
|
1335
1409
|
limit: 1,
|
|
1336
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
1337
|
-
select:
|
|
1338
|
-
}) : await conn.
|
|
1339
|
-
|
|
1340
|
-
fields: baseFields,
|
|
1341
|
-
alias,
|
|
1342
|
-
where,
|
|
1410
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
|
|
1411
|
+
select: select2column(columns, fieldColumns)
|
|
1412
|
+
}) : await conn.find(env, table || '', columns, {
|
|
1413
|
+
where: where2column(where, fieldColumns),
|
|
1343
1414
|
limit: 1,
|
|
1344
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
1345
|
-
select:
|
|
1415
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns),
|
|
1416
|
+
select: select2column(columns, fieldColumns)
|
|
1346
1417
|
});
|
|
1347
|
-
const
|
|
1418
|
+
const baseFieldSet = new Set(Object.keys(fieldColumns || columns));
|
|
1419
|
+
const [item] = await findSub(conn, list, tableFields, baseFieldSet, env);
|
|
1348
1420
|
if (!item) {
|
|
1349
1421
|
return null;
|
|
1350
1422
|
}
|
|
@@ -1354,7 +1426,7 @@ async function first(conn, p, env) {
|
|
|
1354
1426
|
return p[Build](item, true, env);
|
|
1355
1427
|
}
|
|
1356
1428
|
|
|
1357
|
-
/** @import { Environment,
|
|
1429
|
+
/** @import { Environment, IConnection, Queryable } from '../types' */
|
|
1358
1430
|
/**
|
|
1359
1431
|
* @param {IConnection} conn
|
|
1360
1432
|
* @param {Queryable} queryable
|
|
@@ -1369,23 +1441,16 @@ async function pseudoDeleteMany(conn, queryable, update, env) {
|
|
|
1369
1441
|
const {
|
|
1370
1442
|
where
|
|
1371
1443
|
} = getOptions(queryable);
|
|
1444
|
+
const [columns, fieldColumns] = toColumns(fields);
|
|
1372
1445
|
const value = typeof update !== 'object' ? {} : {
|
|
1373
1446
|
...update
|
|
1374
1447
|
};
|
|
1375
1448
|
const pseudoValue = Number(new Date());
|
|
1376
1449
|
const pseudo = queryable.pseudo || '';
|
|
1377
1450
|
value[pseudo] = pseudoValue;
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
const list = table && typeof table === 'object' ? await table.updateReturn(env, conn,
|
|
1381
|
-
table: '',
|
|
1382
|
-
fields: baseFields,
|
|
1383
|
-
where
|
|
1384
|
-
}, value, Object.keys(baseFields)) : await conn.updateReturn(env, {
|
|
1385
|
-
table: table || '',
|
|
1386
|
-
fields: baseFields,
|
|
1387
|
-
where
|
|
1388
|
-
}, value, Object.keys(baseFields));
|
|
1451
|
+
const set = set2column(value, fieldColumns);
|
|
1452
|
+
await setDeleteTimestamp(columns, set);
|
|
1453
|
+
const list = table && typeof table === 'object' ? await table.updateReturn(env, conn, Object.keys(columns), columns, set, where2column(where, fieldColumns)) : await conn.updateReturn(env, Object.keys(columns), table || '', columns, set, where2column(where, fieldColumns));
|
|
1389
1454
|
return list.length;
|
|
1390
1455
|
}
|
|
1391
1456
|
|
|
@@ -1424,7 +1489,7 @@ function table2db(tables) {
|
|
|
1424
1489
|
map.set(table, t);
|
|
1425
1490
|
allTables.push(t);
|
|
1426
1491
|
}
|
|
1427
|
-
const
|
|
1492
|
+
const dbColumns = t.fields;
|
|
1428
1493
|
for (const [name, field] of Object.entries(fields)) {
|
|
1429
1494
|
const {
|
|
1430
1495
|
type,
|
|
@@ -1438,10 +1503,11 @@ function table2db(tables) {
|
|
|
1438
1503
|
if (!type) {
|
|
1439
1504
|
continue;
|
|
1440
1505
|
}
|
|
1441
|
-
const
|
|
1506
|
+
const key = field.column || name;
|
|
1507
|
+
const old = dbColumns[key];
|
|
1442
1508
|
if (typeof type === 'string') {
|
|
1443
1509
|
if (!old) {
|
|
1444
|
-
t.fields[
|
|
1510
|
+
t.fields[key] = {
|
|
1445
1511
|
type,
|
|
1446
1512
|
size,
|
|
1447
1513
|
scale,
|
|
@@ -1451,7 +1517,7 @@ function table2db(tables) {
|
|
|
1451
1517
|
primary
|
|
1452
1518
|
};
|
|
1453
1519
|
} else {
|
|
1454
|
-
t.fields[
|
|
1520
|
+
t.fields[key] = {
|
|
1455
1521
|
type,
|
|
1456
1522
|
size: size || old.size,
|
|
1457
1523
|
scale: scale || old.scale,
|
|
@@ -1463,14 +1529,11 @@ function table2db(tables) {
|
|
|
1463
1529
|
}
|
|
1464
1530
|
continue;
|
|
1465
1531
|
}
|
|
1466
|
-
if (typeof type !== 'object') {
|
|
1467
|
-
continue;
|
|
1468
|
-
}
|
|
1469
1532
|
if (type.table) {
|
|
1470
1533
|
continue;
|
|
1471
1534
|
}
|
|
1472
1535
|
if (!old) {
|
|
1473
|
-
t.fields[
|
|
1536
|
+
t.fields[key] = {
|
|
1474
1537
|
type: 'object',
|
|
1475
1538
|
nullable,
|
|
1476
1539
|
array
|
|
@@ -1488,7 +1551,7 @@ function table2db(tables) {
|
|
|
1488
1551
|
for (const {
|
|
1489
1552
|
type
|
|
1490
1553
|
} of Object.values(fields)) {
|
|
1491
|
-
if (!type || typeof type
|
|
1554
|
+
if (!type || typeof type === 'string') {
|
|
1492
1555
|
continue;
|
|
1493
1556
|
}
|
|
1494
1557
|
list.push(type);
|
|
@@ -1711,6 +1774,7 @@ class Connection {
|
|
|
1711
1774
|
if (newData) {
|
|
1712
1775
|
/** @type {any} */
|
|
1713
1776
|
const doc = data;
|
|
1777
|
+
// @ts-ignore
|
|
1714
1778
|
return updateData(conn, model, doc, newData, this.#env);
|
|
1715
1779
|
}
|
|
1716
1780
|
return create(conn, this.#env, model, data);
|
|
@@ -1761,6 +1825,7 @@ class Connection {
|
|
|
1761
1825
|
};
|
|
1762
1826
|
if (typeof data[PseudoDestroy] !== 'function') {
|
|
1763
1827
|
const conn = await this.#getConnection();
|
|
1828
|
+
// @ts-ignore
|
|
1764
1829
|
return pseudoDestroy(conn, tableDef, data, update, this.#env);
|
|
1765
1830
|
}
|
|
1766
1831
|
const r = /** @type {PseudoDestroy} */data;
|
|
@@ -1831,22 +1896,24 @@ class Connection {
|
|
|
1831
1896
|
table,
|
|
1832
1897
|
fields
|
|
1833
1898
|
}, data, keys) {
|
|
1834
|
-
const
|
|
1899
|
+
const [columns, fieldColumns] = toColumns(fields);
|
|
1835
1900
|
const isArray = Array.isArray(data);
|
|
1836
|
-
const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d,
|
|
1901
|
+
const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d, columns, fieldColumns));
|
|
1837
1902
|
if (!insertValues.length) {
|
|
1838
1903
|
throw new Error();
|
|
1839
1904
|
}
|
|
1840
|
-
let insertKeys = [...new Set(keys || [])].filter(k => k in
|
|
1905
|
+
let insertKeys = fieldColumns ? [...new Set(keys || [])].map(k => fieldColumns[k]).filter(Boolean) : [...new Set(keys || [])].filter(k => k in columns);
|
|
1841
1906
|
if (!insertKeys.length && !isArray) {
|
|
1842
|
-
insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in
|
|
1907
|
+
insertKeys = Object.entries(insertValues[0]).filter(([k, v]) => v !== undefined && k in columns).map(([k]) => k);
|
|
1843
1908
|
}
|
|
1844
1909
|
if (!insertKeys.length) {
|
|
1845
|
-
insertKeys = Object.entries(
|
|
1910
|
+
insertKeys = Object.entries(columns).map(v => v[0]);
|
|
1846
1911
|
}
|
|
1847
1912
|
const conn = await this.#getConnection();
|
|
1848
|
-
const
|
|
1849
|
-
|
|
1913
|
+
const result = table && typeof table === 'object' ? await table.insert(this.#env, conn, columns, insertValues, insertKeys) : await conn.insert(this.#env, table || '', columns, insertValues, insertKeys);
|
|
1914
|
+
const list = toFieldList(result, fieldColumns);
|
|
1915
|
+
// @ts-ignore
|
|
1916
|
+
return isArray ? list : list[0];
|
|
1850
1917
|
}
|
|
1851
1918
|
/**
|
|
1852
1919
|
* @param {TableDefine} tableDefine
|
|
@@ -1859,16 +1926,9 @@ class Connection {
|
|
|
1859
1926
|
table,
|
|
1860
1927
|
fields
|
|
1861
1928
|
}, update, where, skip) {
|
|
1929
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1862
1930
|
const conn = await this.#getConnection();
|
|
1863
|
-
return table && typeof table === 'object' ? table.update(this.#env, conn,
|
|
1864
|
-
table: '',
|
|
1865
|
-
fields: toBaseFields(fields),
|
|
1866
|
-
where: where || undefined
|
|
1867
|
-
}, await getSetNewValue(fields, update, skip)) : conn.update(this.#env, {
|
|
1868
|
-
table: table || '',
|
|
1869
|
-
fields: toBaseFields(fields),
|
|
1870
|
-
where: where || undefined
|
|
1871
|
-
}, await getSetNewValue(fields, update, skip));
|
|
1931
|
+
return table && typeof table === 'object' ? table.update(this.#env, conn, columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns)) : conn.update(this.#env, table || '', columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns));
|
|
1872
1932
|
}
|
|
1873
1933
|
/**
|
|
1874
1934
|
* @template {Fields<MainFieldType>} T
|
|
@@ -1883,17 +1943,10 @@ class Connection {
|
|
|
1883
1943
|
table,
|
|
1884
1944
|
fields
|
|
1885
1945
|
}, update, returning, where, skip) {
|
|
1946
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1886
1947
|
const conn = await this.#getConnection();
|
|
1887
|
-
const
|
|
1888
|
-
return
|
|
1889
|
-
table: '',
|
|
1890
|
-
fields: baseFields,
|
|
1891
|
-
where: where || undefined
|
|
1892
|
-
}, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields)) : conn.updateReturn(this.#env, {
|
|
1893
|
-
table: table || '',
|
|
1894
|
-
fields: baseFields,
|
|
1895
|
-
where: where || undefined
|
|
1896
|
-
}, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields));
|
|
1948
|
+
const result = table && typeof table === 'object' ? await table.updateReturn(this.#env, conn, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns)) : await conn.updateReturn(this.#env, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), table || '', columns, await getSetValue$1(columns, fieldColumns, update, skip), where2column(where, fieldColumns));
|
|
1949
|
+
return toFieldList(result, fieldColumns);
|
|
1897
1950
|
}
|
|
1898
1951
|
/**
|
|
1899
1952
|
* @param {TableDefine} tableDefine
|
|
@@ -1907,11 +1960,11 @@ class Connection {
|
|
|
1907
1960
|
table,
|
|
1908
1961
|
fields
|
|
1909
1962
|
}, pKeys, setKeys, list, skip) {
|
|
1910
|
-
const
|
|
1911
|
-
const update = await
|
|
1912
|
-
const [
|
|
1963
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1964
|
+
const update = await getSetValue$1(columns, fieldColumns, null, skip);
|
|
1965
|
+
const [whereColumns, setColumns] = getKeys(columns, update, field2column(pKeys, fieldColumns), field2column(setKeys, fieldColumns));
|
|
1913
1966
|
const conn = await this.#getConnection();
|
|
1914
|
-
return table && typeof table === 'object' ? table.updateMany(this.#env, conn,
|
|
1967
|
+
return table && typeof table === 'object' ? table.updateMany(this.#env, conn, columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), []) : conn.updateMany(this.#env, table || '', columns, update, whereColumns, setColumns, list, []);
|
|
1915
1968
|
}
|
|
1916
1969
|
/**
|
|
1917
1970
|
* @template {Fields<MainFieldType>} T
|
|
@@ -1927,11 +1980,12 @@ class Connection {
|
|
|
1927
1980
|
table,
|
|
1928
1981
|
fields
|
|
1929
1982
|
}, pKeys, setKeys, list, returning, skip) {
|
|
1930
|
-
const
|
|
1931
|
-
const update =
|
|
1932
|
-
const [
|
|
1983
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1984
|
+
const update = getSetValue$1(columns, fieldColumns, null, skip);
|
|
1985
|
+
const [whereColumns, setColumns] = getKeys(columns, update, field2column(pKeys, fieldColumns), field2column(setKeys, fieldColumns));
|
|
1933
1986
|
const conn = await this.#getConnection();
|
|
1934
|
-
|
|
1987
|
+
const result = table && typeof table === 'object' ? await table.updateManyReturn(this.#env, conn, columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), [], returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns)) : await conn.updateManyReturn(this.#env, table || '', columns, update, whereColumns, setColumns, toColumnList(list, fieldColumns), [], returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns));
|
|
1988
|
+
return toFieldList(result, fieldColumns);
|
|
1935
1989
|
}
|
|
1936
1990
|
/**
|
|
1937
1991
|
* @param {TableDefine} tableDefine
|
|
@@ -1942,16 +1996,9 @@ class Connection {
|
|
|
1942
1996
|
table,
|
|
1943
1997
|
fields
|
|
1944
1998
|
}, where) {
|
|
1999
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1945
2000
|
const conn = await this.#getConnection();
|
|
1946
|
-
return table && typeof table === 'object' ? table.delete(this.#env, conn,
|
|
1947
|
-
table: '',
|
|
1948
|
-
fields: toBaseFields(fields),
|
|
1949
|
-
where
|
|
1950
|
-
}) : conn.delete(this.#env, {
|
|
1951
|
-
table: table || '',
|
|
1952
|
-
fields: toBaseFields(fields),
|
|
1953
|
-
where
|
|
1954
|
-
});
|
|
2001
|
+
return table && typeof table === 'object' ? table.delete(this.#env, conn, columns, where2column(where, fieldColumns)) : conn.delete(this.#env, table || '', columns, where2column(where, fieldColumns));
|
|
1955
2002
|
}
|
|
1956
2003
|
/**
|
|
1957
2004
|
* @template {Fields<MainFieldType>} T
|
|
@@ -1964,17 +2011,10 @@ class Connection {
|
|
|
1964
2011
|
table,
|
|
1965
2012
|
fields
|
|
1966
2013
|
}, returning, where) {
|
|
2014
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1967
2015
|
const conn = await this.#getConnection();
|
|
1968
|
-
const
|
|
1969
|
-
return
|
|
1970
|
-
table: '',
|
|
1971
|
-
fields: baseFields,
|
|
1972
|
-
where
|
|
1973
|
-
}, returning?.length ? returning : Object.keys(baseFields)) : conn.deleteReturn(this.#env, {
|
|
1974
|
-
table: table || '',
|
|
1975
|
-
fields: baseFields,
|
|
1976
|
-
where
|
|
1977
|
-
}, returning?.length ? returning : Object.keys(baseFields));
|
|
2016
|
+
const result = table && typeof table === 'object' ? await table.deleteReturn(this.#env, conn, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), columns, where2column(where, fieldColumns)) : await conn.deleteReturn(this.#env, returning?.length ? field2column(returning, fieldColumns) : Object.keys(columns), table || '', columns, where2column(where, fieldColumns));
|
|
2017
|
+
return toFieldList(result, fieldColumns);
|
|
1978
2018
|
}
|
|
1979
2019
|
/**
|
|
1980
2020
|
*
|
|
@@ -1982,50 +2022,49 @@ class Connection {
|
|
|
1982
2022
|
* @returns {Promise<number>}
|
|
1983
2023
|
*/
|
|
1984
2024
|
async count(queryable) {
|
|
2025
|
+
const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
|
|
1985
2026
|
const {
|
|
1986
|
-
table
|
|
1987
|
-
fields
|
|
2027
|
+
table
|
|
1988
2028
|
} = queryable;
|
|
1989
2029
|
const options = getOptions(queryable);
|
|
2030
|
+
const where = where2column(options.where, fieldColumns);
|
|
1990
2031
|
const conn = await this.#getConnection();
|
|
1991
|
-
return table && typeof table === 'object' ? table.count(this.#env, conn,
|
|
1992
|
-
...options,
|
|
1993
|
-
table: '',
|
|
1994
|
-
fields: toBaseFields(fields)
|
|
1995
|
-
}) : conn.count(this.#env, {
|
|
1996
|
-
...options,
|
|
1997
|
-
table: table || '',
|
|
1998
|
-
fields: toBaseFields(fields)
|
|
1999
|
-
});
|
|
2032
|
+
return table && typeof table === 'object' ? table.count(this.#env, conn, columns, where) : conn.count(this.#env, table || '', columns, where);
|
|
2000
2033
|
}
|
|
2001
2034
|
/**
|
|
2002
2035
|
* @param {Queryable} queryable
|
|
2003
2036
|
* @returns {Promise<any[]>}
|
|
2004
2037
|
*/
|
|
2005
2038
|
async select(queryable) {
|
|
2039
|
+
const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
|
|
2006
2040
|
const {
|
|
2007
2041
|
table
|
|
2008
2042
|
} = queryable;
|
|
2009
|
-
const fields = toBaseFields(queryable.fields);
|
|
2010
2043
|
const options = getOptions(queryable);
|
|
2044
|
+
const {
|
|
2045
|
+
offset,
|
|
2046
|
+
limit
|
|
2047
|
+
} = options;
|
|
2048
|
+
const where = where2column(options.where, fieldColumns);
|
|
2011
2049
|
const conn = await this.#getConnection();
|
|
2012
|
-
const select =
|
|
2050
|
+
const select = select2column(columns, fieldColumns, options.select);
|
|
2013
2051
|
const {
|
|
2014
2052
|
sort
|
|
2015
2053
|
} = options;
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2054
|
+
const result = table && typeof table === 'object' ? await table.find(this.#env, conn, columns, {
|
|
2055
|
+
offset,
|
|
2056
|
+
limit,
|
|
2057
|
+
where,
|
|
2020
2058
|
select,
|
|
2021
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
2022
|
-
}) : conn.
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2059
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
|
|
2060
|
+
}) : await conn.find(this.#env, table || '', columns, {
|
|
2061
|
+
offset,
|
|
2062
|
+
limit,
|
|
2063
|
+
where,
|
|
2026
2064
|
select,
|
|
2027
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
2065
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
|
|
2028
2066
|
});
|
|
2067
|
+
return result;
|
|
2029
2068
|
}
|
|
2030
2069
|
/**
|
|
2031
2070
|
* @param {string} table
|
|
@@ -2124,62 +2163,6 @@ class Connection {
|
|
|
2124
2163
|
const conn = await this.#getConnection();
|
|
2125
2164
|
return conn.renameTable(this.#env, table, newName);
|
|
2126
2165
|
}
|
|
2127
|
-
/**
|
|
2128
|
-
* @param {string} view
|
|
2129
|
-
* @param {Queryable} queryable
|
|
2130
|
-
* @returns {Promise<number>}
|
|
2131
|
-
*/
|
|
2132
|
-
async createView(view, queryable) {
|
|
2133
|
-
const conn = await this.#getConnection();
|
|
2134
|
-
const {
|
|
2135
|
-
table
|
|
2136
|
-
} = queryable;
|
|
2137
|
-
const fields = toBaseFields(queryable.fields);
|
|
2138
|
-
const options = getOptions(queryable);
|
|
2139
|
-
const select = toSelect(fields, options.select);
|
|
2140
|
-
return conn.createView(this.#env, view, {
|
|
2141
|
-
...options,
|
|
2142
|
-
table: typeof table === 'string' ? table : '',
|
|
2143
|
-
fields,
|
|
2144
|
-
select
|
|
2145
|
-
});
|
|
2146
|
-
}
|
|
2147
|
-
/**
|
|
2148
|
-
* @param {string} view
|
|
2149
|
-
* @returns {Promise<number>}
|
|
2150
|
-
*/
|
|
2151
|
-
async dropView(view) {
|
|
2152
|
-
const conn = await this.#getConnection();
|
|
2153
|
-
return conn.dropView(this.#env, view);
|
|
2154
|
-
}
|
|
2155
|
-
/**
|
|
2156
|
-
* @param {string} view
|
|
2157
|
-
* @param {Queryable} queryable
|
|
2158
|
-
* @returns {Promise<number>}
|
|
2159
|
-
*/
|
|
2160
|
-
async createMaterializedView(view, queryable) {
|
|
2161
|
-
const conn = await this.#getConnection();
|
|
2162
|
-
const {
|
|
2163
|
-
table
|
|
2164
|
-
} = queryable;
|
|
2165
|
-
const fields = toBaseFields(queryable.fields);
|
|
2166
|
-
const options = getOptions(queryable);
|
|
2167
|
-
const select = toSelect(fields, options.select);
|
|
2168
|
-
return conn.createMaterializedView(this.#env, view, {
|
|
2169
|
-
...options,
|
|
2170
|
-
table: typeof table === 'string' ? table : '',
|
|
2171
|
-
fields,
|
|
2172
|
-
select
|
|
2173
|
-
});
|
|
2174
|
-
}
|
|
2175
|
-
/**
|
|
2176
|
-
* @param {string} view
|
|
2177
|
-
* @returns {Promise<number>}
|
|
2178
|
-
*/
|
|
2179
|
-
async dropMaterializedView(view) {
|
|
2180
|
-
const conn = await this.#getConnection();
|
|
2181
|
-
return conn.dropMaterializedView(this.#env, view);
|
|
2182
|
-
}
|
|
2183
2166
|
/** @type {AbortController[]} */
|
|
2184
2167
|
#layers = [];
|
|
2185
2168
|
/**
|
|
@@ -2520,12 +2503,7 @@ function submodel(type, constraints, p1, p2) {
|
|
|
2520
2503
|
const define = {
|
|
2521
2504
|
...p,
|
|
2522
2505
|
constraints,
|
|
2523
|
-
type
|
|
2524
|
-
table: type.table,
|
|
2525
|
-
fields: type.fields,
|
|
2526
|
-
pseudo: type.pseudo,
|
|
2527
|
-
indexes: type.indexes
|
|
2528
|
-
},
|
|
2506
|
+
type,
|
|
2529
2507
|
array,
|
|
2530
2508
|
nullable: false,
|
|
2531
2509
|
immutable
|
|
@@ -2891,6 +2869,16 @@ function prop(prop, value) {
|
|
|
2891
2869
|
return (_, ctx) => setProp(ctx, prop, value);
|
|
2892
2870
|
}
|
|
2893
2871
|
|
|
2872
|
+
/** @import { FieldDecorator } from './index.mjs' */
|
|
2873
|
+
/**
|
|
2874
|
+
*
|
|
2875
|
+
* @param {string} [column]
|
|
2876
|
+
* @returns {FieldDecorator<any>}
|
|
2877
|
+
*/
|
|
2878
|
+
function column(column) {
|
|
2879
|
+
return (_, ctx) => setProp(ctx, 'column', column);
|
|
2880
|
+
}
|
|
2881
|
+
|
|
2894
2882
|
/** @import { FieldDecorator } from './index.mjs' */
|
|
2895
2883
|
/**
|
|
2896
2884
|
*
|
|
@@ -3652,7 +3640,7 @@ class Where {
|
|
|
3652
3640
|
}
|
|
3653
3641
|
}
|
|
3654
3642
|
|
|
3655
|
-
/** @typedef {SetValue.Increment | SetValue.Decrement | SetValue.Multiply | SetValue.Divide | string | number | bigint | boolean | null | typeof now | (string | number | bigint | boolean)[]} SetValue */
|
|
3643
|
+
/** @typedef {SetValue.Increment | SetValue.Decrement | SetValue.Multiply | SetValue.Divide | string | number | bigint | boolean | null | typeof now | typeof uuid | (string | number | bigint | boolean)[]} SetValue */
|
|
3656
3644
|
/** @typedef {{[values.increment]: number | bigint}} SetValue.Increment */
|
|
3657
3645
|
/** @typedef {{[values.decrement]: number | bigint}} SetValue.Decrement */
|
|
3658
3646
|
/** @typedef {{[values.multiply]: number | bigint}} SetValue.Multiply */
|
|
@@ -4414,7 +4402,7 @@ function getInitValue(field, value) {
|
|
|
4414
4402
|
if (typeof type === 'string') {
|
|
4415
4403
|
return getBaseTypeValue(type, field.array, value, true);
|
|
4416
4404
|
}
|
|
4417
|
-
if (!type
|
|
4405
|
+
if (!type?.table) {
|
|
4418
4406
|
return getBaseTypeValue('object', field.array, value, true);
|
|
4419
4407
|
}
|
|
4420
4408
|
const {
|
|
@@ -4444,6 +4432,9 @@ function getInitValue(field, value) {
|
|
|
4444
4432
|
const {
|
|
4445
4433
|
type
|
|
4446
4434
|
} = field;
|
|
4435
|
+
if (!type) {
|
|
4436
|
+
continue;
|
|
4437
|
+
}
|
|
4447
4438
|
if (typeof type === 'string') {
|
|
4448
4439
|
doc[key] = getBaseTypeValue(type, field.array, values[key]);
|
|
4449
4440
|
} else if (!type.table) {
|
|
@@ -4471,6 +4462,9 @@ function getSetValue(field, value, immutable) {
|
|
|
4471
4462
|
}
|
|
4472
4463
|
return getBaseTypeValue(type, field.array, value, true);
|
|
4473
4464
|
}
|
|
4465
|
+
if (!type) {
|
|
4466
|
+
return;
|
|
4467
|
+
}
|
|
4474
4468
|
if (!type.table) {
|
|
4475
4469
|
return getBaseTypeValue('object', field.array, value, true);
|
|
4476
4470
|
}
|
|
@@ -4502,6 +4496,9 @@ function getSetValue(field, value, immutable) {
|
|
|
4502
4496
|
const {
|
|
4503
4497
|
type
|
|
4504
4498
|
} = field;
|
|
4499
|
+
if (!type) {
|
|
4500
|
+
continue;
|
|
4501
|
+
}
|
|
4505
4502
|
if (typeof type === 'string') {
|
|
4506
4503
|
if (typeof type !== 'string') {
|
|
4507
4504
|
continue;
|
|
@@ -4661,6 +4658,9 @@ class Model {
|
|
|
4661
4658
|
const {
|
|
4662
4659
|
type
|
|
4663
4660
|
} = field;
|
|
4661
|
+
if (!type) {
|
|
4662
|
+
continue;
|
|
4663
|
+
}
|
|
4664
4664
|
// eslint-disable-next-line no-nested-ternary
|
|
4665
4665
|
values[key] = typeof type === 'string' ? getBaseTypeValue(type, field.array)
|
|
4666
4666
|
// eslint-disable-next-line no-nested-ternary
|
|
@@ -5204,4 +5204,4 @@ function field(type, {
|
|
|
5204
5204
|
};
|
|
5205
5205
|
}
|
|
5206
5206
|
|
|
5207
|
-
export { Build, Connection, Create, Destroy, Model, PseudoDestroy, Query, Save, Submodel, Where, creating, decrement, field as define, deleted, deleting, divide, field$1 as field, getPrimaryFields, getPrimaryKeys, immutable, increment, index, isDevelopment, isPseudo, submodel as model, multiply, now, primary, prop, pseudo, setDevelopment, sort, submodel, toNot, toPrimaries, toPrimary, undeleted, updating, values, withDeleted };
|
|
5207
|
+
export { Build, Connection, Create, Destroy, Model, PseudoDestroy, Query, Save, Submodel, Where, column, creating, decrement, field as define, deleted, deleting, divide, field$1 as field, getPrimaryFields, getPrimaryKeys, immutable, increment, index, isDevelopment, isPseudo, submodel as model, multiply, now, primary, prop, pseudo, setDevelopment, sort, submodel, toNot, toPrimaries, toPrimary, undeleted, updating, uuid, values, withDeleted };
|