@uptimizr/db 0.1.0 → 0.2.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/dist/env.d.ts +17 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +6 -0
- package/dist/env.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/query/aggregations.js +2 -2
- package/dist/query/clickhouseDialect.d.ts +36 -0
- package/dist/query/clickhouseDialect.d.ts.map +1 -0
- package/dist/query/clickhouseDialect.js +114 -0
- package/dist/query/clickhouseDialect.js.map +1 -0
- package/package.json +1 -1
package/dist/env.d.ts
CHANGED
|
@@ -10,8 +10,25 @@ export interface DuckdbSettings {
|
|
|
10
10
|
/** Path to the persisted `.duckdb` file, or `:memory:` for an ephemeral store. */
|
|
11
11
|
path: string;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* ClickHouse (optional single-tenant scale store, ADR 0020) connection settings.
|
|
15
|
+
* Read from the environment but unused by the default DuckDB store, so the OSS
|
|
16
|
+
* install needs neither a ClickHouse server nor the client until opted into via
|
|
17
|
+
* `COLLECTOR_STORE=clickhouse`. Mirrors the `CLICKHOUSE_*` names in `.env.example`.
|
|
18
|
+
*/
|
|
19
|
+
export interface ClickhouseSettings {
|
|
20
|
+
/** HTTP endpoint of the ClickHouse server (used by `@clickhouse/client`). */
|
|
21
|
+
url: string;
|
|
22
|
+
/** Target database. */
|
|
23
|
+
database: string;
|
|
24
|
+
/** Username. */
|
|
25
|
+
username: string;
|
|
26
|
+
/** Password (empty by default for a local dev server). */
|
|
27
|
+
password: string;
|
|
28
|
+
}
|
|
13
29
|
export interface DbSettings {
|
|
14
30
|
duckdb: DuckdbSettings;
|
|
31
|
+
clickhouse: ClickhouseSettings;
|
|
15
32
|
/** Opt-in raw per-session retention for replay (ADR 0003). */
|
|
16
33
|
enableRawSessionRetention: boolean;
|
|
17
34
|
}
|
package/dist/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,8DAA8D;IAC9D,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAmC9C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,GAAiB,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,8DAA8D;IAC9D,yBAAyB,EAAE,OAAO,CAAC;CACpC;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAmC9C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,GAAiB,GAAG,UAAU,CAajE"}
|
package/dist/env.js
CHANGED
|
@@ -49,6 +49,12 @@ export function readDbSettings(env = process.env) {
|
|
|
49
49
|
duckdb: {
|
|
50
50
|
path: env.DUCKDB_PATH ?? defaultDuckdbPath(),
|
|
51
51
|
},
|
|
52
|
+
clickhouse: {
|
|
53
|
+
url: env.CLICKHOUSE_URL ?? "http://localhost:8123",
|
|
54
|
+
database: env.CLICKHOUSE_DATABASE ?? "uptimizr",
|
|
55
|
+
username: env.CLICKHOUSE_USER ?? "default",
|
|
56
|
+
password: env.CLICKHOUSE_PASSWORD ?? "",
|
|
57
|
+
},
|
|
52
58
|
enableRawSessionRetention: bool(env.ENABLE_RAW_SESSION_RETENTION, false),
|
|
53
59
|
};
|
|
54
60
|
}
|
package/dist/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkC1C,SAAS,IAAI,CAAC,KAAyB,EAAE,QAAiB;IACxD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACrC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAW,OAAO,CAAC,GAAG;IACnD,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,iBAAiB,EAAE;SAC7C;QACD,UAAU,EAAE;YACV,GAAG,EAAE,GAAG,CAAC,cAAc,IAAI,uBAAuB;YAClD,QAAQ,EAAE,GAAG,CAAC,mBAAmB,IAAI,UAAU;YAC/C,QAAQ,EAAE,GAAG,CAAC,eAAe,IAAI,SAAS;YAC1C,QAAQ,EAAE,GAAG,CAAC,mBAAmB,IAAI,EAAE;SACxC;QACD,yBAAyB,EAAE,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC;KACzE,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Server/Node only — no DOM imports. Aggregations are query-time in v1.
|
|
11
11
|
*/
|
|
12
12
|
export { readDbSettings } from "./env.js";
|
|
13
|
-
export type { DbSettings, DuckdbSettings } from "./env.js";
|
|
13
|
+
export type { DbSettings, DuckdbSettings, ClickhouseSettings } from "./env.js";
|
|
14
14
|
export { toEventRow, formatUtcTimestamp } from "./events.js";
|
|
15
15
|
export type { EventRow, SessionMeta } from "./events.js";
|
|
16
16
|
export { toNodeSampleRow, nodeSampleRowToEvent } from "./events.js";
|
|
@@ -19,6 +19,7 @@ export { hashApiKey, apiKeyPrefix, generateApiKey } from "./metadata.js";
|
|
|
19
19
|
export type { Project, ApiKeyRecord, ApiKeyCapability, ResolvedApiKey, SceneRepresentation, SceneRepresentationKind, SceneRepresentationSummary, } from "./metadata.js";
|
|
20
20
|
export type { Dialect, ParamType } from "./query/dialect.js";
|
|
21
21
|
export { duckdbDialect, toDuckdbTimestamp } from "./query/duckdbDialect.js";
|
|
22
|
+
export { clickhouseDialect, toClickhouseTimestamp } from "./query/clickhouseDialect.js";
|
|
22
23
|
export { buildListSessions, buildPointerHeatmap, buildWorldHeatmap, buildGazeHeatmap, buildCameraDirectionHeatmap, buildCameraPositionHeatmap, buildSessionTrajectory, buildClickGazeRay, buildFlowHeatmap, buildTopMeshes, buildMeshDwell, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildPerfDaily, buildEventsDaily, buildDistinctScenes, buildTimeseries, buildEventTypeCounts, buildSceneCoverage, buildCameraDistance, buildNavigationStats, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildInteractionsBySource, } from "./query/aggregations.js";
|
|
23
24
|
export type { QuerySpec, RangeOptions, SceneOptions, SourceOptions, SessionOptions, CameraModeOptions, TimeseriesOptions, SessionSummaryRow, HeatmapBinRow, WorldHeatmapBinRow, PositionBinRow, TrajectoryPointRow, DirectionBinRow, ClickGazeRayRow, FlowLinkRow, MeshCountRow, MeshDwellRow, DeadClickRow, RageClickRow, HoverDwellRow, CompileStallRow, ResourceSummaryRow, CapabilityChangeRow, CameraGestureRow, PerfSummaryRow, PerfDistributionRow, FpsHistogramRow, FrameTimePercentileRow, JankRateRow, PerfByDeviceRow, PerfBySceneRow, ResourcePercentileRow, StabilityCountRow, PerfDailyRow, EventsDailyRow, SceneRow, TimeseriesBucketRow, EventTypeCountRow, CoverageVoxelRow, CameraDistanceBucketRow, NavigationStatsRow, XrRotationRateRow, XrSourceUsageRow, XrAbandonmentRow, InteractionSourceRow, } from "./query/types.js";
|
|
24
25
|
export { createDuckdbClient, convertValue } from "./duckdb/client.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ export { toNodeSampleRow, nodeSampleRowToEvent } from "./events.js";
|
|
|
17
17
|
// --- Engine-neutral metadata helpers and types (ADR 0020) ---
|
|
18
18
|
export { hashApiKey, apiKeyPrefix, generateApiKey } from "./metadata.js";
|
|
19
19
|
export { duckdbDialect, toDuckdbTimestamp } from "./query/duckdbDialect.js";
|
|
20
|
+
export { clickhouseDialect, toClickhouseTimestamp } from "./query/clickhouseDialect.js";
|
|
20
21
|
export { buildListSessions, buildPointerHeatmap, buildWorldHeatmap, buildGazeHeatmap, buildCameraDirectionHeatmap, buildCameraPositionHeatmap, buildSessionTrajectory, buildClickGazeRay, buildFlowHeatmap, buildTopMeshes, buildMeshDwell, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildPerfDaily, buildEventsDaily, buildDistinctScenes, buildTimeseries, buildEventTypeCounts, buildSceneCoverage, buildCameraDistance, buildNavigationStats, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildInteractionsBySource, } from "./query/aggregations.js";
|
|
21
22
|
// --- DuckDB (OSS single-file store, ADR 0020) ---
|
|
22
23
|
export { createDuckdbClient, convertValue } from "./duckdb/client.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,sDAAsD;AACtD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG7D,kFAAkF;AAClF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGpE,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgBzE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAiDjC,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,YAAY,IAAI,kBAAkB,EAClC,gBAAgB,IAAI,sBAAsB,EAC1C,mBAAmB,IAAI,yBAAyB,EAChD,cAAc,IAAI,oBAAoB,GACvC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,IAAI,mBAAmB,EACpC,UAAU,IAAI,gBAAgB,EAC9B,YAAY,IAAI,kBAAkB,EAClC,aAAa,IAAI,mBAAmB,GACrC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,IAAI,sBAAsB,EAC1C,sBAAsB,IAAI,4BAA4B,EACtD,wBAAwB,IAAI,8BAA8B,GAC3D,MAAM,2BAA2B,CAAC;AAEnC,iDAAiD;AACjD,8EAA8E;AAC9E,kFAAkF;AAClF,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,sDAAsD;AACtD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG7D,kFAAkF;AAClF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGpE,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgBzE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAiDjC,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,YAAY,IAAI,kBAAkB,EAClC,gBAAgB,IAAI,sBAAsB,EAC1C,mBAAmB,IAAI,yBAAyB,EAChD,cAAc,IAAI,oBAAoB,GACvC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,IAAI,mBAAmB,EACpC,UAAU,IAAI,gBAAgB,EAC9B,YAAY,IAAI,kBAAkB,EAClC,aAAa,IAAI,mBAAmB,GACrC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,IAAI,sBAAsB,EAC1C,sBAAsB,IAAI,4BAA4B,EACtD,wBAAwB,IAAI,8BAA8B,GAC3D,MAAM,2BAA2B,CAAC;AAEnC,iDAAiD;AACjD,8EAA8E;AAC9E,kFAAkF;AAClF,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -454,7 +454,7 @@ export function buildMeshDwell(projectId, opts, d) {
|
|
|
454
454
|
FROM events
|
|
455
455
|
WHERE project_id = ${pid} AND event_type = 'mesh_visibility' AND mesh != ''${range}${scene}${session}
|
|
456
456
|
GROUP BY mesh
|
|
457
|
-
ORDER BY visible_ms DESC
|
|
457
|
+
ORDER BY sum(visible_ms) DESC
|
|
458
458
|
LIMIT ${limit}
|
|
459
459
|
`,
|
|
460
460
|
query_params: bag.values,
|
|
@@ -1042,7 +1042,7 @@ export function buildEventsDaily(projectId, opts, d) {
|
|
|
1042
1042
|
FROM events_daily
|
|
1043
1043
|
WHERE project_id = ${pid}${range}
|
|
1044
1044
|
GROUP BY day, event_type
|
|
1045
|
-
ORDER BY day DESC, events DESC
|
|
1045
|
+
ORDER BY day DESC, sum(events) DESC
|
|
1046
1046
|
LIMIT ${limit}
|
|
1047
1047
|
`,
|
|
1048
1048
|
query_params: bag.values,
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickHouse dialect for the query layer (ADR 0020).
|
|
3
|
+
*
|
|
4
|
+
* ClickHouse is the optional single-tenant scale engine: a columnar, concurrent
|
|
5
|
+
* store for self-hosters who outgrow DuckDB's single-writer file. This dialect
|
|
6
|
+
* renders the engine-specific fragments of each shared aggregation
|
|
7
|
+
* (`aggregations.ts`) to ClickHouse SQL, so the bulk of every query stays shared
|
|
8
|
+
* with DuckDB.
|
|
9
|
+
*
|
|
10
|
+
* Like the DuckDB dialect, it is *single-tenant* — it carries no
|
|
11
|
+
* `org_id`/tenant-isolation concerns — which keeps it relocatable across the
|
|
12
|
+
* open-core boundary.
|
|
13
|
+
*
|
|
14
|
+
* Binding model: parameters are emitted as ClickHouse typed placeholders
|
|
15
|
+
* (`{name:Type}`) and supplied to `@clickhouse/client` as a `query_params`
|
|
16
|
+
* record. Timestamp params are bound as naive-UTC `DateTime64(3)` strings (see
|
|
17
|
+
* {@link toClickhouseTimestamp}); DuckDB binds the same literal form, so both
|
|
18
|
+
* engines order and bucket time identically.
|
|
19
|
+
*
|
|
20
|
+
* Rollup note: the single-tenant store exposes the daily rollups as plain
|
|
21
|
+
* ClickHouse views (not `AggregatingMergeTree` materialized views — those are
|
|
22
|
+
* the scale tier), pre-grouped by `(project_id, …, day)`. Each read GROUP BY
|
|
23
|
+
* therefore sees one source row per group, so the `-Merge` combinators reduce to
|
|
24
|
+
* a plain pass-through aggregate of the precomputed value, mirroring the DuckDB
|
|
25
|
+
* view strategy.
|
|
26
|
+
*/
|
|
27
|
+
import type { Dialect } from "./dialect.js";
|
|
28
|
+
/**
|
|
29
|
+
* Format an epoch-millisecond timestamp as a naive-UTC `YYYY-MM-DD HH:MM:SS.mmm`
|
|
30
|
+
* string for binding to a ClickHouse `DateTime64(3)` column/param. Mirrors the
|
|
31
|
+
* DuckDB `TIMESTAMP` literal format so both stores order and bucket time
|
|
32
|
+
* identically (both treat the naive literal as UTC).
|
|
33
|
+
*/
|
|
34
|
+
export declare function toClickhouseTimestamp(epochMs: number): string;
|
|
35
|
+
export declare const clickhouseDialect: Dialect;
|
|
36
|
+
//# sourceMappingURL=clickhouseDialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouseDialect.d.ts","sourceRoot":"","sources":["../../src/query/clickhouseDialect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,cAAc,CAAC;AAkBvD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED,eAAO,MAAM,iBAAiB,EAAE,OA2D/B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickHouse dialect for the query layer (ADR 0020).
|
|
3
|
+
*
|
|
4
|
+
* ClickHouse is the optional single-tenant scale engine: a columnar, concurrent
|
|
5
|
+
* store for self-hosters who outgrow DuckDB's single-writer file. This dialect
|
|
6
|
+
* renders the engine-specific fragments of each shared aggregation
|
|
7
|
+
* (`aggregations.ts`) to ClickHouse SQL, so the bulk of every query stays shared
|
|
8
|
+
* with DuckDB.
|
|
9
|
+
*
|
|
10
|
+
* Like the DuckDB dialect, it is *single-tenant* — it carries no
|
|
11
|
+
* `org_id`/tenant-isolation concerns — which keeps it relocatable across the
|
|
12
|
+
* open-core boundary.
|
|
13
|
+
*
|
|
14
|
+
* Binding model: parameters are emitted as ClickHouse typed placeholders
|
|
15
|
+
* (`{name:Type}`) and supplied to `@clickhouse/client` as a `query_params`
|
|
16
|
+
* record. Timestamp params are bound as naive-UTC `DateTime64(3)` strings (see
|
|
17
|
+
* {@link toClickhouseTimestamp}); DuckDB binds the same literal form, so both
|
|
18
|
+
* engines order and bucket time identically.
|
|
19
|
+
*
|
|
20
|
+
* Rollup note: the single-tenant store exposes the daily rollups as plain
|
|
21
|
+
* ClickHouse views (not `AggregatingMergeTree` materialized views — those are
|
|
22
|
+
* the scale tier), pre-grouped by `(project_id, …, day)`. Each read GROUP BY
|
|
23
|
+
* therefore sees one source row per group, so the `-Merge` combinators reduce to
|
|
24
|
+
* a plain pass-through aggregate of the precomputed value, mirroring the DuckDB
|
|
25
|
+
* view strategy.
|
|
26
|
+
*/
|
|
27
|
+
/** Map a logical {@link ParamType} to its ClickHouse parameter type name. */
|
|
28
|
+
function chParamType(type) {
|
|
29
|
+
switch (type) {
|
|
30
|
+
case "string":
|
|
31
|
+
return "String";
|
|
32
|
+
case "u32":
|
|
33
|
+
return "UInt32";
|
|
34
|
+
case "f64":
|
|
35
|
+
return "Float64";
|
|
36
|
+
case "timestamp":
|
|
37
|
+
return "DateTime64(3)";
|
|
38
|
+
case "date":
|
|
39
|
+
return "Date";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Format an epoch-millisecond timestamp as a naive-UTC `YYYY-MM-DD HH:MM:SS.mmm`
|
|
44
|
+
* string for binding to a ClickHouse `DateTime64(3)` column/param. Mirrors the
|
|
45
|
+
* DuckDB `TIMESTAMP` literal format so both stores order and bucket time
|
|
46
|
+
* identically (both treat the naive literal as UTC).
|
|
47
|
+
*/
|
|
48
|
+
export function toClickhouseTimestamp(epochMs) {
|
|
49
|
+
const d = new Date(epochMs);
|
|
50
|
+
const p = (n, w = 2) => String(n).padStart(w, "0");
|
|
51
|
+
return (`${d.getUTCFullYear()}-${p(d.getUTCMonth() + 1)}-${p(d.getUTCDate())} ` +
|
|
52
|
+
`${p(d.getUTCHours())}:${p(d.getUTCMinutes())}:${p(d.getUTCSeconds())}.${p(d.getUTCMilliseconds(), 3)}`);
|
|
53
|
+
}
|
|
54
|
+
export const clickhouseDialect = {
|
|
55
|
+
name: "clickhouse",
|
|
56
|
+
placeholder(name, type) {
|
|
57
|
+
return `{${name}:${chParamType(type)}}`;
|
|
58
|
+
},
|
|
59
|
+
timestampValue(epochMs) {
|
|
60
|
+
return toClickhouseTimestamp(epochMs);
|
|
61
|
+
},
|
|
62
|
+
quantile(expr, q) {
|
|
63
|
+
// Plain `quantile` does type-7 linear interpolation between adjacent ranks,
|
|
64
|
+
// matching DuckDB's `quantile_cont`. It is exact (and deterministic) for
|
|
65
|
+
// datasets within the reservoir (≤8192 values); NULLs are ignored, mirroring
|
|
66
|
+
// DuckDB. (`quantileExact` returns an actual element instead of interpolating,
|
|
67
|
+
// so it would diverge from the golden on even-sized inputs.)
|
|
68
|
+
return `quantile(${q})(${expr})`;
|
|
69
|
+
},
|
|
70
|
+
vectorNorm(expr) {
|
|
71
|
+
return `L2Norm(${expr})`;
|
|
72
|
+
},
|
|
73
|
+
avgIf(value, cond) {
|
|
74
|
+
return `avgIf(${value}, ${cond})`;
|
|
75
|
+
},
|
|
76
|
+
anyValue(expr) {
|
|
77
|
+
return `any(${expr})`;
|
|
78
|
+
},
|
|
79
|
+
timeBucketMs(tsExpr, intervalPlaceholder) {
|
|
80
|
+
// toUnixTimestamp64Milli(ts) yields integer milliseconds (UTC); floor to the
|
|
81
|
+
// interval grid to match DuckDB's epoch_ms bucketing.
|
|
82
|
+
return `floor(toUnixTimestamp64Milli(${tsExpr}) / (${intervalPlaceholder} * 1000)) * (${intervalPlaceholder} * 1000)`;
|
|
83
|
+
},
|
|
84
|
+
epochMs(tsExpr) {
|
|
85
|
+
return `toUnixTimestamp64Milli(${tsExpr})`;
|
|
86
|
+
},
|
|
87
|
+
toDate(expr) {
|
|
88
|
+
return `toDate(${expr})`;
|
|
89
|
+
},
|
|
90
|
+
toText(expr) {
|
|
91
|
+
return `toString(${expr})`;
|
|
92
|
+
},
|
|
93
|
+
jsonText(column, ...path) {
|
|
94
|
+
// ClickHouse JSONExtractString takes the nested key path as trailing args.
|
|
95
|
+
const keys = path.map((p) => `'${p}'`).join(", ");
|
|
96
|
+
return `JSONExtractString(${column}, ${keys})`;
|
|
97
|
+
},
|
|
98
|
+
// Single-tenant rollups are plain views (pre-grouped by day), so each group has
|
|
99
|
+
// exactly one source row and the "merge" of a single precomputed value is a
|
|
100
|
+
// plain pass-through aggregate. (AggregatingMergeTree `-Merge` combinators are
|
|
101
|
+
// the scale tier.)
|
|
102
|
+
countMerge(stateExpr) {
|
|
103
|
+
return `sum(${stateExpr})`;
|
|
104
|
+
},
|
|
105
|
+
avgMerge(stateExpr) {
|
|
106
|
+
return `avg(${stateExpr})`;
|
|
107
|
+
},
|
|
108
|
+
quantileMerge(stateExpr, q) {
|
|
109
|
+
return `quantile(${q})(${stateExpr})`;
|
|
110
|
+
},
|
|
111
|
+
asofInnerJoin: "ASOF INNER JOIN",
|
|
112
|
+
asofLeftJoin: "ASOF LEFT JOIN",
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=clickhouseDialect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouseDialect.js","sourceRoot":"","sources":["../../src/query/clickhouseDialect.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED