nesoi 3.2.8 → 3.3.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/README.md +33 -2
- package/lib/bundler/browser/browser.app.d.ts +32 -0
- package/lib/bundler/browser/browser.app.js +51 -0
- package/lib/bundler/browser/browser.bundler.d.ts +5 -0
- package/lib/bundler/browser/browser.bundler.js +27 -0
- package/lib/bundler/browser/stages/8_replace_nesoi_for_browser_stage.d.ts +13 -0
- package/lib/bundler/browser/stages/8_replace_nesoi_for_browser_stage.js +74 -0
- package/lib/bundler/distributed/distributed.app.config.d.ts +43 -0
- package/lib/{engine/apps → bundler}/distributed/distributed.app.config.js +1 -1
- package/lib/{engine/apps → bundler}/distributed/distributed.app.d.ts +14 -14
- package/lib/{engine/apps → bundler}/distributed/distributed.app.js +8 -3
- package/lib/{compiler/apps/distributed/distributed_compiler.d.ts → bundler/distributed/distributed.bundler.d.ts} +7 -7
- package/lib/{compiler/apps/distributed/distributed_compiler.js → bundler/distributed/distributed.bundler.js} +11 -11
- package/lib/{engine/apps → bundler}/distributed/distributed_node.app.d.ts +14 -20
- package/lib/{engine/apps → bundler}/distributed/distributed_node.app.js +18 -50
- package/lib/bundler/distributed/stages/1_mkdir_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/distributed/stages/1_mkdir_stage.js +6 -6
- package/lib/bundler/distributed/stages/2_build_typescript_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/distributed/stages/2_build_typescript_stage.js +7 -7
- package/lib/bundler/distributed/stages/3_copy_types_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/distributed/stages/3_copy_types_stage.js +7 -7
- package/lib/bundler/distributed/stages/4_dump_modules_stage.d.ts +16 -0
- package/lib/{compiler/apps → bundler}/distributed/stages/4_dump_modules_stage.js +5 -5
- package/lib/{compiler/apps → bundler}/distributed/stages/5_copy_static_stage.js +3 -3
- package/lib/{compiler/apps → bundler}/distributed/stages/6_dump_cli_stage.js +3 -3
- package/lib/{compiler/apps → bundler}/distributed/stages/7_dump_package_json_stage.js +3 -3
- package/lib/{engine/apps → bundler}/monolyth/monolyth.app.d.ts +13 -13
- package/lib/{engine/apps → bundler}/monolyth/monolyth.app.js +13 -10
- package/lib/{compiler/apps/monolyth/monolyth_compiler.d.ts → bundler/monolyth/monolyth.bundler.d.ts} +9 -7
- package/lib/{compiler/apps/monolyth/monolyth_compiler.js → bundler/monolyth/monolyth.bundler.js} +13 -12
- package/lib/bundler/monolyth/stages/1_mkdir_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/monolyth/stages/1_mkdir_stage.js +6 -6
- package/lib/bundler/monolyth/stages/2_build_typescript_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/monolyth/stages/2_build_typescript_stage.js +8 -7
- package/lib/bundler/monolyth/stages/3_copy_types_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/monolyth/stages/3_copy_types_stage.js +7 -7
- package/lib/{compiler/apps → bundler}/monolyth/stages/4_dump_modules_stage.d.ts +4 -4
- package/lib/{compiler/apps → bundler}/monolyth/stages/4_dump_modules_stage.js +29 -16
- package/lib/{compiler/apps → bundler}/monolyth/stages/5_copy_static_stage.d.ts +4 -4
- package/lib/{compiler/apps → bundler}/monolyth/stages/5_copy_static_stage.js +7 -7
- package/lib/bundler/monolyth/stages/6_dump_cli_stage.d.ts +15 -0
- package/lib/{compiler/apps → bundler}/monolyth/stages/6_dump_cli_stage.js +4 -4
- package/lib/{compiler/apps → bundler}/monolyth/stages/7_dump_package_json_stage.d.ts +4 -4
- package/lib/{compiler/apps → bundler}/monolyth/stages/7_dump_package_json_stage.js +13 -10
- package/lib/compiler/compiler.d.ts +1 -6
- package/lib/compiler/compiler.js +1 -1
- package/lib/compiler/elements/bucket.element.d.ts +2 -1
- package/lib/compiler/elements/bucket.element.js +16 -21
- package/lib/compiler/elements/cached.element.d.ts +1 -1
- package/lib/compiler/elements/cached.element.js +2 -2
- package/lib/compiler/elements/constants.element.d.ts +1 -1
- package/lib/compiler/elements/constants.element.js +2 -0
- package/lib/compiler/elements/controller.element.js +3 -3
- package/lib/compiler/elements/element.d.ts +6 -13
- package/lib/compiler/elements/element.js +11 -9
- package/lib/compiler/elements/externals.element.js +2 -2
- package/lib/compiler/elements/job.element.d.ts +1 -1
- package/lib/compiler/elements/job.element.js +1 -1
- package/lib/compiler/elements/machine.element.d.ts +2 -2
- package/lib/compiler/elements/machine.element.js +7 -7
- package/lib/compiler/elements/message.element.d.ts +1 -1
- package/lib/compiler/elements/message.element.js +26 -26
- package/lib/compiler/elements/queue.element.js +1 -1
- package/lib/compiler/elements/resource.element.d.ts +1 -1
- package/lib/compiler/elements/resource.element.js +9 -9
- package/lib/compiler/elements/topic.element.js +1 -1
- package/lib/compiler/error.d.ts +1 -5
- package/lib/compiler/error.js +3 -15
- package/lib/compiler/helpers/dump_helpers.d.ts +1 -1
- package/lib/compiler/helpers/dump_helpers.js +1 -1
- package/lib/compiler/index.d.ts +1 -3
- package/lib/compiler/index.js +15 -7
- package/lib/compiler/module.js +12 -12
- package/lib/compiler/progressive.d.ts +3 -4
- package/lib/compiler/progressive.js +3 -4
- package/lib/compiler/stages/2_treeshake_stage.js +4 -0
- package/lib/compiler/stages/3_extract_ts_stage.js +7 -7
- package/lib/compiler/stages/4_build_schemas_stage.js +3 -16
- package/lib/compiler/stages/6_build_elements_stage.js +1 -1
- package/lib/compiler/stages/7_dump_stage.js +35 -10
- package/lib/compiler/typescript/bridge/extract.js +24 -0
- package/lib/compiler/typescript/bridge/inject.js +18 -3
- package/lib/compiler/typescript/bridge/organize.d.ts +4 -0
- package/lib/compiler/typescript/bridge/organize.js +41 -22
- package/lib/compiler/typescript/error.d.ts +2 -83
- package/lib/compiler/typescript/error.js +6 -219
- package/lib/compiler/typescript/parser.js +3 -3
- package/lib/compiler/typescript/source.d.ts +2 -2
- package/lib/compiler/typescript/transformers/app_inject.transformer.js +13 -4
- package/lib/compiler/typescript/typescript_compiler.d.ts +3 -3
- package/lib/compiler/typescript/typescript_compiler.js +2 -2
- package/lib/elements/blocks/block.builder.d.ts +7 -4
- package/lib/elements/blocks/block.builder.js +24 -13
- package/lib/elements/blocks/block.js +2 -2
- package/lib/elements/blocks/block.schema.d.ts +12 -9
- package/lib/elements/blocks/block.schema.js +2 -2
- package/lib/elements/blocks/job/internal/machine_job.builder.d.ts +6 -5
- package/lib/elements/blocks/job/internal/machine_job.builder.js +3 -3
- package/lib/elements/blocks/job/internal/resource_job.builder.d.ts +11 -10
- package/lib/elements/blocks/job/internal/resource_job.builder.js +9 -6
- package/lib/elements/blocks/job/internal/resource_job.js +3 -6
- package/lib/elements/blocks/job/job.builder.d.ts +5 -5
- package/lib/elements/blocks/job/job.builder.js +7 -7
- package/lib/elements/blocks/job/job.js +1 -1
- package/lib/elements/blocks/job/job.schema.d.ts +5 -5
- package/lib/elements/blocks/job/job.schema.js +3 -3
- package/lib/elements/blocks/machine/machine.builder.d.ts +2 -2
- package/lib/elements/blocks/machine/machine.builder.js +12 -9
- package/lib/elements/blocks/machine/machine.js +7 -7
- package/lib/elements/blocks/machine/machine.schema.d.ts +23 -23
- package/lib/elements/blocks/machine/machine.schema.js +9 -9
- package/lib/elements/blocks/machine/machine_state.builder.d.ts +1 -0
- package/lib/elements/blocks/machine/machine_state.builder.js +31 -29
- package/lib/elements/blocks/machine/machine_transition.builder.d.ts +2 -2
- package/lib/elements/blocks/machine/machine_transition.builder.js +8 -8
- package/lib/elements/blocks/queue/queue.builder.d.ts +3 -3
- package/lib/elements/blocks/queue/queue.builder.js +3 -3
- package/lib/elements/blocks/queue/queue.schema.d.ts +6 -6
- package/lib/elements/blocks/queue/queue.schema.js +3 -3
- package/lib/elements/blocks/resource/resource.builder.d.ts +2 -2
- package/lib/elements/blocks/resource/resource.builder.js +37 -40
- package/lib/elements/blocks/resource/resource.d.ts +2 -2
- package/lib/elements/blocks/resource/resource.js +10 -18
- package/lib/elements/blocks/resource/resource.schema.d.ts +15 -15
- package/lib/elements/blocks/resource/resource.schema.js +8 -8
- package/lib/elements/blocks/topic/topic.builder.d.ts +2 -2
- package/lib/elements/blocks/topic/topic.builder.js +4 -4
- package/lib/elements/blocks/topic/topic.d.ts +2 -2
- package/lib/elements/blocks/topic/topic.js +7 -7
- package/lib/elements/blocks/topic/topic.schema.d.ts +6 -6
- package/lib/elements/blocks/topic/topic.schema.js +3 -3
- package/lib/elements/edge/controller/adapters/cli.controller_adapter.js +1 -1
- package/lib/elements/edge/controller/adapters/controller_adapter.d.ts +2 -2
- package/lib/elements/edge/controller/adapters/controller_adapter.js +2 -2
- package/lib/elements/edge/controller/controller.builder.d.ts +14 -13
- package/lib/elements/edge/controller/controller.builder.js +52 -42
- package/lib/elements/edge/controller/controller.d.ts +3 -3
- package/lib/elements/edge/controller/controller.js +12 -12
- package/lib/elements/edge/controller/controller.schema.d.ts +17 -16
- package/lib/elements/edge/controller/controller.schema.js +11 -11
- package/lib/elements/edge/externals/externals.builder.d.ts +8 -13
- package/lib/elements/edge/externals/externals.builder.js +43 -11
- package/lib/elements/edge/externals/externals.schema.d.ts +8 -7
- package/lib/elements/edge/externals/externals.schema.js +5 -3
- package/lib/elements/entities/bucket/adapters/browserdb.bucket_adapter.d.ts +45 -0
- package/lib/elements/entities/bucket/adapters/browserdb.bucket_adapter.js +164 -0
- package/lib/elements/entities/bucket/adapters/browserdb.service.d.ts +30 -0
- package/lib/elements/entities/bucket/adapters/browserdb.service.js +97 -0
- package/lib/elements/entities/bucket/adapters/bucket_adapter.d.ts +6 -1
- package/lib/elements/entities/bucket/adapters/bucket_adapter.js +7 -6
- package/lib/elements/entities/bucket/adapters/json.bucket_adapter.d.ts +1 -1
- package/lib/elements/entities/bucket/adapters/json.bucket_adapter.js +1 -0
- package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.d.ts +1 -0
- package/lib/elements/entities/bucket/adapters/memory.bucket_adapter.js +14 -13
- package/lib/elements/entities/bucket/adapters/memory.nql.js +41 -35
- package/lib/elements/entities/bucket/bucket.builder.d.ts +6 -8
- package/lib/elements/entities/bucket/bucket.builder.js +19 -34
- package/lib/elements/entities/bucket/bucket.d.ts +2 -2
- package/lib/elements/entities/bucket/bucket.infer.d.ts +5 -5
- package/lib/elements/entities/bucket/bucket.js +24 -22
- package/lib/elements/entities/bucket/bucket.schema.d.ts +3 -3
- package/lib/elements/entities/bucket/bucket.schema.js +2 -2
- package/lib/elements/entities/bucket/cache/bucket_cache.js +14 -2
- package/lib/elements/entities/bucket/graph/bucket_graph.d.ts +3 -3
- package/lib/elements/entities/bucket/graph/bucket_graph.js +102 -30
- package/lib/elements/entities/bucket/graph/bucket_graph.schema.d.ts +3 -3
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.d.ts +2 -2
- package/lib/elements/entities/bucket/graph/bucket_graph_link.builder.js +5 -3
- package/lib/elements/entities/bucket/model/bucket_model.builder.d.ts +2 -1
- package/lib/elements/entities/bucket/model/bucket_model.builder.js +2 -2
- package/lib/elements/entities/bucket/model/bucket_model.convert.js +3 -6
- package/lib/elements/entities/bucket/model/bucket_model.d.ts +13 -0
- package/lib/elements/entities/bucket/model/bucket_model.js +93 -0
- package/lib/elements/entities/bucket/model/bucket_model.schema.d.ts +4 -8
- package/lib/elements/entities/bucket/model/bucket_model.schema.js +0 -68
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.d.ts +12 -4
- package/lib/elements/entities/bucket/model/bucket_model_field.builder.js +30 -33
- package/lib/elements/entities/bucket/query/nql.schema.d.ts +1 -1
- package/lib/elements/entities/bucket/query/nql_compiler.d.ts +8 -4
- package/lib/elements/entities/bucket/query/nql_compiler.js +44 -38
- package/lib/elements/entities/bucket/query/nql_engine.d.ts +1 -1
- package/lib/elements/entities/bucket/query/nql_engine.js +5 -2
- package/lib/elements/entities/bucket/view/bucket_view.builder.d.ts +2 -2
- package/lib/elements/entities/bucket/view/bucket_view.js +113 -81
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.d.ts +9 -8
- package/lib/elements/entities/bucket/view/bucket_view_field.builder.js +8 -10
- package/lib/elements/entities/constants/constants.builder.d.ts +3 -3
- package/lib/elements/entities/constants/constants.builder.js +8 -8
- package/lib/elements/entities/constants/constants.schema.d.ts +8 -3
- package/lib/elements/entities/constants/constants.schema.js +7 -2
- package/lib/elements/entities/message/message.infer.d.ts +1 -5
- package/lib/elements/entities/message/message.js +2 -7
- package/lib/elements/entities/message/message.schema.js +1 -1
- package/lib/elements/entities/message/template/message_template.schema.d.ts +7 -5
- package/lib/elements/entities/message/template/message_template_field.builder.d.ts +18 -3
- package/lib/elements/entities/message/template/message_template_field.builder.js +49 -30
- package/lib/elements/entities/message/template/message_template_parser.js +2 -2
- package/lib/engine/{apps → app}/app.config.d.ts +11 -5
- package/lib/engine/{apps → app}/app.config.js +2 -2
- package/lib/engine/{apps → app}/app.d.ts +3 -2
- package/lib/engine/{apps → app}/app.js +3 -1
- package/lib/engine/{apps/distributed → app}/inc/inc.client.js +1 -1
- package/lib/engine/{apps/distributed → app}/inc/inc.server.js +3 -3
- package/lib/engine/{apps/distributed → app}/inc/sandbox.js +1 -1
- package/lib/engine/{apps → app}/inline.app.d.ts +2 -12
- package/lib/engine/{apps → app}/inline.app.js +37 -34
- package/lib/engine/auth/authn.d.ts +10 -12
- package/lib/engine/auth/zero.authn_provider.d.ts +3 -4
- package/lib/engine/auth/zero.authn_provider.js +0 -1
- package/lib/engine/builder.d.ts +28 -0
- package/lib/engine/builder.js +99 -0
- package/lib/engine/cli/cli.js +3 -2
- package/lib/engine/cli/ui.js +1 -0
- package/lib/engine/daemon.d.ts +28 -25
- package/lib/engine/daemon.js +37 -8
- package/lib/engine/data/error.d.ts +37 -3
- package/lib/engine/data/error.js +58 -16
- package/lib/engine/data/file.d.ts +1 -0
- package/lib/engine/data/file.js +4 -0
- package/lib/engine/dependency.d.ts +53 -81
- package/lib/engine/dependency.js +246 -120
- package/lib/engine/module.d.ts +18 -48
- package/lib/engine/module.js +78 -158
- package/lib/engine/space.d.ts +2 -2
- package/lib/engine/space.js +6 -6
- package/lib/engine/transaction/nodes/bucket.trx_node.d.ts +7 -4
- package/lib/engine/transaction/nodes/bucket.trx_node.js +66 -43
- package/lib/engine/transaction/nodes/bucket_query.trx_node.d.ts +10 -4
- package/lib/engine/transaction/nodes/bucket_query.trx_node.js +56 -45
- package/lib/engine/transaction/nodes/external.trx_node.d.ts +15 -0
- package/lib/engine/transaction/nodes/external.trx_node.js +53 -0
- package/lib/engine/transaction/nodes/job.trx_node.d.ts +7 -3
- package/lib/engine/transaction/nodes/job.trx_node.js +49 -29
- package/lib/engine/transaction/nodes/machine.trx_node.js +6 -6
- package/lib/engine/transaction/nodes/queue.trx_node.js +3 -3
- package/lib/engine/transaction/nodes/resource.trx_node.d.ts +7 -4
- package/lib/engine/transaction/nodes/resource.trx_node.js +68 -51
- package/lib/engine/transaction/nodes/topic.trx_node.js +9 -9
- package/lib/engine/transaction/trx.d.ts +15 -12
- package/lib/engine/transaction/trx.js +19 -3
- package/lib/engine/transaction/trx_engine.config.d.ts +4 -4
- package/lib/engine/transaction/trx_engine.d.ts +25 -7
- package/lib/engine/transaction/trx_engine.js +67 -16
- package/lib/engine/transaction/trx_node.d.ts +25 -21
- package/lib/engine/transaction/trx_node.js +99 -57
- package/lib/engine/tree.d.ts +4 -16
- package/lib/engine/tree.js +87 -57
- package/lib/{compiler → engine}/treeshake.d.ts +32 -32
- package/lib/{compiler → engine}/treeshake.js +272 -242
- package/lib/engine/util/console.js +3 -0
- package/lib/engine/util/crypto.d.ts +4 -3
- package/lib/engine/util/crypto.js +15 -5
- package/lib/engine/util/hash.js +5 -0
- package/lib/engine/util/log.d.ts +6 -8
- package/lib/engine/util/log.js +1 -1
- package/lib/engine/util/name_helpers.d.ts +37 -0
- package/lib/{compiler/helpers → engine/util}/name_helpers.js +33 -0
- package/lib/engine/util/parse.d.ts +4 -3
- package/lib/engine/util/parse.js +13 -28
- package/lib/engine/util/path.d.ts +1 -0
- package/lib/engine/util/path.js +14 -0
- package/lib/engine/util/random.d.ts +4 -0
- package/lib/engine/util/random.js +31 -0
- package/lib/engine/util/type.d.ts +8 -0
- package/lib/schema.d.ts +1 -1
- package/package.json +4 -1
- package/tools/joaquin/bucket.js +1 -1
- package/tools/joaquin/job.js +1 -1
- package/tools/joaquin/message.js +1 -1
- package/tools/joaquin/mock.js +2 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/lib/compiler/apps/distributed/stages/1_mkdir_stage.d.ts +0 -15
- package/lib/compiler/apps/distributed/stages/2_build_typescript_stage.d.ts +0 -15
- package/lib/compiler/apps/distributed/stages/3_copy_types_stage.d.ts +0 -15
- package/lib/compiler/apps/distributed/stages/4_dump_modules_stage.d.ts +0 -16
- package/lib/compiler/apps/monolyth/stages/1_mkdir_stage.d.ts +0 -15
- package/lib/compiler/apps/monolyth/stages/2_build_typescript_stage.d.ts +0 -15
- package/lib/compiler/apps/monolyth/stages/3_copy_types_stage.d.ts +0 -15
- package/lib/compiler/apps/monolyth/stages/6_dump_cli_stage.d.ts +0 -15
- package/lib/compiler/helpers/name_helpers.d.ts +0 -20
- package/lib/engine/apps/distributed/distributed.app.config.d.ts +0 -44
- package/lib/engine/apps/distributed/elements/distributed_job.d.ts +0 -7
- package/lib/engine/apps/distributed/elements/distributed_job.js +0 -11
- /package/lib/{compiler/apps → bundler}/distributed/stages/5_copy_static_stage.d.ts +0 -0
- /package/lib/{compiler/apps → bundler}/distributed/stages/6_dump_cli_stage.d.ts +0 -0
- /package/lib/{compiler/apps → bundler}/distributed/stages/7_dump_package_json_stage.d.ts +0 -0
- /package/lib/engine/{apps/distributed → app}/inc/inc.client.d.ts +0 -0
- /package/lib/engine/{apps/distributed → app}/inc/inc.server.d.ts +0 -0
- /package/lib/engine/{apps/distributed → app}/inc/sandbox.d.ts +0 -0
- /package/lib/engine/{apps → app}/service.d.ts +0 -0
- /package/lib/engine/{apps → app}/service.js +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BucketModel = void 0;
|
|
4
|
+
const error_1 = require("../../../../engine/data/error");
|
|
5
|
+
/**
|
|
6
|
+
* @category Elements
|
|
7
|
+
* @subcategory Entity
|
|
8
|
+
* */
|
|
9
|
+
class BucketModel {
|
|
10
|
+
constructor(bucket, config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.alias = bucket.alias;
|
|
13
|
+
this.schema = bucket.model;
|
|
14
|
+
}
|
|
15
|
+
copy(obj) {
|
|
16
|
+
const meta = this.config?.meta || {
|
|
17
|
+
created_at: 'created_at',
|
|
18
|
+
created_by: 'created_by',
|
|
19
|
+
updated_at: 'updated_at',
|
|
20
|
+
updated_by: 'updated_by',
|
|
21
|
+
};
|
|
22
|
+
const copy = {};
|
|
23
|
+
let poll = Object.entries(this.schema.fields).map(([path, field]) => ({ path, obj, copy, field }));
|
|
24
|
+
while (poll.length) {
|
|
25
|
+
const next = [];
|
|
26
|
+
for (const entry of poll) {
|
|
27
|
+
const val = entry.obj[entry.path];
|
|
28
|
+
if (val === undefined) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (val === null) {
|
|
32
|
+
entry.copy[entry.path] = null;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (entry.field.type === 'list') {
|
|
36
|
+
if (!Array.isArray(val))
|
|
37
|
+
continue;
|
|
38
|
+
entry.copy[entry.path] = [];
|
|
39
|
+
next.push(...val.map((_, i) => ({
|
|
40
|
+
path: i.toString(),
|
|
41
|
+
obj: val,
|
|
42
|
+
copy: entry.copy[entry.path],
|
|
43
|
+
field: entry.field.children['#']
|
|
44
|
+
})));
|
|
45
|
+
}
|
|
46
|
+
else if (entry.field.type === 'dict') {
|
|
47
|
+
if (typeof val !== 'object' || Array.isArray(val))
|
|
48
|
+
continue;
|
|
49
|
+
entry.copy[entry.path] = {};
|
|
50
|
+
next.push(...Object.keys(val).map((path) => ({
|
|
51
|
+
path,
|
|
52
|
+
obj: val,
|
|
53
|
+
copy: entry.copy[entry.path],
|
|
54
|
+
field: entry.field.children['#']
|
|
55
|
+
})));
|
|
56
|
+
}
|
|
57
|
+
else if (entry.field.type === 'obj') {
|
|
58
|
+
if (typeof val !== 'object' || Array.isArray(val))
|
|
59
|
+
continue;
|
|
60
|
+
entry.copy[entry.path] = {};
|
|
61
|
+
next.push(...Object.keys(entry.field.children).map(path => ({
|
|
62
|
+
path: path,
|
|
63
|
+
obj: val,
|
|
64
|
+
copy: entry.copy[entry.path],
|
|
65
|
+
field: entry.field.children[path]
|
|
66
|
+
})));
|
|
67
|
+
}
|
|
68
|
+
else if (entry.field.type === 'union') {
|
|
69
|
+
// TODO: ??????????
|
|
70
|
+
entry.copy[entry.path] = entry.obj[entry.path];
|
|
71
|
+
}
|
|
72
|
+
else if (entry.field.type === 'enum') {
|
|
73
|
+
const v = entry.obj[entry.path];
|
|
74
|
+
const options = entry.field.meta.enum.options;
|
|
75
|
+
if (!(v in options)) {
|
|
76
|
+
throw error_1.NesoiError.Bucket.Model.InvalidEnum({ bucket: this.alias, value: v, options: Object.keys(options) });
|
|
77
|
+
}
|
|
78
|
+
entry.copy[entry.path] = entry.obj[entry.path];
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
entry.copy[entry.path] = entry.obj[entry.path];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
poll = next;
|
|
85
|
+
}
|
|
86
|
+
copy[meta.created_at] = obj[meta.created_at];
|
|
87
|
+
copy[meta.created_by] = obj[meta.created_by];
|
|
88
|
+
copy[meta.updated_at] = obj[meta.updated_at];
|
|
89
|
+
copy[meta.updated_by] = obj[meta.updated_by];
|
|
90
|
+
return copy;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.BucketModel = BucketModel;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BucketAdapterConfig } from '../adapters/bucket_adapter';
|
|
1
|
+
import { Tag } from "../../../../engine/dependency";
|
|
3
2
|
export type $BucketModelFieldType = 'boolean' | 'date' | 'datetime' | 'duration' | 'decimal' | 'enum' | 'file' | 'float' | 'int' | 'string' | 'obj' | 'unknown' | 'dict' | 'list' | 'union' | 'literal';
|
|
4
3
|
export type $BucketModelFieldCrypto = {
|
|
5
4
|
algorithm: string;
|
|
6
|
-
|
|
5
|
+
value: Tag;
|
|
7
6
|
};
|
|
8
7
|
/**
|
|
9
8
|
* @category Schemas
|
|
@@ -20,8 +19,7 @@ export declare class $BucketModelField {
|
|
|
20
19
|
template: string;
|
|
21
20
|
};
|
|
22
21
|
enum?: {
|
|
23
|
-
options: string
|
|
24
|
-
dep?: $Dependency;
|
|
22
|
+
options: Record<string, any>;
|
|
25
23
|
};
|
|
26
24
|
decimal?: {
|
|
27
25
|
left?: number;
|
|
@@ -41,8 +39,7 @@ export declare class $BucketModelField {
|
|
|
41
39
|
template: string;
|
|
42
40
|
};
|
|
43
41
|
enum?: {
|
|
44
|
-
options: string
|
|
45
|
-
dep?: $Dependency;
|
|
42
|
+
options: Record<string, any>;
|
|
46
43
|
};
|
|
47
44
|
decimal?: {
|
|
48
45
|
left?: number;
|
|
@@ -75,6 +72,5 @@ export declare class $BucketModel {
|
|
|
75
72
|
static getField(model: $BucketModel, modelpath: string): $BucketModelField[];
|
|
76
73
|
static fieldsOfType(model: $BucketModel, type: $BucketModelFieldType): $BucketModelField[];
|
|
77
74
|
static forEachField(model: $BucketModel, predicate: (field: $BucketModelField, path: string) => Promise<void>): Promise<void>;
|
|
78
|
-
static copy<T extends Record<string, any>>(model: $BucketModel, obj: T, meta?: BucketAdapterConfig['meta']): T;
|
|
79
75
|
static getModelpaths(model: $BucketModel): Record<string, $BucketModelField[]>;
|
|
80
76
|
}
|
|
@@ -119,74 +119,6 @@ class $BucketModel {
|
|
|
119
119
|
poll = next;
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
static copy(model, obj, meta = {
|
|
123
|
-
created_at: 'created_at',
|
|
124
|
-
created_by: 'created_by',
|
|
125
|
-
updated_at: 'updated_at',
|
|
126
|
-
updated_by: 'updated_by',
|
|
127
|
-
}) {
|
|
128
|
-
const copy = {};
|
|
129
|
-
let poll = Object.entries(model.fields).map(([path, field]) => ({ path, obj, copy, field }));
|
|
130
|
-
while (poll.length) {
|
|
131
|
-
const next = [];
|
|
132
|
-
for (const entry of poll) {
|
|
133
|
-
const val = entry.obj[entry.path];
|
|
134
|
-
if (val === undefined) {
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if (val === null) {
|
|
138
|
-
entry.copy[entry.path] = null;
|
|
139
|
-
continue;
|
|
140
|
-
}
|
|
141
|
-
if (entry.field.type === 'list') {
|
|
142
|
-
if (!Array.isArray(val))
|
|
143
|
-
continue;
|
|
144
|
-
entry.copy[entry.path] = [];
|
|
145
|
-
next.push(...val.map((_, i) => ({
|
|
146
|
-
path: i.toString(),
|
|
147
|
-
obj: val,
|
|
148
|
-
copy: entry.copy[entry.path],
|
|
149
|
-
field: entry.field.children['#']
|
|
150
|
-
})));
|
|
151
|
-
}
|
|
152
|
-
else if (entry.field.type === 'dict') {
|
|
153
|
-
if (typeof val !== 'object' || Array.isArray(val))
|
|
154
|
-
continue;
|
|
155
|
-
entry.copy[entry.path] = {};
|
|
156
|
-
next.push(...Object.keys(val).map((path) => ({
|
|
157
|
-
path,
|
|
158
|
-
obj: val,
|
|
159
|
-
copy: entry.copy[entry.path],
|
|
160
|
-
field: entry.field.children['#']
|
|
161
|
-
})));
|
|
162
|
-
}
|
|
163
|
-
else if (entry.field.type === 'obj') {
|
|
164
|
-
if (typeof val !== 'object' || Array.isArray(val))
|
|
165
|
-
continue;
|
|
166
|
-
entry.copy[entry.path] = {};
|
|
167
|
-
next.push(...Object.keys(entry.field.children).map(path => ({
|
|
168
|
-
path: path,
|
|
169
|
-
obj: val,
|
|
170
|
-
copy: entry.copy[entry.path],
|
|
171
|
-
field: entry.field.children[path]
|
|
172
|
-
})));
|
|
173
|
-
}
|
|
174
|
-
else if (entry.field.type === 'union') {
|
|
175
|
-
// TODO: ??????????
|
|
176
|
-
entry.copy[entry.path] = entry.obj[entry.path];
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
entry.copy[entry.path] = entry.obj[entry.path];
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
poll = next;
|
|
183
|
-
}
|
|
184
|
-
copy[meta.created_at] = obj[meta.created_at];
|
|
185
|
-
copy[meta.created_by] = obj[meta.created_by];
|
|
186
|
-
copy[meta.updated_at] = obj[meta.updated_at];
|
|
187
|
-
copy[meta.updated_by] = obj[meta.updated_by];
|
|
188
|
-
return copy;
|
|
189
|
-
}
|
|
190
122
|
static getModelpaths(model) {
|
|
191
123
|
const modelpaths = {};
|
|
192
124
|
let poll = Object.entries(model.fields).map(([path, field]) => ({ path, field }));
|
|
@@ -2,10 +2,12 @@ import { $Module, $Space } from "../../../../schema";
|
|
|
2
2
|
import { $BucketModelField, $BucketModelFieldType, $BucketModelFields } from './bucket_model.schema';
|
|
3
3
|
import { NesoiDate } from "../../../../engine/data/date";
|
|
4
4
|
import { BucketModelpathObjInfer, BucketModelpathDictInfer, BucketModelpathListInfer, BucketModelObjInfer, BucketQuerypathDictInfer, BucketQuerypathListInfer, BucketQuerypathObjInfer, BucketModelpathUnionInfer } from './bucket_model.infer';
|
|
5
|
+
import { Dependency } from "../../../../engine/dependency";
|
|
5
6
|
import { NesoiDecimal } from "../../../../engine/data/decimal";
|
|
6
7
|
import { NesoiDatetime } from "../../../../engine/data/datetime";
|
|
7
8
|
import { NesoiFile } from "../../../../engine/data/file";
|
|
8
9
|
import { NesoiDuration } from "../../../../engine/data/duration";
|
|
10
|
+
import { ModuleTree } from "../../../../engine/tree";
|
|
9
11
|
/**
|
|
10
12
|
* @category Builders
|
|
11
13
|
* @subcategory Entity
|
|
@@ -134,7 +136,13 @@ export declare class BucketModelFieldBuilder<Module extends $Module, Input, Outp
|
|
|
134
136
|
private _required;
|
|
135
137
|
private _defaultValue?;
|
|
136
138
|
private crypto?;
|
|
137
|
-
constructor(module: string, type: $BucketModelFieldType, alias?: string | undefined, meta?:
|
|
139
|
+
constructor(module: string, type: $BucketModelFieldType, alias?: string | undefined, meta?: (Omit<NonNullable<$BucketModelField["meta"]>, "enum"> & {
|
|
140
|
+
enum?: {
|
|
141
|
+
options: Record<string, any>;
|
|
142
|
+
} | {
|
|
143
|
+
dep: Dependency;
|
|
144
|
+
};
|
|
145
|
+
}) | undefined, children?: BucketModelFieldBuilders<Module> | undefined);
|
|
138
146
|
as(alias: string): this;
|
|
139
147
|
/**
|
|
140
148
|
* This field can be `undefined` or `null`.
|
|
@@ -169,12 +177,12 @@ export declare class BucketModelFieldBuilder<Module extends $Module, Input, Outp
|
|
|
169
177
|
*/
|
|
170
178
|
maxLength(val: number | null): void;
|
|
171
179
|
encrypt(key: keyof Module['constants']['values'], algorithm?: string): this;
|
|
172
|
-
static build(builder: AnyBucketModelFieldBuilder, name: string, basePath?: string): {
|
|
180
|
+
static build(tree: ModuleTree, builder: AnyBucketModelFieldBuilder, name: string, basePath?: string): {
|
|
173
181
|
schema: $BucketModelField;
|
|
174
182
|
hasFile: boolean;
|
|
175
183
|
hasEncrypted: boolean;
|
|
176
184
|
};
|
|
177
|
-
static buildChildren(module: string, children: BucketModelFieldBuilders<any>, path?: string): {
|
|
185
|
+
static buildChildren(tree: ModuleTree, module: string, children: BucketModelFieldBuilders<any>, path?: string): {
|
|
178
186
|
schema: $BucketModelFields;
|
|
179
187
|
defaults: Record<string, any>;
|
|
180
188
|
hasFileField: boolean;
|
|
@@ -182,6 +190,6 @@ export declare class BucketModelFieldBuilder<Module extends $Module, Input, Outp
|
|
|
182
190
|
};
|
|
183
191
|
}
|
|
184
192
|
export type BucketModelFieldBuilders<Module extends $Module> = {
|
|
185
|
-
[x: string]: BucketModelFieldBuilder<Module, any, any, any, any, any
|
|
193
|
+
[x: string]: BucketModelFieldBuilder<Module, any, any, any, any, any>;
|
|
186
194
|
};
|
|
187
195
|
export type AnyBucketModelFieldBuilder = BucketModelFieldBuilder<any, any, any, any, any, any>;
|
|
@@ -39,21 +39,22 @@ class BucketModelFieldFactory {
|
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
enum(options) {
|
|
42
|
-
|
|
43
|
-
? options
|
|
44
|
-
: Object.keys(options);
|
|
45
|
-
let dep;
|
|
42
|
+
let meta;
|
|
46
43
|
if (typeof options === 'string') {
|
|
47
|
-
const tag = dependency_1
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
const tag = dependency_1.Tag.fromNameOrShort(this.module, 'constants.enum', options);
|
|
45
|
+
meta = { dep: new dependency_1.Dependency(this.module, tag, { build: true }) };
|
|
46
|
+
}
|
|
47
|
+
else if (Array.isArray(options)) {
|
|
48
|
+
const opts = {};
|
|
49
|
+
for (const opt of options)
|
|
50
|
+
opts[opt] = opt;
|
|
51
|
+
meta = { options: opts };
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
meta = { options: options };
|
|
54
55
|
}
|
|
55
56
|
return new BucketModelFieldBuilder(this.module, 'enum', this.alias, {
|
|
56
|
-
enum:
|
|
57
|
+
enum: meta
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
get int() {
|
|
@@ -155,23 +156,31 @@ class BucketModelFieldBuilder {
|
|
|
155
156
|
maxLength(val) {
|
|
156
157
|
}
|
|
157
158
|
encrypt(key, algorithm = 'aes256') {
|
|
159
|
+
const tag = dependency_1.Tag.fromNameOrShort(this.module, 'constants.value', key);
|
|
158
160
|
this.crypto = {
|
|
159
161
|
algorithm,
|
|
160
|
-
|
|
162
|
+
value: new dependency_1.Dependency(this.module, tag, { build: true })
|
|
161
163
|
};
|
|
162
164
|
return this;
|
|
163
165
|
}
|
|
164
166
|
// Build
|
|
165
|
-
static build(builder, name, basePath = '') {
|
|
167
|
+
static build(tree, builder, name, basePath = '') {
|
|
166
168
|
const path = basePath + name;
|
|
167
169
|
const childrenPath = path + '.';
|
|
170
|
+
if (builder.type === 'enum' && 'dep' in builder.meta.enum) {
|
|
171
|
+
const schema = dependency_1.Tag.resolve(builder.meta.enum.dep.tag, tree);
|
|
172
|
+
builder.meta.enum = { options: schema.options };
|
|
173
|
+
}
|
|
168
174
|
const children = builder.children
|
|
169
|
-
? BucketModelFieldBuilder.buildChildren(builder.module, builder.children, childrenPath)
|
|
175
|
+
? BucketModelFieldBuilder.buildChildren(tree, builder.module, builder.children, childrenPath)
|
|
170
176
|
: undefined;
|
|
171
177
|
const defaults = builder._defaultValue && builder.children
|
|
172
178
|
? Object.assign({}, builder._defaultValue, children?.defaults)
|
|
173
179
|
: builder._defaultValue;
|
|
174
|
-
const schema = new bucket_model_schema_1.$BucketModelField(name, path, builder.type, builder.alias || name, builder._required, builder.meta, defaults, children?.schema, builder.crypto
|
|
180
|
+
const schema = new bucket_model_schema_1.$BucketModelField(name, path, builder.type, builder.alias || name, builder._required, builder.meta, defaults, children?.schema, builder.crypto ? {
|
|
181
|
+
algorithm: builder.crypto.algorithm,
|
|
182
|
+
value: builder.crypto.value.tag
|
|
183
|
+
} : undefined);
|
|
175
184
|
const hasFile = builder.type === 'file'
|
|
176
185
|
|| children?.hasFileField
|
|
177
186
|
|| false;
|
|
@@ -180,29 +189,17 @@ class BucketModelFieldBuilder {
|
|
|
180
189
|
|| false;
|
|
181
190
|
return { schema, hasFile, hasEncrypted };
|
|
182
191
|
}
|
|
183
|
-
static buildChildren(module, children, path) {
|
|
192
|
+
static buildChildren(tree, module, children, path) {
|
|
184
193
|
const schema = {};
|
|
185
194
|
const defaults = {};
|
|
186
195
|
let hasFileField = false;
|
|
187
196
|
let hasEncryptedField = false;
|
|
188
197
|
for (const c in children) {
|
|
189
198
|
const child = children[c];
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
hasEncryptedField || (hasEncryptedField = out.hasEncrypted);
|
|
195
|
-
}
|
|
196
|
-
// Builders are allowed to implicitly declare nested fields.
|
|
197
|
-
// The code below transforms these groups into fields of the scope 'group'.
|
|
198
|
-
else {
|
|
199
|
-
const fieldTypeBuilder = new BucketModelFieldFactory(module);
|
|
200
|
-
const fieldBuilder = fieldTypeBuilder.obj(child);
|
|
201
|
-
const out = BucketModelFieldBuilder.build(fieldBuilder, c, path);
|
|
202
|
-
schema[c] = out.schema;
|
|
203
|
-
hasFileField || (hasFileField = out.hasFile);
|
|
204
|
-
hasEncryptedField || (hasEncryptedField = out.hasEncrypted);
|
|
205
|
-
}
|
|
199
|
+
const out = BucketModelFieldBuilder.build(tree, child, c, path);
|
|
200
|
+
schema[c] = out.schema;
|
|
201
|
+
hasFileField || (hasFileField = out.hasFile);
|
|
202
|
+
hasEncryptedField || (hasEncryptedField = out.hasEncrypted);
|
|
206
203
|
defaults[c] = schema[c].defaultValue;
|
|
207
204
|
}
|
|
208
205
|
return { schema, defaults, hasFileField, hasEncryptedField };
|
|
@@ -4,7 +4,7 @@ import { NesoiDate } from "../../../../engine/data/date";
|
|
|
4
4
|
import { NesoiDatetime } from "../../../../engine/data/datetime";
|
|
5
5
|
import { NesoiDuration } from "../../../../engine/data/duration";
|
|
6
6
|
export type NQL_QueryMeta = {
|
|
7
|
-
|
|
7
|
+
schema?: $Bucket;
|
|
8
8
|
scope?: string;
|
|
9
9
|
avgTime: number;
|
|
10
10
|
};
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { NQL_AnyQuery, NQL_Union, NQL_Part, NQL_Node } from './nql.schema';
|
|
2
|
-
import {
|
|
2
|
+
import { AnyDaemon } from "../../../../engine/daemon";
|
|
3
|
+
import { BucketMetadata } from "../../../../engine/transaction/trx_engine";
|
|
3
4
|
/**
|
|
4
5
|
* @category NQL
|
|
5
6
|
* */
|
|
6
7
|
export declare class NQL_RuleTree {
|
|
8
|
+
private daemon;
|
|
7
9
|
private module;
|
|
8
10
|
private bucketName;
|
|
9
11
|
private query;
|
|
12
|
+
private customMetadata?;
|
|
10
13
|
private debug;
|
|
11
14
|
private static OpByType;
|
|
12
15
|
root: NQL_Union;
|
|
13
|
-
constructor(module:
|
|
16
|
+
constructor(daemon: AnyDaemon, module: string, bucketName: string, query: NQL_AnyQuery, customMetadata?: BucketMetadata | undefined, debug?: boolean);
|
|
17
|
+
parse(): Promise<void>;
|
|
14
18
|
private parseUnion;
|
|
15
19
|
private parseOrder;
|
|
16
20
|
private parseKey;
|
|
@@ -35,8 +39,8 @@ export declare class NQL_RuleTree {
|
|
|
35
39
|
* @category NQL
|
|
36
40
|
* */
|
|
37
41
|
export declare class NQL_Compiler {
|
|
38
|
-
static build(module:
|
|
39
|
-
static
|
|
42
|
+
static build(daemon: AnyDaemon, module: string, bucketName: string, query: NQL_AnyQuery, customMetadata?: BucketMetadata): Promise<NQL_CompiledQuery>;
|
|
43
|
+
static buildTree(tree: NQL_RuleTree): Promise<NQL_CompiledQuery>;
|
|
40
44
|
}
|
|
41
45
|
/**
|
|
42
46
|
* A query ready to be run by the NQL engine, which will call
|
|
@@ -3,32 +3,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.NQL_CompiledQuery = exports.NQL_Compiler = exports.NQL_RuleTree = void 0;
|
|
4
4
|
const bucket_model_schema_1 = require("../model/bucket_model.schema");
|
|
5
5
|
const string_1 = require("../../../../engine/util/string");
|
|
6
|
+
const daemon_1 = require("../../../../engine/daemon");
|
|
7
|
+
const dependency_1 = require("../../../../engine/dependency");
|
|
6
8
|
/**
|
|
7
9
|
* @category NQL
|
|
8
10
|
* */
|
|
9
11
|
class NQL_RuleTree {
|
|
10
|
-
constructor(module, bucketName, query, debug = false) {
|
|
12
|
+
constructor(daemon, module, bucketName, query, customMetadata, debug = false) {
|
|
13
|
+
this.daemon = daemon;
|
|
11
14
|
this.module = module;
|
|
12
15
|
this.bucketName = bucketName;
|
|
13
16
|
this.query = query;
|
|
17
|
+
this.customMetadata = customMetadata;
|
|
14
18
|
this.debug = debug;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
}
|
|
20
|
+
async parse() {
|
|
21
|
+
const tag = dependency_1.Tag.fromNameOrShort(this.module, 'bucket', this.bucketName);
|
|
22
|
+
const bucket = this.customMetadata || await daemon_1.Daemon.getBucketMetadata(this.daemon, tag);
|
|
23
|
+
this.root = await this.parseUnion(bucket, this.query);
|
|
24
|
+
if (this.debug) {
|
|
18
25
|
console.log(this.describe());
|
|
19
26
|
}
|
|
20
27
|
this.simplify();
|
|
21
28
|
this._addDebugId();
|
|
22
|
-
if (debug) {
|
|
29
|
+
if (this.debug) {
|
|
23
30
|
console.log(this.describe());
|
|
24
31
|
}
|
|
25
32
|
}
|
|
26
33
|
// Parse NQL
|
|
27
|
-
parseUnion(bucket, query, select) {
|
|
28
|
-
const meta = bucket.getQueryMeta();
|
|
34
|
+
async parseUnion(bucket, query, select) {
|
|
29
35
|
const union = {
|
|
30
36
|
meta: {
|
|
31
|
-
...
|
|
37
|
+
...bucket,
|
|
32
38
|
avgTime: 0
|
|
33
39
|
},
|
|
34
40
|
inters: [
|
|
@@ -37,14 +43,14 @@ class NQL_RuleTree {
|
|
|
37
43
|
};
|
|
38
44
|
for (const key in query) {
|
|
39
45
|
const value = query[key];
|
|
40
|
-
const parsedKey = this.parseKey(bucket, key);
|
|
46
|
+
const parsedKey = await this.parseKey(bucket, key);
|
|
41
47
|
// Fieldpath term -> Condition
|
|
42
48
|
if (parsedKey.type === 'fieldpath') {
|
|
43
|
-
const parsed = this.parseValue(value, parsedKey,
|
|
49
|
+
const parsed = await this.parseValue(value, parsedKey, bucket, select);
|
|
44
50
|
const rule = ('subquery' in parsed)
|
|
45
51
|
? parsed.subquery.union
|
|
46
52
|
: {
|
|
47
|
-
meta: { ...
|
|
53
|
+
meta: { ...bucket },
|
|
48
54
|
select,
|
|
49
55
|
fieldpath: parsedKey.fieldpath,
|
|
50
56
|
value: parsed,
|
|
@@ -71,15 +77,15 @@ class NQL_RuleTree {
|
|
|
71
77
|
throw new Error('Graph Link not supported yet');
|
|
72
78
|
}
|
|
73
79
|
else if (parsedKey.type === 'and') {
|
|
74
|
-
const subInter = this.parseUnion(bucket, value, select);
|
|
80
|
+
const subInter = await this.parseUnion(bucket, value, select);
|
|
75
81
|
union.inters[0].rules.push(subInter);
|
|
76
82
|
}
|
|
77
83
|
else if (parsedKey.type === 'or') {
|
|
78
|
-
const subInter = this.parseUnion(bucket, value, select);
|
|
84
|
+
const subInter = await this.parseUnion(bucket, value, select);
|
|
79
85
|
union.inters.push({ meta: {}, rules: [subInter] });
|
|
80
86
|
}
|
|
81
87
|
else if (parsedKey.type === 'order') {
|
|
82
|
-
union.order = this.parseOrder(bucket, value);
|
|
88
|
+
union.order = await this.parseOrder(bucket, value);
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
91
|
if (!union.inters[0]?.rules.length) {
|
|
@@ -91,7 +97,7 @@ class NQL_RuleTree {
|
|
|
91
97
|
let by = value['by'];
|
|
92
98
|
if (by) {
|
|
93
99
|
for (const key of by) {
|
|
94
|
-
if (Object.values(bucket.
|
|
100
|
+
if (Object.values(bucket.meta).includes(key))
|
|
95
101
|
continue;
|
|
96
102
|
const fields = bucket_model_schema_1.$BucketModel.getField(bucket.schema.model, key);
|
|
97
103
|
if (!fields.length) {
|
|
@@ -99,7 +105,7 @@ class NQL_RuleTree {
|
|
|
99
105
|
}
|
|
100
106
|
for (const field of fields) {
|
|
101
107
|
if (![
|
|
102
|
-
'date', 'datetime', 'duration', 'decimal', 'enum', 'float', 'int', 'string', 'literal', 'boolean'
|
|
108
|
+
'date', 'datetime', 'duration', 'decimal', 'enum', 'float', 'int', 'string', 'literal', 'boolean', 'unknown'
|
|
103
109
|
].includes(field.type)) {
|
|
104
110
|
throw new Error(`Field '${key}' is not sortable`);
|
|
105
111
|
}
|
|
@@ -122,7 +128,7 @@ class NQL_RuleTree {
|
|
|
122
128
|
}
|
|
123
129
|
return { by, dir: dir };
|
|
124
130
|
}
|
|
125
|
-
parseKey(bucket, key) {
|
|
131
|
+
async parseKey(bucket, key) {
|
|
126
132
|
if (key === '#order') {
|
|
127
133
|
return { type: 'order' };
|
|
128
134
|
}
|
|
@@ -138,11 +144,8 @@ class NQL_RuleTree {
|
|
|
138
144
|
if (!link) {
|
|
139
145
|
throw new Error(`Graph Link '${linkName}' doesn't exist on the bucket ${bucket}`);
|
|
140
146
|
}
|
|
141
|
-
const linkBucket = this.
|
|
142
|
-
|
|
143
|
-
throw new Error(`Graph Link '${link}' points to a bucket '${link.bucket}' not found on the module ${this.module.name}`);
|
|
144
|
-
}
|
|
145
|
-
return { type: 'graphlink', link: link.name, linkBucket };
|
|
147
|
+
const linkBucket = await daemon_1.Daemon.getBucketMetadata(this.daemon, link.bucket);
|
|
148
|
+
return { type: 'graphlink', link: link.name, linkBucket: linkBucket.schema };
|
|
146
149
|
}
|
|
147
150
|
else {
|
|
148
151
|
const term = key.match(/^(or )?([\w|.|*]+)( not)? ?(~)?(.*)$/);
|
|
@@ -150,19 +153,19 @@ class NQL_RuleTree {
|
|
|
150
153
|
throw new Error(`Invalid term '${key}'`);
|
|
151
154
|
}
|
|
152
155
|
const [_, or, fieldpath, not, case_i, op] = term;
|
|
153
|
-
if (Object.values(bucket.
|
|
154
|
-
const _op = this.parseOp(
|
|
156
|
+
if (Object.values(bucket.meta).includes(fieldpath)) {
|
|
157
|
+
const _op = this.parseOp([{ type: 'datetime', name: fieldpath }], op);
|
|
155
158
|
return { type: 'fieldpath', or: !!or, fieldpath, not: !!not, case_i: !!case_i, op: _op };
|
|
156
159
|
}
|
|
157
160
|
const fields = bucket_model_schema_1.$BucketModel.getField(bucket.schema.model, fieldpath);
|
|
158
161
|
if (!fields.length) {
|
|
159
162
|
throw new Error(`Field '${fieldpath}' not found on bucket '${bucket.schema.name}'`);
|
|
160
163
|
}
|
|
161
|
-
const _op = this.parseOp(
|
|
164
|
+
const _op = this.parseOp(fields, op);
|
|
162
165
|
return { type: 'fieldpath', or: !!or, fieldpath, not: !!not, case_i: !!case_i, op: _op };
|
|
163
166
|
}
|
|
164
167
|
}
|
|
165
|
-
parseOp(
|
|
168
|
+
parseOp(fields, op) {
|
|
166
169
|
const _op = (op === '' ? '==' : op);
|
|
167
170
|
for (const field of fields) {
|
|
168
171
|
if (![
|
|
@@ -197,14 +200,14 @@ class NQL_RuleTree {
|
|
|
197
200
|
}
|
|
198
201
|
return _op;
|
|
199
202
|
}
|
|
200
|
-
parseValue(value, parsedKey, meta, select) {
|
|
203
|
+
async parseValue(value, parsedKey, meta, select) {
|
|
201
204
|
if (typeof value === 'object') {
|
|
202
205
|
// Array
|
|
203
206
|
if (Array.isArray(value)) {
|
|
204
207
|
const statyc = [];
|
|
205
208
|
const params = [];
|
|
206
209
|
for (const item of value) {
|
|
207
|
-
const parsed = this.parseValue(item, parsedKey, meta, select);
|
|
210
|
+
const parsed = await this.parseValue(item, parsedKey, meta, select);
|
|
208
211
|
if ('static' in parsed) {
|
|
209
212
|
statyc.push(parsed.static);
|
|
210
213
|
}
|
|
@@ -231,7 +234,7 @@ class NQL_RuleTree {
|
|
|
231
234
|
return { param: value['.'] };
|
|
232
235
|
}
|
|
233
236
|
// Sub-Query
|
|
234
|
-
return { subquery: this.parseSubQuery(value, parsedKey, meta, select) };
|
|
237
|
+
return { subquery: await this.parseSubQuery(value, parsedKey, meta, select) };
|
|
235
238
|
}
|
|
236
239
|
}
|
|
237
240
|
// Static value
|
|
@@ -239,7 +242,7 @@ class NQL_RuleTree {
|
|
|
239
242
|
return { static: value };
|
|
240
243
|
}
|
|
241
244
|
}
|
|
242
|
-
parseSubQuery(value, parsedKey, meta, select) {
|
|
245
|
+
async parseSubQuery(value, parsedKey, meta, select) {
|
|
243
246
|
const union = {
|
|
244
247
|
meta: {},
|
|
245
248
|
inters: [
|
|
@@ -253,7 +256,8 @@ class NQL_RuleTree {
|
|
|
253
256
|
throw new Error(`Invalid bucket field '${key}'`);
|
|
254
257
|
}
|
|
255
258
|
const [_, or, refBucket, fieldpath] = refField;
|
|
256
|
-
const
|
|
259
|
+
const tag = dependency_1.Tag.fromNameOrShort(this.module, 'bucket', refBucket);
|
|
260
|
+
const bucket = await daemon_1.Daemon.getBucketMetadata(this.daemon, tag);
|
|
257
261
|
if (!bucket) {
|
|
258
262
|
throw new Error(`Bucket '${bucket}' not found on module`);
|
|
259
263
|
}
|
|
@@ -261,7 +265,7 @@ class NQL_RuleTree {
|
|
|
261
265
|
if (!field) {
|
|
262
266
|
throw new Error(`Field '${fieldpath}' not found on bucket '${bucket.schema.name}'`);
|
|
263
267
|
}
|
|
264
|
-
const refInter = this.parseUnion(bucket, value[key], fieldpath);
|
|
268
|
+
const refInter = await this.parseUnion(bucket, value[key], fieldpath);
|
|
265
269
|
const rule = {
|
|
266
270
|
meta: { ...meta },
|
|
267
271
|
select,
|
|
@@ -336,7 +340,7 @@ class NQL_RuleTree {
|
|
|
336
340
|
const inter = node[0].inters[0];
|
|
337
341
|
parent[0].rules.splice(parent[1], 1, ...inter.rules);
|
|
338
342
|
stack.pop();
|
|
339
|
-
|
|
343
|
+
parent[1]--;
|
|
340
344
|
continue;
|
|
341
345
|
}
|
|
342
346
|
}
|
|
@@ -452,7 +456,7 @@ class NQL_RuleTree {
|
|
|
452
456
|
+ (0, string_1.colored)(`└ ${node._debug_id || ''}[if] `, 'lightcyan')
|
|
453
457
|
+ (0, string_1.colored)(node.select ? '(⊹ ' + node.select + ') ' : '', 'brown')
|
|
454
458
|
+ (0, string_1.colored)(`${node.meta.scope || ''} ${node.meta.avgTime || '?'}ms `, 'black')
|
|
455
|
-
+ `@${node.meta.
|
|
459
|
+
+ `@${node.meta.schema?.name}.${node.fieldpath}${node.not ? ' not' : ''} ${node.case_i ? '~' : ''}${node.op}`
|
|
456
460
|
+ (('static' in node.value) ? ` ${node.value.static}`
|
|
457
461
|
: ('param' in node.value) ? ` ->${node.value.param}`
|
|
458
462
|
: ' ▼ ' + (0, string_1.colored)('(' + node.value.subquery.bucket.name + '.' + node.value.subquery.select + ')', 'brown'))
|
|
@@ -490,11 +494,13 @@ NQL_RuleTree.OpByType = {
|
|
|
490
494
|
* @category NQL
|
|
491
495
|
* */
|
|
492
496
|
class NQL_Compiler {
|
|
493
|
-
static build(module, bucketName, query) {
|
|
494
|
-
const tree = new NQL_RuleTree(module, bucketName, query);
|
|
495
|
-
return this.
|
|
497
|
+
static async build(daemon, module, bucketName, query, customMetadata) {
|
|
498
|
+
const tree = new NQL_RuleTree(daemon, module, bucketName, query, customMetadata);
|
|
499
|
+
return this.buildTree(tree);
|
|
496
500
|
}
|
|
497
|
-
static
|
|
501
|
+
static async buildTree(tree) {
|
|
502
|
+
await tree.parse();
|
|
503
|
+
const union = tree.root;
|
|
498
504
|
// const debugLog: string[] = [];
|
|
499
505
|
// Create top-level part
|
|
500
506
|
const parts = [{
|
|
@@ -24,7 +24,7 @@ export declare class NQL_Engine {
|
|
|
24
24
|
private module;
|
|
25
25
|
private runners;
|
|
26
26
|
constructor(module: AnyModule);
|
|
27
|
-
run(trx: AnyTrxNode, query: NQL_CompiledQuery, pagination?: NQL_Pagination, params?: Record<string, any>[], view?: $BucketView,
|
|
27
|
+
run(trx: AnyTrxNode, query: NQL_CompiledQuery, pagination?: NQL_Pagination, params?: Record<string, any>[], view?: $BucketView, customRunners?: Record<string, NQLRunner>): Promise<NQL_Result>;
|
|
28
28
|
linkExternal(bucket: AnyBucket): void;
|
|
29
29
|
}
|
|
30
30
|
export {};
|