dobo 2.37.2 → 2.39.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/extend/bajoCli/applet/{create-aggregate.js → aggregate.js} +3 -3
- package/extend/bajoCli/applet/{create-histogram.js → histogram.js} +3 -3
- package/extend/dobo/adapter/memory.js +5 -5
- package/lib/factory/action.js +4 -4
- package/lib/factory/adapter.js +18 -18
- package/lib/factory/model/aggregate.js +23 -0
- package/lib/factory/model/histogram.js +23 -0
- package/lib/factory/model.js +4 -4
- package/package.json +1 -1
- package/wiki/CHANGES.md +9 -0
- package/lib/factory/model/create-aggregate.js +0 -23
- package/lib/factory/model/create-histogram.js +0 -23
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import postProcess from './lib/post-process.js'
|
|
2
2
|
|
|
3
|
-
async function
|
|
3
|
+
async function aggregate (path, ...args) {
|
|
4
4
|
const { importPkg } = this.app.bajo
|
|
5
5
|
const { isEmpty, map } = this.app.lib._
|
|
6
6
|
const { parseKvString } = this.app.lib.aneka
|
|
@@ -26,8 +26,8 @@ async function createAggregate (path, ...args) {
|
|
|
26
26
|
})
|
|
27
27
|
}
|
|
28
28
|
params = isEmpty(params) ? {} : parseKvString(params)
|
|
29
|
-
await postProcess.call(this, { noConfirmation: true, handler: '
|
|
29
|
+
await postProcess.call(this, { noConfirmation: true, handler: 'aggregate', params: [model, filter, params, options], path, processMsg: 'Create aggregate' })
|
|
30
30
|
this.app.exit()
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
export default
|
|
33
|
+
export default aggregate
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import postProcess from './lib/post-process.js'
|
|
2
2
|
|
|
3
|
-
async function
|
|
3
|
+
async function histogram (path, ...args) {
|
|
4
4
|
const { importPkg } = this.app.bajo
|
|
5
5
|
const { isEmpty, map } = this.app.lib._
|
|
6
6
|
const { parseKvString } = this.app.lib.aneka
|
|
@@ -26,8 +26,8 @@ async function createHistogram (path, ...args) {
|
|
|
26
26
|
})
|
|
27
27
|
}
|
|
28
28
|
params = isEmpty(params) ? {} : parseKvString(params)
|
|
29
|
-
await postProcess.call(this, { noConfirmation: true, handler: '
|
|
29
|
+
await postProcess.call(this, { noConfirmation: true, handler: 'histogram', params: [model, filter, params, options], path, processMsg: 'Create histogram' })
|
|
30
30
|
this.app.exit()
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
export default
|
|
33
|
+
export default histogram
|
|
@@ -28,7 +28,7 @@ async function memoryAdapterFactory () {
|
|
|
28
28
|
async connect (connection, noRebuild) {
|
|
29
29
|
const conn = this.plugin.getConnection('memory')
|
|
30
30
|
const { fs } = this.app.lib
|
|
31
|
-
const {
|
|
31
|
+
const { startInterval } = this.app.lib
|
|
32
32
|
const dir = `${this.app.getPluginDataDir(this.plugin.ns)}/memDb/data` // persistence dir
|
|
33
33
|
fs.ensureDirSync(dir)
|
|
34
34
|
conn.persistences = conn.persistences ?? []
|
|
@@ -52,7 +52,7 @@ async function memoryAdapterFactory () {
|
|
|
52
52
|
else this.storage[model.name] = data
|
|
53
53
|
} else await model.loadFixtures({ ignoreError: false })
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
const handler = async () => {
|
|
56
56
|
if (!this.saving) return
|
|
57
57
|
this.saving = true
|
|
58
58
|
for (const model of models) {
|
|
@@ -64,7 +64,7 @@ async function memoryAdapterFactory () {
|
|
|
64
64
|
this.saving = false
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
startInterval(handler, this.plugin.config.memDb.persistenceDur, 'memDbPersistence')
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
async _getOldRecord (model, id, options = {}) {
|
|
@@ -149,13 +149,13 @@ async function memoryAdapterFactory () {
|
|
|
149
149
|
return { data }
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
async
|
|
152
|
+
async aggregate (model, filter = {}, params = {}, options = {}) {
|
|
153
153
|
const item = await this.findAllRecord(model, filter, options)
|
|
154
154
|
const result = this.app.dobo.calcAggregate({ data: item.data, ...params })
|
|
155
155
|
return { data: result }
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
async
|
|
158
|
+
async histogram (model, filter = {}, params = {}, options = {}) {
|
|
159
159
|
const item = await this.findAllRecord(model, filter, options)
|
|
160
160
|
const result = this.app.dobo.calcHistogram({ data: item.data, ...params })
|
|
161
161
|
return { data: result }
|
package/lib/factory/action.js
CHANGED
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* @property {string[]} [findAllRecord=['filter']]
|
|
15
15
|
* @property {string[]} [findAllRecords=['filter']] - Alias of `findAllRecord`
|
|
16
16
|
* @property {string[]} [countRecord=['params']]
|
|
17
|
-
* @property {string[]} [
|
|
18
|
-
* @property {string[]} [
|
|
17
|
+
* @property {string[]} [aggregate=['params']]
|
|
18
|
+
* @property {string[]} [histogram=['params']]
|
|
19
19
|
* @property {string[]} [createAttachment=['id']]
|
|
20
20
|
* @property {string[]} [findAttachment=['id']]
|
|
21
21
|
* @property {string[]} [getAttachment=['id', 'field', 'file']]
|
|
@@ -34,8 +34,8 @@ const methods = {
|
|
|
34
34
|
findAllRecord: ['filter'],
|
|
35
35
|
findAllRecords: ['filter'],
|
|
36
36
|
countRecord: ['params'],
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
aggregate: ['params'],
|
|
38
|
+
histogram: ['params'],
|
|
39
39
|
createAttachment: ['id'],
|
|
40
40
|
findAttachment: ['id'],
|
|
41
41
|
getAttachment: ['id', 'field', 'file'],
|
package/lib/factory/adapter.js
CHANGED
|
@@ -452,7 +452,7 @@ async function adapterFactory () {
|
|
|
452
452
|
if (!this.support.uniqueIndex) await this._checkUnique(model, body, options)
|
|
453
453
|
}
|
|
454
454
|
if (!options.noIdCheck && isSet(body.id)) {
|
|
455
|
-
const resp = await this.getRecord(model, body.id, {
|
|
455
|
+
const resp = await this.getRecord(model, body.id, { noMagic: true })
|
|
456
456
|
if (!isEmpty(resp.data)) throw this.plugin.error('recordExists%s%s', body.id, model.name)
|
|
457
457
|
}
|
|
458
458
|
body = this.sanitizeBody(model, body)
|
|
@@ -536,7 +536,7 @@ async function adapterFactory () {
|
|
|
536
536
|
if (!this.support.uniqueIndex) await this._checkUnique(model, body, options)
|
|
537
537
|
}
|
|
538
538
|
if (!options._data) {
|
|
539
|
-
const resp = await this.getRecord(model, id, {
|
|
539
|
+
const resp = await this.getRecord(model, id, { noMagic: true })
|
|
540
540
|
if (!resp.data) throw this.plugin.error('recordNotFound%s%s', id, model.name)
|
|
541
541
|
options._data = resp.data
|
|
542
542
|
}
|
|
@@ -573,7 +573,7 @@ async function adapterFactory () {
|
|
|
573
573
|
}
|
|
574
574
|
if (isSet(body.id)) {
|
|
575
575
|
if (!options._data) {
|
|
576
|
-
const resp = await this.getRecord(model, body.id, {
|
|
576
|
+
const resp = await this.getRecord(model, body.id, { noMagic: true })
|
|
577
577
|
if (!resp.data) throw this.plugin.error('recordNotFound%s%s', body.id, model.name)
|
|
578
578
|
options._data = resp.data
|
|
579
579
|
}
|
|
@@ -604,7 +604,7 @@ async function adapterFactory () {
|
|
|
604
604
|
*/
|
|
605
605
|
async _removeRecord (model, id, options = {}) {
|
|
606
606
|
if (!options._data) {
|
|
607
|
-
const resp = await this.getRecord(model, id, {
|
|
607
|
+
const resp = await this.getRecord(model, id, { noMagic: true })
|
|
608
608
|
if (!resp.data) throw this.plugin.error('recordNotFound%s%s', id, model.name)
|
|
609
609
|
options._data = resp.data
|
|
610
610
|
}
|
|
@@ -731,7 +731,7 @@ async function adapterFactory () {
|
|
|
731
731
|
}
|
|
732
732
|
|
|
733
733
|
/**
|
|
734
|
-
* Wrapper for the {@link DoboAdapter#
|
|
734
|
+
* Wrapper for the {@link DoboAdapter#aggregate} method, called internally by `model` to make sure
|
|
735
735
|
* all adapter hooks are executed accordingly, and all inputs and outputs are sanitized.
|
|
736
736
|
* @internal
|
|
737
737
|
* @async
|
|
@@ -742,7 +742,7 @@ async function adapterFactory () {
|
|
|
742
742
|
* @param {object} options
|
|
743
743
|
* @returns {Promise<object>}
|
|
744
744
|
*/
|
|
745
|
-
async
|
|
745
|
+
async _aggregate (model, filter = {}, params = {}, options = {}) {
|
|
746
746
|
const fieldPropTypes = ['integer', 'smallint', 'float', 'double']
|
|
747
747
|
const groupPropTypes = ['string', ...fieldPropTypes]
|
|
748
748
|
this.app.dobo.checkAggregateParams(params)
|
|
@@ -758,9 +758,9 @@ async function adapterFactory () {
|
|
|
758
758
|
|
|
759
759
|
let result
|
|
760
760
|
try {
|
|
761
|
-
await this._attachHook('
|
|
762
|
-
result = await this.
|
|
763
|
-
await this._attachHook('
|
|
761
|
+
await this._attachHook('beforeAggregate', model, filter, params, options)
|
|
762
|
+
result = await this.aggregate(model, filter, params, options)
|
|
763
|
+
await this._attachHook('afterAggregate', model, filter, params, result, options)
|
|
764
764
|
} catch (err) {
|
|
765
765
|
if (err.message !== '_emptyColumnQuery') throw err
|
|
766
766
|
result = { data: [] }
|
|
@@ -774,7 +774,7 @@ async function adapterFactory () {
|
|
|
774
774
|
}
|
|
775
775
|
|
|
776
776
|
/**
|
|
777
|
-
* Wrapper for the {@link DoboAdapter#
|
|
777
|
+
* Wrapper for the {@link DoboAdapter#histogram} method, called internally by `model` to make sure
|
|
778
778
|
* all adapter hooks are executed accordingly, and all inputs and outputs are sanitized.
|
|
779
779
|
* @internal
|
|
780
780
|
* @async
|
|
@@ -785,7 +785,7 @@ async function adapterFactory () {
|
|
|
785
785
|
* @param {object} options
|
|
786
786
|
* @returns {Promise<object>}
|
|
787
787
|
*/
|
|
788
|
-
async
|
|
788
|
+
async _histogram (model, filter = {}, params, options = {}) {
|
|
789
789
|
// const fieldPropTypes = ['integer', 'smallint', 'float', 'double']
|
|
790
790
|
const groupPropTypes = ['datetime', 'date']
|
|
791
791
|
this.app.dobo.checkHistogramParams(params)
|
|
@@ -800,9 +800,9 @@ async function adapterFactory () {
|
|
|
800
800
|
|
|
801
801
|
let result
|
|
802
802
|
try {
|
|
803
|
-
await this._attachHook('
|
|
804
|
-
result = await this.
|
|
805
|
-
await this._attachHook('
|
|
803
|
+
await this._attachHook('beforeHistogram', model, filter, params, options)
|
|
804
|
+
result = await this.histogram(model, filter, params, options)
|
|
805
|
+
await this._attachHook('afterHistogram', model, filter, params, result, options)
|
|
806
806
|
} catch (err) {
|
|
807
807
|
if (err.message !== '_emptyColumnQuery') throw err
|
|
808
808
|
result = { data: [] }
|
|
@@ -997,8 +997,8 @@ async function adapterFactory () {
|
|
|
997
997
|
* @param {object} options - Additional options that may affect aggregate creation
|
|
998
998
|
* @returns {Promise<object>} - The result of the aggregate creation
|
|
999
999
|
*/
|
|
1000
|
-
async
|
|
1001
|
-
throw this.plugin.error('notSupportedAdapter%s%s%s', this.app.t('method'), '
|
|
1000
|
+
async aggregate (model, filter = {}, params = {}, options = {}) {
|
|
1001
|
+
throw this.plugin.error('notSupportedAdapter%s%s%s', this.app.t('method'), 'aggregate', this.name)
|
|
1002
1002
|
}
|
|
1003
1003
|
|
|
1004
1004
|
/**
|
|
@@ -1013,8 +1013,8 @@ async function adapterFactory () {
|
|
|
1013
1013
|
* @param {object} options - Additional options that may affect histogram creation
|
|
1014
1014
|
* @returns {Promise<object>} - The result of the histogram creation
|
|
1015
1015
|
*/
|
|
1016
|
-
async
|
|
1017
|
-
throw this.plugin.error('notSupportedAdapter%s%s%s', this.app.t('method'), '
|
|
1016
|
+
async histogram (model, filter = {}, params = {}, options = {}) {
|
|
1017
|
+
throw this.plugin.error('notSupportedAdapter%s%s%s', this.app.t('method'), 'histogram', this.name)
|
|
1018
1018
|
}
|
|
1019
1019
|
|
|
1020
1020
|
/**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getFilterAndOptions, execHook, execModelHook, execDynHook } from './helper.js'
|
|
2
|
+
const action = 'aggregate'
|
|
3
|
+
|
|
4
|
+
async function aggregate (...args) {
|
|
5
|
+
if (args.length === 0) return this.action(action, ...args)
|
|
6
|
+
const [_filter = {}, params = {}, opts = {}] = args
|
|
7
|
+
opts.dataOnly = opts.dataOnly ?? true
|
|
8
|
+
const { dataOnly } = opts
|
|
9
|
+
const { filter, options } = await getFilterAndOptions.call(this, _filter, opts, action)
|
|
10
|
+
const { getDefaultValues } = this.app.dobo
|
|
11
|
+
await execHook.call(this, 'beforeAggregate', filter, params, options)
|
|
12
|
+
await execModelHook.call(this, 'beforeAggregate', filter, params, options)
|
|
13
|
+
await execDynHook.call(this, 'beforeAggregate', filter, params, options)
|
|
14
|
+
const result = (await this.adapter._aggregate(this, filter, params, options)) ?? {}
|
|
15
|
+
const { warnings } = getDefaultValues(options)
|
|
16
|
+
if (!warnings) delete result.warnings
|
|
17
|
+
await execDynHook.call(this, 'afterAggregate', filter, params, result, options)
|
|
18
|
+
await execModelHook.call(this, 'afterAggregate', filter, params, result, options)
|
|
19
|
+
await execHook.call(this, 'afterAggregate', filter, params, result, options)
|
|
20
|
+
return dataOnly ? result.data : result
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default aggregate
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getFilterAndOptions, execHook, execModelHook, execDynHook } from './helper.js'
|
|
2
|
+
const action = 'histogram'
|
|
3
|
+
|
|
4
|
+
async function histogram (...args) {
|
|
5
|
+
if (args.length === 0) return this.action(action, ...args)
|
|
6
|
+
const [_filter = {}, params = {}, opts = {}] = args
|
|
7
|
+
opts.dataOnly = opts.dataOnly ?? true
|
|
8
|
+
const { dataOnly } = opts
|
|
9
|
+
const { filter, options } = await getFilterAndOptions.call(this, _filter, opts, action)
|
|
10
|
+
const { getDefaultValues } = this.app.dobo
|
|
11
|
+
await execHook.call(this, 'beforeHistogram', filter, params, options)
|
|
12
|
+
await execModelHook.call(this, 'beforeHistogram', filter, params, options)
|
|
13
|
+
await execDynHook.call(this, 'beforeHistogram', filter, params, options)
|
|
14
|
+
const result = (await this.adapter._histogram(this, filter, params, options)) ?? {}
|
|
15
|
+
const { warnings } = getDefaultValues(options)
|
|
16
|
+
if (!warnings) delete result.warnings
|
|
17
|
+
await execDynHook.call(this, 'afterHistogram', filter, params, result, options)
|
|
18
|
+
await execModelHook.call(this, 'afterHistogram', filter, params, result, options)
|
|
19
|
+
await execHook.call(this, 'afterHistogram', filter, params, result, options)
|
|
20
|
+
return dataOnly ? result.data : result
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default histogram
|
package/lib/factory/model.js
CHANGED
|
@@ -7,8 +7,8 @@ import findAllRecord from './model/find-all-record.js'
|
|
|
7
7
|
import findOneRecord from './model/find-one-record.js'
|
|
8
8
|
import findRecord from './model/find-record.js'
|
|
9
9
|
import getRecord from './model/get-record.js'
|
|
10
|
-
import
|
|
11
|
-
import
|
|
10
|
+
import histogram from './model/histogram.js'
|
|
11
|
+
import aggregate from './model/aggregate.js'
|
|
12
12
|
import exists from './model/exists.js'
|
|
13
13
|
import build from './model/build.js'
|
|
14
14
|
import loadFixtures from './model/load-fixtures.js'
|
|
@@ -271,8 +271,8 @@ async function modelFactory () {
|
|
|
271
271
|
transaction,
|
|
272
272
|
bulkCreateRecord,
|
|
273
273
|
|
|
274
|
-
|
|
275
|
-
|
|
274
|
+
aggregate,
|
|
275
|
+
histogram,
|
|
276
276
|
countRecord,
|
|
277
277
|
|
|
278
278
|
createAttachment,
|
package/package.json
CHANGED
package/wiki/CHANGES.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changes
|
|
2
2
|
|
|
3
|
+
## 2026-08-24
|
|
4
|
+
|
|
5
|
+
- [2.39.0] Now use the new `app.lib.startInterval()`
|
|
6
|
+
|
|
7
|
+
## 2026-08-18
|
|
8
|
+
|
|
9
|
+
- [2.38.0] Change `createAggregate()` to `aggregate()`
|
|
10
|
+
- [2.38.0] Change `createHistogram()` to `histogram()`
|
|
11
|
+
|
|
3
12
|
## 2026-08-13
|
|
4
13
|
|
|
5
14
|
- [2.37.1] Bug fix in `adapter.js` to pass options when calling `getRecord()`
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { getFilterAndOptions, execHook, execModelHook, execDynHook } from './helper.js'
|
|
2
|
-
const action = 'createAggregate'
|
|
3
|
-
|
|
4
|
-
async function createAggregate (...args) {
|
|
5
|
-
if (args.length === 0) return this.action(action, ...args)
|
|
6
|
-
const [_filter = {}, params = {}, opts = {}] = args
|
|
7
|
-
opts.dataOnly = opts.dataOnly ?? true
|
|
8
|
-
const { dataOnly } = opts
|
|
9
|
-
const { filter, options } = await getFilterAndOptions.call(this, _filter, opts, action)
|
|
10
|
-
const { getDefaultValues } = this.app.dobo
|
|
11
|
-
await execHook.call(this, 'beforeCreateAggregate', filter, params, options)
|
|
12
|
-
await execModelHook.call(this, 'beforeCreateAggregate', filter, params, options)
|
|
13
|
-
await execDynHook.call(this, 'beforeCreateAggregate', filter, params, options)
|
|
14
|
-
const result = (await this.adapter._createAggregate(this, filter, params, options)) ?? {}
|
|
15
|
-
const { warnings } = getDefaultValues(options)
|
|
16
|
-
if (!warnings) delete result.warnings
|
|
17
|
-
await execDynHook.call(this, 'afterCreateAggregate', filter, params, result, options)
|
|
18
|
-
await execModelHook.call(this, 'afterCreateAggregate', filter, params, result, options)
|
|
19
|
-
await execHook.call(this, 'afterCreateAggregate', filter, params, result, options)
|
|
20
|
-
return dataOnly ? result.data : result
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export default createAggregate
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { getFilterAndOptions, execHook, execModelHook, execDynHook } from './helper.js'
|
|
2
|
-
const action = 'createHistogram'
|
|
3
|
-
|
|
4
|
-
async function createHistogram (...args) {
|
|
5
|
-
if (args.length === 0) return this.action(action, ...args)
|
|
6
|
-
const [_filter = {}, params = {}, opts = {}] = args
|
|
7
|
-
opts.dataOnly = opts.dataOnly ?? true
|
|
8
|
-
const { dataOnly } = opts
|
|
9
|
-
const { filter, options } = await getFilterAndOptions.call(this, _filter, opts, action)
|
|
10
|
-
const { getDefaultValues } = this.app.dobo
|
|
11
|
-
await execHook.call(this, 'beforeCreateHistogram', filter, params, options)
|
|
12
|
-
await execModelHook.call(this, 'beforeCreateHistogram', filter, params, options)
|
|
13
|
-
await execDynHook.call(this, 'beforeCreateHistogram', filter, params, options)
|
|
14
|
-
const result = (await this.adapter._createHistogram(this, filter, params, options)) ?? {}
|
|
15
|
-
const { warnings } = getDefaultValues(options)
|
|
16
|
-
if (!warnings) delete result.warnings
|
|
17
|
-
await execDynHook.call(this, 'afterCreateHistogram', filter, params, result, options)
|
|
18
|
-
await execModelHook.call(this, 'afterCreateHistogram', filter, params, result, options)
|
|
19
|
-
await execHook.call(this, 'afterCreateHistogram', filter, params, result, options)
|
|
20
|
-
return dataOnly ? result.data : result
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export default createHistogram
|