imodel 0.3.0 → 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 +103 -118
- package/index.mjs +588 -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,35 +1441,127 @@ 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
|
|
|
1457
|
+
/** @import { TableDefine } from '../types/table' */
|
|
1458
|
+
/** @import { DBIndex, DBTable } from '../types/connection' */
|
|
1459
|
+
/**
|
|
1460
|
+
*
|
|
1461
|
+
* @param {(TableDefine | DBTable)[]} tables
|
|
1462
|
+
*/
|
|
1463
|
+
function table2db(tables) {
|
|
1464
|
+
/** @type {DBTable[]} */
|
|
1465
|
+
const allTables = [];
|
|
1466
|
+
/** @type {Map<string, DBTable & {indexes: DBIndex[]}>} */
|
|
1467
|
+
const map = new Map();
|
|
1468
|
+
const saved = new Set();
|
|
1469
|
+
/** @type {(TableDefine | DBTable)[]} */
|
|
1470
|
+
const list = [...tables];
|
|
1471
|
+
for (let define = list.pop(); define; define = list.pop()) {
|
|
1472
|
+
if (saved.has(define)) {
|
|
1473
|
+
continue;
|
|
1474
|
+
}
|
|
1475
|
+
saved.add(define);
|
|
1476
|
+
const {
|
|
1477
|
+
table,
|
|
1478
|
+
fields,
|
|
1479
|
+
indexes
|
|
1480
|
+
} = define;
|
|
1481
|
+
if (table && typeof table === 'string') {
|
|
1482
|
+
let t = map.get(table);
|
|
1483
|
+
if (!t) {
|
|
1484
|
+
t = {
|
|
1485
|
+
table,
|
|
1486
|
+
fields: Object.create(null),
|
|
1487
|
+
indexes: []
|
|
1488
|
+
};
|
|
1489
|
+
map.set(table, t);
|
|
1490
|
+
allTables.push(t);
|
|
1491
|
+
}
|
|
1492
|
+
const dbColumns = t.fields;
|
|
1493
|
+
for (const [name, field] of Object.entries(fields)) {
|
|
1494
|
+
const {
|
|
1495
|
+
type,
|
|
1496
|
+
size,
|
|
1497
|
+
scale,
|
|
1498
|
+
default: value,
|
|
1499
|
+
nullable,
|
|
1500
|
+
array,
|
|
1501
|
+
primary
|
|
1502
|
+
} = field;
|
|
1503
|
+
if (!type) {
|
|
1504
|
+
continue;
|
|
1505
|
+
}
|
|
1506
|
+
const key = field.column || name;
|
|
1507
|
+
const old = dbColumns[key];
|
|
1508
|
+
if (typeof type === 'string') {
|
|
1509
|
+
if (!old) {
|
|
1510
|
+
t.fields[key] = {
|
|
1511
|
+
type,
|
|
1512
|
+
size,
|
|
1513
|
+
scale,
|
|
1514
|
+
default: value,
|
|
1515
|
+
nullable,
|
|
1516
|
+
array,
|
|
1517
|
+
primary
|
|
1518
|
+
};
|
|
1519
|
+
} else {
|
|
1520
|
+
t.fields[key] = {
|
|
1521
|
+
type,
|
|
1522
|
+
size: size || old.size,
|
|
1523
|
+
scale: scale || old.scale,
|
|
1524
|
+
default: value ?? old.default,
|
|
1525
|
+
nullable: nullable ?? old.nullable,
|
|
1526
|
+
array: array ?? old.array,
|
|
1527
|
+
primary: primary || old.primary
|
|
1528
|
+
};
|
|
1529
|
+
}
|
|
1530
|
+
continue;
|
|
1531
|
+
}
|
|
1532
|
+
if (type.table) {
|
|
1533
|
+
continue;
|
|
1534
|
+
}
|
|
1535
|
+
if (!old) {
|
|
1536
|
+
t.fields[key] = {
|
|
1537
|
+
type: 'object',
|
|
1538
|
+
nullable,
|
|
1539
|
+
array
|
|
1540
|
+
};
|
|
1541
|
+
} else {
|
|
1542
|
+
old.type = 'object';
|
|
1543
|
+
old.array = array ?? old.array;
|
|
1544
|
+
old.nullable = nullable ?? old.nullable;
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
for (const index of indexes || []) {
|
|
1548
|
+
t.indexes.push(index);
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
for (const {
|
|
1552
|
+
type
|
|
1553
|
+
} of Object.values(fields)) {
|
|
1554
|
+
if (!type || typeof type === 'string') {
|
|
1555
|
+
continue;
|
|
1556
|
+
}
|
|
1557
|
+
list.push(type);
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
return allTables;
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1392
1563
|
/* eslint-disable max-lines */
|
|
1393
1564
|
/* eslint-disable max-len */
|
|
1394
|
-
/** @import { WhereValue } from '../Where.mjs' */
|
|
1395
|
-
/** @import { SetValue } from '../set.mjs' */
|
|
1396
|
-
/** @import { Environment, IConnection } from '../types' */
|
|
1397
|
-
/** @import { Fields, FieldType, FieldValue, IndexOptions, MainFieldType, TableDefine } from '../types/table' */
|
|
1398
|
-
/** @import { Queryable } from '../types/options' */
|
|
1399
|
-
/** @import { Column, ColumnOptions } from '../types/column' */
|
|
1400
|
-
/** @import { DBTable, GetName, Skip, TableType } from '../types/connection' */
|
|
1401
1565
|
/**
|
|
1402
1566
|
*
|
|
1403
1567
|
* @param {Fields<keyof FieldType>} fields
|
|
@@ -1610,6 +1774,7 @@ class Connection {
|
|
|
1610
1774
|
if (newData) {
|
|
1611
1775
|
/** @type {any} */
|
|
1612
1776
|
const doc = data;
|
|
1777
|
+
// @ts-ignore
|
|
1613
1778
|
return updateData(conn, model, doc, newData, this.#env);
|
|
1614
1779
|
}
|
|
1615
1780
|
return create(conn, this.#env, model, data);
|
|
@@ -1660,6 +1825,7 @@ class Connection {
|
|
|
1660
1825
|
};
|
|
1661
1826
|
if (typeof data[PseudoDestroy] !== 'function') {
|
|
1662
1827
|
const conn = await this.#getConnection();
|
|
1828
|
+
// @ts-ignore
|
|
1663
1829
|
return pseudoDestroy(conn, tableDef, data, update, this.#env);
|
|
1664
1830
|
}
|
|
1665
1831
|
const r = /** @type {PseudoDestroy} */data;
|
|
@@ -1730,22 +1896,24 @@ class Connection {
|
|
|
1730
1896
|
table,
|
|
1731
1897
|
fields
|
|
1732
1898
|
}, data, keys) {
|
|
1733
|
-
const
|
|
1899
|
+
const [columns, fieldColumns] = toColumns(fields);
|
|
1734
1900
|
const isArray = Array.isArray(data);
|
|
1735
|
-
const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d,
|
|
1901
|
+
const insertValues = (isArray ? data : [data]).map(d => getInsertValue(d, columns, fieldColumns));
|
|
1736
1902
|
if (!insertValues.length) {
|
|
1737
1903
|
throw new Error();
|
|
1738
1904
|
}
|
|
1739
|
-
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);
|
|
1740
1906
|
if (!insertKeys.length && !isArray) {
|
|
1741
|
-
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);
|
|
1742
1908
|
}
|
|
1743
1909
|
if (!insertKeys.length) {
|
|
1744
|
-
insertKeys = Object.entries(
|
|
1910
|
+
insertKeys = Object.entries(columns).map(v => v[0]);
|
|
1745
1911
|
}
|
|
1746
1912
|
const conn = await this.#getConnection();
|
|
1747
|
-
const
|
|
1748
|
-
|
|
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];
|
|
1749
1917
|
}
|
|
1750
1918
|
/**
|
|
1751
1919
|
* @param {TableDefine} tableDefine
|
|
@@ -1758,16 +1926,9 @@ class Connection {
|
|
|
1758
1926
|
table,
|
|
1759
1927
|
fields
|
|
1760
1928
|
}, update, where, skip) {
|
|
1929
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1761
1930
|
const conn = await this.#getConnection();
|
|
1762
|
-
return table && typeof table === 'object' ? table.update(this.#env, conn,
|
|
1763
|
-
table: '',
|
|
1764
|
-
fields: toBaseFields(fields),
|
|
1765
|
-
where: where || undefined
|
|
1766
|
-
}, await getSetNewValue(fields, update, skip)) : conn.update(this.#env, {
|
|
1767
|
-
table: table || '',
|
|
1768
|
-
fields: toBaseFields(fields),
|
|
1769
|
-
where: where || undefined
|
|
1770
|
-
}, 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));
|
|
1771
1932
|
}
|
|
1772
1933
|
/**
|
|
1773
1934
|
* @template {Fields<MainFieldType>} T
|
|
@@ -1782,17 +1943,10 @@ class Connection {
|
|
|
1782
1943
|
table,
|
|
1783
1944
|
fields
|
|
1784
1945
|
}, update, returning, where, skip) {
|
|
1946
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1785
1947
|
const conn = await this.#getConnection();
|
|
1786
|
-
const
|
|
1787
|
-
return
|
|
1788
|
-
table: '',
|
|
1789
|
-
fields: baseFields,
|
|
1790
|
-
where: where || undefined
|
|
1791
|
-
}, await getSetNewValue(fields, update, skip), returning?.length ? returning : Object.keys(baseFields)) : conn.updateReturn(this.#env, {
|
|
1792
|
-
table: table || '',
|
|
1793
|
-
fields: baseFields,
|
|
1794
|
-
where: where || undefined
|
|
1795
|
-
}, 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);
|
|
1796
1950
|
}
|
|
1797
1951
|
/**
|
|
1798
1952
|
* @param {TableDefine} tableDefine
|
|
@@ -1806,11 +1960,11 @@ class Connection {
|
|
|
1806
1960
|
table,
|
|
1807
1961
|
fields
|
|
1808
1962
|
}, pKeys, setKeys, list, skip) {
|
|
1809
|
-
const
|
|
1810
|
-
const update = await
|
|
1811
|
-
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));
|
|
1812
1966
|
const conn = await this.#getConnection();
|
|
1813
|
-
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, []);
|
|
1814
1968
|
}
|
|
1815
1969
|
/**
|
|
1816
1970
|
* @template {Fields<MainFieldType>} T
|
|
@@ -1826,11 +1980,12 @@ class Connection {
|
|
|
1826
1980
|
table,
|
|
1827
1981
|
fields
|
|
1828
1982
|
}, pKeys, setKeys, list, returning, skip) {
|
|
1829
|
-
const
|
|
1830
|
-
const update =
|
|
1831
|
-
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));
|
|
1832
1986
|
const conn = await this.#getConnection();
|
|
1833
|
-
|
|
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);
|
|
1834
1989
|
}
|
|
1835
1990
|
/**
|
|
1836
1991
|
* @param {TableDefine} tableDefine
|
|
@@ -1841,16 +1996,9 @@ class Connection {
|
|
|
1841
1996
|
table,
|
|
1842
1997
|
fields
|
|
1843
1998
|
}, where) {
|
|
1999
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1844
2000
|
const conn = await this.#getConnection();
|
|
1845
|
-
return table && typeof table === 'object' ? table.delete(this.#env, conn,
|
|
1846
|
-
table: '',
|
|
1847
|
-
fields: toBaseFields(fields),
|
|
1848
|
-
where
|
|
1849
|
-
}) : conn.delete(this.#env, {
|
|
1850
|
-
table: table || '',
|
|
1851
|
-
fields: toBaseFields(fields),
|
|
1852
|
-
where
|
|
1853
|
-
});
|
|
2001
|
+
return table && typeof table === 'object' ? table.delete(this.#env, conn, columns, where2column(where, fieldColumns)) : conn.delete(this.#env, table || '', columns, where2column(where, fieldColumns));
|
|
1854
2002
|
}
|
|
1855
2003
|
/**
|
|
1856
2004
|
* @template {Fields<MainFieldType>} T
|
|
@@ -1863,17 +2011,10 @@ class Connection {
|
|
|
1863
2011
|
table,
|
|
1864
2012
|
fields
|
|
1865
2013
|
}, returning, where) {
|
|
2014
|
+
const [columns, fieldColumns, tableFields] = toColumns(fields);
|
|
1866
2015
|
const conn = await this.#getConnection();
|
|
1867
|
-
const
|
|
1868
|
-
return
|
|
1869
|
-
table: '',
|
|
1870
|
-
fields: baseFields,
|
|
1871
|
-
where
|
|
1872
|
-
}, returning?.length ? returning : Object.keys(baseFields)) : conn.deleteReturn(this.#env, {
|
|
1873
|
-
table: table || '',
|
|
1874
|
-
fields: baseFields,
|
|
1875
|
-
where
|
|
1876
|
-
}, 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);
|
|
1877
2018
|
}
|
|
1878
2019
|
/**
|
|
1879
2020
|
*
|
|
@@ -1881,50 +2022,49 @@ class Connection {
|
|
|
1881
2022
|
* @returns {Promise<number>}
|
|
1882
2023
|
*/
|
|
1883
2024
|
async count(queryable) {
|
|
2025
|
+
const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
|
|
1884
2026
|
const {
|
|
1885
|
-
table
|
|
1886
|
-
fields
|
|
2027
|
+
table
|
|
1887
2028
|
} = queryable;
|
|
1888
2029
|
const options = getOptions(queryable);
|
|
2030
|
+
const where = where2column(options.where, fieldColumns);
|
|
1889
2031
|
const conn = await this.#getConnection();
|
|
1890
|
-
return table && typeof table === 'object' ? table.count(this.#env, conn,
|
|
1891
|
-
...options,
|
|
1892
|
-
table: '',
|
|
1893
|
-
fields: toBaseFields(fields)
|
|
1894
|
-
}) : conn.count(this.#env, {
|
|
1895
|
-
...options,
|
|
1896
|
-
table: table || '',
|
|
1897
|
-
fields: toBaseFields(fields)
|
|
1898
|
-
});
|
|
2032
|
+
return table && typeof table === 'object' ? table.count(this.#env, conn, columns, where) : conn.count(this.#env, table || '', columns, where);
|
|
1899
2033
|
}
|
|
1900
2034
|
/**
|
|
1901
2035
|
* @param {Queryable} queryable
|
|
1902
2036
|
* @returns {Promise<any[]>}
|
|
1903
2037
|
*/
|
|
1904
2038
|
async select(queryable) {
|
|
2039
|
+
const [columns, fieldColumns, tableFields] = toColumns(queryable.fields);
|
|
1905
2040
|
const {
|
|
1906
2041
|
table
|
|
1907
2042
|
} = queryable;
|
|
1908
|
-
const fields = toBaseFields(queryable.fields);
|
|
1909
2043
|
const options = getOptions(queryable);
|
|
2044
|
+
const {
|
|
2045
|
+
offset,
|
|
2046
|
+
limit
|
|
2047
|
+
} = options;
|
|
2048
|
+
const where = where2column(options.where, fieldColumns);
|
|
1910
2049
|
const conn = await this.#getConnection();
|
|
1911
|
-
const select =
|
|
2050
|
+
const select = select2column(columns, fieldColumns, options.select);
|
|
1912
2051
|
const {
|
|
1913
2052
|
sort
|
|
1914
2053
|
} = options;
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
2054
|
+
const result = table && typeof table === 'object' ? await table.find(this.#env, conn, columns, {
|
|
2055
|
+
offset,
|
|
2056
|
+
limit,
|
|
2057
|
+
where,
|
|
1919
2058
|
select,
|
|
1920
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
1921
|
-
}) : conn.
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
2059
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
|
|
2060
|
+
}) : await conn.find(this.#env, table || '', columns, {
|
|
2061
|
+
offset,
|
|
2062
|
+
limit,
|
|
2063
|
+
where,
|
|
1925
2064
|
select,
|
|
1926
|
-
sort: sort?.length ? sort : getDefaultSort(
|
|
2065
|
+
sort: sort?.length ? sort2column(sort, fieldColumns) : getDefaultSort(columns)
|
|
1927
2066
|
});
|
|
2067
|
+
return result;
|
|
1928
2068
|
}
|
|
1929
2069
|
/**
|
|
1930
2070
|
* @param {string} table
|
|
@@ -2023,62 +2163,6 @@ class Connection {
|
|
|
2023
2163
|
const conn = await this.#getConnection();
|
|
2024
2164
|
return conn.renameTable(this.#env, table, newName);
|
|
2025
2165
|
}
|
|
2026
|
-
/**
|
|
2027
|
-
* @param {string} view
|
|
2028
|
-
* @param {Queryable} queryable
|
|
2029
|
-
* @returns {Promise<number>}
|
|
2030
|
-
*/
|
|
2031
|
-
async createView(view, queryable) {
|
|
2032
|
-
const conn = await this.#getConnection();
|
|
2033
|
-
const {
|
|
2034
|
-
table
|
|
2035
|
-
} = queryable;
|
|
2036
|
-
const fields = toBaseFields(queryable.fields);
|
|
2037
|
-
const options = getOptions(queryable);
|
|
2038
|
-
const select = toSelect(fields, options.select);
|
|
2039
|
-
return conn.createView(this.#env, view, {
|
|
2040
|
-
...options,
|
|
2041
|
-
table: typeof table === 'string' ? table : '',
|
|
2042
|
-
fields,
|
|
2043
|
-
select
|
|
2044
|
-
});
|
|
2045
|
-
}
|
|
2046
|
-
/**
|
|
2047
|
-
* @param {string} view
|
|
2048
|
-
* @returns {Promise<number>}
|
|
2049
|
-
*/
|
|
2050
|
-
async dropView(view) {
|
|
2051
|
-
const conn = await this.#getConnection();
|
|
2052
|
-
return conn.dropView(this.#env, view);
|
|
2053
|
-
}
|
|
2054
|
-
/**
|
|
2055
|
-
* @param {string} view
|
|
2056
|
-
* @param {Queryable} queryable
|
|
2057
|
-
* @returns {Promise<number>}
|
|
2058
|
-
*/
|
|
2059
|
-
async createMaterializedView(view, queryable) {
|
|
2060
|
-
const conn = await this.#getConnection();
|
|
2061
|
-
const {
|
|
2062
|
-
table
|
|
2063
|
-
} = queryable;
|
|
2064
|
-
const fields = toBaseFields(queryable.fields);
|
|
2065
|
-
const options = getOptions(queryable);
|
|
2066
|
-
const select = toSelect(fields, options.select);
|
|
2067
|
-
return conn.createMaterializedView(this.#env, view, {
|
|
2068
|
-
...options,
|
|
2069
|
-
table: typeof table === 'string' ? table : '',
|
|
2070
|
-
fields,
|
|
2071
|
-
select
|
|
2072
|
-
});
|
|
2073
|
-
}
|
|
2074
|
-
/**
|
|
2075
|
-
* @param {string} view
|
|
2076
|
-
* @returns {Promise<number>}
|
|
2077
|
-
*/
|
|
2078
|
-
async dropMaterializedView(view) {
|
|
2079
|
-
const conn = await this.#getConnection();
|
|
2080
|
-
return conn.dropMaterializedView(this.#env, view);
|
|
2081
|
-
}
|
|
2082
2166
|
/** @type {AbortController[]} */
|
|
2083
2167
|
#layers = [];
|
|
2084
2168
|
/**
|
|
@@ -2164,12 +2248,20 @@ class Connection {
|
|
|
2164
2248
|
return conn.loadTables(this.#env, tables);
|
|
2165
2249
|
}
|
|
2166
2250
|
/**
|
|
2167
|
-
* @param {DBTable
|
|
2251
|
+
* @param {TableDefine | DBTable} table
|
|
2252
|
+
* @returns {Promise<void>}
|
|
2253
|
+
*/
|
|
2254
|
+
async syncTable(table) {
|
|
2255
|
+
const conn = await this.#getConnection();
|
|
2256
|
+
return conn.syncTables(this.#env, table2db([table]));
|
|
2257
|
+
}
|
|
2258
|
+
/**
|
|
2259
|
+
* @param {(TableDefine | DBTable)[]} tables
|
|
2168
2260
|
* @returns {Promise<void>}
|
|
2169
2261
|
*/
|
|
2170
2262
|
async syncTables(tables) {
|
|
2171
2263
|
const conn = await this.#getConnection();
|
|
2172
|
-
return conn.syncTables(this.#env, tables);
|
|
2264
|
+
return conn.syncTables(this.#env, table2db(tables));
|
|
2173
2265
|
}
|
|
2174
2266
|
/**
|
|
2175
2267
|
* @template T
|
|
@@ -2411,12 +2503,7 @@ function submodel(type, constraints, p1, p2) {
|
|
|
2411
2503
|
const define = {
|
|
2412
2504
|
...p,
|
|
2413
2505
|
constraints,
|
|
2414
|
-
type
|
|
2415
|
-
table: type.table,
|
|
2416
|
-
fields: type.fields,
|
|
2417
|
-
pseudo: type.pseudo,
|
|
2418
|
-
indexes: type.indexes
|
|
2419
|
-
},
|
|
2506
|
+
type,
|
|
2420
2507
|
array,
|
|
2421
2508
|
nullable: false,
|
|
2422
2509
|
immutable
|
|
@@ -2782,6 +2869,16 @@ function prop(prop, value) {
|
|
|
2782
2869
|
return (_, ctx) => setProp(ctx, prop, value);
|
|
2783
2870
|
}
|
|
2784
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
|
+
|
|
2785
2882
|
/** @import { FieldDecorator } from './index.mjs' */
|
|
2786
2883
|
/**
|
|
2787
2884
|
*
|
|
@@ -3543,7 +3640,7 @@ class Where {
|
|
|
3543
3640
|
}
|
|
3544
3641
|
}
|
|
3545
3642
|
|
|
3546
|
-
/** @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 */
|
|
3547
3644
|
/** @typedef {{[values.increment]: number | bigint}} SetValue.Increment */
|
|
3548
3645
|
/** @typedef {{[values.decrement]: number | bigint}} SetValue.Decrement */
|
|
3549
3646
|
/** @typedef {{[values.multiply]: number | bigint}} SetValue.Multiply */
|
|
@@ -4305,7 +4402,7 @@ function getInitValue(field, value) {
|
|
|
4305
4402
|
if (typeof type === 'string') {
|
|
4306
4403
|
return getBaseTypeValue(type, field.array, value, true);
|
|
4307
4404
|
}
|
|
4308
|
-
if (!type
|
|
4405
|
+
if (!type?.table) {
|
|
4309
4406
|
return getBaseTypeValue('object', field.array, value, true);
|
|
4310
4407
|
}
|
|
4311
4408
|
const {
|
|
@@ -4335,6 +4432,9 @@ function getInitValue(field, value) {
|
|
|
4335
4432
|
const {
|
|
4336
4433
|
type
|
|
4337
4434
|
} = field;
|
|
4435
|
+
if (!type) {
|
|
4436
|
+
continue;
|
|
4437
|
+
}
|
|
4338
4438
|
if (typeof type === 'string') {
|
|
4339
4439
|
doc[key] = getBaseTypeValue(type, field.array, values[key]);
|
|
4340
4440
|
} else if (!type.table) {
|
|
@@ -4362,6 +4462,9 @@ function getSetValue(field, value, immutable) {
|
|
|
4362
4462
|
}
|
|
4363
4463
|
return getBaseTypeValue(type, field.array, value, true);
|
|
4364
4464
|
}
|
|
4465
|
+
if (!type) {
|
|
4466
|
+
return;
|
|
4467
|
+
}
|
|
4365
4468
|
if (!type.table) {
|
|
4366
4469
|
return getBaseTypeValue('object', field.array, value, true);
|
|
4367
4470
|
}
|
|
@@ -4393,6 +4496,9 @@ function getSetValue(field, value, immutable) {
|
|
|
4393
4496
|
const {
|
|
4394
4497
|
type
|
|
4395
4498
|
} = field;
|
|
4499
|
+
if (!type) {
|
|
4500
|
+
continue;
|
|
4501
|
+
}
|
|
4396
4502
|
if (typeof type === 'string') {
|
|
4397
4503
|
if (typeof type !== 'string') {
|
|
4398
4504
|
continue;
|
|
@@ -4552,6 +4658,9 @@ class Model {
|
|
|
4552
4658
|
const {
|
|
4553
4659
|
type
|
|
4554
4660
|
} = field;
|
|
4661
|
+
if (!type) {
|
|
4662
|
+
continue;
|
|
4663
|
+
}
|
|
4555
4664
|
// eslint-disable-next-line no-nested-ternary
|
|
4556
4665
|
values[key] = typeof type === 'string' ? getBaseTypeValue(type, field.array)
|
|
4557
4666
|
// eslint-disable-next-line no-nested-ternary
|
|
@@ -5095,4 +5204,4 @@ function field(type, {
|
|
|
5095
5204
|
};
|
|
5096
5205
|
}
|
|
5097
5206
|
|
|
5098
|
-
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 };
|