drizzle-cube 0.5.7 → 0.5.8
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/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +4 -4
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +4 -4
- package/dist/adapters/{handler-Dz1F4iwf.js → handler-Cx8QYLk6.js} +18 -4
- package/dist/adapters/{handler-C63rJUUK.cjs → handler-CzbCuS6_.cjs} +4 -4
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +7 -7
- package/dist/adapters/{locale-gU_d1Wja.js → locale-BPB7flIG.js} +1 -1
- package/dist/adapters/{locale-CTNwPVZI.cjs → locale-tIMrNcCr.cjs} +1 -1
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +2 -2
- package/dist/adapters/mcp-transport-C2QzXm6h.cjs +40 -0
- package/dist/adapters/mcp-transport-D0B3S1tB.js +579 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +4 -4
- package/dist/{server/openai-y7GhJNdn.js → adapters/openai-B5jEiqiB.js} +776 -719
- package/dist/{server/openai-DiVskd89.js → adapters/openai-BZdAA7Ji.js} +1 -1
- package/dist/adapters/openai-D0musiYP.cjs +17 -0
- package/dist/adapters/{openai-6wrBvAnv.cjs → openai-D_U4V0kT.cjs} +1 -1
- package/dist/adapters/{utils-DosuoabY.js → utils-D9JPLmfl.js} +16 -4
- package/dist/adapters/utils-KV37IBIv.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.js +1 -1
- package/dist/client/charts/ChartLoader.d.ts +1 -1
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{DashboardEditModal-6KRE36mm.js → DashboardEditModal-CjCIAT-J.js} +1258 -1050
- package/dist/client/chunks/DashboardEditModal-CjCIAT-J.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-CCpu0C-s.js → RetentionCombinedChart-BPkfcTa8.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-CCpu0C-s.js.map → RetentionCombinedChart-BPkfcTa8.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-B24PiIfr.js → RetentionHeatmap-DGzLzr7h.js} +2 -2
- package/dist/client/chunks/{RetentionHeatmap-B24PiIfr.js.map → RetentionHeatmap-DGzLzr7h.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-zd48FVJO.js → analysis-builder-MuMIzoRq.js} +8 -8
- package/dist/client/chunks/{analysis-builder-zd48FVJO.js.map → analysis-builder-MuMIzoRq.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-x576-O5p.js → analysis-builder-shared-CYVwSPqt.js} +21 -21
- package/dist/client/chunks/{analysis-builder-shared-x576-O5p.js.map → analysis-builder-shared-CYVwSPqt.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-CiHrLH6Y.js → chart-activity-grid-DmruKPab.js} +9 -4
- package/dist/client/chunks/{chart-activity-grid-CiHrLH6Y.js.map → chart-activity-grid-DmruKPab.js.map} +1 -1
- package/dist/client/chunks/{chart-area-CXFK-Grv.js → chart-area-DHCPM4Em.js} +2 -2
- package/dist/client/chunks/{chart-area-CXFK-Grv.js.map → chart-area-DHCPM4Em.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-DKXfLoGG.js → chart-bar-KddciGDv.js} +3 -3
- package/dist/client/chunks/{chart-bar-DKXfLoGG.js.map → chart-bar-KddciGDv.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-Bu9hy-17.js → chart-box-plot-DYKfyOI8.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-Bu9hy-17.js.map → chart-box-plot-DYKfyOI8.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-DGkTQlxM.js → chart-bubble-CfqiB538.js} +2 -2
- package/dist/client/chunks/{chart-bubble-DGkTQlxM.js.map → chart-bubble-CfqiB538.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-Dau5AF4E.js → chart-candlestick-Dwc92Mrj.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-Dau5AF4E.js.map → chart-candlestick-Dwc92Mrj.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-Cm5jrpaw.js → chart-data-table-BO4sXsim.js} +27 -27
- package/dist/client/chunks/{chart-data-table-Cm5jrpaw.js.map → chart-data-table-BO4sXsim.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-Eke8IPtG.js → chart-funnel-DnWRsmnS.js} +2 -2
- package/dist/client/chunks/{chart-funnel-Eke8IPtG.js.map → chart-funnel-DnWRsmnS.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-DeRZNsyl.js → chart-gauge-CgMeqeGb.js} +2 -2
- package/dist/client/chunks/{chart-gauge-DeRZNsyl.js.map → chart-gauge-CgMeqeGb.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-C86thSJ4.js → chart-heat-map-DcGm9SWK.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-C86thSJ4.js.map → chart-heat-map-DcGm9SWK.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-CxOYD2f1.js → chart-kpi-delta-C2wKPqCb.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-CxOYD2f1.js.map → chart-kpi-delta-C2wKPqCb.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-C6gWz-x4.js → chart-kpi-number-gWYF44ol.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-C6gWz-x4.js.map → chart-kpi-number-gWYF44ol.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-dDONrhS-.js → chart-kpi-text-DIYtJtk4.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-dDONrhS-.js.map → chart-kpi-text-DIYtJtk4.js.map} +1 -1
- package/dist/client/chunks/{chart-line-r4iWevKZ.js → chart-line-9BEGN5Ti.js} +3 -3
- package/dist/client/chunks/{chart-line-r4iWevKZ.js.map → chart-line-9BEGN5Ti.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-BPW-EAm9.js → chart-markdown-dgUetjyM.js} +1359 -1240
- package/dist/client/chunks/chart-markdown-dgUetjyM.js.map +1 -0
- package/dist/client/chunks/{chart-measure-profile-BI3kADCp.js → chart-measure-profile-ClfpLs4q.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-BI3kADCp.js.map → chart-measure-profile-ClfpLs4q.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-yqH2YVEI.js → chart-pie-BjAIhyOi.js} +3 -3
- package/dist/client/chunks/{chart-pie-yqH2YVEI.js.map → chart-pie-BjAIhyOi.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-B-_3v-rE.js → chart-radar-Dgkcl2bN.js} +3 -3
- package/dist/client/chunks/{chart-radar-B-_3v-rE.js.map → chart-radar-Dgkcl2bN.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-C0EgzfAF.js → chart-radial-bar-DdWJjAhK.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar-C0EgzfAF.js.map → chart-radial-bar-DdWJjAhK.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-CFzjGvZX.js → chart-sankey-M3XpO_ah.js} +2 -2
- package/dist/client/chunks/{chart-sankey-CFzjGvZX.js.map → chart-sankey-M3XpO_ah.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-DZPirzwX.js → chart-scatter-DaHYP_OL.js} +3 -3
- package/dist/client/chunks/{chart-scatter-DZPirzwX.js.map → chart-scatter-DaHYP_OL.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-91Q2tzaB.js → chart-sunburst-A_u6lqlS.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-91Q2tzaB.js.map → chart-sunburst-A_u6lqlS.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-Bi4axCvh.js → chart-tree-map-uiwUU4nb.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-Bi4axCvh.js.map → chart-tree-map-uiwUU4nb.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-DcHbbPaG.js → chart-waterfall-BuhMoagf.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-DcHbbPaG.js.map → chart-waterfall-BuhMoagf.js.map} +1 -1
- package/dist/client/chunks/{charts-core-CrBDYN6N.js → charts-core-jRtb0S2M.js} +2 -2
- package/dist/client/chunks/{charts-core-CrBDYN6N.js.map → charts-core-jRtb0S2M.js.map} +1 -1
- package/dist/client/chunks/{core-DsAWNRRv.js → core-D7vPfUIe.js} +2 -2
- package/dist/client/chunks/{core-DsAWNRRv.js.map → core-D7vPfUIe.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-oyr2wENY.js → nl-NL-CpVs7ox3.js} +7 -2
- package/dist/client/chunks/{nl-NL-oyr2wENY.js.map → nl-NL-CpVs7ox3.js.map} +1 -1
- package/dist/client/chunks/{schema-visualization-BszcrmZX.js → schema-visualization-DE09kQE3.js} +3 -3
- package/dist/client/chunks/{schema-visualization-BszcrmZX.js.map → schema-visualization-DE09kQE3.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-B5wCDJSj.js → useDirtyStateTracking-CoeQbprt.js} +4 -4
- package/dist/client/chunks/{useDirtyStateTracking-B5wCDJSj.js.map → useDirtyStateTracking-CoeQbprt.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-CCeCYzDm.js → useExplainAI-DlnXWdmz.js} +4 -4
- package/dist/client/chunks/{useExplainAI-CCeCYzDm.js.map → useExplainAI-DlnXWdmz.js.map} +1 -1
- package/dist/client/chunks/{utils-kqa-JIMg.js → utils-CTKNaXS8.js} +3 -3
- package/dist/client/chunks/{utils-kqa-JIMg.js.map → utils-CTKNaXS8.js.map} +1 -1
- package/dist/client/chunks/{vendor-0hJNlZXQ.js → vendor-CPIYyeuD.js} +2 -2
- package/dist/client/chunks/{vendor-0hJNlZXQ.js.map → vendor-CPIYyeuD.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisAIPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisAxisDropZone.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisChartConfigPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterGroup.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterItem.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisFilterSection.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisModeErrorBoundary.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/ExplainAIPanel.d.ts +2 -1
- package/dist/client/components/AnalysisBuilder/FieldDetailPanel.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/FieldSearchItem.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/FieldSearchModal.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/FilterConfigModal.d.ts +2 -1
- package/dist/client/components/AnalysisBuilder/LimitSection.d.ts +1 -1
- package/dist/client/components/AnalysisBuilder/SectionHeading.d.ts +1 -1
- package/dist/client/components/AnalyticsDashboard.d.ts +1 -1
- package/dist/client/components/AnalyticsPage.d.ts +1 -1
- package/dist/client/components/ChartErrorBoundary.d.ts +1 -1
- package/dist/client/components/ChartTypeSelector.d.ts +1 -1
- package/dist/client/components/ColorPaletteSelector.d.ts +1 -1
- package/dist/client/components/DashboardEditModal.d.ts +2 -1
- package/dist/client/components/DashboardFilters/DashboardFilterConfigModal.d.ts +1 -1
- package/dist/client/components/DashboardFilters/DashboardFilterItem.d.ts +1 -1
- package/dist/client/components/DashboardGrid.d.ts +1 -1
- package/dist/client/components/DashboardThumbnailPlaceholder.d.ts +1 -1
- package/dist/client/components/DataBrowser/DataBrowserSidebar.d.ts +1 -1
- package/dist/client/components/DataBrowser/DataBrowserToolbar.d.ts +1 -1
- package/dist/client/components/DataBrowser/index.d.ts +1 -1
- package/dist/client/components/DataHistogram.d.ts +1 -1
- package/dist/client/components/DebugModal.d.ts +1 -1
- package/dist/client/components/DrillBreadcrumb.d.ts +2 -1
- package/dist/client/components/LoadingIndicator.d.ts +1 -1
- package/dist/client/components/MobileStackedLayout.d.ts +1 -1
- package/dist/client/components/PortletAnalysisModal.d.ts +1 -1
- package/dist/client/components/PortletContainer.d.ts +1 -1
- package/dist/client/components/PortletFilterConfigModal.d.ts +6 -4
- package/dist/client/components/RowManagedLayout.d.ts +1 -1
- package/dist/client/components/ScaledGridWrapper.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/CubeNode.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/FieldDetailPanel.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/RelationshipEdge.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/SchemaVisualizationLazy.d.ts +1 -1
- package/dist/client/components/SchemaVisualization/index.d.ts +1 -1
- package/dist/client/components/TextPortletModal.d.ts +1 -1
- package/dist/client/components/charts/AxisFormatControls.d.ts +2 -2
- package/dist/client/components/charts/ChartContainer.d.ts +1 -1
- package/dist/client/components/charts/ChartLegend.d.ts +1 -1
- package/dist/client/components/charts/ChartTooltip.d.ts +1 -1
- package/dist/client/components/charts/MissingDependencyFallback.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardContext.d.ts +2 -2
- package/dist/client/components/dashboard/DashboardCoordinator.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardFilterBar.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardGridSurface.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardModals.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardProvider.d.ts +1 -1
- package/dist/client/components/dashboard/DashboardToolbar.d.ts +1 -1
- package/dist/client/components/dashboard/dashboardGridUtils.d.ts +1 -1
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/dashboard/useDashboardController.d.ts +2 -2
- package/dist/client/hooks/useDashboardHook.d.ts +2 -2
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.d.ts +1 -1
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +15 -15
- package/dist/client/providers/CubeApiProvider.d.ts +1 -1
- package/dist/client/providers/CubeFeaturesProvider.d.ts +1 -1
- package/dist/client/providers/CubeMetaProvider.d.ts +1 -1
- package/dist/client/providers/CubeProvider.d.ts +1 -1
- package/dist/client/providers/I18nProvider.d.ts +1 -1
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/stores/analysisBuilderStore.d.ts +1 -1
- package/dist/client/stores/dashboardStore.d.ts +1 -1
- package/dist/client/stores/dataBrowserStore.d.ts +1 -1
- package/dist/client/stores/notebookStore.d.ts +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types/drill.d.ts +1 -1
- package/dist/client/types.d.ts +7 -2
- package/dist/client/utils/drillQueryBuilder.d.ts +2 -2
- package/dist/client/utils/filterUtils.d.ts +33 -5
- package/dist/client/utils/joinReachability.d.ts +27 -0
- package/dist/client/utils.js +5 -5
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +4 -4
- package/dist/server/index.cjs +6 -6
- package/dist/server/index.d.ts +2 -5050
- package/dist/server/index.js +33 -7
- package/dist/{adapters/openai-y7GhJNdn.js → server/openai-B5jEiqiB.js} +776 -719
- package/dist/{adapters/openai-DiVskd89.js → server/openai-BZdAA7Ji.js} +1 -1
- package/dist/server/openai-D0musiYP.cjs +17 -0
- package/dist/server/{openai-6wrBvAnv.cjs → openai-D_U4V0kT.cjs} +1 -1
- package/dist/server/server/adapters/base-adapter.d.ts +287 -0
- package/dist/server/server/adapters/databend-adapter.d.ts +114 -0
- package/dist/server/server/adapters/duckdb-adapter.d.ts +122 -0
- package/dist/server/server/adapters/mysql-adapter.d.ts +122 -0
- package/dist/server/server/adapters/postgres-adapter.d.ts +119 -0
- package/dist/server/server/adapters/singlestore-adapter.d.ts +4 -0
- package/dist/server/server/adapters/snowflake-adapter.d.ts +116 -0
- package/dist/server/server/adapters/sqlite-adapter.d.ts +140 -0
- package/dist/server/server/agent/chart-validation.d.ts +27 -0
- package/dist/server/server/agent/handler.d.ts +25 -0
- package/dist/server/server/agent/index.d.ts +11 -0
- package/dist/server/server/agent/providers/anthropic.d.ts +24 -0
- package/dist/server/server/agent/providers/factory.d.ts +12 -0
- package/dist/server/server/agent/providers/google.d.ts +23 -0
- package/dist/server/server/agent/providers/index.d.ts +6 -0
- package/dist/server/server/agent/providers/openai.d.ts +26 -0
- package/dist/server/server/agent/providers/types.d.ts +95 -0
- package/dist/server/server/agent/system-prompt.d.ts +5 -0
- package/dist/server/server/agent/tools.d.ts +28 -0
- package/dist/server/server/agent/types.d.ts +192 -0
- package/dist/server/server/ai/discovery.d.ts +62 -0
- package/dist/server/server/ai/index.d.ts +10 -0
- package/dist/server/server/ai/mcp-prompts.d.ts +83 -0
- package/dist/server/server/ai/query-schema.d.ts +258 -0
- package/dist/server/server/ai/schemas.d.ts +63 -0
- package/dist/server/server/ai/suggestion.d.ts +19 -0
- package/dist/server/server/ai/validation.d.ts +34 -0
- package/dist/server/server/builders/comparison-query-builder.d.ts +70 -0
- package/dist/server/server/builders/cte-builder.d.ts +62 -0
- package/dist/server/server/builders/date-time-builder.d.ts +29 -0
- package/dist/server/server/builders/filter-builder.d.ts +23 -0
- package/dist/server/server/builders/flow-query-builder.d.ts +109 -0
- package/dist/server/server/builders/funnel-query-builder.d.ts +134 -0
- package/dist/server/server/builders/group-by-builder.d.ts +27 -0
- package/dist/server/server/builders/index.d.ts +13 -0
- package/dist/server/server/builders/measure-builder.d.ts +142 -0
- package/dist/server/server/builders/retention-query-builder.d.ts +100 -0
- package/dist/server/server/cache-providers/index.d.ts +5 -0
- package/dist/server/server/cache-providers/memory.d.ts +105 -0
- package/dist/server/server/cache-utils.d.ts +65 -0
- package/dist/server/server/compiler.d.ts +218 -0
- package/dist/server/server/cube-utils.d.ts +133 -0
- package/dist/server/server/database-utils.d.ts +18 -0
- package/dist/server/server/executor.d.ts +183 -0
- package/dist/server/server/executors/base-executor.d.ts +16 -0
- package/dist/server/server/executors/databend-executor.d.ts +33 -0
- package/dist/server/server/executors/duckdb-executor.d.ts +33 -0
- package/dist/server/server/executors/index.d.ts +21 -0
- package/dist/server/server/executors/mysql-executor.d.ts +27 -0
- package/dist/server/server/executors/postgres-executor.d.ts +27 -0
- package/dist/server/server/executors/singlestore-executor.d.ts +9 -0
- package/dist/server/server/executors/snowflake-executor.d.ts +33 -0
- package/dist/server/server/executors/sqlite-executor.d.ts +28 -0
- package/dist/server/server/explain/databend-parser.d.ts +16 -0
- package/dist/server/server/explain/duckdb-parser.d.ts +28 -0
- package/dist/server/server/explain/index.d.ts +9 -0
- package/dist/server/server/explain/mysql-parser.d.ts +38 -0
- package/dist/server/server/explain/postgres-parser.d.ts +18 -0
- package/dist/server/server/explain/snowflake-parser.d.ts +17 -0
- package/dist/server/server/explain/sqlite-parser.d.ts +23 -0
- package/dist/server/server/filter-cache.d.ts +73 -0
- package/dist/server/server/gap-filler.d.ts +42 -0
- package/dist/server/server/index.d.ts +36 -0
- package/dist/server/server/logical-plan/index.d.ts +14 -0
- package/dist/server/server/logical-plan/logical-plan-builder.d.ts +58 -0
- package/dist/server/server/logical-plan/logical-planner.d.ts +232 -0
- package/dist/server/server/logical-plan/optimiser.d.ts +32 -0
- package/dist/server/server/logical-plan/types.d.ts +191 -0
- package/dist/server/server/physical-plan/drizzle-plan-builder.d.ts +50 -0
- package/dist/server/server/physical-plan/drizzle-sql-builder.d.ts +107 -0
- package/dist/server/server/physical-plan/index.d.ts +2 -0
- package/dist/server/server/physical-plan/processors/cte-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/index.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/joins-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/predicates-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/selection-processor.d.ts +6 -0
- package/dist/server/server/physical-plan/processors/shared.d.ts +33 -0
- package/dist/server/server/physical-plan/processors/window-processor.d.ts +6 -0
- package/dist/server/server/prompts/explain-analysis-prompt.d.ts +47 -0
- package/dist/server/server/prompts/index.d.ts +27 -0
- package/dist/server/server/prompts/single-step-prompt.d.ts +31 -0
- package/dist/server/server/prompts/step0-validation-prompt.d.ts +39 -0
- package/dist/server/server/prompts/step1-shape-prompt.d.ts +29 -0
- package/dist/server/server/prompts/step2-complete-prompt.d.ts +19 -0
- package/dist/server/server/prompts/types.d.ts +37 -0
- package/dist/server/server/resolvers/calculated-measure-resolver.d.ts +93 -0
- package/dist/server/server/resolvers/index.d.ts +6 -0
- package/dist/server/server/resolvers/join-path-resolver.d.ts +152 -0
- package/dist/server/server/template-substitution.d.ts +57 -0
- package/dist/server/server/types/analysis.d.ts +189 -0
- package/dist/server/server/types/cache.d.ts +132 -0
- package/dist/server/server/types/core.d.ts +164 -0
- package/dist/server/server/types/cube.d.ts +530 -0
- package/dist/server/server/types/executor.d.ts +156 -0
- package/dist/server/server/types/flow.d.ts +143 -0
- package/dist/server/server/types/funnel.d.ts +118 -0
- package/dist/server/server/types/index.d.ts +11 -0
- package/dist/server/server/types/metadata.d.ts +113 -0
- package/dist/server/server/types/query.d.ts +153 -0
- package/dist/server/server/types/retention.d.ts +141 -0
- package/dist/server/server/types/utils.d.ts +11 -0
- package/package.json +5 -5
- package/dist/adapters/mcp-transport-C4J4SAcn.cjs +0 -40
- package/dist/adapters/mcp-transport-CVUiifEc.js +0 -579
- package/dist/adapters/openai-BDwb2u7y.cjs +0 -17
- package/dist/adapters/utils-CkEkU8Bo.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-6KRE36mm.js.map +0 -1
- package/dist/client/chunks/chart-markdown-BPW-EAm9.js.map +0 -1
- package/dist/server/openai-BDwb2u7y.cjs +0 -17
- /package/dist/adapters/{express → adapters/express}/index.d.ts +0 -0
- /package/dist/adapters/{fastify → adapters/fastify}/index.d.ts +0 -0
- /package/dist/adapters/{hono → adapters/hono}/index.d.ts +0 -0
- /package/dist/adapters/{locale.d.ts → adapters/locale.d.ts} +0 -0
- /package/dist/adapters/{mcp-tools.d.ts → adapters/mcp-tools.d.ts} +0 -0
- /package/dist/adapters/{mcp-transport.d.ts → adapters/mcp-transport.d.ts} +0 -0
- /package/dist/adapters/{nextjs → adapters/nextjs}/index.d.ts +0 -0
- /package/dist/adapters/{types.d.ts → adapters/types.d.ts} +0 -0
- /package/dist/adapters/{utils.d.ts → adapters/utils.d.ts} +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step 1: Query Shape Determination Prompt
|
|
3
|
+
*
|
|
4
|
+
* This prompt is used in the first stage of the multi-stage AI query generation flow.
|
|
5
|
+
* It analyzes the user's request to determine:
|
|
6
|
+
* 1. Whether this is a regular query or funnel query
|
|
7
|
+
* 2. Which dimensions need actual values from the database
|
|
8
|
+
*
|
|
9
|
+
* The output of this step determines whether we need to fetch dimension values
|
|
10
|
+
* from the database before generating the final query.
|
|
11
|
+
*
|
|
12
|
+
* @see https://github.com/cliftonc/drizzle-cube/blob/main/src/server/prompts/step1-shape-prompt.ts
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* System prompt for Step 1: Analyze query shape and identify dimensions needing values.
|
|
16
|
+
*
|
|
17
|
+
* Placeholders:
|
|
18
|
+
* - {CUBE_SCHEMA} - JSON-formatted cube schema
|
|
19
|
+
* - {USER_PROMPT} - User's natural language query
|
|
20
|
+
*/
|
|
21
|
+
export declare const STEP1_SYSTEM_PROMPT = "You are analyzing a data query request to determine its structure.\n\nGiven the cube schema and user query, determine:\n1. What type of query this is (regular query or funnel)\n2. What dimensions will need filtering with specific categorical values\n\nCUBE SCHEMA:\n{CUBE_SCHEMA}\n\nRESPONSE FORMAT:\nReturn JSON with:\n{\n \"queryType\": \"query\" | \"funnel\",\n \"dimensionsNeedingValues\": [\"CubeName.dimensionName\", ...],\n \"reasoning\": \"Brief explanation of what dimensions need values and why\"\n}\n\nRULES:\n- For funnels, you'll typically need values for the event type dimension to define the steps\n- For regular queries with categorical filters, list those dimensions where you need to know valid values\n- Only list dimensions where you would otherwise have to guess the filter values\n- If no dimension values are needed (e.g., numeric filters, date ranges, simple aggregations), return empty array\n- Common dimensions needing values: status fields, type fields, category fields, event types\n- Do NOT list dimensions for: date ranges, numeric comparisons, name searches\n\nUSER QUERY:\n{USER_PROMPT}\n\nReturn ONLY valid JSON - no explanations or markdown:";
|
|
22
|
+
/**
|
|
23
|
+
* Build the Step 1 prompt for query shape analysis
|
|
24
|
+
*
|
|
25
|
+
* @param cubeSchema - JSON-formatted cube schema
|
|
26
|
+
* @param userPrompt - User's natural language query
|
|
27
|
+
* @returns Complete prompt ready to send to AI
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildStep1Prompt(cubeSchema: string, userPrompt: string): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DimensionValues } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* System prompt for Step 2: Generate final query with actual dimension values.
|
|
4
|
+
*
|
|
5
|
+
* Placeholders:
|
|
6
|
+
* - {CUBE_SCHEMA} - JSON-formatted cube schema
|
|
7
|
+
* - {USER_PROMPT} - User's natural language query
|
|
8
|
+
* - {DIMENSION_VALUES} - JSON object of dimension names to their actual values
|
|
9
|
+
*/
|
|
10
|
+
export declare const STEP2_SYSTEM_PROMPT = "Complete the data query using actual dimension values from the database.\n\nORIGINAL USER REQUEST: {USER_PROMPT}\n\nCUBE SCHEMA:\n{CUBE_SCHEMA}\n\nAVAILABLE DIMENSION VALUES (from the actual database):\n{DIMENSION_VALUES}\n\nComplete the query using ONLY the values listed above for any dimension filters.\nDo NOT invent or guess filter values - use exactly what's available.\nMatch user intent to the closest available values (e.g., if user says \"opened\" but only \"created\" exists, use \"created\").\n\nRESPONSE FORMAT (same as single-step):\n{\n \"query\": { /* Cube.js query OR funnel query with actual filter values */ },\n \"chartType\": \"line\"|\"bar\"|\"area\"|\"pie\"|\"scatter\"|\"bubble\"|\"table\"|\"funnel\",\n \"chartConfig\": {\n \"xAxis\": string[],\n \"yAxis\": string[],\n \"series\": string[],\n \"sizeField\": string,\n \"colorField\": string\n }\n}\n\nFUNNEL QUERY STRUCTURE (if queryType was \"funnel\"):\n{\n \"funnel\": {\n \"bindingKey\": \"PREvents.prNumber\",\n \"timeDimension\": \"PREvents.timestamp\",\n \"steps\": [\n {\n \"name\": \"Created\",\n \"filter\": [\n { \"member\": \"PREvents.eventType\", \"operator\": \"equals\", \"values\": [\"created\"] },\n { \"member\": \"PREvents.timestamp\", \"operator\": \"inDateRange\", \"values\": [\"last 6 months\"] }\n ]\n },\n {\n \"name\": \"Merged\",\n \"filter\": { \"member\": \"PREvents.eventType\", \"operator\": \"equals\", \"values\": [\"merged\"] }\n }\n ],\n \"includeTimeMetrics\": true\n }\n}\n\nCRITICAL FILTER FORMAT RULES:\n- filter MUST be a flat array of filter objects: [{ member, operator, values }, ...]\n- filter MUST NOT be nested arrays: NOT [[{ member, operator, values }]]\n- For a single filter, use object format: { \"member\": \"...\", \"operator\": \"...\", \"values\": [...] }\n- For multiple filters on step 0, use flat array: [{ filter1 }, { filter2 }] (NOT [[filter1, filter2]])\n- The time filter (inDateRange) goes ONLY on step 0's filter, not on other steps.\n\nReturn ONLY valid JSON - no explanations or markdown:";
|
|
11
|
+
/**
|
|
12
|
+
* Build the Step 2 prompt with actual dimension values from the database
|
|
13
|
+
*
|
|
14
|
+
* @param cubeSchema - JSON-formatted cube schema
|
|
15
|
+
* @param userPrompt - User's natural language query
|
|
16
|
+
* @param dimensionValues - Actual dimension values fetched from database
|
|
17
|
+
* @returns Complete prompt ready to send to AI
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildStep2Prompt(cubeSchema: string, userPrompt: string, dimensionValues: DimensionValues): string;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for AI prompt building
|
|
3
|
+
*
|
|
4
|
+
* These types define the structure of data passed between the multi-stage
|
|
5
|
+
* AI query generation flow.
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/cliftonc/drizzle-cube/blob/main/src/server/prompts/types.ts
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Context required to build any AI prompt
|
|
11
|
+
*/
|
|
12
|
+
export interface PromptContext {
|
|
13
|
+
/** JSON-formatted cube schema with measures, dimensions, and relationships */
|
|
14
|
+
cubeSchema: string;
|
|
15
|
+
/** The user's natural language query */
|
|
16
|
+
userPrompt: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Actual dimension values fetched from the database
|
|
20
|
+
* Used in Step 2 to provide real values for filter generation
|
|
21
|
+
*/
|
|
22
|
+
export interface DimensionValues {
|
|
23
|
+
/** Map of dimension name to array of distinct values */
|
|
24
|
+
[dimensionName: string]: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result from Step 1: Query shape analysis
|
|
28
|
+
* Determines what type of query to generate and what dimension values are needed
|
|
29
|
+
*/
|
|
30
|
+
export interface Step1Result {
|
|
31
|
+
/** Type of query to generate */
|
|
32
|
+
queryType: 'query' | 'funnel';
|
|
33
|
+
/** Dimensions that need actual values from the database for filters */
|
|
34
|
+
dimensionsNeedingValues: string[];
|
|
35
|
+
/** AI's reasoning for why these dimensions need values */
|
|
36
|
+
reasoning: string;
|
|
37
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Cube, Measure } from '../types/cube';
|
|
2
|
+
/**
|
|
3
|
+
* Dependency information for a calculated measure
|
|
4
|
+
*/
|
|
5
|
+
export interface MeasureDependency {
|
|
6
|
+
/** Full measure name (e.g., "Cube.measure" or "measure") */
|
|
7
|
+
measureName: string;
|
|
8
|
+
/** Referenced cube name (null if same cube) */
|
|
9
|
+
cubeName: string | null;
|
|
10
|
+
/** Referenced field name */
|
|
11
|
+
fieldName: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Calculated Measure Resolver
|
|
15
|
+
* Manages dependency resolution for calculated measures
|
|
16
|
+
*/
|
|
17
|
+
export declare class CalculatedMeasureResolver {
|
|
18
|
+
private dependencyGraph;
|
|
19
|
+
private cubes;
|
|
20
|
+
constructor(cubes: Map<string, Cube> | Cube);
|
|
21
|
+
/**
|
|
22
|
+
* Extract {member} references from calculatedSql template
|
|
23
|
+
* Supports both {measure} and {Cube.measure} syntax
|
|
24
|
+
*
|
|
25
|
+
* @param calculatedSql - Template string with {member} references
|
|
26
|
+
* @returns Array of dependency information
|
|
27
|
+
*/
|
|
28
|
+
extractDependencies(calculatedSql: string): MeasureDependency[];
|
|
29
|
+
/**
|
|
30
|
+
* Build dependency graph for all calculated measures in a cube
|
|
31
|
+
*
|
|
32
|
+
* @param cube - The cube containing measures
|
|
33
|
+
*/
|
|
34
|
+
buildGraph(cube: Cube): void;
|
|
35
|
+
/**
|
|
36
|
+
* Build dependency graph for multiple cubes
|
|
37
|
+
*
|
|
38
|
+
* @param cubes - Map of cubes to analyze
|
|
39
|
+
*/
|
|
40
|
+
buildGraphForMultipleCubes(cubes: Map<string, Cube>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate in-degree for each node (number of measures depending on it)
|
|
43
|
+
*/
|
|
44
|
+
private calculateInDegrees;
|
|
45
|
+
/**
|
|
46
|
+
* Perform topological sort using Kahn's algorithm
|
|
47
|
+
* Returns measures in dependency order (dependencies first)
|
|
48
|
+
*
|
|
49
|
+
* @param measureNames - List of measure names to sort
|
|
50
|
+
* @returns Sorted array of measure names
|
|
51
|
+
* @throws Error if circular dependency detected
|
|
52
|
+
*/
|
|
53
|
+
topologicalSort(measureNames: string[]): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Detect circular dependencies using DFS
|
|
56
|
+
* Returns the cycle path if found, null otherwise
|
|
57
|
+
*
|
|
58
|
+
* @returns Array representing the cycle, or null
|
|
59
|
+
*/
|
|
60
|
+
detectCycle(): string[] | null;
|
|
61
|
+
/**
|
|
62
|
+
* DFS helper for cycle detection
|
|
63
|
+
*/
|
|
64
|
+
private dfs;
|
|
65
|
+
/**
|
|
66
|
+
* Get all dependencies for a specific measure (direct and transitive)
|
|
67
|
+
*
|
|
68
|
+
* @param measureName - Full measure name (e.g., "Cube.measure")
|
|
69
|
+
* @returns Set of all dependency measure names
|
|
70
|
+
*/
|
|
71
|
+
getAllDependencies(measureName: string): Set<string>;
|
|
72
|
+
/**
|
|
73
|
+
* Validate that all dependencies exist
|
|
74
|
+
*
|
|
75
|
+
* @param cube - The cube to validate
|
|
76
|
+
* @throws Error if dependencies are missing
|
|
77
|
+
*/
|
|
78
|
+
validateDependencies(cube: Cube): void;
|
|
79
|
+
/**
|
|
80
|
+
* Auto-populate dependencies array for calculated measures
|
|
81
|
+
* Updates the measure objects with detected dependencies
|
|
82
|
+
*
|
|
83
|
+
* @param cube - The cube to update
|
|
84
|
+
*/
|
|
85
|
+
populateDependencies(cube: Cube): void;
|
|
86
|
+
/**
|
|
87
|
+
* Check if a measure is a calculated measure
|
|
88
|
+
*
|
|
89
|
+
* @param measure - The measure to check
|
|
90
|
+
* @returns True if the measure is calculated
|
|
91
|
+
*/
|
|
92
|
+
static isCalculatedMeasure(measure: Measure): boolean;
|
|
93
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Cube, CubeJoin } from '../types';
|
|
2
|
+
import { SQL } from 'drizzle-orm';
|
|
3
|
+
/**
|
|
4
|
+
* Internal representation of a join path step
|
|
5
|
+
* Used during path finding - simpler than the public JoinPathStep analysis type
|
|
6
|
+
*/
|
|
7
|
+
export interface InternalJoinPathStep {
|
|
8
|
+
/** Source cube name */
|
|
9
|
+
fromCube: string;
|
|
10
|
+
/** Target cube name */
|
|
11
|
+
toCube: string;
|
|
12
|
+
/** The join definition from the source cube */
|
|
13
|
+
joinDef: CubeJoin;
|
|
14
|
+
/** True when this step was discovered via a reversed edge (target cube defines the join back to source) */
|
|
15
|
+
reversed?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Score breakdown for a candidate preferred path.
|
|
19
|
+
*/
|
|
20
|
+
export interface PreferredPathScoreBreakdown {
|
|
21
|
+
preferredJoinBonus: number;
|
|
22
|
+
preferredCubeBonus: number;
|
|
23
|
+
lengthPenalty: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A scored candidate path considered by preferred-path selection.
|
|
27
|
+
*/
|
|
28
|
+
export interface PreferredPathCandidateScore {
|
|
29
|
+
path: InternalJoinPathStep[];
|
|
30
|
+
score: number;
|
|
31
|
+
usesPreferredJoin: boolean;
|
|
32
|
+
preferredCubesInPath: number;
|
|
33
|
+
usesProcessed: boolean;
|
|
34
|
+
scoreBreakdown: PreferredPathScoreBreakdown;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Detailed preferred-path selection output for analysis/debug UIs.
|
|
38
|
+
*/
|
|
39
|
+
export interface PreferredPathSelection {
|
|
40
|
+
strategy: 'preferred' | 'fallbackShortest';
|
|
41
|
+
preferredCubes: string[];
|
|
42
|
+
selectedIndex: number;
|
|
43
|
+
candidates: PreferredPathCandidateScore[];
|
|
44
|
+
selectedPath: InternalJoinPathStep[] | null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolves join paths between cubes and manages connectivity caching.
|
|
48
|
+
* Supports bidirectional path finding: both forward (outgoing) joins and
|
|
49
|
+
* reverse (incoming) joins are traversable. Reversed steps are marked with
|
|
50
|
+
* `reversed: true` so downstream code can adjust join type and analysis.
|
|
51
|
+
*/
|
|
52
|
+
export declare class JoinPathResolver {
|
|
53
|
+
private cubes;
|
|
54
|
+
private connectivityCache;
|
|
55
|
+
/** Maps cubeName → joins that TARGET that cube (incoming edges) */
|
|
56
|
+
private reverseIndex;
|
|
57
|
+
/**
|
|
58
|
+
* @param cubes Map of cube name to cube definition
|
|
59
|
+
*/
|
|
60
|
+
constructor(cubes: Map<string, Cube>);
|
|
61
|
+
/**
|
|
62
|
+
* Build reverse adjacency index: for each cube's outgoing join A→B,
|
|
63
|
+
* store an entry under B pointing back to A.
|
|
64
|
+
*
|
|
65
|
+
* Excludes belongsToMany joins because reversing them requires swapping
|
|
66
|
+
* sourceKey/targetKey in the junction table configuration, which is
|
|
67
|
+
* error-prone. The 2-hop forward path through the junction table handles
|
|
68
|
+
* these relationships correctly.
|
|
69
|
+
*/
|
|
70
|
+
private buildReverseIndex;
|
|
71
|
+
/**
|
|
72
|
+
* Find the shortest join path from source cube to target cube
|
|
73
|
+
* Uses BFS algorithm for optimal path discovery
|
|
74
|
+
*
|
|
75
|
+
* @param fromCube Source cube name
|
|
76
|
+
* @param toCube Target cube name
|
|
77
|
+
* @param alreadyProcessed Set of cubes to exclude from path finding
|
|
78
|
+
* @returns Array of join steps or null if no path exists
|
|
79
|
+
*/
|
|
80
|
+
findPath(fromCube: string, toCube: string, alreadyProcessed?: Set<string>): InternalJoinPathStep[] | null;
|
|
81
|
+
/**
|
|
82
|
+
* Find path that prefers going through specified cubes when possible
|
|
83
|
+
* Used when certain cubes have measures in the query - ensures joins go through
|
|
84
|
+
* the semantically correct path (e.g., through junction tables when their measures are used)
|
|
85
|
+
*
|
|
86
|
+
* IMPORTANT: This method allows paths to go THROUGH already-processed cubes (as intermediate
|
|
87
|
+
* steps) but won't return them as new cubes to add. This is crucial for preferring paths
|
|
88
|
+
* through cubes that have measures (like junction tables).
|
|
89
|
+
*
|
|
90
|
+
* Path scoring priority (highest to lowest):
|
|
91
|
+
* 1. Paths using joins with `preferredFor` that includes the target cube (score +10)
|
|
92
|
+
* 2. Paths going through cubes with measures in the query (score +1 per cube)
|
|
93
|
+
* 3. Paths reusing already-processed cubes
|
|
94
|
+
* 4. Shorter paths
|
|
95
|
+
*
|
|
96
|
+
* @param fromCube Source cube name
|
|
97
|
+
* @param toCube Target cube name
|
|
98
|
+
* @param preferredCubes Set of cube names to prefer in the path (usually cubes with measures)
|
|
99
|
+
* @param alreadyProcessed Set of cubes already in the join plan (can be used as intermediates)
|
|
100
|
+
* @returns Array of join steps or null if no path exists
|
|
101
|
+
*/
|
|
102
|
+
findPathPreferring(fromCube: string, toCube: string, preferredCubes: Set<string>, alreadyProcessed?: Set<string>): InternalJoinPathStep[] | null;
|
|
103
|
+
/**
|
|
104
|
+
* Find preferred path with candidate scoring telemetry.
|
|
105
|
+
* Used by analysis/debug panels to explain planner decisions.
|
|
106
|
+
*/
|
|
107
|
+
findPathPreferringDetailed(fromCube: string, toCube: string, preferredCubes: Set<string>, alreadyProcessed?: Set<string>): PreferredPathSelection;
|
|
108
|
+
/**
|
|
109
|
+
* Find all possible paths between two cubes (up to maxDepth)
|
|
110
|
+
* Used by findPathPreferring to evaluate multiple paths
|
|
111
|
+
*
|
|
112
|
+
* @param fromCube Source cube name
|
|
113
|
+
* @param toCube Target cube name
|
|
114
|
+
* @param alreadyProcessed Set of cubes to exclude from path finding
|
|
115
|
+
* @param maxDepth Maximum path length to search (default 4 to avoid explosion)
|
|
116
|
+
* @returns Array of all valid paths
|
|
117
|
+
*/
|
|
118
|
+
private findAllPaths;
|
|
119
|
+
/**
|
|
120
|
+
* Check if a cube can reach all other cubes in the list via joins
|
|
121
|
+
*
|
|
122
|
+
* @param fromCube Starting cube name
|
|
123
|
+
* @param allCubes List of all cubes that must be reachable
|
|
124
|
+
* @returns true if all cubes are reachable
|
|
125
|
+
*/
|
|
126
|
+
canReachAll(fromCube: string, allCubes: string[]): boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Forward-only path finding (no reverse edges).
|
|
129
|
+
* Used by canReachAll for primary cube selection to preserve join semantics.
|
|
130
|
+
*/
|
|
131
|
+
private findForwardOnlyPath;
|
|
132
|
+
/**
|
|
133
|
+
* Build SQL join condition from join definition
|
|
134
|
+
*
|
|
135
|
+
* @param joinDef The cube join definition
|
|
136
|
+
* @param sourceAlias Optional alias for source table (null uses actual column)
|
|
137
|
+
* @param targetAlias Optional alias for target table (null uses actual column)
|
|
138
|
+
* @returns SQL condition for the join
|
|
139
|
+
*/
|
|
140
|
+
buildJoinCondition(joinDef: CubeJoin, sourceAlias: string | null, targetAlias: string | null): SQL;
|
|
141
|
+
/**
|
|
142
|
+
* Get all reachable cubes from a starting cube
|
|
143
|
+
* Useful for analyzing cube connectivity
|
|
144
|
+
*
|
|
145
|
+
* @param fromCube Starting cube name
|
|
146
|
+
* @returns Set of all reachable cube names
|
|
147
|
+
*/
|
|
148
|
+
getReachableCubes(fromCube: string): Set<string>;
|
|
149
|
+
private getCacheKey;
|
|
150
|
+
private getFromCache;
|
|
151
|
+
private setInCache;
|
|
152
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SQL } from 'drizzle-orm';
|
|
2
|
+
import { Cube, QueryContext } from './types/cube';
|
|
3
|
+
/**
|
|
4
|
+
* Resolved measure SQL builders
|
|
5
|
+
* Maps full measure names (e.g., "Cube.measure") to functions that build their SQL
|
|
6
|
+
* Using functions instead of SQL objects avoids mutation and shared reference issues
|
|
7
|
+
*/
|
|
8
|
+
export type ResolvedMeasures = Map<string, () => SQL>;
|
|
9
|
+
/**
|
|
10
|
+
* Substitution context
|
|
11
|
+
*/
|
|
12
|
+
export interface SubstitutionContext {
|
|
13
|
+
/** The cube being processed */
|
|
14
|
+
cube: Cube;
|
|
15
|
+
/** All available cubes for cross-cube references */
|
|
16
|
+
allCubes: Map<string, Cube>;
|
|
17
|
+
/** Already resolved measure SQL expressions */
|
|
18
|
+
resolvedMeasures: ResolvedMeasures;
|
|
19
|
+
/** Query context for SQL generation */
|
|
20
|
+
queryContext: QueryContext;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Substitute {member} references in calculatedSql template
|
|
24
|
+
*
|
|
25
|
+
* Replaces {member} with the corresponding SQL expression from resolvedMeasures.
|
|
26
|
+
* Supports both same-cube ({measure}) and cross-cube ({Cube.measure}) references.
|
|
27
|
+
*
|
|
28
|
+
* @param calculatedSql - Template string with {member} references
|
|
29
|
+
* @param context - Substitution context
|
|
30
|
+
* @returns SQL expression with substituted values
|
|
31
|
+
* @throws Error if referenced measure is not resolved
|
|
32
|
+
*/
|
|
33
|
+
export declare function substituteTemplate(calculatedSql: string, context: SubstitutionContext): SQL;
|
|
34
|
+
/**
|
|
35
|
+
* Validate calculatedSql template syntax
|
|
36
|
+
*
|
|
37
|
+
* @param calculatedSql - Template string to validate
|
|
38
|
+
* @returns Validation result
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateTemplateSyntax(calculatedSql: string): {
|
|
41
|
+
isValid: boolean;
|
|
42
|
+
errors: string[];
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Check if a template contains any member references
|
|
46
|
+
*
|
|
47
|
+
* @param calculatedSql - Template string to check
|
|
48
|
+
* @returns True if template contains {member} references
|
|
49
|
+
*/
|
|
50
|
+
export declare function hasMemberReferences(calculatedSql: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Get list of all unique member references in a template
|
|
53
|
+
*
|
|
54
|
+
* @param calculatedSql - Template string
|
|
55
|
+
* @returns Array of unique full member names (e.g., ["Cube.measure", "otherMeasure"])
|
|
56
|
+
*/
|
|
57
|
+
export declare function getMemberReferences(calculatedSql: string, currentCube: string): string[];
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Analysis Types
|
|
3
|
+
* Provides transparency into query planning decisions for debugging
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Reason why a cube was selected as primary (FROM table)
|
|
7
|
+
*/
|
|
8
|
+
export type PrimaryCubeSelectionReason = 'most_dimensions' | 'most_connected' | 'alphabetical_fallback' | 'single_cube';
|
|
9
|
+
/**
|
|
10
|
+
* Candidate cube considered for primary selection
|
|
11
|
+
*/
|
|
12
|
+
export interface PrimaryCubeCandidate {
|
|
13
|
+
/** Cube name */
|
|
14
|
+
cubeName: string;
|
|
15
|
+
/** Number of dimensions from this cube in the query */
|
|
16
|
+
dimensionCount: number;
|
|
17
|
+
/** Number of join definitions on this cube */
|
|
18
|
+
joinCount: number;
|
|
19
|
+
/** Whether this cube can reach all other required cubes */
|
|
20
|
+
canReachAll: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Primary cube selection analysis
|
|
24
|
+
*/
|
|
25
|
+
export interface PrimaryCubeAnalysis {
|
|
26
|
+
/** Name of the selected primary cube */
|
|
27
|
+
selectedCube: string;
|
|
28
|
+
/** Reason for selection */
|
|
29
|
+
reason: PrimaryCubeSelectionReason;
|
|
30
|
+
/** Human-readable explanation */
|
|
31
|
+
explanation: string;
|
|
32
|
+
/** Other candidates that were considered */
|
|
33
|
+
candidates?: PrimaryCubeCandidate[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Single step in a join path
|
|
37
|
+
*/
|
|
38
|
+
export interface JoinPathStep {
|
|
39
|
+
/** Source cube name */
|
|
40
|
+
fromCube: string;
|
|
41
|
+
/** Target cube name */
|
|
42
|
+
toCube: string;
|
|
43
|
+
/** Relationship type used (effective, after reversal if applicable) */
|
|
44
|
+
relationship: 'belongsTo' | 'hasOne' | 'hasMany' | 'belongsToMany';
|
|
45
|
+
/** SQL join type that will be used */
|
|
46
|
+
joinType: 'inner' | 'left' | 'right' | 'full';
|
|
47
|
+
/** Join condition columns */
|
|
48
|
+
joinColumns: Array<{
|
|
49
|
+
sourceColumn: string;
|
|
50
|
+
targetColumn: string;
|
|
51
|
+
}>;
|
|
52
|
+
/** Junction table info for belongsToMany */
|
|
53
|
+
junctionTable?: {
|
|
54
|
+
tableName: string;
|
|
55
|
+
sourceColumns: string[];
|
|
56
|
+
targetColumns: string[];
|
|
57
|
+
};
|
|
58
|
+
/** True when this step was discovered via a reversed edge */
|
|
59
|
+
reversed?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Complete join path from primary to target cube
|
|
63
|
+
*/
|
|
64
|
+
export interface JoinPathAnalysis {
|
|
65
|
+
/** Target cube name */
|
|
66
|
+
targetCube: string;
|
|
67
|
+
/** Whether a path was found */
|
|
68
|
+
pathFound: boolean;
|
|
69
|
+
/** The join steps (if found) */
|
|
70
|
+
path?: JoinPathStep[];
|
|
71
|
+
/** Total path length */
|
|
72
|
+
pathLength?: number;
|
|
73
|
+
/** Error message if path not found */
|
|
74
|
+
error?: string;
|
|
75
|
+
/** Cubes that were visited during BFS search */
|
|
76
|
+
visitedCubes?: string[];
|
|
77
|
+
/** Path selection decision and scoring details (when preferred routing is used) */
|
|
78
|
+
selection?: {
|
|
79
|
+
strategy: 'shortest' | 'preferred' | 'fallbackShortest';
|
|
80
|
+
preferredCubes?: string[];
|
|
81
|
+
selectedRank?: number;
|
|
82
|
+
selectedScore?: number;
|
|
83
|
+
candidates?: Array<{
|
|
84
|
+
rank: number;
|
|
85
|
+
score: number;
|
|
86
|
+
usesPreferredJoin: boolean;
|
|
87
|
+
preferredCubesInPath: number;
|
|
88
|
+
usesProcessed: boolean;
|
|
89
|
+
scoreBreakdown: {
|
|
90
|
+
preferredJoinBonus: number;
|
|
91
|
+
preferredCubeBonus: number;
|
|
92
|
+
lengthPenalty: number;
|
|
93
|
+
};
|
|
94
|
+
path: JoinPathStep[];
|
|
95
|
+
}>;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Pre-aggregation CTE analysis
|
|
100
|
+
*/
|
|
101
|
+
/**
|
|
102
|
+
* Reason why a cube requires a CTE
|
|
103
|
+
*/
|
|
104
|
+
export type CTEReason = 'hasMany' | 'fanOutPrevention';
|
|
105
|
+
export interface PreAggregationAnalysis {
|
|
106
|
+
/** Cube being pre-aggregated */
|
|
107
|
+
cubeName: string;
|
|
108
|
+
/** CTE alias in the query */
|
|
109
|
+
cteAlias: string;
|
|
110
|
+
/** Why this cube needs a CTE (human-readable explanation) */
|
|
111
|
+
reason: string;
|
|
112
|
+
/** Typed reason for programmatic use */
|
|
113
|
+
reasonType?: CTEReason;
|
|
114
|
+
/** Measures included in CTE (aggregate measures + window base measures) */
|
|
115
|
+
measures: string[];
|
|
116
|
+
/** Join keys used */
|
|
117
|
+
joinKeys: Array<{
|
|
118
|
+
sourceColumn: string;
|
|
119
|
+
targetColumn: string;
|
|
120
|
+
}>;
|
|
121
|
+
/**
|
|
122
|
+
* Type of CTE:
|
|
123
|
+
* - 'aggregate': Standard CTE with GROUP BY (count, sum, avg, etc.)
|
|
124
|
+
*
|
|
125
|
+
* Note: Window function CTEs are no longer used. Post-aggregation window
|
|
126
|
+
* functions are applied in the outer query after data is aggregated.
|
|
127
|
+
*/
|
|
128
|
+
cteType?: 'aggregate';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Query structure summary
|
|
132
|
+
*/
|
|
133
|
+
export interface QuerySummary {
|
|
134
|
+
/** Query type: 'single_cube', 'multi_cube_join', or 'multi_cube_cte' */
|
|
135
|
+
queryType: 'single_cube' | 'multi_cube_join' | 'multi_cube_cte';
|
|
136
|
+
/** Strategy selected for multiplied-measure handling / multi-fact merge */
|
|
137
|
+
measureStrategy?: 'simple' | 'keysDeduplication' | 'ctePreAggregateFallback' | 'multiFactMerge';
|
|
138
|
+
/** Total number of joins */
|
|
139
|
+
joinCount: number;
|
|
140
|
+
/** Total number of CTEs */
|
|
141
|
+
cteCount: number;
|
|
142
|
+
/** Has hasMany relationships requiring aggregation */
|
|
143
|
+
hasPreAggregation: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Whether query contains post-aggregation window function measures.
|
|
146
|
+
* These window functions (lag, lead, rank, etc.) operate on aggregated
|
|
147
|
+
* data and are applied in the outer query after CTEs.
|
|
148
|
+
*/
|
|
149
|
+
hasWindowFunctions?: boolean;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Structured planner trace for explain/dry-run UIs.
|
|
153
|
+
* Captures key decisions made during logical planning.
|
|
154
|
+
*/
|
|
155
|
+
export interface PlanningTraceStep {
|
|
156
|
+
/** Pipeline phase name */
|
|
157
|
+
phase: 'cube_usage' | 'primary_cube_selection' | 'join_planning' | 'cte_planning' | 'measure_strategy' | 'warnings';
|
|
158
|
+
/** Short summary of what was decided */
|
|
159
|
+
decision: string;
|
|
160
|
+
/** Optional machine-readable details */
|
|
161
|
+
details?: Record<string, unknown>;
|
|
162
|
+
}
|
|
163
|
+
export interface PlanningTrace {
|
|
164
|
+
/** Ordered decision trace */
|
|
165
|
+
steps: PlanningTraceStep[];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Complete query analysis result
|
|
169
|
+
*/
|
|
170
|
+
export interface QueryAnalysis {
|
|
171
|
+
/** Timestamp of analysis */
|
|
172
|
+
timestamp: string;
|
|
173
|
+
/** Number of cubes involved */
|
|
174
|
+
cubeCount: number;
|
|
175
|
+
/** List of all cubes used */
|
|
176
|
+
cubesInvolved: string[];
|
|
177
|
+
/** Primary cube selection details */
|
|
178
|
+
primaryCube: PrimaryCubeAnalysis;
|
|
179
|
+
/** Join path analysis for each joined cube */
|
|
180
|
+
joinPaths: JoinPathAnalysis[];
|
|
181
|
+
/** Pre-aggregation CTE details */
|
|
182
|
+
preAggregations: PreAggregationAnalysis[];
|
|
183
|
+
/** Overall query structure summary */
|
|
184
|
+
querySummary: QuerySummary;
|
|
185
|
+
/** Warnings or potential issues */
|
|
186
|
+
warnings?: string[];
|
|
187
|
+
/** Structured decision trace for debugging and dry-run UIs */
|
|
188
|
+
planningTrace?: PlanningTrace;
|
|
189
|
+
}
|