@malloy-publisher/server 0.0.235 → 0.0.236
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/dist/app/api-doc.yaml +47 -17
- package/dist/package_load_worker.mjs +8 -1
- package/dist/server.mjs +471 -54
- package/package.json +5 -2
- package/.eslintrc.json +0 -44
- package/.prettierignore +0 -1
- package/.prettierrc +0 -4
- package/build.ts +0 -97
- package/eslint.config.mjs +0 -76
- package/k6-tests/README.md +0 -144
- package/k6-tests/bun.lock +0 -797
- package/k6-tests/load-test/load-test-crud-connections.ts +0 -263
- package/k6-tests/load-test/load-test-crud-packages.ts +0 -461
- package/k6-tests/load-test/load-test-crud-projects.ts +0 -160
- package/k6-tests/load-test/load-test-crud.ts +0 -142
- package/k6-tests/load-test/load-test.ts +0 -784
- package/k6-tests/package.json +0 -27
- package/k6-tests/scripts/run-with-otel.sh +0 -50
- package/k6-tests/smoke-test/smoke-test.ts +0 -158
- package/k6-tests/tsconfig.json +0 -29
- package/k6-tests/utils/client_factory.ts +0 -128
- package/k6-tests/utils/common.ts +0 -489
- package/k6-tests/utils/logger.ts +0 -62
- package/k6-tests/utils/types.d.ts +0 -35
- package/malloy_mcp.dxt +0 -0
- package/publisher.config.example.bigquery.json +0 -33
- package/publisher.config.example.duckdb.json +0 -23
- package/publisher.config.json +0 -23
- package/scripts/bake-duckdb-extensions.js +0 -110
- package/src/config.spec.ts +0 -1535
- package/src/config.theme.spec.ts +0 -178
- package/src/config.ts +0 -1142
- package/src/constants.ts +0 -105
- package/src/controller/compile.controller.ts +0 -40
- package/src/controller/connection.controller.spec.ts +0 -849
- package/src/controller/connection.controller.ts +0 -901
- package/src/controller/database.controller.ts +0 -24
- package/src/controller/materialization.controller.spec.ts +0 -293
- package/src/controller/materialization.controller.ts +0 -319
- package/src/controller/model.controller.ts +0 -164
- package/src/controller/package.controller.spec.ts +0 -273
- package/src/controller/package.controller.ts +0 -306
- package/src/controller/query.controller.ts +0 -152
- package/src/controller/theme.controller.ts +0 -83
- package/src/controller/watch-mode.controller.ts +0 -243
- package/src/data_styles.ts +0 -71
- package/src/default-publisher.config.json +0 -23
- package/src/ducklake_version.spec.ts +0 -163
- package/src/ducklake_version.ts +0 -153
- package/src/errors.spec.ts +0 -119
- package/src/errors.ts +0 -237
- package/src/filter_deprecation.spec.ts +0 -64
- package/src/filter_deprecation.ts +0 -42
- package/src/health.spec.ts +0 -123
- package/src/health.ts +0 -233
- package/src/heap_check.spec.ts +0 -144
- package/src/heap_check.ts +0 -144
- package/src/instrumentation.ts +0 -214
- package/src/json_utils.spec.ts +0 -51
- package/src/json_utils.ts +0 -33
- package/src/logger.spec.ts +0 -210
- package/src/logger.ts +0 -251
- package/src/malloy_pin_prereqs.spec.ts +0 -25
- package/src/materialization_metrics.spec.ts +0 -169
- package/src/materialization_metrics.ts +0 -346
- package/src/mcp/error_messages.spec.ts +0 -35
- package/src/mcp/error_messages.ts +0 -183
- package/src/mcp/handler_utils.spec.ts +0 -108
- package/src/mcp/handler_utils.ts +0 -251
- package/src/mcp/mcp_constants.ts +0 -6
- package/src/mcp/query_envelope.spec.ts +0 -229
- package/src/mcp/query_envelope.ts +0 -240
- package/src/mcp/server.protocol.spec.ts +0 -250
- package/src/mcp/server.ts +0 -87
- package/src/mcp/skills/build_skills_bundle.spec.ts +0 -51
- package/src/mcp/skills/build_skills_bundle.ts +0 -176
- package/src/mcp/skills/skills_bundle.json +0 -1
- package/src/mcp/skills/skills_bundle.spec.ts +0 -171
- package/src/mcp/tool_response.spec.ts +0 -108
- package/src/mcp/tool_response.ts +0 -138
- package/src/mcp/tools/compile_tool.spec.ts +0 -315
- package/src/mcp/tools/compile_tool.ts +0 -208
- package/src/mcp/tools/docs_search/build_docs_index.ts +0 -132
- package/src/mcp/tools/docs_search/malloy_docs_index.json +0 -1
- package/src/mcp/tools/docs_search_tool.spec.ts +0 -32
- package/src/mcp/tools/docs_search_tool.ts +0 -128
- package/src/mcp/tools/embedding_index.spec.ts +0 -1236
- package/src/mcp/tools/embedding_index.ts +0 -808
- package/src/mcp/tools/execute_query_tool.spec.ts +0 -294
- package/src/mcp/tools/execute_query_tool.ts +0 -316
- package/src/mcp/tools/get_context_eval.ts +0 -275
- package/src/mcp/tools/get_context_tool.spec.ts +0 -592
- package/src/mcp/tools/get_context_tool.ts +0 -585
- package/src/mcp/tools/reload_package_tool.spec.ts +0 -232
- package/src/mcp/tools/reload_package_tool.ts +0 -132
- package/src/mcp_config.spec.ts +0 -919
- package/src/mcp_config.ts +0 -425
- package/src/oom_guards.integration.spec.ts +0 -269
- package/src/package_load/package_load_pool.spec.ts +0 -252
- package/src/package_load/package_load_pool.ts +0 -931
- package/src/package_load/package_load_worker.ts +0 -1034
- package/src/package_load/protocol.ts +0 -364
- package/src/package_load/rpc_wait_accountant.spec.ts +0 -109
- package/src/package_load/rpc_wait_accountant.ts +0 -76
- package/src/package_load_metrics.spec.ts +0 -114
- package/src/package_load_metrics.ts +0 -127
- package/src/path_safety.spec.ts +0 -158
- package/src/path_safety.ts +0 -146
- package/src/pg_helpers.spec.ts +0 -223
- package/src/pg_helpers.ts +0 -52
- package/src/query_cap_metrics.spec.ts +0 -89
- package/src/query_cap_metrics.ts +0 -116
- package/src/query_concurrency.spec.ts +0 -247
- package/src/query_concurrency.ts +0 -237
- package/src/query_metadata_metrics.ts +0 -49
- package/src/query_param_utils.ts +0 -29
- package/src/query_timeout.spec.ts +0 -224
- package/src/query_timeout.ts +0 -179
- package/src/runtime/publisher.js +0 -328
- package/src/server-old.ts +0 -988
- package/src/server.ts +0 -2059
- package/src/service/annotations.spec.ts +0 -118
- package/src/service/annotations.ts +0 -91
- package/src/service/authorize.spec.ts +0 -154
- package/src/service/authorize.ts +0 -498
- package/src/service/authorize_integration.spec.ts +0 -2041
- package/src/service/build_plan.spec.ts +0 -685
- package/src/service/build_plan.ts +0 -797
- package/src/service/compile_authorize.spec.ts +0 -85
- package/src/service/compile_fragment_techniques.spec.ts +0 -156
- package/src/service/connection.spec.ts +0 -2360
- package/src/service/connection.ts +0 -2187
- package/src/service/connection_config.spec.ts +0 -734
- package/src/service/connection_config.ts +0 -899
- package/src/service/connection_federation.spec.ts +0 -184
- package/src/service/connection_fingerprint.spec.ts +0 -102
- package/src/service/connection_service.spec.ts +0 -711
- package/src/service/connection_service.ts +0 -291
- package/src/service/cron_evaluator.spec.ts +0 -79
- package/src/service/cron_evaluator.ts +0 -105
- package/src/service/db_utils.spec.ts +0 -1085
- package/src/service/db_utils.ts +0 -1502
- package/src/service/duckdb_instance_isolation.spec.ts +0 -137
- package/src/service/ducklake_lazy_attach.spec.ts +0 -110
- package/src/service/embedding_provider.spec.ts +0 -329
- package/src/service/embedding_provider.ts +0 -236
- package/src/service/environment.ts +0 -2191
- package/src/service/environment_admission.spec.ts +0 -344
- package/src/service/environment_compile.spec.ts +0 -197
- package/src/service/environment_store.spec.ts +0 -2274
- package/src/service/environment_store.ts +0 -2434
- package/src/service/environment_store_anchoring.spec.ts +0 -107
- package/src/service/environment_store_clone.spec.ts +0 -350
- package/src/service/explore_visibility.spec.ts +0 -434
- package/src/service/exports_probe.spec.ts +0 -107
- package/src/service/extension_fetch_policy.spec.ts +0 -256
- package/src/service/filter.spec.ts +0 -458
- package/src/service/filter.ts +0 -341
- package/src/service/filter_bypass.spec.ts +0 -418
- package/src/service/filter_integration.spec.ts +0 -1004
- package/src/service/freshness.spec.ts +0 -183
- package/src/service/freshness.ts +0 -112
- package/src/service/gcs_s3_utils.ts +0 -427
- package/src/service/given.ts +0 -105
- package/src/service/givens_integration.spec.ts +0 -219
- package/src/service/manifest_loader.spec.ts +0 -189
- package/src/service/manifest_loader.ts +0 -156
- package/src/service/materialization_build_session.spec.ts +0 -435
- package/src/service/materialization_build_session.ts +0 -681
- package/src/service/materialization_config_validation.spec.ts +0 -99
- package/src/service/materialization_config_validation.ts +0 -120
- package/src/service/materialization_eligibility.spec.ts +0 -158
- package/src/service/materialization_eligibility.ts +0 -305
- package/src/service/materialization_schedule_surface.spec.ts +0 -256
- package/src/service/materialization_scheduler.spec.ts +0 -289
- package/src/service/materialization_scheduler.ts +0 -304
- package/src/service/materialization_serve_transform.spec.ts +0 -1003
- package/src/service/materialization_serve_transform.ts +0 -779
- package/src/service/materialization_service.spec.ts +0 -2373
- package/src/service/materialization_service.ts +0 -2342
- package/src/service/materialization_test_fixtures.ts +0 -249
- package/src/service/model.spec.ts +0 -1157
- package/src/service/model.ts +0 -3370
- package/src/service/model_limits.spec.ts +0 -209
- package/src/service/model_limits.ts +0 -131
- package/src/service/model_storage_serve.spec.ts +0 -193
- package/src/service/model_storage_serve_joins.spec.ts +0 -193
- package/src/service/package.spec.ts +0 -612
- package/src/service/package.ts +0 -1799
- package/src/service/package_manifest.spec.ts +0 -230
- package/src/service/package_manifest.ts +0 -241
- package/src/service/package_memory_governor.spec.ts +0 -173
- package/src/service/package_memory_governor.ts +0 -233
- package/src/service/package_quote_bound_tables.spec.ts +0 -171
- package/src/service/package_race.spec.ts +0 -208
- package/src/service/package_reload_safety.spec.ts +0 -193
- package/src/service/package_rollback.spec.ts +0 -190
- package/src/service/package_worker_path.spec.ts +0 -645
- package/src/service/path_injection.spec.ts +0 -39
- package/src/service/persist_annotation_validation.spec.ts +0 -89
- package/src/service/persist_annotation_validation.ts +0 -59
- package/src/service/persistence_policy.spec.ts +0 -374
- package/src/service/proxy.spec.ts +0 -414
- package/src/service/proxy.ts +0 -248
- package/src/service/query_boundary.spec.ts +0 -470
- package/src/service/query_metadata.spec.ts +0 -408
- package/src/service/query_metadata.ts +0 -492
- package/src/service/query_metadata_identity.spec.ts +0 -149
- package/src/service/query_text.spec.ts +0 -79
- package/src/service/query_text.ts +0 -43
- package/src/service/quoting.spec.ts +0 -135
- package/src/service/quoting.ts +0 -78
- package/src/service/resolve_environment.ts +0 -15
- package/src/service/restricted_mode.spec.ts +0 -299
- package/src/service/source_extraction.ts +0 -225
- package/src/service/theme_store.ts +0 -199
- package/src/storage/DatabaseInterface.ts +0 -198
- package/src/storage/StorageManager.ts +0 -113
- package/src/storage/duckdb/ConnectionRepository.ts +0 -143
- package/src/storage/duckdb/DuckDBConnection.ts +0 -123
- package/src/storage/duckdb/DuckDBRepository.ts +0 -208
- package/src/storage/duckdb/EnvironmentRepository.ts +0 -148
- package/src/storage/duckdb/MaterializationRepository.spec.ts +0 -191
- package/src/storage/duckdb/MaterializationRepository.ts +0 -336
- package/src/storage/duckdb/PackageRepository.ts +0 -135
- package/src/storage/duckdb/schema.ts +0 -229
- package/src/stream_helpers.spec.ts +0 -280
- package/src/stream_helpers.ts +0 -162
- package/src/telemetry.ts +0 -20
- package/src/test_helpers/metrics_harness.ts +0 -166
- package/src/theme_key_parity.spec.ts +0 -57
- package/src/utils.ts +0 -29
- package/tests/fixtures/authorize-compile/model.malloy +0 -9
- package/tests/fixtures/authorize-compile/publisher.json +0 -4
- package/tests/fixtures/html-pages-nopublic/model.malloy +0 -1
- package/tests/fixtures/html-pages-nopublic/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/data.csv +0 -3
- package/tests/fixtures/html-pages-test/public/assets/app.css +0 -3
- package/tests/fixtures/html-pages-test/public/barehtml.html +0 -4
- package/tests/fixtures/html-pages-test/public/bodymeta.html +0 -8
- package/tests/fixtures/html-pages-test/public/data.json +0 -1
- package/tests/fixtures/html-pages-test/public/fitcomment.html +0 -11
- package/tests/fixtures/html-pages-test/public/index.html +0 -9
- package/tests/fixtures/html-pages-test/public/nohead.html +0 -8
- package/tests/fixtures/html-pages-test/public/notfit.html +0 -13
- package/tests/fixtures/html-pages-test/public/slides.html +0 -12
- package/tests/fixtures/html-pages-test/public/sub/page2.html +0 -9
- package/tests/fixtures/html-pages-test/public/unterminated.html +0 -10
- package/tests/fixtures/html-pages-test/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/report.malloy +0 -1
- package/tests/fixtures/persist-multi-level/data/orders.csv +0 -5
- package/tests/fixtures/persist-multi-level/multi_level.malloy +0 -18
- package/tests/fixtures/persist-multi-level/publisher.json +0 -5
- package/tests/fixtures/persist-schedule-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-test/persist_schedule_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-test/publisher.json +0 -7
- package/tests/fixtures/persist-schedule-warn-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-warn-test/persist_warn_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-warn-test/publisher.json +0 -6
- package/tests/fixtures/persist-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-test/persist_test.malloy +0 -11
- package/tests/fixtures/persist-test/publisher.json +0 -5
- package/tests/fixtures/publisher.config.json +0 -15
- package/tests/fixtures/query-givens/data/orders.csv +0 -7
- package/tests/fixtures/query-givens/model.malloy +0 -34
- package/tests/fixtures/query-givens/publisher.json +0 -5
- package/tests/fixtures/xlsx/database.xlsx +0 -0
- package/tests/harness/mcp_test_setup.ts +0 -332
- package/tests/harness/rest_e2e.ts +0 -68
- package/tests/integration/authorize/compile_authorize_http.integration.spec.ts +0 -92
- package/tests/integration/concurrent_package/concurrent_package.integration.spec.ts +0 -280
- package/tests/integration/duckdb_storage/duckdb_storage.integration.spec.ts +0 -138
- package/tests/integration/first_boot/readiness_line.integration.spec.ts +0 -177
- package/tests/integration/html_pages/html_pages.integration.spec.ts +0 -440
- package/tests/integration/legacy_routes/legacy_routes.integration.spec.ts +0 -259
- package/tests/integration/materialization/environment_list.integration.spec.ts +0 -133
- package/tests/integration/materialization/freshness_gate.integration.spec.ts +0 -292
- package/tests/integration/materialization/manifest_binding.integration.spec.ts +0 -430
- package/tests/integration/materialization/materialization_lifecycle.integration.spec.ts +0 -441
- package/tests/integration/materialization/orchestrated_rebind.integration.spec.ts +0 -150
- package/tests/integration/materialization/reference_manifest.integration.spec.ts +0 -251
- package/tests/integration/materialization/schedule_edit.integration.spec.ts +0 -126
- package/tests/integration/materialization/scheduler.integration.spec.ts +0 -200
- package/tests/integration/materialization/scheduler_recovery.integration.spec.ts +0 -172
- package/tests/integration/materialization/scheduler_transitions.integration.spec.ts +0 -256
- package/tests/integration/materialization/scheduler_wiring.integration.spec.ts +0 -143
- package/tests/integration/mcp/mcp_execute_query_tool.integration.spec.ts +0 -438
- package/tests/integration/mcp/mcp_get_context_semantic.integration.spec.ts +0 -235
- package/tests/integration/mcp/mcp_transport.integration.spec.ts +0 -98
- package/tests/integration/query_givens/query_givens.integration.spec.ts +0 -146
- package/tests/integration/query_givens/query_givens_authorize.integration.spec.ts +0 -121
- package/tests/integration/sdk_givens/sdk_givens.integration.spec.ts +0 -110
- package/tests/integration/watch-mode/watch_mode.integration.spec.ts +0 -421
- package/tests/unit/controller/theme.controller.spec.ts +0 -141
- package/tests/unit/duckdb/attached_databases.test.ts +0 -1243
- package/tests/unit/duckdb/duckdb_connection.test.ts +0 -181
- package/tests/unit/duckdb/legacy_schema_migration.test.ts +0 -197
- package/tests/unit/duckdb/repositories.test.ts +0 -208
- package/tests/unit/ducklake/ducklake.test.ts +0 -952
- package/tests/unit/service/theme_store.spec.ts +0 -139
- package/tsconfig.json +0 -32
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
// Model-level routing contract for JOINS and VIEWS in the `storage=` serve path,
|
|
2
|
-
// through the real Model.getQueryResults against a real in-memory DuckDB. This
|
|
3
|
-
// exercises the glue the transform-level tests can't: serveBindingsWithRefinements
|
|
4
|
-
// reading a REAL compiled modelDef, mapping a join's `sourceID` to the joined
|
|
5
|
-
// source name, and lifting join/view declarations verbatim from the on-disk
|
|
6
|
-
// source file (as it does in production — hence a real temp file, not
|
|
7
|
-
// InMemoryURLReader alone), plus the shape-compile escalation that keeps one
|
|
8
|
-
// un-carriable refinement from disabling all storage serving.
|
|
9
|
-
//
|
|
10
|
-
// Signals: the live sources return region_name 'LIVE' and amount 10; the bound
|
|
11
|
-
// (materialized) tables return 'STORE' and amount 99 — so the value observed
|
|
12
|
-
// tells which path ran.
|
|
13
|
-
import { DuckDBConnection } from "@malloydata/db-duckdb";
|
|
14
|
-
import {
|
|
15
|
-
FixedConnectionMap,
|
|
16
|
-
InMemoryURLReader,
|
|
17
|
-
modelDefToModelInfo,
|
|
18
|
-
Runtime,
|
|
19
|
-
} from "@malloydata/malloy";
|
|
20
|
-
import { afterAll, afterEach, describe, expect, it } from "bun:test";
|
|
21
|
-
import { mkdtempSync, rmSync, writeFileSync } from "fs";
|
|
22
|
-
import { tmpdir } from "os";
|
|
23
|
-
import { join } from "path";
|
|
24
|
-
import { pathToFileURL } from "url";
|
|
25
|
-
import { Model } from "./model";
|
|
26
|
-
import type { ServeBinding } from "./materialization_serve_transform";
|
|
27
|
-
|
|
28
|
-
const MODEL_SRC = `source: regions is duckdb.sql("SELECT 'r1' AS region_id, 'LIVE' AS region_name")
|
|
29
|
-
source: orders is duckdb.sql("SELECT 10 AS amount, 'r1' AS region_id") extend {
|
|
30
|
-
join_one: regions is regions on region_id = regions.region_id
|
|
31
|
-
measure: total is amount.sum()
|
|
32
|
-
view: by_region is { group_by: regions.region_name; aggregate: total }
|
|
33
|
-
}
|
|
34
|
-
`;
|
|
35
|
-
|
|
36
|
-
const ORDERS_BINDING: ServeBinding = {
|
|
37
|
-
sourceName: "orders",
|
|
38
|
-
connectionName: "duckdb",
|
|
39
|
-
virtualHandle: "orders_h",
|
|
40
|
-
tablePath: "orders_mz",
|
|
41
|
-
schema: [
|
|
42
|
-
{ name: "amount", type: "BIGINT" },
|
|
43
|
-
{ name: "region_id", type: "VARCHAR" },
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
|
-
const REGIONS_BINDING: ServeBinding = {
|
|
47
|
-
sourceName: "regions",
|
|
48
|
-
connectionName: "duckdb",
|
|
49
|
-
virtualHandle: "regions_h",
|
|
50
|
-
tablePath: "regions_mz",
|
|
51
|
-
schema: [
|
|
52
|
-
{ name: "region_id", type: "VARCHAR" },
|
|
53
|
-
{ name: "region_name", type: "VARCHAR" },
|
|
54
|
-
],
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const tmpDirs: string[] = [];
|
|
58
|
-
|
|
59
|
-
async function buildModel(): Promise<Model> {
|
|
60
|
-
const dir = mkdtempSync(join(tmpdir(), "mz-join-"));
|
|
61
|
-
tmpDirs.push(dir);
|
|
62
|
-
const file = join(dir, "m.malloy");
|
|
63
|
-
writeFileSync(file, MODEL_SRC);
|
|
64
|
-
const fileUrl = pathToFileURL(file).toString();
|
|
65
|
-
|
|
66
|
-
const duckdb = new DuckDBConnection("duckdb", ":memory:");
|
|
67
|
-
// Materialized tables carry distinct values (region_name 'STORE', amount 99)
|
|
68
|
-
// from the live sources ('LIVE', 10), so a result value proves which ran.
|
|
69
|
-
await duckdb.runSQL(
|
|
70
|
-
"CREATE OR REPLACE TABLE orders_mz AS SELECT 99 AS amount, 'r1' AS region_id",
|
|
71
|
-
);
|
|
72
|
-
await duckdb.runSQL(
|
|
73
|
-
"CREATE OR REPLACE TABLE regions_mz AS SELECT 'r1' AS region_id, 'STORE' AS region_name",
|
|
74
|
-
);
|
|
75
|
-
const connMap = new Map<string, DuckDBConnection>([["duckdb", duckdb]]);
|
|
76
|
-
|
|
77
|
-
// Register the source under its real file:// URL so the compiled modelDef's
|
|
78
|
-
// locations point at the file liftText reads back from disk.
|
|
79
|
-
const urlReader = new InMemoryURLReader(new Map([[fileUrl, MODEL_SRC]]));
|
|
80
|
-
const runtime = new Runtime({
|
|
81
|
-
urlReader,
|
|
82
|
-
connections: new FixedConnectionMap(connMap, "duckdb"),
|
|
83
|
-
});
|
|
84
|
-
const mm = runtime.loadModel(new URL(fileUrl), {
|
|
85
|
-
importBaseURL: new URL(".", fileUrl),
|
|
86
|
-
});
|
|
87
|
-
const compiled = await mm.getModel();
|
|
88
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
-
const modelDef = (compiled as any)._modelDef;
|
|
90
|
-
const modelInfo = modelDefToModelInfo(modelDef);
|
|
91
|
-
const model = new Model(
|
|
92
|
-
"pkg",
|
|
93
|
-
"m.malloy",
|
|
94
|
-
{},
|
|
95
|
-
"model",
|
|
96
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
-
mm as any,
|
|
98
|
-
modelDef,
|
|
99
|
-
undefined,
|
|
100
|
-
undefined,
|
|
101
|
-
undefined,
|
|
102
|
-
undefined,
|
|
103
|
-
undefined,
|
|
104
|
-
undefined,
|
|
105
|
-
undefined,
|
|
106
|
-
modelInfo,
|
|
107
|
-
);
|
|
108
|
-
model.setServeMalloyConfig(connMap);
|
|
109
|
-
return model;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** Run a query and return the first result row. */
|
|
113
|
-
async function runRow<T>(model: Model, query: string): Promise<T> {
|
|
114
|
-
const res = await model.getQueryResults(
|
|
115
|
-
undefined,
|
|
116
|
-
undefined,
|
|
117
|
-
query,
|
|
118
|
-
{},
|
|
119
|
-
true,
|
|
120
|
-
);
|
|
121
|
-
return (res.compactResult as unknown as T[])[0];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const JOIN_QUERY =
|
|
125
|
-
"run: orders -> { group_by: regions.region_name; aggregate: t is amount.sum() }";
|
|
126
|
-
const VIEW_QUERY = "run: orders -> by_region";
|
|
127
|
-
const PLAIN_QUERY = "run: orders -> { aggregate: t is amount.sum() }";
|
|
128
|
-
|
|
129
|
-
describe("storage= serve routing with joins and views (end-to-end)", () => {
|
|
130
|
-
afterEach(() => {
|
|
131
|
-
delete process.env.PERSIST_STORAGE_MODE;
|
|
132
|
-
});
|
|
133
|
-
afterAll(() => {
|
|
134
|
-
for (const d of tmpDirs) rmSync(d, { recursive: true, force: true });
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("serves a join query from the materialized tables when both sources are bound", async () => {
|
|
138
|
-
process.env.PERSIST_STORAGE_MODE = "on";
|
|
139
|
-
const model = await buildModel();
|
|
140
|
-
model.setServeBindings([ORDERS_BINDING, REGIONS_BINDING]);
|
|
141
|
-
const row = await runRow<{ region_name: string }>(model, JOIN_QUERY);
|
|
142
|
-
expect(row.region_name).toBe("STORE"); // join ran over the bound tables
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it("serves a named view (grouping by a joined field) from the materialized tables", async () => {
|
|
146
|
-
process.env.PERSIST_STORAGE_MODE = "on";
|
|
147
|
-
const model = await buildModel();
|
|
148
|
-
model.setServeBindings([ORDERS_BINDING, REGIONS_BINDING]);
|
|
149
|
-
const row = await runRow<{ region_name: string; total: number }>(
|
|
150
|
-
model,
|
|
151
|
-
VIEW_QUERY,
|
|
152
|
-
);
|
|
153
|
-
expect(row.region_name).toBe("STORE");
|
|
154
|
-
expect(Number(row.total)).toBe(99); // amount from orders_mz, not live 10
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("falls back to live when the joined source is not materialized (the gate)", async () => {
|
|
158
|
-
process.env.PERSIST_STORAGE_MODE = "on";
|
|
159
|
-
const model = await buildModel();
|
|
160
|
-
// Only `orders` is bound; the join to `regions` is not carried, so a query
|
|
161
|
-
// traversing it cannot compile against the serve shape → live.
|
|
162
|
-
model.setServeBindings([ORDERS_BINDING]);
|
|
163
|
-
expect(
|
|
164
|
-
(await runRow<{ region_name: string }>(model, JOIN_QUERY)).region_name,
|
|
165
|
-
).toBe("LIVE");
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("a view that reaches a non-materialized join does not disable base serving (escalation)", async () => {
|
|
169
|
-
process.env.PERSIST_STORAGE_MODE = "on";
|
|
170
|
-
const model = await buildModel();
|
|
171
|
-
// Only `orders` bound: the join is gated out, so the emitted `by_region`
|
|
172
|
-
// view references an absent join and the RICH shape fails to compile. The
|
|
173
|
-
// escalation must drop the view category and keep serving base + measures,
|
|
174
|
-
// rather than losing all storage serving. A plain aggregate must still be
|
|
175
|
-
// served from storage (amount 99), while the view query falls back to live.
|
|
176
|
-
model.setServeBindings([ORDERS_BINDING]);
|
|
177
|
-
expect(Number((await runRow<{ t: number }>(model, PLAIN_QUERY)).t)).toBe(
|
|
178
|
-
99,
|
|
179
|
-
);
|
|
180
|
-
expect(
|
|
181
|
-
(await runRow<{ region_name: string }>(model, VIEW_QUERY)).region_name,
|
|
182
|
-
).toBe("LIVE");
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it("mode=off serves live even with both bindings present", async () => {
|
|
186
|
-
process.env.PERSIST_STORAGE_MODE = "off";
|
|
187
|
-
const model = await buildModel();
|
|
188
|
-
model.setServeBindings([ORDERS_BINDING, REGIONS_BINDING]);
|
|
189
|
-
expect(
|
|
190
|
-
(await runRow<{ region_name: string }>(model, JOIN_QUERY)).region_name,
|
|
191
|
-
).toBe("LIVE");
|
|
192
|
-
});
|
|
193
|
-
});
|