diff --git a/CHANGELOG.md b/CHANGELOG.md index 94bc830949313..f08231fd8024f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +### Bug Fixes + +- **api-gateway:** Allow messageId to be int in unsubscribe WS request ([#10250](https://github.com/cube-js/cube/issues/10250)) ([1e2e7cb](https://github.com/cube-js/cube/commit/1e2e7cb382bfb95376f1149f9f91608914ff4bc1)) +- **client-ws-transport:** Handle WebSocket close code 1009 (Message Too Big) ([#10246](https://github.com/cube-js/cube/issues/10246)) ([5652f0f](https://github.com/cube-js/cube/commit/5652f0f9e46fe0da942a2f23dbf41f6594fef2b8)) + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) ### Bug Fixes diff --git a/docs/pages/product/administration/users-and-permissions/roles-and-permissions.mdx b/docs/pages/product/administration/users-and-permissions/roles-and-permissions.mdx index 6e9c86e83f08e..d4b4aea901d45 100644 --- a/docs/pages/product/administration/users-and-permissions/roles-and-permissions.mdx +++ b/docs/pages/product/administration/users-and-permissions/roles-and-permissions.mdx @@ -50,7 +50,7 @@ A Viewer role is planned for future implementation with the following capabiliti Agents are connected to Semantic Model Deployments and inherit the permission level of the user they are operating under. Each agent can be configured to use the _Restrict Views_ feature which allows to select the views that are visible to the agent. -This feature should not be used as a security measure. Configure [data access policies][ref-data-access-policies] instead. +This feature should not be used as a security measure. Configure [access policies][ref-data-access-policies] instead. ## Typical Usage Scenarios diff --git a/docs/pages/product/administration/users-and-permissions/user-groups.mdx b/docs/pages/product/administration/users-and-permissions/user-groups.mdx index 0a8a2b49d5ea9..523054210ee0c 100644 --- a/docs/pages/product/administration/users-and-permissions/user-groups.mdx +++ b/docs/pages/product/administration/users-and-permissions/user-groups.mdx @@ -2,7 +2,7 @@ User groups allow you to organize users and manage access collectively. Instead of assigning [user attributes][ref-user-attributes] to individual users, you can add users to groups for easier management at scale. -[Data access policies][ref-dap] can be configured based on groups to control [row-level security][ref-rls]. +[Access policies][ref-dap] can be configured based on groups to control [row-level security][ref-rls]. ## Creating groups diff --git a/docs/pages/product/administration/workspace/sso.mdx b/docs/pages/product/administration/workspace/sso.mdx index 58d99656b4214..4bff1be9a3e29 100644 --- a/docs/pages/product/administration/workspace/sso.mdx +++ b/docs/pages/product/administration/workspace/sso.mdx @@ -8,7 +8,7 @@ Cube Cloud also provides single sign-on (SSO) via identity providers supporting Finally, Cube Cloud provides the [LDAP integration](#ldap-integration), enabling users of [APIs & integrations][ref-apis] to authenticate via an LDAP catalog -and assume roles that work with [data access policies][ref-dap] once [authentication +and assume roles that work with [access policies][ref-dap] once [authentication integration][ref-auth-integration] is enabled. @@ -113,7 +113,7 @@ Use the tooltips in Cube Cloud to get more information about each setting. #### User roles mapping You can configure how user data in an LDAP catalog maps to roles in Cube Cloud. -You can also use mapped roles with [data access policies][ref-dap] once [authentication +You can also use mapped roles with [access policies][ref-dap] once [authentication integration][ref-auth-integration] is enabled. Mapping is performed as follows: @@ -140,7 +140,7 @@ All roles will be available under `cubeCloud.roles` array in the [security conte #### User attributes mapping -You can also bring more user data from an LDAP catalog to use with [data access policies][ref-dap]. +You can also bring more user data from an LDAP catalog to use with [access policies][ref-dap]. Mapping is performed using the rules under Attribute mapping. All mapped attributes and their values will be available under `cubeCloud.userAttributes` diff --git a/docs/pages/product/apis-integrations.mdx b/docs/pages/product/apis-integrations.mdx index a3d486192d02f..da04959182720 100644 --- a/docs/pages/product/apis-integrations.mdx +++ b/docs/pages/product/apis-integrations.mdx @@ -3,107 +3,15 @@ With a rich set of APIs, Cube can power and deliver data to all kinds of data applications. -[Data APIs](#data-apis) are used to run queries against the data model. -Despite varying protocols and query formats, all data APIs share common -[querying concepts][ref-queries]. +Cube provides three types of APIs: - +- **[Embed APIs][ref-embed-apis]** are used to support embedding analytics use cases, including AI-powered chat and signed iframe embedding +- **[Core Data APIs][ref-core-data-apis]** are used to query data from the semantic layer using various protocols +- **Management APIs** - currently the [Orchestration API][ref-orchestration-api] is available to control pre-aggregation refreshes externally -Also, there are [management APIs](#management-apis) to control Cube deployments -externally. - - -## Data APIs - -A few rules of thumb to help you choose an API: - -* To embed chats and dashboards into your applications, use the [embedding][ref-embedding] capabilities. - -* For real-time conversations with AI agents, use the [Chat API][ref-chat-api]. - -* To connect to AI assistants, use the [Model Context Protocol (MCP) server][ref-mcp-server]. - -* To connect to [Microsoft Power BI][ref-powerbi], use the [DAX API][ref-dax-api]. - -* To connect to [Microsoft Excel][ref-excel], use either the [MDX API][ref-mdx-api] -or [Cube Cloud for Excel][ref-cube-cloud-for-excel]. - -* To connect to [Google Sheets][ref-sheets], use [Cube Cloud for Sheets][ref-cube-cloud-for-sheets]. - -* For internal or self-serve [business intelligence][cube-issbi], use -[Semantic Layer Sync][ref-sls] in case it supports your BI tools. -Otherwise, connect via the [SQL API][ref-sql-api] directly. - -* For [embedded analytics][cube-ea] and [real-time analytics][cube-rta], use -[REST API][ref-rest-api] or [GraphQL API][ref-graphql-api]. When using the REST API, -the [JavaScript SDK][ref-js-sdk] can simplify integration with your front-end code. - - - -See this [GitHub issue](https://github.com/cube-js/cube/issues/1744#issuecomment-2291680777) -for an unofficial, community-maintained [client library for Python](https://github.com/mharrisb1/cube-http-client). - - - -### Data modeling - -Support for data modeling features differ across APIs, integrations, and [visualization -tools][ref-viz-tools]. Some of the features with partial support are listed below: - -| Feature | ✅ Supported in | -| --- | --- | -| [Hierarchies][ref-hierarchies] | [Microsoft Power BI][ref-powerbi] via the [DAX API][ref-dax-api]
[Cube Cloud for Excel][ref-cube-cloud-for-excel]
[Cube Cloud for Sheets][ref-cube-cloud-for-sheets]
[Tableau][ref-tableau] via [Semantic Layer Sync][ref-sls]

Also, supported in [Playground][ref-playground] | -| Flat [folders][ref-folders] | [Microsoft Power BI][ref-powerbi] via the [DAX API][ref-dax-api]
[Microsoft Excel][ref-excel] via the [MDX API][ref-mdx-api]
[Cube Cloud for Excel][ref-cube-cloud-for-excel]
[Cube Cloud for Sheets][ref-cube-cloud-for-sheets]
[Tableau][ref-tableau] via [Semantic Layer Sync][ref-sls]
[Apache Superset][ref-superset] via [Semantic Layer Sync][ref-sls]
[Preset][ref-preset] via [Semantic Layer Sync][ref-sls]

Also, supported in [Playground][ref-playground] | -| Nested [folders][ref-folders] | [Microsoft Power BI][ref-powerbi] via the [DAX API][ref-dax-api]
[Microsoft Excel][ref-excel] via the [MDX API][ref-mdx-api] | - -### Authentication methods - -Support for authentication methods differ across APIs, integrations, and [visualization -tools][ref-viz-tools]: - -| Method | ✅ Supported in | -| --- | --- | -| [User name and password][ref-auth-user-pass] | [DAX API][ref-dax-api]
[MDX API][ref-mdx-api]
[Semantic Layer Sync][ref-sls]
[SQL API][ref-sql-api] | -| [Kerberos][ref-auth-kerberos] and [NTLM][ref-auth-ntlm] | [DAX API][ref-dax-api]
[MDX API][ref-mdx-api] | -| [Identity provider][ref-auth-idp] | [Cube Cloud for Excel][ref-cube-cloud-for-excel]
[Cube Cloud for Sheets][ref-cube-cloud-for-sheets] | -| [JSON Web Token][ref-auth-jwt] | [REST API][ref-rest-api]
[GraphQL API][ref-graphql-api] | - -## Management APIs - -In case you'd like Cube to work with data orchestration tools and let them push -changes from upstream data sources to Cube, explore the [Orchestration -API][ref-orchestration-api]. - -[cube-issbi]: https://cube.dev/use-cases/semantic-layer -[cube-ea]: https://cube.dev/use-cases/embedded-analytics -[cube-rta]: https://cube.dev/use-cases/real-time-analytics -[ref-queries]: /product/apis-integrations/queries -[ref-dax-api]: /product/apis-integrations/dax-api -[ref-sql-api]: /product/apis-integrations/sql-api -[ref-rest-api]: /product/apis-integrations/rest-api -[ref-graphql-api]: /product/apis-integrations/graphql-api -[ref-mdx-api]: /product/apis-integrations/mdx-api +[ref-embed-apis]: /product/apis-integrations/embed-apis +[ref-core-data-apis]: /product/apis-integrations/core-data-apis [ref-orchestration-api]: /product/apis-integrations/orchestration-api -[ref-sls]: /product/apis-integrations/semantic-layer-sync -[ref-js-sdk]: /product/apis-integrations/javascript-sdk -[ref-cube-cloud-for-excel]: /product/apis-integrations/microsoft-excel -[ref-cube-cloud-for-sheets]: /product/apis-integrations/google-sheets -[ref-viz-tools]: /product/configuration/visualization-tools -[ref-hierarchies]: /product/data-modeling/reference/hierarchies -[ref-folders]: /product/data-modeling/reference/view#folders -[ref-powerbi]: /product/configuration/visualization-tools/powerbi -[ref-excel]: /product/configuration/visualization-tools/excel -[ref-sheets]: /product/configuration/visualization-tools/google-sheets -[ref-tableau]: /product/configuration/visualization-tools/tableau -[ref-auth-user-pass]: /product/auth/methods/name-password -[ref-auth-idp]: /product/auth/methods/identity-provider -[ref-auth-jwt]: /product/auth/methods/jwt -[ref-auth-kerberos]: /product/auth/methods/kerberos -[ref-auth-ntlm]: /product/auth/methods/ntlm -[ref-superset]: /product/configuration/visualization-tools/superset -[ref-preset]: /product/configuration/visualization-tools/superset -[ref-playground]: /product/workspace/playground -[ref-mcp-server]: /product/apis-integrations/mcp-server -[ref-chat-api]: /product/apis-integrations/chat-api -[ref-embedding]: /product/apis-integrations/embedding \ No newline at end of file +[ref-chat-api]: /product/apis-integrations/embed-apis/chat-api +[ref-generate-session]: /product/apis-integrations/embed-apis/generate-session \ No newline at end of file diff --git a/docs/pages/product/apis-integrations/_meta.js b/docs/pages/product/apis-integrations/_meta.js index 3c844e497e49b..923b98666433b 100644 --- a/docs/pages/product/apis-integrations/_meta.js +++ b/docs/pages/product/apis-integrations/_meta.js @@ -1,16 +1,11 @@ module.exports = { - "queries": "Queries", - "chat-api": "Chat API", + "embed-apis": "Embed APIs", + "core-data-apis": "Core Data APIs", + "orchestration-api": "Orchestration API", "mcp-server": "MCP server", - "dax-api": "DAX API", - "mdx-api": "MDX API", "microsoft-excel": "Cube Cloud for Excel", "google-sheets": "Cube Cloud for Sheets", "semantic-layer-sync": "Semantic Layer Sync", - "sql-api": "SQL API", - "rest-api": "REST API", - "graphql-api": "GraphQL API", "javascript-sdk": "JavaScript SDK", - "orchestration-api": "Orchestration API", "recipes": "Recipes" }; diff --git a/docs/pages/product/apis-integrations/core-data-apis.mdx b/docs/pages/product/apis-integrations/core-data-apis.mdx new file mode 100644 index 0000000000000..d6138861e50da --- /dev/null +++ b/docs/pages/product/apis-integrations/core-data-apis.mdx @@ -0,0 +1,80 @@ +# Core Data APIs + +Core Data APIs enable you to query and retrieve data from your Cube semantic layer using various protocols and formats, including SQL, DAX, MDX, REST, and GraphQL. + +## Choosing the Right API + +* To connect to [Microsoft Power BI][ref-powerbi], use the [DAX API][ref-dax-api] + +* To connect to [Microsoft Excel][ref-excel], use either the [MDX API][ref-mdx-api] or [Cube Cloud for Excel][ref-cube-cloud-for-excel] + +* To connect to [Google Sheets][ref-sheets], use [Cube Cloud for Sheets][ref-cube-cloud-for-sheets] + +* To connect to AI assistants, use the [Model Context Protocol (MCP) server][ref-mcp-server] + +* For internal or self-serve [business intelligence][cube-issbi], use [Semantic Layer Sync][ref-sls] if it supports your BI tools. Otherwise, connect via the [SQL API][ref-sql-api] directly + +* For [embedded analytics][cube-ea] and [real-time analytics][cube-rta], use [REST API][ref-rest-api] or [GraphQL API][ref-graphql-api]. When using the REST API, the [JavaScript SDK][ref-js-sdk] can simplify integration with your front-end code + +All Core Data APIs share common [querying concepts][ref-queries] and support authentication, security contexts, and access policies defined in your semantic layer. + + + +See this [GitHub issue](https://github.com/cube-js/cube/issues/1744#issuecomment-2291680777) +for an unofficial, community-maintained [client library for Python](https://github.com/mharrisb1/cube-http-client). + + + +## Data modeling + +Support for data modeling features differ across APIs, integrations, and [visualization +tools][ref-viz-tools]. Some of the features with partial support are listed below: + +| Feature | ✅ Supported in | +| --- | --- | +| [Hierarchies][ref-hierarchies] | [Microsoft Power BI][ref-powerbi] via the [DAX API][ref-dax-api]
[Cube Cloud for Excel][ref-cube-cloud-for-excel]
[Cube Cloud for Sheets][ref-cube-cloud-for-sheets]
[Tableau][ref-tableau] via [Semantic Layer Sync][ref-sls]

Also, supported in [Playground][ref-playground] | +| Flat [folders][ref-folders] | [Microsoft Power BI][ref-powerbi] via the [DAX API][ref-dax-api]
[Microsoft Excel][ref-excel] via the [MDX API][ref-mdx-api]
[Cube Cloud for Excel][ref-cube-cloud-for-excel]
[Cube Cloud for Sheets][ref-cube-cloud-for-sheets]
[Tableau][ref-tableau] via [Semantic Layer Sync][ref-sls]
[Apache Superset][ref-superset] via [Semantic Layer Sync][ref-sls]
[Preset][ref-preset] via [Semantic Layer Sync][ref-sls]

Also, supported in [Playground][ref-playground] | +| Nested [folders][ref-folders] | [Microsoft Power BI][ref-powerbi] via the [DAX API][ref-dax-api]
[Microsoft Excel][ref-excel] via the [MDX API][ref-mdx-api] | + +## Authentication methods + +Support for authentication methods differ across APIs, integrations, and [visualization +tools][ref-viz-tools]: + +| Method | ✅ Supported in | +| --- | --- | +| [User name and password][ref-auth-user-pass] | [DAX API][ref-dax-api]
[MDX API][ref-mdx-api]
[Semantic Layer Sync][ref-sls]
[SQL API][ref-sql-api] | +| [Kerberos][ref-auth-kerberos] and [NTLM][ref-auth-ntlm] | [DAX API][ref-dax-api]
[MDX API][ref-mdx-api] | +| [Identity provider][ref-auth-idp] | [Cube Cloud for Excel][ref-cube-cloud-for-excel]
[Cube Cloud for Sheets][ref-cube-cloud-for-sheets] | +| [JSON Web Token][ref-auth-jwt] | [REST API][ref-rest-api]
[GraphQL API][ref-graphql-api] | + +[cube-issbi]: https://cube.dev/use-cases/semantic-layer +[cube-ea]: https://cube.dev/use-cases/embedded-analytics +[cube-rta]: https://cube.dev/use-cases/real-time-analytics +[ref-queries]: /product/apis-integrations/core-data-apis/queries +[ref-sql-api]: /product/apis-integrations/core-data-apis/sql-api +[ref-dax-api]: /product/apis-integrations/core-data-apis/dax-api +[ref-mdx-api]: /product/apis-integrations/core-data-apis/mdx-api +[ref-rest-api]: /product/apis-integrations/core-data-apis/rest-api +[ref-graphql-api]: /product/apis-integrations/core-data-apis/graphql-api +[ref-sls]: /product/apis-integrations/semantic-layer-sync +[ref-js-sdk]: /product/apis-integrations/javascript-sdk +[ref-cube-cloud-for-excel]: /product/apis-integrations/microsoft-excel +[ref-cube-cloud-for-sheets]: /product/apis-integrations/google-sheets +[ref-mcp-server]: /product/apis-integrations/mcp-server +[ref-viz-tools]: /product/configuration/visualization-tools +[ref-hierarchies]: /product/data-modeling/reference/hierarchies +[ref-folders]: /product/data-modeling/reference/view#folders +[ref-powerbi]: /product/configuration/visualization-tools/powerbi +[ref-excel]: /product/configuration/visualization-tools/excel +[ref-sheets]: /product/configuration/visualization-tools/google-sheets +[ref-tableau]: /product/configuration/visualization-tools/tableau +[ref-auth-user-pass]: /product/auth/methods/name-password +[ref-auth-idp]: /product/auth/methods/identity-provider +[ref-auth-jwt]: /product/auth/methods/jwt +[ref-auth-kerberos]: /product/auth/methods/kerberos +[ref-auth-ntlm]: /product/auth/methods/ntlm +[ref-superset]: /product/configuration/visualization-tools/superset +[ref-preset]: /product/configuration/visualization-tools/superset +[ref-playground]: /product/administration/workspace/playground + diff --git a/docs/pages/product/apis-integrations/core-data-apis/_meta.js b/docs/pages/product/apis-integrations/core-data-apis/_meta.js new file mode 100644 index 0000000000000..59d6106e797ed --- /dev/null +++ b/docs/pages/product/apis-integrations/core-data-apis/_meta.js @@ -0,0 +1,9 @@ +module.exports = { + "queries": "Queries", + "sql-api": "SQL API", + "dax-api": "DAX API", + "mdx-api": "MDX API", + "rest-api": "REST API", + "graphql-api": "GraphQL API" +}; + diff --git a/docs/pages/product/apis-integrations/dax-api.mdx b/docs/pages/product/apis-integrations/core-data-apis/dax-api.mdx similarity index 100% rename from docs/pages/product/apis-integrations/dax-api.mdx rename to docs/pages/product/apis-integrations/core-data-apis/dax-api.mdx diff --git a/docs/pages/product/apis-integrations/dax-api/_meta.js b/docs/pages/product/apis-integrations/core-data-apis/dax-api/_meta.js similarity index 100% rename from docs/pages/product/apis-integrations/dax-api/_meta.js rename to docs/pages/product/apis-integrations/core-data-apis/dax-api/_meta.js diff --git a/docs/pages/product/apis-integrations/dax-api/reference.mdx b/docs/pages/product/apis-integrations/core-data-apis/dax-api/reference.mdx similarity index 100% rename from docs/pages/product/apis-integrations/dax-api/reference.mdx rename to docs/pages/product/apis-integrations/core-data-apis/dax-api/reference.mdx diff --git a/docs/pages/product/apis-integrations/graphql-api.mdx b/docs/pages/product/apis-integrations/core-data-apis/graphql-api.mdx similarity index 100% rename from docs/pages/product/apis-integrations/graphql-api.mdx rename to docs/pages/product/apis-integrations/core-data-apis/graphql-api.mdx diff --git a/docs/pages/product/apis-integrations/graphql-api/_meta.js b/docs/pages/product/apis-integrations/core-data-apis/graphql-api/_meta.js similarity index 100% rename from docs/pages/product/apis-integrations/graphql-api/_meta.js rename to docs/pages/product/apis-integrations/core-data-apis/graphql-api/_meta.js diff --git a/docs/pages/product/apis-integrations/graphql-api/reference.mdx b/docs/pages/product/apis-integrations/core-data-apis/graphql-api/reference.mdx similarity index 100% rename from docs/pages/product/apis-integrations/graphql-api/reference.mdx rename to docs/pages/product/apis-integrations/core-data-apis/graphql-api/reference.mdx diff --git a/docs/pages/product/apis-integrations/mdx-api.mdx b/docs/pages/product/apis-integrations/core-data-apis/mdx-api.mdx similarity index 100% rename from docs/pages/product/apis-integrations/mdx-api.mdx rename to docs/pages/product/apis-integrations/core-data-apis/mdx-api.mdx diff --git a/docs/pages/product/apis-integrations/queries.mdx b/docs/pages/product/apis-integrations/core-data-apis/queries.mdx similarity index 100% rename from docs/pages/product/apis-integrations/queries.mdx rename to docs/pages/product/apis-integrations/core-data-apis/queries.mdx diff --git a/docs/pages/product/apis-integrations/rest-api.mdx b/docs/pages/product/apis-integrations/core-data-apis/rest-api.mdx similarity index 100% rename from docs/pages/product/apis-integrations/rest-api.mdx rename to docs/pages/product/apis-integrations/core-data-apis/rest-api.mdx diff --git a/docs/pages/product/apis-integrations/rest-api/_meta.js b/docs/pages/product/apis-integrations/core-data-apis/rest-api/_meta.js similarity index 100% rename from docs/pages/product/apis-integrations/rest-api/_meta.js rename to docs/pages/product/apis-integrations/core-data-apis/rest-api/_meta.js diff --git a/docs/pages/product/apis-integrations/rest-api/query-format.mdx b/docs/pages/product/apis-integrations/core-data-apis/rest-api/query-format.mdx similarity index 100% rename from docs/pages/product/apis-integrations/rest-api/query-format.mdx rename to docs/pages/product/apis-integrations/core-data-apis/rest-api/query-format.mdx diff --git a/docs/pages/product/apis-integrations/rest-api/reference.mdx b/docs/pages/product/apis-integrations/core-data-apis/rest-api/reference.mdx similarity index 100% rename from docs/pages/product/apis-integrations/rest-api/reference.mdx rename to docs/pages/product/apis-integrations/core-data-apis/rest-api/reference.mdx diff --git a/docs/pages/product/apis-integrations/sql-api.mdx b/docs/pages/product/apis-integrations/core-data-apis/sql-api.mdx similarity index 100% rename from docs/pages/product/apis-integrations/sql-api.mdx rename to docs/pages/product/apis-integrations/core-data-apis/sql-api.mdx diff --git a/docs/pages/product/apis-integrations/sql-api/_meta.js b/docs/pages/product/apis-integrations/core-data-apis/sql-api/_meta.js similarity index 100% rename from docs/pages/product/apis-integrations/sql-api/_meta.js rename to docs/pages/product/apis-integrations/core-data-apis/sql-api/_meta.js diff --git a/docs/pages/product/apis-integrations/sql-api/joins.mdx b/docs/pages/product/apis-integrations/core-data-apis/sql-api/joins.mdx similarity index 100% rename from docs/pages/product/apis-integrations/sql-api/joins.mdx rename to docs/pages/product/apis-integrations/core-data-apis/sql-api/joins.mdx diff --git a/docs/pages/product/apis-integrations/sql-api/query-format.mdx b/docs/pages/product/apis-integrations/core-data-apis/sql-api/query-format.mdx similarity index 100% rename from docs/pages/product/apis-integrations/sql-api/query-format.mdx rename to docs/pages/product/apis-integrations/core-data-apis/sql-api/query-format.mdx diff --git a/docs/pages/product/apis-integrations/sql-api/reference.mdx b/docs/pages/product/apis-integrations/core-data-apis/sql-api/reference.mdx similarity index 100% rename from docs/pages/product/apis-integrations/sql-api/reference.mdx rename to docs/pages/product/apis-integrations/core-data-apis/sql-api/reference.mdx diff --git a/docs/pages/product/apis-integrations/sql-api/security.mdx b/docs/pages/product/apis-integrations/core-data-apis/sql-api/security.mdx similarity index 100% rename from docs/pages/product/apis-integrations/sql-api/security.mdx rename to docs/pages/product/apis-integrations/core-data-apis/sql-api/security.mdx diff --git a/docs/pages/product/apis-integrations/embed-apis.mdx b/docs/pages/product/apis-integrations/embed-apis.mdx new file mode 100644 index 0000000000000..5d838683f4798 --- /dev/null +++ b/docs/pages/product/apis-integrations/embed-apis.mdx @@ -0,0 +1,18 @@ +# Embed APIs + +Embed APIs enable you to integrate Cube's analytics capabilities directly into your applications with secure, session-based authentication. + +## Available APIs + +### [Chat API][ref-chat-api] + +API-first approach to build custom Analytics Chat experiences. Use this API to programmatically integrate AI-powered conversations with your data into your applications. + +### [Generate Session][ref-generate-session] + +Create secure, temporary sessions for embedding Cube content. Use sessions to authenticate users for [signed embedding][ref-embedding] without exposing API keys. + +[ref-chat-api]: /product/apis-integrations/embed-apis/chat-api +[ref-generate-session]: /product/apis-integrations/embed-apis/generate-session +[ref-embedding]: /product/presentation/embedding/signed-embedding + diff --git a/docs/pages/product/apis-integrations/embed-apis/_meta.js b/docs/pages/product/apis-integrations/embed-apis/_meta.js new file mode 100644 index 0000000000000..f56a3ce3ac390 --- /dev/null +++ b/docs/pages/product/apis-integrations/embed-apis/_meta.js @@ -0,0 +1,5 @@ +module.exports = { + "chat-api": "Chat API", + "generate-session": "Generate Session" +}; + diff --git a/docs/pages/product/apis-integrations/chat-api.mdx b/docs/pages/product/apis-integrations/embed-apis/chat-api.mdx similarity index 81% rename from docs/pages/product/apis-integrations/chat-api.mdx rename to docs/pages/product/apis-integrations/embed-apis/chat-api.mdx index 0de3d82dea47d..59493c524544a 100644 --- a/docs/pages/product/apis-integrations/chat-api.mdx +++ b/docs/pages/product/apis-integrations/embed-apis/chat-api.mdx @@ -2,18 +2,23 @@ The Chat API enables real-time conversations with AI agents for analytics and data exploration. - + -The Chat API is available in Cube Cloud on [Premium and above](https://cube.dev/pricing) product tiers. +The Chat API is available on [Premium and Enterprise plans](https://cube.dev/pricing). - + ## Endpoint + +The endpoint has the following structure: + ``` -https://ai.gcp-us-central1.cubecloud.dev/api/v1/public/{tenantName}/agents/{agentId}/chat/stream-chat-state +https://ai.{cloudRegion}.cubecloud.dev/api/v1/public/{accountName}/agents/{agentId}/chat/stream-chat-state ``` +Copy the exact Chat API URL from your agent settings (**Chat API URL** field) in Admin → Agents. + ## Overview @@ -21,57 +26,18 @@ The Chat API enables real-time streaming conversations with Cube's AI agents. Th ## Authentication -Use the session-based authentication flow: - -1. **Generate a session** using your [API key][ref-api-keys]. This endpoint will automatically create (insert) or update the external user based on the `externalId` provided: - Accounts are limited to 10,000 external users. To increase this limit, please contact support. -```javascript -const session = await fetch('https://your-tenant.cubecloud.dev/api/v1/embed/generate-session', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Api-Key ${API_KEY}', - }, - body: JSON.stringify({ - externalId: 'user@example.com', - userAttributes: [ // optional - { - name: 'city', - value: 'San Francisco' - } - ] - }), -}); - -const { sessionId } = await session.json(); -``` - -2. **Exchange session ID for a token**: +Pass your [API key][ref-api-keys] directly to the Chat API endpoint. The session will be created automatically based on the `externalId` provided: ```javascript -const tokenResponse = await fetch('https://your-tenant.cubecloud.dev/api/v1/embed/session/token', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Api-Key ${API_KEY}', - }, - body: JSON.stringify({ sessionId }), -}); - -const { token } = await tokenResponse.json(); -``` +// Copy the Chat API URL from your agent settings (Admin → Agents → Chat API URL field) +const CHAT_API_URL = 'YOUR_CHAT_API_URL'; -## Direct API Key Authentication - -For simpler integration, you can pass the API key directly to the Chat API endpoint. The session will be created automatically: - -```javascript const response = await fetch( - 'https://ai.gcp-us-central1.cubecloud.dev/v1/public/{tenantName}/agents/{agentId}/chat/stream-chat-state', + CHAT_API_URL, { method: 'POST', headers: { @@ -153,21 +119,34 @@ The attributes passed during session generation become available as `userAttribu ## Endpoint Reference -Endpoint URL can be found in settings of an Agent but typically it would be defined as following: +**POST** -**POST** `/api/v1/public/{tenantName}/agents/{agentId}/chat/stream-chat-state` +``` +https://ai.{cloudRegion}.cubecloud.dev/api/v1/public/{accountName}/agents/{agentId}/chat/stream-chat-state +``` + + + +Copy the complete Chat API URL from your agent settings (**Chat API URL** field) in Admin → Agents. -**Base URL:** `https://ai.gcp-us-central1.cubecloud.dev` + ### Path Parameters -- **`tenantName`** (string, required): The tenant identifier (e.g., "acme"). It is in your account URL, e.g. https://acme.cubecloud.dev +- **`cloudRegion`** (string): The cloud region identifier (e.g., "gcp-us-central1") +- **`accountName`** (string, required): The account identifier (e.g., "acme"). It is in your account URL, e.g. https://acme.cubecloud.dev - **`agentId`** (string, required): The AI agent identifier (e.g., "1"). You can find it in Admin → Agents → Click on Agent row in the table. ### Request Body -- **`chatId`** (string, required): Unique identifier for the chat session. We recommend generating a UUID for this. -- **`input`** (string): User message or query to send to the AI agent, e.g. "What is our revenue last month?" +- **`input`** (string): User message or query to send to the AI agent, e.g. "What is our revenue last month?". If omitted, returns current state of thread with provided `chatId`. +- **`chatId`** (string): Chat thread ID. If omitted, a new thread is created automatically. If provided, it should match the previously returned `chatId` from a message with id `__cutoff__`. +- **`sessionSettings`** (object, required): Session configuration for the user + - **`externalId`** (string, required): Unique identifier for the user + - **`email`** (string): User's email address + - **`userAttributes`** (array): Array of `{name, value}` pairs for row-level security + - **`groups`** (string[]): Array of group names for user + - **`securityContext`** (object): Custom security context object passed to Cube queries ## Response Format @@ -748,60 +727,43 @@ When an error occurs, the `result` property of the toolCall will contain an `err ```bash cURL -curl -X POST "https://ai.gcp-us-central1.cubecloud.dev/api/v1/public/cloud/agents/2/chat/stream-chat-state" \ +# Copy YOUR_CHAT_API_URL from your agent settings (Admin → Agents → Chat API URL field) +curl -X POST "YOUR_CHAT_API_URL" \ -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_SESSION_TOKEN" \ + -H "Authorization: Api-Key YOUR_API_KEY" \ -d '{ - "chatId": "chat-session-123", - "input": "Show me revenue trends for the last 6 months" + "input": "Show me revenue trends for the last 6 months", + "sessionSettings": { + "externalId": "user@example.com" + } }' ``` ```javascript JavaScript -// First, get a session token -const session = await fetch('https://your-tenant.cubecloud.dev/api/v1/embed/generate-session', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Api-Key ${API_KEY}', - }, - body: JSON.stringify({ - externalId: 'user@example.com', - email: 'user@example.com', - userAttributes: [ - { - name: 'city', - value: 'San Francisco' - } - ] - }), -}); - -const { sessionId } = await session.json(); - -const tokenResponse = await fetch('https://your-tenant.cubecloud.dev/api/v1/embed/session/token', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Api-Key ${API_KEY}', - }, - body: JSON.stringify({ sessionId }), -}); - -const { token } = await tokenResponse.json(); +// Copy the Chat API URL from your agent settings (Admin → Agents → Chat API URL field) +const CHAT_API_URL = 'YOUR_CHAT_API_URL'; +const API_KEY = 'YOUR_API_KEY'; -// Now use the token to make the chat request const response = await fetch( - 'https://ai.gcp-us-central1.cubecloud.dev/api/v1/public/cloud/agents/2/chat/stream-chat-state', + CHAT_API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` + 'Authorization': `Api-Key ${API_KEY}` }, body: JSON.stringify({ - chatId: 'chat-session-123', - input: 'Hello, how can you help me analyze our data?' + input: 'Hello, how can you help me analyze our data?', + sessionSettings: { + externalId: 'user@example.com', + email: 'user@example.com', // optional + userAttributes: [ // optional + { + name: 'city', + value: 'San Francisco' + } + ] + } }) } ); @@ -835,42 +797,30 @@ while (true) { import requests import json -# First, get a session token -session_url = "https://your-tenant.cubecloud.dev/api/v1/embed/generate-session" -session_headers = { - "Content-Type": "application/json", - "Authorization": f"Api-Key {api_key}" -} - -session_response = requests.post(session_url, headers=session_headers, json={ - "externalId": "user@example.com", - "email": "user@example.com", - "userAttributes": [ - { - "name": "city", - "value": "San Francisco" - } - ] -}) -session_id = session_response.json()["sessionId"] - -token_url = "https://your-tenant.cubecloud.dev/api/v1/embed/session/token" -token_response = requests.post(token_url, headers=session_headers, json={"sessionId": session_id}) -token = token_response.json()["token"] +# Copy the Chat API URL from your agent settings (Admin → Agents → Chat API URL field) +CHAT_API_URL = "YOUR_CHAT_API_URL" +API_KEY = "YOUR_API_KEY" -# Now use the token to make the chat request -url = "https://ai.gcp-us-central1.cubecloud.dev/api/v1/public/cloud/agents/2/chat/stream-chat-state" headers = { "Content-Type": "application/json", - "Authorization": f"Bearer {token}" + "Authorization": f"Api-Key {API_KEY}" } data = { - "chatId": "chat-session-123", - "input": "What are our top performing products?" + "input": "What are our top performing products?", + "sessionSettings": { + "externalId": "user@example.com", + "email": "user@example.com", # optional + "userAttributes": [ # optional + { + "name": "city", + "value": "San Francisco" + } + ] + } } -response = requests.post(url, headers=headers, json=data, stream=True) +response = requests.post(CHAT_API_URL, headers=headers, json=data, stream=True) for line in response.iter_lines(): if line: @@ -882,9 +832,9 @@ for line in response.iter_lines(): ## Error Handling -- **401 Unauthorized**: Invalid or missing JWT token. Verify your token is properly signed and not expired. +- **401 Unauthorized**: Invalid or missing API key. Verify your API key is correct and has the necessary permissions. - **400 Bad Request**: Invalid request body or parameters. Check required fields and data types. -- **404 Not Found**: Agent or tenant not found. Verify the tenantName and agentId parameters. +- **404 Not Found**: Agent or tenant not found. Verify the Chat API URL from your agent settings. - **500 Internal Server Error**: Server processing error. Contact support if the issue persists. diff --git a/docs/pages/product/apis-integrations/embed-apis/generate-session.mdx b/docs/pages/product/apis-integrations/embed-apis/generate-session.mdx new file mode 100644 index 0000000000000..e81aa2f4bb2a2 --- /dev/null +++ b/docs/pages/product/apis-integrations/embed-apis/generate-session.mdx @@ -0,0 +1,134 @@ +# Generate Session + +The Generate Session API provides secure, session-based authentication for [signed embedding][ref-signed-embedding]. This API creates temporary sessions that allow external users to access embedded dashboards and visualizations without exposing your API keys. + + + +The Generate Session API is available on [Premium and Enterprise plans](https://cube.dev/pricing). + + + +## Authentication + +The Generate Session API requires your [Cube Cloud API key][ref-api-keys] for authentication. + +## Endpoint + +``` +POST https://{accountName}.cubecloud.dev/api/v1/embed/generate-session +``` + +### Request Headers + +| Header | Value | Required | +|--------|-------|----------| +| `Content-Type` | `application/json` | Yes | +| `Authorization` | `Api-Key YOUR_API_KEY` | Yes | + +### Request Body + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `externalId` | string | Yes | Unique identifier for the external user | +| `email` | string | No | User's email address | +| `userAttributes` | array | No | Array of `{name, value}` pairs for row-level security | +| `groups` | string[] | No | Array of group names for user | +| `securityContext` | object | No | Custom security context object passed to Cube queries | + + + +Accounts are limited to 10,000 external users. To increase this limit, please contact support. + + + +### Response + +The API returns a session object: + +```json +{ + "sessionId": "abc123def456..." +} +``` + +| Field | Type | Description | +|-------|------|-------------| +| `sessionId` | string | Unique session identifier to use for embedding content | + +Use the `sessionId` directly in your embed URL to authenticate and load content securely. + +## Code Example + + + +```javascript JavaScript +const API_KEY = 'YOUR_API_KEY'; +const ACCOUNT_NAME = 'your-account'; + +// Generate a session on your server +const response = await fetch( + `https://${ACCOUNT_NAME}.cubecloud.dev/api/v1/embed/generate-session`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Api-Key ${API_KEY}` + }, + body: JSON.stringify({ + externalId: 'user@example.com', + email: 'user@example.com', + userAttributes: [ + { name: 'department', value: 'Sales' } + ] + }) + } +); + +const { sessionId } = await response.json(); +``` + +```python Python +import requests + +API_KEY = 'YOUR_API_KEY' +ACCOUNT_NAME = 'your-account' + +# Generate a session on your server +response = requests.post( + f'https://{ACCOUNT_NAME}.cubecloud.dev/api/v1/embed/generate-session', + headers={ + 'Content-Type': 'application/json', + 'Authorization': f'Api-Key {API_KEY}' + }, + json={ + 'externalId': 'user@example.com', + 'email': 'user@example.com', + 'userAttributes': [ + {'name': 'department', 'value': 'Sales'} + ] + } +) + +session_id = response.json()['sessionId'] +``` + +```bash cURL +curl -X POST "https://your-account.cubecloud.dev/api/v1/embed/generate-session" \ + -H "Content-Type: application/json" \ + -H "Authorization: Api-Key YOUR_API_KEY" \ + -d '{ + "externalId": "user@example.com", + "email": "user@example.com", + "userAttributes": [ + {"name": "department", "value": "Sales"} + ] + }' +``` + + + +Use session ID in [signed embedding][ref-signed-embedding]. + +[ref-api-keys]: /product/administration/workspace/api-keys +[ref-signed-embedding]: /product/presentation/embedding/signed-embedding + diff --git a/docs/pages/product/apis-integrations/mcp-server.mdx b/docs/pages/product/apis-integrations/mcp-server.mdx index 27dd79c01364e..7034d8cd21af7 100644 --- a/docs/pages/product/apis-integrations/mcp-server.mdx +++ b/docs/pages/product/apis-integrations/mcp-server.mdx @@ -2,11 +2,11 @@ The Cube MCP (Model Context Protocol) server provides seamless integration with AI assistants like Claude Desktop and Cursor, enabling direct chat functionality with Cube's AI agent for analytics and data exploration. - + -The MCP server is available in Cube Cloud on [Premium and above](https://cube.dev/pricing) product tiers. +The MCP server is available on [Premium and Enterprise plans](https://cube.dev/pricing). - + ## What is MCP? @@ -29,26 +29,21 @@ Before setting up the MCP server, ensure you have: ### 1. Obtain Required Credentials -You'll need four key pieces of information: +You'll need three key pieces of information: -#### `CUBE_API_KEY` - -- Go to Admin → API Keys to create and manage [API keys][ref-api-keys]. -- Create a new API key for your Cube organization. - -#### `CUBE_TENANT_NAME` +#### `CUBE_CHAT_API_URL` -- Your tenant name from the URL (e.g., 'acme' in `https://acme.cubecloud.dev`) +- Copy the complete Chat API URL from your agent settings (**Chat API URL** field) in Admin → Agents → Click on Agent +- This is the full endpoint URL for your agent -#### `CUBE_AGENT_ID` +#### `CUBE_API_KEY` -- Go to Admin → Agent → Click on Agent to find the Agent ID +- Navigate to Admin → Agents → Click on Agent → Enable API Key #### `USER_ID` -- Can be the email address of a registered user in your Cube instance -- Or any custom unique identifier for unregistered users -- This helps identify and personalize responses from the AI agent +- A unique identifier for the user (e.g., email address or user ID) +- Used for session settings and personalization ## Configuration @@ -62,9 +57,8 @@ Add the following configuration to your Claude Desktop or Cursor MCP settings: "command": "npx", "args": ["@cube-dev/mcp-server"], "env": { + "CUBE_CHAT_API_URL": "https://ai.{cloudRegion}.cubecloud.dev/api/v1/public/{accountName}/agents/{agentId}/chat/stream-chat-state", "CUBE_API_KEY": "your_api_key_here", - "CUBE_TENANT_NAME": "your_tenant_name", - "CUBE_AGENT_ID": "your_agent_id", "USER_ID": "user@example.com" } } @@ -82,5 +76,11 @@ Ask natural language questions about your data: - _What are our top-performing products this quarter?_ - _How does customer acquisition compare year-over-year?_ +The server will stream real-time analytics responses with data visualizations and SQL queries. + +## How It Works + +The MCP server integrates with Cube's [Chat API][ref-chat-api] using API key authentication directly. The Chat API URL should be copied from your agent settings in the Cube admin panel to ensure you're using the correct dynamic endpoint for your deployment. -[ref-api-keys]: /product/workspace/api-keys \ No newline at end of file +[ref-api-keys]: /product/administration/workspace/api-keys +[ref-chat-api]: /product/apis-integrations/embed-apis/chat-api \ No newline at end of file diff --git a/docs/pages/product/auth.mdx b/docs/pages/product/auth.mdx index 0da48b025d25a..d9acfb3843138 100644 --- a/docs/pages/product/auth.mdx +++ b/docs/pages/product/auth.mdx @@ -7,7 +7,7 @@ Cube has a data access control layer built into the data model. Access control i **Cube** cloud platform provides built-in authentication abstractions alongside [user attributes][ref-user-attributes] and groups for managing data access. **Cube Core** users can control the [security context][ref-sec-ctx] directly to implement authentication. -Authorization is based on [data access policies][ref-dap] and dynamic controls for advanced use cases. +Authorization is based on [access policies][ref-dap] and dynamic controls for advanced use cases. [ref-user-attributes]: /product/administration/users-and-permissions/user-attributes diff --git a/docs/pages/product/auth/_meta.js b/docs/pages/product/auth/_meta.js index 4a156cf9c3af7..eb57108b63900 100644 --- a/docs/pages/product/auth/_meta.js +++ b/docs/pages/product/auth/_meta.js @@ -3,6 +3,5 @@ module.exports = { "row-level-security": "Row-level security", "member-level-security": "Member-level security", "methods": "Cube Core Authentication", - "context": "Security context", - "recipes": "Recipes" + "context": "Security context" } \ No newline at end of file diff --git a/docs/pages/product/auth/context.mdx b/docs/pages/product/auth/context.mdx index 17501fa7b2b2d..40d6955fe2043 100644 --- a/docs/pages/product/auth/context.mdx +++ b/docs/pages/product/auth/context.mdx @@ -308,6 +308,227 @@ Authentication integration is available in Cube Cloud on [all product tiers](htt You can enable the authentication integration by navigating to the Settings → Configuration of your Cube Cloud deployment and using the Enable Cloud Auth Integration toggle. +## Common patterns + +### Enforcing mandatory filters + +You can use `query_rewrite` to enforce mandatory filters that apply to all queries. This is useful when you need to ensure certain conditions are always met, such as filtering data by date range or restricting access to specific data subsets. + +For example, if you want to only show orders created after a specific date across all queries, you can add a mandatory filter: + + + +```python +from cube import config + +@config('query_rewrite') +def query_rewrite(query: dict, ctx: dict) -> dict: + query['filters'].append({ + 'member': 'orders.created_at', + 'operator': 'afterDate', + 'values': ['2019-12-30'] + }) + return query +``` + +```javascript +module.exports = { + queryRewrite: (query) => { + query.filters.push({ + member: `orders.created_at`, + operator: "afterDate", + values: ["2019-12-30"] + }) + + return query + } +} +``` + + + +This filter will be automatically applied to all queries, ensuring that only orders created after December 30th, 2019 are returned, regardless of any other filters specified in the query. + +### Enforcing role-based access + +You can use `query_rewrite` to enforce role-based access control by filtering data based on the user's role from the security context. + +For example, to restrict access so that users with the `operator` role can only view processing orders, while users with the `manager` role can only view shipped and completed orders: + + + +```python +from cube import config + +@config('query_rewrite') +def query_rewrite(query: dict, ctx: dict) -> dict: + if not ctx['securityContext'].get('role'): + raise ValueError("No role found in Security Context!") + + role = ctx['securityContext']['role'] + + if role == "manager": + query['filters'].append({ + 'member': 'orders.status', + 'operator': 'equals', + 'values': ['shipped', 'completed'] + }) + elif role == "operator": + query['filters'].append({ + 'member': 'orders.status', + 'operator': 'equals', + 'values': ['processing'] + }) + + return query +``` + +```javascript +module.exports = { + queryRewrite: (query, { securityContext }) => { + if (!securityContext.role) { + throw new Error("No role found in Security Context!") + } + + if (securityContext.role == "manager") { + query.filters.push({ + member: "orders.status", + operator: "equals", + values: ["shipped", "completed"] + }) + } + + if (securityContext.role == "operator") { + query.filters.push({ + member: "orders.status", + operator: "equals", + values: ["processing"] + }) + } + + return query + } +} +``` + + + +### Enforcing column-based access + +You can use `query_rewrite` to enforce column-based access control by filtering data based on relationships and user attributes from the security context. + +For example, to restrict suppliers to only see their own products based on their email: + + + +```python +from cube import config + +@config('query_rewrite') +def query_rewrite(query: dict, ctx: dict) -> dict: + cube_names = [ + *(query.get('dimensions', [])), + *(query.get('measures', [])) + ] + cube_names = [e.split(".")[0] for e in cube_names] + + if "products" in cube_names: + email = ctx['securityContext'].get('email') + if not email: + raise ValueError("No email found in Security Context!") + + query['filters'].append({ + 'member': 'suppliers.email', + 'operator': 'equals', + 'values': [email] + }) + + return query +``` + +```javascript +module.exports = { + queryRewrite: (query, { securityContext }) => { + const cubeNames = [ + ...(query.dimensions || []), + ...(query.measures || []) + ].map((e) => e.split(".")[0]) + + if (cubeNames.includes("products")) { + if (!securityContext.email) { + throw new Error("No email found in Security Context!") + } + + query.filters.push({ + member: `suppliers.email`, + operator: "equals", + values: [securityContext.email] + }) + } + + return query + } +} +``` + + + +### Controlling access to cubes and views + +You can use `extend_context` and `COMPILE_CONTEXT` to control access to cubes and views based on user properties from the security context. + +For example, to make a view accessible only to users with a `department` claim set to `finance`: + + + +```python +from cube import config + +@config('extend_context') +def extend_context(ctx: dict) -> dict: + return { + 'securityContext': { + **ctx['securityContext'], + 'isFinance': ctx['securityContext'].get('department') == 'finance' + } + } +``` + +```javascript +module.exports = { + extendContext: ({ securityContext }) => { + return { + securityContext: { + ...securityContext, + isFinance: securityContext.department === "finance" + } + } + } +} +``` + + + +Then in your data model, use `COMPILE_CONTEXT` to control visibility: + + + +```yaml +views: + - name: total_revenue_per_customer + public: {{ COMPILE_CONTEXT['securityContext']['isFinance'] }} + # ... +``` + +```javascript +view(`total_revenue_per_customer`, { + public: COMPILE_CONTEXT.securityContext.isFinance, + // ... +}) +``` + + + [link-auth0-jwks]: https://auth0.com/docs/tokens/json-web-tokens/json-web-key-sets diff --git a/docs/pages/product/auth/data-access-policies.mdx b/docs/pages/product/auth/data-access-policies.mdx index 3ff7bcd617a38..83636387c0da0 100644 --- a/docs/pages/product/auth/data-access-policies.mdx +++ b/docs/pages/product/auth/data-access-policies.mdx @@ -1,46 +1,13 @@ -# Data access policies +# Access policies -Data access policies provide a holistic mechanism to manage [member-level](#member-level-access) -and [row-level](#row-level-access) security for different [data access roles](#data-access-roles). +Access policies provide a holistic mechanism to manage [member-level](#member-level-access) +and [row-level](#row-level-access) security for different user groups. You can define access control rules in data model files, allowing for an organized and maintainable approach to security. - - -## Data access roles - -Each request to Cube includes a [security context][ref-sec-ctx], which can contain -information about the user. You can use the [`context_to_roles` configuration -option][ref-ctx-to-roles] to derive the user's roles from the security context: - - - -```python -from cube import config - -@config('context_to_roles') -def context_to_roles(ctx: dict) -> list[str]: - return ctx['securityContext'].get('roles', ['default']) -``` - -```javascript -module.exports = { - contextToRoles: ({ securityContext }) => { - return securityContext.roles || ['default'] - } -} -``` - - - -A user can have more than one role. - ## Policies -You can define policies that target specific roles and contain member-level and (or) +You can define policies that target specific groups and contain member-level and (or) row-level security rules: @@ -51,19 +18,17 @@ cubes: # ... access_policy: - # For the `manager` role, + # For the `manager` group, # allow access to all members # but filter rows by the user's country - - role: manager - conditions: - - if: "{ securityContext.is_EMEA_based }" + - group: manager member_level: includes: "*" row_level: filters: - member: country operator: equals - values: [ "{ securityContext.country }" ] + values: [ "{ userAttributes.country }" ] ``` ```javascript @@ -72,20 +37,17 @@ cube(`orders`, { access_policy: [ { - // For all roles, restrict access entirely - role: `*`, + // For all groups, restrict access entirely + group: `*`, member_level: { includes: [] } }, { - // For the `manager` role, + // For the `manager` group, // allow access to all members // but filter rows by the user's country - role: `manager`, - conditions: [ - { if: securityContext.is_EMEA_based } - ], + group: `manager`, member_level: { includes: `*` }, @@ -94,7 +56,7 @@ cube(`orders`, { { member: `country`, operator: `equals`, - values: [ securityContext.country ] + values: [ userAttributes.country ] } ] } @@ -105,26 +67,23 @@ cube(`orders`, { -You can define data access policies both in cubes and views. If you use views, -it is recommended to keep all your cubes private and define access policies in views only. -It will make your security rules easier to maintain and reason about, especially -when it comes to [member-level access](#member-level-access). +While you can define access policies on both cubes and views, it is more common to define them on views. -For more details on available parameters, check out the [data access policies reference][ref-ref-dap]. +For more details on available parameters, check out the [access policies reference][ref-ref-dap]. ## Policy evaluation -When processing a request, Cube will evaluate the data access policies and combine them +When processing a request, Cube will evaluate the access policies and combine them with relevant custom security rules, e.g., [`public` parameters][ref-mls-public] for member-level security -and [`query_rewrite` filters][ref-rls-queryrewrite] for row-level security. +and `query_rewrite` filters for row-level security. If multiple access policies apply to a request, they are _combined together_ -using the _OR_ semantics. For example, if a user has two roles with different +using the _OR_ semantics. For example, if a user has two groups with different policies, the user will get the union of the permissions in these policies. ### Member-level access -Member-level security rules in data access policies are _combined together_ +Member-level security rules in access policies are _combined together_ with `public` parameters of cube and view members using the _AND_ semantics. Both will apply to the request. @@ -142,8 +101,8 @@ columns in the table are public or not, the view will expose them anyway. ### Row-level access -Row-level filters in data access policies are _combined together_ with filters defined -using the [`query_rewrite` configuration option][ref-config-queryrewrite]. +Row-level filters in access policies are _combined together_ with filters defined +using the `query_rewrite` configuration option. Both will apply to the request. _When querying a view,_ row-level filters defined in the view are _combined together_ @@ -157,14 +116,198 @@ filtered by the row-level security rules of both views. -## Troubleshooting +## Common patterns + +### Restrict access to specific groups + +To restrict access to a view to only specific groups, define access policies for those groups. Access is automatically denied to all other groups: -### Common pitfalls + -Be careful with the [_any role_ shorthand][ref-ref-dap-role] (`role: "*"`) in data access +```yaml +views: + - name: sensitive_data_view + # ... + + access_policy: + # Allow access only to the `analysts` group + - group: analysts + member_level: + includes: "*" +``` + +```javascript +view(`sensitive_data_view`, { + // ... + + access_policy: [ + { + // Allow access only to the `analysts` group + group: `analysts`, + member_level: { + includes: `*` + } + } + ] +}) +``` + + + +You can also use the `groups` parameter (plural) to apply the same policy to multiple groups at once: + + + +```yaml +views: + - name: sensitive_data_view + # ... + + access_policy: + # Allow access to multiple groups using groups array + - groups: [analysts, managers] + member_level: + includes: "*" +``` + +```javascript +view(`sensitive_data_view`, { + // ... + + access_policy: [ + { + // Allow access to multiple groups using groups array + groups: [`analysts`, `managers`], + member_level: { + includes: `*` + } + } + ] +}) +``` + + + +### Filter by user attribute + +You can filter data based on user attributes to ensure users only see data they're authorized to access. For example, sales people can see only their own deals, while sales managers can see all deals: + + + +```yaml +views: + - name: deals_view + # ... + + access_policy: + # Sales people can only see their own deals + - group: sales + member_level: + includes: "*" + row_level: + filters: + - member: sales_person_id + operator: equals + values: [ "{ userAttributes.userId }" ] + + # Sales managers can see all deals + - group: sales_manager + member_level: + includes: "*" + # No row-level filters - full access to all rows +``` + +```javascript +view(`deals_view`, { + // ... + + access_policy: [ + { + // Sales people can only see their own deals + group: `sales`, + member_level: { + includes: `*` + }, + row_level: { + filters: [ + { + member: `sales_person_id`, + operator: `equals`, + values: [ userAttributes.userId ] + } + ] + } + }, + { + // Sales managers can see all deals + group: `sales_manager`, + member_level: { + includes: `*` + } + // No row-level filters - full access to all rows + } + ] +}) +``` + + + +### Mandatory filters + +You can apply mandatory row-level filters to specific groups to ensure they only see data matching certain criteria: + + + +```yaml +views: + - name: country_data_view + # ... + + access_policy: + # Allow access only to the `sales` and `marketing` groups with country filtering + - groups: [sales, marketing] + member_level: + includes: "*" + row_level: + filters: + - member: users_country + operator: equals + values: ["Brasil"] +``` + +```javascript +view(`country_data_view`, { + // ... + + access_policy: [ + { + // Allow access only to the `sales` and `marketing` groups with country filtering + groups: [`sales`, `marketing`], + member_level: { + includes: `*` + }, + row_level: { + filters: [ + { + member: `users_country`, + operator: `equals`, + values: [`Brasil`] + } + ] + } + } + ] +}) +``` + + + +## Troubleshooting + +Be careful with the [_any group_ shorthand][ref-ref-dap-role] (`group: "*"`) in access policies that don't restrict access on member __and__ row level. Given that policies for -multiple roles are [combined together](#policy-evaluation) using the _OR_ semantics, -a policy that allows access for _any role_ without restrictions on a certain level will +multiple groups are [combined together](#policy-evaluation) using the _OR_ semantics, +a policy that allows access for _any group_ without restrictions on a certain level will effectively grant unrestricted access on that level to all users: ```yaml @@ -173,13 +316,13 @@ cubes: # ... access_policy: - # No access on member level, __full access__ on row level for any role - - role: "*" + # No access on member level, __full access__ on row level for any group + - group: "*" member_level: includes: [] - # Some restrictions on row level for the `restricted` role - - role: restricted + # Some restrictions on row level for the `restricted` group + - group: restricted row_level: filters: - member: country @@ -188,14 +331,92 @@ cubes: ``` In the example above, all users will have full access to all members and all rows of the -`orders` cube, regardless of their roles, because of the first policy applies to _any -role_ and is combined with the second one using the _OR_ semantics. +`orders` cube, regardless of their groups, because the first policy applies to _any +group_ and is combined with the second one using the _OR_ semantics. + +## Custom mapping + +Cube cloud platform automatically maps authenticated users to groups for access policies. +If you are using Cube Core or authenticating against [Core Data APIs][ref-core-data-apis] directly, you might need to map the security context to groups manually. + + + +```python +# cube.py +from cube import config + +@config('context_to_groups') +def context_to_groups(ctx: dict) -> list[str]: + return ctx['securityContext'].get('groups', ['default']) +``` + +```javascript +// cube.js +module.exports = { + contextToGroups: ({ securityContext }) => { + return securityContext.groups || ['default'] + } +} +``` + + + +A user can have more than one group. + +## Using securityContext + +The [`userAttributes`][ref-sec-ctx] object is only available in Cube Cloud platform. If you are using Cube Core or authenticating against [Core Data APIs][ref-core-data-apis] directly, you won't have access to `userAttributes`. Instead, you need to use `securityContext` directly when referencing user attributes in access policies (e.g., in `row_level` filters or `conditions`). For example, use `securityContext.userId` instead of `userAttributes.userId`. + + + +```yaml +cubes: + - name: orders + # ... + + access_policy: + - group: manager + row_level: + filters: + - member: country + operator: equals + values: [ "{ securityContext.country }" ] +``` + +```javascript +cube(`orders`, { + // ... + + access_policy: [ + { + group: `manager`, + row_level: { + filters: [ + { + member: `country`, + operator: `equals`, + values: [ securityContext.country ] + } + ] + } + } + ] +}) +``` + + + +## Using roles + +In prior versions of Cube, we were using `roles` instead of `groups`. We have changed that to `groups` to avoid conflict with [Cube roles][ref-cube-roles]. + +In Cube Core, you can still use roles. You would need to define `context_to_roles` instead of `context_to_groups`. [ref-mls-public]: /product/auth/member-level-security#managing-member-level-access -[ref-rls-queryrewrite]: /product/auth/row-level-security#managing-row-level-access [ref-sec-ctx]: /product/auth/context [ref-ctx-to-roles]: /product/configuration/reference/config#context_to_roles [ref-ref-dap]: /product/data-modeling/reference/data-access-policies -[ref-config-queryrewrite]: /product/configuration/reference/config#query_rewrite -[ref-ref-dap-role]: /product/data-modeling/reference/data-access-policies#role \ No newline at end of file +[ref-ref-dap-role]: /product/data-modeling/reference/data-access-policies#role +[ref-core-data-apis]: /product/apis-integrations/core-data-apis +[ref-cube-roles]: /product/administration/users-and-permissions/roles-and-permissions \ No newline at end of file diff --git a/docs/pages/product/auth/member-level-security.mdx b/docs/pages/product/auth/member-level-security.mdx index c944841fdf7a3..912cb719f7ae0 100644 --- a/docs/pages/product/auth/member-level-security.mdx +++ b/docs/pages/product/auth/member-level-security.mdx @@ -15,19 +15,10 @@ can be accessed by any users and they are also visible during data model introsp ## Managing member-level access -You can use [data access policies][ref-dap] to configure member-level access -for different [roles][ref-dap-roles]. With the `access_policy` parameter in +You can use [access policies][ref-dap] to configure member-level access +for different groups. With the `access_policy` parameter in [cubes][ref-ref-cubes] and [views][ref-ref-views], you can define which members -are accessible to users with specific roles. - - - -In [development mode][ref-dev-mode] in [Playground][ref-playground], access -control checks are disabled and all access policies are not evaluated. It helps -you conveniently debug the data model by querying any members in -API queries and during data model introspection. - - +are accessible to users with specific groups. Use the `member_level` parameter to specify either: - `includes`: a list of allowed members, or @@ -35,7 +26,13 @@ Use the `member_level` parameter to specify either: You can use `"*"` as a shorthand to include or exclude all members. -In the following example, member-level access is configured for different roles: + + +When you define access policies for specific groups, access is automatically denied to all other groups. You don't need to create a default policy that denies access. + + + +In the following example, member-level access is configured for different groups: @@ -52,26 +49,21 @@ views: - count_30d access_policy: - # Default policy: no access for users without specific roles - - role: "*" - member_level: - includes: [] - # Managers can access all members except for `count` - - role: manager + - group: manager member_level: excludes: - count # Observers can access all members except for `count` and `count_7d` - - role: observer + - group: observer member_level: excludes: - count - count_7d # Guests can only access the `count_30d` measure - - role: guest + - group: guest member_level: includes: - count_30d @@ -93,16 +85,9 @@ view(`orders_view`, { ], access_policy: [ - { - // Default policy: no access for users without specific roles - role: `*`, - member_level: { - includes: [] - } - }, { // Managers can access all members except for `count` - role: `manager`, + group: `manager`, member_level: { excludes: [ `count` @@ -111,7 +96,7 @@ view(`orders_view`, { }, { // Observers can access all members except for `count` and `count_7d` - role: `observer`, + group: `observer`, member_level: { excludes: [ `count`, @@ -121,7 +106,7 @@ view(`orders_view`, { }, { // Guests can only access the `count_30d` measure - role: `guest`, + group: `guest`, member_level: { includes: [ `count_30d` @@ -136,7 +121,7 @@ view(`orders_view`, { This configuration results in the following access: -| Role | Access | +| Group | Access | | --- | --- | | `manager` | All members except for `count` | | `observer` | All members except for `count` and `count_7d` | @@ -144,36 +129,15 @@ This configuration results in the following access: | All other users | No access to this view at all | Access policies also respect member-level security restrictions configured via -`public` parameters. For more details, see the [data access policies +`public` parameters. For more details, see the [access policies reference][ref-dap-ref]. -## Using the public parameter - -You can explicitly make a data model entity public or private by setting its -`public` parameter to `true` or `false`. This parameter is available for -[cubes][ref-cubes-public], [views][ref-views-public], [measures][ref-measures-public], -[dimensions][ref-dimensions-public], [hierarchies][ref-hierarchies-public], and -[segments][ref-segments-public]. - -You can also control whether a data model entity should be public or private -[dynamically][ref-dynamic-data-modeling] by using the [security context][ref-security-context]. - - - -While the `public` parameter provides a simple way to restrict access, it applies -globally to all users. __It is recommended to use [data access policies][ref-dap] -by default__ as they allow you to define granular access control rules -in one place. - - - [ref-data-modeling-concepts]: /product/data-modeling/concepts [ref-apis]: /product/apis-integrations [ref-cubes]: /product/data-modeling/concepts#cubes [ref-views]: /product/data-modeling/concepts#views [ref-dap]: /product/auth/data-access-policies -[ref-dap-roles]: /product/auth/data-access-policies#data-access-roles [ref-ref-cubes]: /product/data-modeling/reference/cube [ref-ref-views]: /product/data-modeling/reference/view [ref-dev-mode]: /product/configuration#development-mode diff --git a/docs/pages/product/auth/methods.mdx b/docs/pages/product/auth/methods.mdx index 32bfcec90cc42..7fab7076362b5 100644 --- a/docs/pages/product/auth/methods.mdx +++ b/docs/pages/product/auth/methods.mdx @@ -16,7 +16,7 @@ Regardless of the method, the authentication flow includes the following steps: * Cube validates the identity information. * Cube associates the API request with a [security context][ref-sec-ctx]. * The security context is used to configure [member-level security][ref-mls] -and [row-level security][ref-rls] as well as set [data access policies][ref-dap]. +and [row-level security][ref-rls] as well as set [access policies][ref-dap]. [ref-apis]: /product/apis-integrations diff --git a/docs/pages/product/auth/methods/_meta.js b/docs/pages/product/auth/methods/_meta.js index 3904893959cc2..7801d14284095 100644 --- a/docs/pages/product/auth/methods/_meta.js +++ b/docs/pages/product/auth/methods/_meta.js @@ -3,5 +3,8 @@ module.exports = { "kerberos": "Kerberos", "ntlm": "NTLM", "identity-provider": "Identity provider", - "jwt": "JSON Web Token" + "jwt": "JSON Web Token", + "auth0": "Auth0", + "aws-cognito": "AWS Cognito", + "ldap": "SQL API with LDAP" } \ No newline at end of file diff --git a/docs/pages/product/auth/recipes/auth0-guide.mdx b/docs/pages/product/auth/methods/auth0.mdx similarity index 99% rename from docs/pages/product/auth/recipes/auth0-guide.mdx rename to docs/pages/product/auth/methods/auth0.mdx index f780d5d622b12..fba6dd1252120 100644 --- a/docs/pages/product/auth/recipes/auth0-guide.mdx +++ b/docs/pages/product/auth/methods/auth0.mdx @@ -240,4 +240,5 @@ your own Cube application. [ref-config-auth0]: #configure-cube [ref-sec-ctx]: /product/auth/context [gh-cube-auth0-example]: - https://github.com/cube-js/examples/tree/master/auth0 \ No newline at end of file + https://github.com/cube-js/examples/tree/master/auth0 + diff --git a/docs/pages/product/auth/recipes/aws-cognito.mdx b/docs/pages/product/auth/methods/aws-cognito.mdx similarity index 99% rename from docs/pages/product/auth/recipes/aws-cognito.mdx rename to docs/pages/product/auth/methods/aws-cognito.mdx index 17104280dc627..275727d383efb 100644 --- a/docs/pages/product/auth/recipes/aws-cognito.mdx +++ b/docs/pages/product/auth/methods/aws-cognito.mdx @@ -188,3 +188,4 @@ models using the [Security Context][ref-sec-ctx] should now work as expected. [link-aws-lambda]: https://docs.aws.amazon.com/lambda/latest/dg/welcome.html [link-openid-playground]: https://openidconnect.net/ [ref-sec-ctx]: /product/auth/context + diff --git a/docs/pages/product/auth/recipes/sql-api-ldap.mdx b/docs/pages/product/auth/methods/ldap.mdx similarity index 97% rename from docs/pages/product/auth/recipes/sql-api-ldap.mdx rename to docs/pages/product/auth/methods/ldap.mdx index dfc2bd4d9fded..bb2f552b5dcce 100644 --- a/docs/pages/product/auth/recipes/sql-api-ldap.mdx +++ b/docs/pages/product/auth/methods/ldap.mdx @@ -1,6 +1,6 @@ # Authenticate requests to the SQL API with LDAP -In this recipe, you'll learn how to authenticate requests to the [SQL +In this guide, you'll learn how to authenticate requests to the [SQL API](/product/apis-integrations/sql-api) with a LDAP catalog. You can use this approach to enable single sign-on (SSO) experience in BI tools connecting to Cube for your end users. @@ -28,7 +28,7 @@ Here's a step-by-step breakdown of the authentication flow: -In this recipe, the SQL API is used to connect to [Power BI][ref-powerbi]. +In this guide, the SQL API is used to connect to [Power BI][ref-powerbi]. Currently, it's recommended to use the [DAX API][ref-dax-api]. @@ -188,4 +188,5 @@ module.exports = { [ref-dax-api]: /product/apis-integrations/dax-api -[ref-powerbi]: /product/configuration/visualization-tools/powerbi \ No newline at end of file +[ref-powerbi]: /product/configuration/visualization-tools/powerbi + diff --git a/docs/pages/product/auth/recipes/_meta.js b/docs/pages/product/auth/recipes/_meta.js deleted file mode 100644 index e3dfd04731239..0000000000000 --- a/docs/pages/product/auth/recipes/_meta.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - "enforcing-mandatory-filters": "Mandatory filters", - "column-based-access": "Column-based access", - "role-based-access": "Role-based access", - "controlling-access-to-cubes-and-views": "Access to cubes/views", - "sql-api-ldap": "SQL API and LDAP", - "auth0-guide": "REST API and Auth0", - "aws-cognito": "REST API and AWS Cognito" -} diff --git a/docs/pages/product/auth/recipes/column-based-access.mdx b/docs/pages/product/auth/recipes/column-based-access.mdx deleted file mode 100644 index db3684624a1a9..0000000000000 --- a/docs/pages/product/auth/recipes/column-based-access.mdx +++ /dev/null @@ -1,179 +0,0 @@ -# Enforcing column-based access - -## Use case - -We want to manage user access to different data depending on a database -relationship. In the recipe below, we will manage supplier access to their -products. A supplier can't see other supplier's products. - -## Data modeling - -To implement column-based access, we will use supplier's email from a -[JSON Web Token](/product/auth), and the -[`queryRewrite`](/product/auth/context#using-query_rewrite) extension point to -manage data access. - -We have `products` and `suppliers` cubes with a `many_to_one` relationship from -products to suppliers: - - - -```yaml -cubes: - - name: products - sql_table: products - - joins: - - name: suppliers - relationship: many_to_one - sql: "{CUBE}.supplier_id = {suppliers.id}" - - dimensions: - - name: name - sql: name - type: string -``` - -```javascript -cube(`products`, { - sql_table: `products`, - - joins: { - suppliers: { - relationship: `many_to_one`, - sql: `${CUBE}.supplier_id = ${suppliers.id}` - } - }, - - dimensions: { - name: { - sql: `name`, - type: `string` - } - } -}) -``` - - - - - -```yaml -cubes: - - name: suppliers - sql_table: suppliers - - dimensions: - - name: id - sql: id - type: string - primary_key: true - - - name: email - sql: email - type: string -``` - -```javascript -cube(`suppliers`, { - sql_table: `suppliers`, - - dimensions: { - id: { - sql: `id`, - type: `string`, - primary_key: true - }, - - email: { - sql: `email`, - type: `string` - } - } -}) -``` - - - -## Configuration - -Let's add the supplier email filter if a query includes any dimensions or -measures from the `products` cube: - -```javascript -module.exports = { - queryRewrite: (query, { securityContext }) => { - const cubeNames = [ - ...(query.dimensions || []), - ...(query.measures || []) - ].map((e) => e.split(".")[0]) - - if (cubeNames.includes("products")) { - if (!securityContext.email) { - throw new Error("No email found in Security Context!") - } - - query.filters.push({ - member: `suppliers.email`, - operator: "equals", - values: [securityContext.email] - }) - } - - return query - } -} -``` - -## Query - -To get the supplier's products, we will send two identical requests with -different emails inside JWTs. - -```json -{ - "iat": 1000000000, - "exp": 5000000000, - "email": "purus.accumsan@Proin.org" -} -``` - -```json -{ - "iat": 1000000000, - "exp": 5000000000, - "email": "gravida.sit.amet@risus.net" -} -``` - -## Result - -We have received different data depending on the supplier's email. - -```javascript -// purus.accumsan@Proin.org -[ - { - "products.name": "Awesome Soft Salad" - }, - { - "products.name": "Rustic Granite Gloves" - } -] -``` - -```javascript -// gravida.sit.amet@risus.net -[ - { - "products.name": "Incredible Granite Cheese" - } -] -``` - -## Source code - -Please feel free to check out the -[full source code](https://github.com/cube-js/cube/tree/master/examples/recipes/column-based-access) -or run it with the `docker-compose up` command. You'll see the result, including -queried data, in the console. diff --git a/docs/pages/product/auth/recipes/controlling-access-to-cubes-and-views.mdx b/docs/pages/product/auth/recipes/controlling-access-to-cubes-and-views.mdx deleted file mode 100644 index 89c33b4cf96b4..0000000000000 --- a/docs/pages/product/auth/recipes/controlling-access-to-cubes-and-views.mdx +++ /dev/null @@ -1,161 +0,0 @@ -# Controlling access to cubes and views - -## Use case - -We want to manage user access to different cubes and/or views depending on some -sort of user property. In the recipe below, we will manage access to a view so -that only users with a `department` claim in their JWT can query it. - -## Configuration - -```javascript -module.exports = { - contextToAppId: ({ securityContext }) => { - return `CUBE_APP_${securityContext.company}` - }, - extendContext: ({ securityContext }) => { - return { - securityContext: { - ...securityContext, - isFinance: securityContext.department === "finance" - } - } - } -} -``` - -## Data modeling - - - -```yaml -# orders.yml -cubes: - - name: orders - sql_table: orders - public: false - # ... - -# users.yml -cubes: - - name: users - sql_table: users - public: false - # ... - -# total_revenue_per_customer.yml -views: - - name: total_revenue_per_customer - public: {{ COMPILE_CONTEXT['securityContext']['isFinance'] }} - - cubes: - - join_path: orders - includes: - - total_revenue - - - join_path: orders.users - includes: - - company -``` - -```javascript -// orders.js -cube(`orders`, { - sql_table: `orders`, - public: false, - - // ... -}) - -// users.js -cube(`users`, { - sql_table: `users`, - public: false, - - // ... -}) - -// total_revenue_per_customer.js -view(`total_revenue_per_customer`, { - description: `Total revenue per customer`, - public: COMPILE_CONTEXT.securityContext.isFinance, - - cubes: [ - { - join_path: orders, - includes: [ - `total_revenue` - ] - }, - { - join_path: orders.users, - includes: [ - `company` - ] - } - ] -}) -``` - - - -## Query - -After generating a JWT with a `department` claim set to `finance`, we can send -it as part of a cURL command: - -```bash -curl \ - -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkZXBhcnRtZW50IjoiZmluYW5jZSIsImV4cCI6MTY2NzMzNzI1MH0.njfL7GMDNlzKaJDZA0OQ_b2u2JhuSm-WjnS0yVfB8NA" \ - http://localhost:4000/cubejs-api/v1/meta -``` - -## Result - -The `/meta` endpoint shows the available cubes and views: - -```json -{ - "cubes": [ - { - "name": "total_revenue_per_customer", - "title": "Total Revenue Per Customer", - "description": "Total revenue per customer", - "measures": [ - { - "name": "total_revenue_per_customer.total_revenue", - "title": "Total Revenue Per Customer Total Revenue", - "shortTitle": "Total Revenue", - "cumulativeTotal": false, - "cumulative": false, - "type": "number", - "aggType": "number", - "drillMembers": [], - "drillMembersGrouped": { - "measures": [], - "dimensions": [] - }, - "isVisible": true - } - ], - "dimensions": [ - { - "name": "total_revenue_per_customer.company", - "title": "Total Revenue Per Customer Company", - "type": "string", - "shortTitle": "Company", - "suggestFilterValues": true, - "isVisible": true - } - ], - "segments": [] - } - ] -} -``` - -## Source code - -Please feel free to check out the -[full source code](https://github.com/cube-js/cube/tree/master/examples/recipes/changing-visibility-of-cubes-or-views) -or run it with the `docker-compose up` command. diff --git a/docs/pages/product/auth/recipes/enforcing-mandatory-filters.mdx b/docs/pages/product/auth/recipes/enforcing-mandatory-filters.mdx deleted file mode 100644 index 1f0b3f5761f7a..0000000000000 --- a/docs/pages/product/auth/recipes/enforcing-mandatory-filters.mdx +++ /dev/null @@ -1,133 +0,0 @@ -# Enforcing mandatory filters - -## Use case - -Let's imagine that on New Year's Eve, December 30th, 2019, we renamed our store, -changed the design, and started selling completely different products. At the -same time, we decided to reuse the database for the new store. So, we'd like to -only show orders created after December 30th, 2019. In the recipe below, we'll -learn how to add mandatory filters to all queries. - -## Configuration - -To enforce mandatory filters we'll use the -[`queryRewrite`](/product/auth/context#using-query_rewrite) parameter in the -`cube.js` configuration file. - -To solve this, we add a filter that will apply to all queries. This will make -sure we only show orders created after December 30th, 2019. - -```javascript -module.exports = { - queryRewrite: (query) => { - query.filters.push({ - member: `orders.created_at`, - operator: "afterDate", - values: ["2019-12-30"] - }) - - return query - } -} -``` - -## Query - -To get the orders we will send two queries with filters by status: - -```bash -# Completed orders -curl cube:4000/cubejs-api/v1/load \ - -H "Authorization: eeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoib3BlcmF0b3IiLCJpYXQiOjE2Mjg3NDUwNDUsImV4cCI6MTgwMTU0NTA0NX0.VErb2t7Bc43ryRwaOiEgXuU5KiolCT-69eI_i2pRq4o" \ - 'query={"measures": [], "order": [["Users.created_at", "asc"]], "dimensions": ["orders.number", "orders.created_at"], - "filters": [ - { - "member": "orders.status", - "operator": "equals", - "values": ["completed"] - } - ], - "limit": 5 - }' -``` - -```bash -# Shipped orders -curl cube:4000/cubejs-api/v1/load \ - -H "Authorization: eeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoib3BlcmF0b3IiLCJpYXQiOjE2Mjg3NDUwNDUsImV4cCI6MTgwMTU0NTA0NX0.VErb2t7Bc43ryRwaOiEgXuU5KiolCT-69eI_i2pRq4o" \ - 'query={"measures": [], "order": [["orders.created_at", "asc"]], "dimensions": ["orders.number", "orders.created_at"], - "filters": [ - { - "member": "orders.status", - "operator": "equals", - "values": ["shipped"] - } - ], - "limit": 5 - }' -``` - -## Result - -We have received orders created after December 30th, 2019. - -Completed orders: - -```javascript -[ - { - "orders.number": 78, - "orders.created_at": "2020-01-01T00:00:00.000" - }, - { - "orders.number": 43, - "orders.created_at": "2020-01-02T00:00:00.000" - }, - { - "orders.number": 87, - "orders.created_at": "2020-01-04T00:00:00.000" - }, - { - "orders.number": 45, - "orders.created_at": "2020-01-04T00:00:00.000" - }, - { - "orders.number": 28, - "orders.created_at": "2020-01-05T00:00:00.000" - } -] -``` - -Shipped orders: - -```javascript -[ - { - "orders.number": 57, - "orders.created_at": "2019-12-31T00:00:00.000" - }, - { - "orders.number": 38, - "orders.created_at": "2020-01-01T00:00:00.000" - }, - { - "orders.number": 10, - "orders.created_at": "2020-01-02T00:00:00.000" - }, - { - "orders.number": 19, - "orders.created_at": "2020-01-02T00:00:00.000" - }, - { - "orders.number": 15, - "orders.created_at": "2020-01-02T00:00:00.000" - } -] -``` - -## Source code - -Please feel free to check out the -[full source code](https://github.com/cube-js/cube/tree/master/examples/recipes/mandatory-filters) -or run it with the `docker-compose up` command. You'll see the result, including -queried data, in the console. diff --git a/docs/pages/product/auth/recipes/role-based-access.mdx b/docs/pages/product/auth/recipes/role-based-access.mdx deleted file mode 100644 index 46e652bbfaa83..0000000000000 --- a/docs/pages/product/auth/recipes/role-based-access.mdx +++ /dev/null @@ -1,100 +0,0 @@ -# Enforcing role-based access - -## Use case - -We want to manage user access to different data depending on their role. In the -recipe below, a user with the `operator` role can only view processing orders -from a shop and a `manager` can only view shipped and completed orders. - -## Configuration - -To implement role-based access, we will use a [JSON Web Token](/product/auth) -with role information in the payload, and the -[`queryRewrite`](/product/auth/context#using-query_rewrite) extension point to -manage data access. - -Let's add the role verification in the `cube.js` file. - -```javascript -module.exports = { - queryRewrite: (query, { securityContext }) => { - if (!securityContext.role) { - throw new Error("No role found in Security Context!") - } - - if (securityContext.role == "manager") { - query.filters.push({ - member: "orders.status", - operator: "equals", - values: ["shipped", "completed"] - }) - } - - if (securityContext.role == "operator") { - query.filters.push({ - member: "orders.status", - operator: "equals", - values: ["processing"] - }) - } - - return query - } -} -``` - -## Query - -To get the number of orders as a manager or operator, we will send two identical -requests with different JWTs: - -```json -{ - "iat": 1000000000, - "exp": 5000000000, - "role": "manager" -} -``` - -```json -{ - "iat": 1000000000, - "exp": 5000000000, - "role": "operator" -} -``` - -## Result - -We have received different data depending on the user's role. - -```json5 -// Manager -[ - { - "orders.status": "completed", - "orders.count": "3346", - }, - { - "orders.status": "shipped", - "orders.count": "3300", - }, -] -``` - -```json5 -// Operator -[ - { - "orders.status": "processing", - "orders.count": "3354", - }, -] -``` - -## Source code - -Please feel free to check out the -[full source code](https://github.com/cube-js/cube/tree/master/examples/recipes/role-based-access) -or run it with the `docker-compose up` command. You'll see the result, including -queried data, in the console. diff --git a/docs/pages/product/auth/row-level-security.mdx b/docs/pages/product/auth/row-level-security.mdx index fbaacab8e0fe4..0f0d4796f5ae8 100644 --- a/docs/pages/product/auth/row-level-security.mdx +++ b/docs/pages/product/auth/row-level-security.mdx @@ -13,10 +13,10 @@ data model facts when they are accessed by any users. ## Managing row-level access -You can use [data access policies][ref-dap] to manage both [member-level][ref-mls] -and row-level security based on [user attributes][ref-security-context] or groups. +You can use [access policies][ref-dap] to manage both [member-level][ref-mls] +and row-level security based on groups and [user attributes][ref-security-context]. -Here's an example of how to filter rows by a user attribute using data access policies: +Here's an example of how to filter rows by a user attribute using access policies: @@ -26,7 +26,7 @@ cubes: # ... access_policy: - - role: manager + - group: manager row_level: filters: - member: country @@ -40,13 +40,13 @@ cube(`orders`, { access_policy: [ { - role: `manager`, + group: `manager`, row_level: { filters: [ { member: `country`, operator: `equals`, - values: [ securityContext.country ] + values: [ userAttributes.country ] } ] } @@ -58,9 +58,6 @@ cube(`orders`, { -## Advanced scenarios - -For more complex scenarios, you can use [`query_rewrite`][ref-query-rewrite] for programmatic query filtering or adjust the [`sql` parameter][ref-cubes-sql] in [dynamic data models][ref-dynamic-data-modeling]. [ref-data-modeling-concepts]: /product/data-modeling/concepts @@ -69,7 +66,6 @@ For more complex scenarios, you can use [`query_rewrite`][ref-query-rewrite] for [ref-views]: /product/data-modeling/concepts#views [ref-cubes-sql]: /product/data-modeling/reference/cube#sql [ref-dynamic-data-modeling]: /product/data-modeling/dynamic -[ref-query-rewrite]: /product/configuration/reference/config#query_rewrite [ref-dap]: /product/auth/data-access-policies [ref-mls]: /product/auth/member-level-security [ref-security-context]: /product/auth/context \ No newline at end of file diff --git a/docs/pages/product/configuration/reference/config.mdx b/docs/pages/product/configuration/reference/config.mdx index b0c3dfb71922a..2647ac445cf54 100644 --- a/docs/pages/product/configuration/reference/config.mdx +++ b/docs/pages/product/configuration/reference/config.mdx @@ -1365,7 +1365,7 @@ module.exports = { ### `context_to_roles` -Used by [data access policies][ref-dap]. This option is used to derive a list of +Used by [access policies][ref-dap]. This option is used to derive a list of [data access roles][ref-dap-roles] from the [security context][ref-sec-ctx]. diff --git a/docs/pages/product/data-modeling/reference/_meta.js b/docs/pages/product/data-modeling/reference/_meta.js index 548760eb8c7ba..13c9fe942ce17 100644 --- a/docs/pages/product/data-modeling/reference/_meta.js +++ b/docs/pages/product/data-modeling/reference/_meta.js @@ -7,7 +7,7 @@ module.exports = { "segments": "Segments", "joins": "Joins", "pre-aggregations": "Pre-aggregations", - "data-access-policies": "Data access policies", + "data-access-policies": "Access policies", "types-and-formats": "Types and formats", "context-variables": "Context variables", "cube-package": "cube package", diff --git a/docs/pages/product/data-modeling/reference/cube.mdx b/docs/pages/product/data-modeling/reference/cube.mdx index 4f670ad39af1a..cedc8193b13d6 100644 --- a/docs/pages/product/data-modeling/reference/cube.mdx +++ b/docs/pages/product/data-modeling/reference/cube.mdx @@ -6,7 +6,7 @@ Cubes are typically declared in separate files with one cube per file. Within each cube are definitions of [measures][ref-ref-measures], [dimensions][ref-ref-dimensions], [hierarchies][ref-ref-hierarchies], [segments][ref-ref-segments], [joins][ref-ref-joins] between cubes, -[pre-aggregations][ref-ref-pre-aggs], and [data access policies][ref-ref-dap]. +[pre-aggregations][ref-ref-pre-aggs], and [access policies][ref-ref-dap]. @@ -644,7 +644,7 @@ The `measures` parameter is used to configure [measures][ref-ref-measures]. ### `access_policy` -The `access_policy` parameter is used to configure [data access policies][ref-ref-dap]. +The `access_policy` parameter is used to configure [access policies][ref-ref-dap]. [ref-config-driverfactory]: /product/configuration/reference/config#driverfactory diff --git a/docs/pages/product/data-modeling/reference/data-access-policies.mdx b/docs/pages/product/data-modeling/reference/data-access-policies.mdx index e965f571737cb..15feb3986724a 100644 --- a/docs/pages/product/data-modeling/reference/data-access-policies.mdx +++ b/docs/pages/product/data-modeling/reference/data-access-policies.mdx @@ -1,30 +1,30 @@ -# Data access policies +# Access policies You can use the `access_policy` parameter within [cubes][ref-ref-cubes] and [views][ref-ref-views] -to configure [data access policies][ref-dap] for them. +to configure [access policies][ref-dap] for them. ## Parameters The `access_policy` parameter should define a list of access policies. Each policy can be configured using the following parameters: -- [`role`](#role) defines which [data access role][ref-dap-roles] a policy applies -to. +- [`group`](#group) or [`groups`](#groups) define which groups a policy applies to. - [`conditions`](#conditions) can be optionally used to specify when a policy takes effect. - [`member_level`](#member-level) and [`row_level`](#row-level) parameters are used to configure [member-level][ref-dap-mls] and [row-level][ref-dap-rls] access. -### `role` + -The `role` parameter defines which [data access role][ref-dap-roles], as defined -by the [`context_to_roles`][ref-context-to-roles] configuration parameter, a -policy applies to. To define a policy that applies to all users regardless of -their roles, use the _any role_ shorthand: `role: "*"`. +When you define access policies for specific groups, access is automatically denied to all other groups. You don't need to create a default policy that denies access. -In the following example, three access policies are defined, with the first one -applying to all users and two other applying to users with `marketing` or -`finance` roles, respectively. + + +### `group` + +The `group` parameter defines which group a policy applies to. To define a policy that applies to all users regardless of their groups, use the _any group_ shorthand: `group: "*"`. + +In the following example, two access policies are defined for users with `marketing` or `finance` groups, respectively. @@ -34,14 +34,10 @@ cubes: # ... access_policy: - # Applies to any role - - role: "*" - # ... - - - role: marketing + - group: marketing # ... - - role: finance + - group: finance # ... ``` @@ -51,17 +47,48 @@ cube(`orders`, { access_policy: [ { - // Applies to any role - role: `*`, + group: `marketing`, // ... }, { - role: `marketing`, + group: `finance`, // ... - }, + } + ] +}) +``` + + + +### `groups` + +The `groups` parameter (plural) allows you to apply the same policy to multiple groups at once by providing an array of group names. + +In the following example, a single policy applies to both `analysts` and `managers` groups: + + + +```yaml +cubes: + - name: orders + # ... + + access_policy: + - groups: [analysts, managers] + member_level: + includes: "*" +``` + +```javascript +cube(`orders`, { + // ... + + access_policy: [ { - role: `finance`, - // ... + groups: [`analysts`, `managers`], + member_level: { + includes: `*` + } } ] }) @@ -74,11 +101,10 @@ cube(`orders`, { The optional `conditions` parameter, when present, defines a list of conditions that should all be `true` in order for a policy to take effect. Each condition is configured with an `if` parameter that is expected to reference the [security -context][ref-sec-ctx]. +context][ref-sec-ctx] or user attributes. -In the following example, a permissive policy for all roles will only apply to -EMEA-based users, as determined by the `is_EMEA_based` attribute in the security -context: +In the following example, a permissive policy for all groups will only apply to +EMEA-based users, as determined by the `is_EMEA_based` user attribute: @@ -88,9 +114,9 @@ cubes: # ... access_policy: - - role: "*" + - group: "*" conditions: - - if: "{ securityContext.is_EMEA_based }" + - if: "{ userAttributes.is_EMEA_based }" member_level: includes: "*" ``` @@ -101,9 +127,9 @@ cube(`orders`, { access_policy: [ { - role: `*`, + group: `*`, conditions: [ - { if: securityContext.is_EMEA_based } + { if: userAttributes.is_EMEA_based } ], member_level: { includes: `*` @@ -116,11 +142,11 @@ cube(`orders`, { You can use the `conditions` parameter to define multiple policies for the same -role. +group. In the following example, the first policy provides access to a _subset of members_ -to managers who are full-time employees while the other one provides access to -_all members_ to managers who are full-time employees and have also completed a +to users in the manager group who are full-time employees while the other one provides access to +_all members_ to users in the manager group who are full-time employees and have also completed a data privacy training: @@ -131,18 +157,18 @@ cubes: # ... access_policy: - - role: manager + - group: manager conditions: - - if: "{ securityContext.is_full_time_employee }" + - if: "{ userAttributes.is_full_time_employee }" member_level: includes: - status - count - - role: manager + - group: manager conditions: - - if: "{ securityContext.is_full_time_employee }" - - if: "{ securityContext.has_completed_privacy_training }" + - if: "{ userAttributes.is_full_time_employee }" + - if: "{ userAttributes.has_completed_privacy_training }" member_level: includes: "*" ``` @@ -153,9 +179,9 @@ cube(`orders`, { access_policy: [ { - role: `manager`, + group: `manager`, conditions: [ - { if: securityContext.is_full_time_employee } + { if: userAttributes.is_full_time_employee } ], member_level: { includes: [ @@ -165,10 +191,10 @@ cube(`orders`, { } }, { - role: `manager`, + group: `manager`, conditions: [ - { if: securityContext.is_full_time_employee }, - { if: securityContext.has_completed_privacy_training } + { if: userAttributes.is_full_time_employee }, + { if: userAttributes.has_completed_privacy_training } ], member_level: { includes: `*` @@ -191,12 +217,12 @@ _all members_ shorthand for both of these paramaters: `includes: "*"`, `excludes In the following example, member-level access is configured this way: -| Scope | Access | +| Group | Access | | --- | --- | -| Users with the `manager` role | All members except for `count` | -| Users with the `observer` role | All members except for `count` and `count_7d` | -| Users with the `guest` role | Only the `count_30d` measure | -| All other users | No access to this cube at all | +| `manager` | All members except for `count` | +| `observer` | All members except for `count` and `count_7d` | +| `guest` | Only the `count_30d` measure | +| All other groups | No access to this cube at all | @@ -206,25 +232,20 @@ cubes: # ... access_policy: - - role: "*" - member_level: - # Includes nothing, i.e., excludes all members - includes: [] - - - role: manager + - group: manager member_level: # Includes all members except for `count` excludes: - count - - role: observer + - group: observer member_level: # Includes all members except for `count` and `count_7d` excludes: - count - count_7d - - role: guest + - group: guest # Includes only `count_30d`, excludes all other members member_level: includes: @@ -237,14 +258,7 @@ cube(`orders`, { access_policy: [ { - role: `*`, - // Includes nothing, i.e., excludes all members - member_level: { - includes: [] - } - }, - { - role: `manager`, + group: `manager`, // Includes all members except for `count` member_level: { excludes: [ @@ -253,7 +267,7 @@ cube(`orders`, { } }, { - role: `observer`, + group: `observer`, // Includes all members except for `count` and `count_7d` member_level: { excludes: [ @@ -263,7 +277,7 @@ cube(`orders`, { } }, { - role: `guest`, + group: `guest`, // Includes only `count_30d`, excludes all other members member_level: { includes: [ @@ -286,7 +300,7 @@ learn more about policy evaluation. The optional `row_level` parameter, when present, configures [row-level access][ref-dap-rls] for a policy by specifying `filters` that should apply to result set rows. -In the following example, users with the `manager` role are allowed to access only +In the following example, users in the `manager` group are allowed to access only rows that have the `state` dimension matching the state from the [security context][ref-sec-ctx]. All other users are disallowed from accessing any rows at all. @@ -298,13 +312,12 @@ cubes: # ... access_policy: - - - role: manager + - group: manager row_level: filters: - member: state operator: equals - values: [ "{ securityContext.state }" ] + values: [ "{ userAttributes.state }" ] ``` ```javascript @@ -313,13 +326,13 @@ cube(`orders`, { access_policy: [ { - role: `manager`, + group: `manager`, row_level: { filters: [ { member: `state`, operator: `equals`, - values: [ securityContext.state ] + values: [ userAttributes.state ] } ] } @@ -340,17 +353,59 @@ Note that access policies also respect [row-level security][ref-rls] restriction configured via the `query_rewrite` configuration option. See [row-level access][ref-dap-rls] to learn more about policy evaluation. +## Using securityContext + +The [`userAttributes`][ref-sec-ctx] object is only available in Cube Cloud platform. If you are using Cube Core or authenticating against [Core Data APIs][ref-core-data-apis] directly, you won't have access to `userAttributes`. Instead, you need to use `securityContext` directly when referencing user attributes in access policies (e.g., in `row_level` filters or `conditions`). For example, use `securityContext.userId` instead of `userAttributes.userId`. + + + +```yaml +cubes: + - name: orders + # ... + + access_policy: + - group: manager + row_level: + filters: + - member: country + operator: equals + values: [ "{ securityContext.country }" ] +``` + +```javascript +cube(`orders`, { + // ... + + access_policy: [ + { + group: `manager`, + row_level: { + filters: [ + { + member: `country`, + operator: `equals`, + values: [ securityContext.country ] + } + ] + } + } + ] +}) +``` + + + [ref-ref-cubes]: /product/data-modeling/reference/cube [ref-ref-views]: /product/data-modeling/reference/view [ref-dap]: /product/auth/data-access-policies -[ref-dap-roles]: /product/auth/data-access-policies#data-access-roles [ref-dap-mls]: /product/auth/data-access-policies#member-level-access [ref-dap-rls]: /product/auth/data-access-policies#row-level-access -[ref-context-to-roles]: /product/configuration/reference/config#context_to_roles [ref-mls]: /product/auth/member-level-security [ref-rls]: /product/auth/row-level-security [ref-sec-ctx]: /product/auth/context +[ref-core-data-apis]: /product/apis-integrations/core-data-apis [ref-rest-query-filters]: /product/apis-integrations/rest-api/query-format#filters-format [ref-rest-query-ops]: /product/apis-integrations/rest-api/query-format#filters-operators [ref-rest-boolean-ops]: /product/apis-integrations/rest-api/query-format#boolean-logical-operators diff --git a/docs/pages/product/data-modeling/reference/pre-aggregations.mdx b/docs/pages/product/data-modeling/reference/pre-aggregations.mdx index deecbaa5a4a1d..a55135a9b6afc 100644 --- a/docs/pages/product/data-modeling/reference/pre-aggregations.mdx +++ b/docs/pages/product/data-modeling/reference/pre-aggregations.mdx @@ -1356,6 +1356,10 @@ To address such cases, you can use relative date in the future for the `build_ra For example, you can add one day to the current timestamp and use it as `build_range_end`. The actual value to be added depends on how frequently `refresh_key` is updated. +On the other hand, if the current timestamp is used as `build_range_end`, it can trigger +updates of the first and last partitions more frequently than the [`refresh_key`][self-refreshkey] does, +since the build range boundaries change with each evaluation. + @@ -1371,10 +1375,10 @@ cube(`orders`, { granularity: `day`, partition_granularity: `month`, build_range_start: { - sql: `SELECT NOW() - INTERVAL '300 day'` + sql: `SELECT CURRENT_DATE - INTERVAL '300 day'` }, build_range_end: { - sql: `SELECT NOW()` + sql: `SELECT CURRENT_DATE` } } }, @@ -1396,9 +1400,9 @@ cubes: granularity: day partition_granularity: month build_range_start: - sql: SELECT NOW() - INTERVAL '300 day' + sql: SELECT CURRENT_DATE - INTERVAL '300 day' build_range_end: - sql: SELECT NOW() + sql: SELECT CURRENT_DATE # ... ``` diff --git a/docs/pages/product/data-modeling/reference/view.mdx b/docs/pages/product/data-modeling/reference/view.mdx index 28ba3eb2b5fe1..b0cef601ecab2 100644 --- a/docs/pages/product/data-modeling/reference/view.mdx +++ b/docs/pages/product/data-modeling/reference/view.mdx @@ -557,7 +557,7 @@ Details`. ### `access_policy` -The `access_policy` parameter is used to configure [data access policies][ref-ref-dap]. +The `access_policy` parameter is used to configure [access policies][ref-ref-dap]. [ref-recipe-control-access-cubes-views]: /product/auth/recipes/controlling-access-to-cubes-and-views diff --git a/docs/pages/product/presentation/embedding/signed-embedding.mdx b/docs/pages/product/presentation/embedding/signed-embedding.mdx index 16b969bca713f..a30a2a80e8825 100644 --- a/docs/pages/product/presentation/embedding/signed-embedding.mdx +++ b/docs/pages/product/presentation/embedding/signed-embedding.mdx @@ -37,24 +37,13 @@ To use the embedded chat or dashboard, you need an [API key][ref-api-keys]: ### Generate an embed session -Use the `/api/v1/embed/generate-session` endpoint to create a session for your user. This endpoint will automatically create (insert) or update the external user based on the `externalId` provided. +Use the [Generate Session API][ref-generate-session] to create a session for your user. This endpoint will automatically create (insert) or update the external user based on the `externalId` provided. Accounts are limited to 10,000 external users. To increase this limit, please contact support. - -#### Request parameters - -- **`deploymentId`** (required): The deployment ID to scope the session to. This ensures tokens and access are limited to a specific deployment and model, providing better security isolation. -- **`externalId`** (required): A unique identifier for your user (e.g., email, user ID) -- **`userAttributes`** (optional): Array of attributes for row-level security and personalized responses - - - The `deploymentId` parameter is required for security purposes. It scopes the generated session token to a specific deployment and data model, preventing unauthorized access across different deployments or models. - - #### Example (JavaScript) ```javascript @@ -62,7 +51,7 @@ const API_KEY = "YOUR_API_KEY"; const DEPLOYMENT_ID = 32; const session = await fetch( - "https://your-tenant.cubecloud.dev/api/v1/embed/generate-session", + "https://your-account.cubecloud.dev/api/v1/embed/generate-session", { method: "POST", headers: { @@ -187,4 +176,5 @@ User attributes enable row-level security and personalized chat responses by fil - Department heads see only their department's metrics -[ref-api-keys]: /product/workspace/api-keys +[ref-api-keys]: /product/administration/workspace/api-keys +[ref-generate-session]: /product/apis-integrations/embed-apis/generate-session diff --git a/docs/redirects.json b/docs/redirects.json index 3702e4e61a4d4..912ed660df9ec 100644 --- a/docs/redirects.json +++ b/docs/redirects.json @@ -201,17 +201,32 @@ }, { "source": "/guides/recipes/auth/aws-cognito", - "destination": "/product/auth/recipes/aws-cognito", + "destination": "/product/auth/methods/aws-cognito", "permanent": true }, { "source": "/guides/recipes/auth/auth0-guide", - "destination": "/product/auth/recipes/auth0-guide", + "destination": "/product/auth/methods/auth0", "permanent": true }, { "source": "/guides/recipes/auth/sql-api-ldap", - "destination": "/product/auth/recipes/sql-api-ldap", + "destination": "/product/auth/methods/ldap", + "permanent": true + }, + { + "source": "/product/auth/recipes/aws-cognito", + "destination": "/product/auth/methods/aws-cognito", + "permanent": true + }, + { + "source": "/product/auth/recipes/auth0-guide", + "destination": "/product/auth/methods/auth0", + "permanent": true + }, + { + "source": "/product/auth/recipes/sql-api-ldap", + "destination": "/product/auth/methods/ldap", "permanent": true }, { @@ -221,22 +236,42 @@ }, { "source": "/guides/recipes/access-control/controlling-access-to-cubes-and-views", - "destination": "/product/auth/recipes/controlling-access-to-cubes-and-views", + "destination": "/product/auth/context#controlling-access-to-cubes-and-views", "permanent": true }, { "source": "/guides/recipes/access-control/role-based-access", - "destination": "/product/auth/recipes/role-based-access", + "destination": "/product/auth/context#enforcing-role-based-access", "permanent": true }, { "source": "/guides/recipes/access-control/column-based-access", - "destination": "/product/auth/recipes/column-based-access", + "destination": "/product/auth/context#enforcing-column-based-access", + "permanent": true + }, + { + "source": "/product/auth/recipes/controlling-access-to-cubes-and-views", + "destination": "/product/auth/context#controlling-access-to-cubes-and-views", + "permanent": true + }, + { + "source": "/product/auth/recipes/role-based-access", + "destination": "/product/auth/context#enforcing-role-based-access", + "permanent": true + }, + { + "source": "/product/auth/recipes/column-based-access", + "destination": "/product/auth/context#enforcing-column-based-access", "permanent": true }, { "source": "/guides/recipes/access-control/enforcing-mandatory-filters", - "destination": "/product/auth/recipes/enforcing-mandatory-filters", + "destination": "/product/auth/context#enforcing-mandatory-filters", + "permanent": true + }, + { + "source": "/product/auth/recipes/enforcing-mandatory-filters", + "destination": "/product/auth/context#enforcing-mandatory-filters", "permanent": true }, { @@ -1476,7 +1511,7 @@ }, { "source": "/recipes/enforcing-mandatory-filters", - "destination": "/guides/recipes/access-control/enforcing-mandatory-filters", + "destination": "/product/auth/context#enforcing-mandatory-filters", "permanent": true }, { @@ -1491,22 +1526,22 @@ }, { "source": "/recipes/authn-with-auth0", - "destination": "/product/auth/recipes/auth0-guide", + "destination": "/product/auth/methods/auth0", "permanent": true }, { "source": "/security/jwt/auth0", - "destination": "/product/auth/recipes/auth0-guide", + "destination": "/product/auth/methods/auth0", "permanent": true }, { "source": "/recipes/authn-with-aws-cognito", - "destination": "/product/auth/recipes/aws-cognito", + "destination": "/product/auth/methods/aws-cognito", "permanent": true }, { "source": "/security/jwt/aws-cognito", - "destination": "/product/auth/recipes/aws-cognito", + "destination": "/product/auth/methods/aws-cognito", "permanent": true }, { @@ -1601,17 +1636,17 @@ }, { "source": "/recipes/role-based-access", - "destination": "/guides/recipes/access-control/role-based-access", + "destination": "/product/auth/context#enforcing-role-based-access", "permanent": true }, { "source": "/recipes/controlling-access-to-cubes-and-views", - "destination": "/product/auth/recipes/controlling-access-to-cubes-and-views", + "destination": "/product/auth/context#controlling-access-to-cubes-and-views", "permanent": true }, { "source": "/recipes/column-based-access", - "destination": "/guides/recipes/access-control/column-based-access", + "destination": "/product/auth/context#enforcing-column-based-access", "permanent": true }, { @@ -1988,5 +2023,80 @@ "source": "/product/agentic-analytics/roles-and-permissions", "destination": "/product/administration/users-and-permissions/roles-and-permissions", "permanent": true + }, + { + "source": "/product/apis-integrations/queries", + "destination": "/product/apis-integrations/core-data-apis/queries", + "permanent": true + }, + { + "source": "/product/apis-integrations/sql-api", + "destination": "/product/apis-integrations/core-data-apis/sql-api", + "permanent": true + }, + { + "source": "/product/apis-integrations/sql-api/joins", + "destination": "/product/apis-integrations/core-data-apis/sql-api/joins", + "permanent": true + }, + { + "source": "/product/apis-integrations/sql-api/query-format", + "destination": "/product/apis-integrations/core-data-apis/sql-api/query-format", + "permanent": true + }, + { + "source": "/product/apis-integrations/sql-api/reference", + "destination": "/product/apis-integrations/core-data-apis/sql-api/reference", + "permanent": true + }, + { + "source": "/product/apis-integrations/sql-api/security", + "destination": "/product/apis-integrations/core-data-apis/sql-api/security", + "permanent": true + }, + { + "source": "/product/apis-integrations/dax-api", + "destination": "/product/apis-integrations/core-data-apis/dax-api", + "permanent": true + }, + { + "source": "/product/apis-integrations/dax-api/reference", + "destination": "/product/apis-integrations/core-data-apis/dax-api/reference", + "permanent": true + }, + { + "source": "/product/apis-integrations/mdx-api", + "destination": "/product/apis-integrations/core-data-apis/mdx-api", + "permanent": true + }, + { + "source": "/product/apis-integrations/rest-api", + "destination": "/product/apis-integrations/core-data-apis/rest-api", + "permanent": true + }, + { + "source": "/product/apis-integrations/rest-api/query-format", + "destination": "/product/apis-integrations/core-data-apis/rest-api/query-format", + "permanent": true + }, + { + "source": "/product/apis-integrations/rest-api/reference", + "destination": "/product/apis-integrations/core-data-apis/rest-api/reference", + "permanent": true + }, + { + "source": "/product/apis-integrations/graphql-api", + "destination": "/product/apis-integrations/core-data-apis/graphql-api", + "permanent": true + }, + { + "source": "/product/apis-integrations/graphql-api/reference", + "destination": "/product/apis-integrations/core-data-apis/graphql-api/reference", + "permanent": true + }, + { + "source": "/product/apis-integrations/chat-api", + "destination": "/product/apis-integrations/embed-apis/chat-api", + "permanent": true } ] diff --git a/docs/theme.config.tsx b/docs/theme.config.tsx index 415c4c8f7c034..6b10df58dfede 100644 --- a/docs/theme.config.tsx +++ b/docs/theme.config.tsx @@ -110,14 +110,12 @@ const config: DocsThemeConfig = { ) }, toc: { - extraContent: ( -
-
- - - -
- ) + }, + editLink: { + component: null + }, + feedback: { + content: null } }; diff --git a/lerna.json b/lerna.json index 8d64070a9afa7..5aa37c2b3ff0f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.5.14", + "version": "1.5.15", "npmClient": "yarn", "command": { "bootstrap": { diff --git a/packages/cubejs-api-gateway/CHANGELOG.md b/packages/cubejs-api-gateway/CHANGELOG.md index 9d1b555bf7e9a..6f1b40c49f4a9 100644 --- a/packages/cubejs-api-gateway/CHANGELOG.md +++ b/packages/cubejs-api-gateway/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +### Bug Fixes + +- **api-gateway:** Allow messageId to be int in unsubscribe WS request ([#10250](https://github.com/cube-js/cube/issues/10250)) ([1e2e7cb](https://github.com/cube-js/cube/commit/1e2e7cb382bfb95376f1149f9f91608914ff4bc1)) + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/api-gateway diff --git a/packages/cubejs-api-gateway/package.json b/packages/cubejs-api-gateway/package.json index a29caf54cec7b..3ddde03e68d38 100644 --- a/packages/cubejs-api-gateway/package.json +++ b/packages/cubejs-api-gateway/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/api-gateway", "description": "Cube.js API Gateway", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,9 +27,9 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/native": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/native": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@ungap/structured-clone": "^0.3.4", "assert-never": "^1.4.0", "body-parser": "^1.19.0", @@ -53,7 +53,7 @@ "zod": "^4.1.13" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/express": "^4.17.21", "@types/jest": "^29", "@types/jsonwebtoken": "^9.0.2", diff --git a/packages/cubejs-api-gateway/src/ws/local-subscription-store.ts b/packages/cubejs-api-gateway/src/ws/local-subscription-store.ts index 20d71cb6fcf5d..695e572b3ab2a 100644 --- a/packages/cubejs-api-gateway/src/ws/local-subscription-store.ts +++ b/packages/cubejs-api-gateway/src/ws/local-subscription-store.ts @@ -2,6 +2,8 @@ interface LocalSubscriptionStoreOptions { heartBeatInterval?: number; } +export type SubscriptionId = string | number; + export type LocalSubscriptionStoreSubscription = { message: any, state: any, @@ -9,7 +11,7 @@ export type LocalSubscriptionStoreSubscription = { }; export type LocalSubscriptionStoreConnection = { - subscriptions: Map, + subscriptions: Map, authContext?: any, }; @@ -35,7 +37,7 @@ export class LocalSubscriptionStore { }); } - public async unsubscribe(connectionId: string, subscriptionId: string) { + public async unsubscribe(connectionId: string, subscriptionId: SubscriptionId) { const connection = this.getConnectionOrCreate(connectionId); connection.subscriptions.delete(subscriptionId); } diff --git a/packages/cubejs-api-gateway/src/ws/message-schema.ts b/packages/cubejs-api-gateway/src/ws/message-schema.ts index ca981faee5fea..79c2d05d7d46f 100644 --- a/packages/cubejs-api-gateway/src/ws/message-schema.ts +++ b/packages/cubejs-api-gateway/src/ws/message-schema.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -const messageId = z.union([z.string().max(16), z.number()]); +const messageId = z.union([z.string().max(16), z.int()]); const requestId = z.string().max(64).optional(); export const authMessageSchema = z.object({ @@ -8,7 +8,7 @@ export const authMessageSchema = z.object({ }).strict(); export const unsubscribeMessageSchema = z.object({ - unsubscribe: z.string().max(16), + unsubscribe: messageId, }).strict(); const queryParams = z.object({ diff --git a/packages/cubejs-api-gateway/test/ws/subscription-server.test.ts b/packages/cubejs-api-gateway/test/ws/subscription-server.test.ts index 3f3709c9c4654..7e42377e49a36 100644 --- a/packages/cubejs-api-gateway/test/ws/subscription-server.test.ts +++ b/packages/cubejs-api-gateway/test/ws/subscription-server.test.ts @@ -59,6 +59,15 @@ describe('SubscriptionServer', () => { expect(mockSubscriptionStore.unsubscribe).toHaveBeenCalledWith('conn-1', 'msg-1'); }); + it('should accept unsubscribe with numeric messageId', async () => { + const { mockApiGateway, mockSubscriptionStore, mockSendMessage, mockContextAcceptor } = createMocks(); + const server = new SubscriptionServer(mockApiGateway, mockSendMessage, mockSubscriptionStore, mockContextAcceptor); + + await server.processMessage('conn-1', JSON.stringify({ unsubscribe: 123 })); + + expect(mockSubscriptionStore.unsubscribe).toHaveBeenCalledWith('conn-1', 123); + }); + it('should accept valid load message', async () => { const { mockApiGateway, mockSubscriptionStore, mockSendMessage, mockContextAcceptor, sentMessages } = createMocks(); const server = new SubscriptionServer(mockApiGateway, mockSendMessage, mockSubscriptionStore, mockContextAcceptor); diff --git a/packages/cubejs-athena-driver/CHANGELOG.md b/packages/cubejs-athena-driver/CHANGELOG.md index 0daa289d5bb34..be06dc3e82039 100644 --- a/packages/cubejs-athena-driver/CHANGELOG.md +++ b/packages/cubejs-athena-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/athena-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/athena-driver diff --git a/packages/cubejs-athena-driver/package.json b/packages/cubejs-athena-driver/package.json index 7b5337df8cf59..81c6854ffd101 100644 --- a/packages/cubejs-athena-driver/package.json +++ b/packages/cubejs-athena-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/athena-driver", "description": "Cube.js Athena database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -30,13 +30,13 @@ "dependencies": { "@aws-sdk/client-athena": "^3.22.0", "@aws-sdk/credential-providers": "^3.22.0", - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "sqlstring": "^2.3.1" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "@types/ramda": "^0.27.40", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-backend-cloud/CHANGELOG.md b/packages/cubejs-backend-cloud/CHANGELOG.md index fec88b8af01af..d07bb0020b490 100644 --- a/packages/cubejs-backend-cloud/CHANGELOG.md +++ b/packages/cubejs-backend-cloud/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/cloud + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/cloud diff --git a/packages/cubejs-backend-cloud/package.json b/packages/cubejs-backend-cloud/package.json index 0db88a34fbd83..6b4dd3327c439 100644 --- a/packages/cubejs-backend-cloud/package.json +++ b/packages/cubejs-backend-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/cloud", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube Cloud package", "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -30,7 +30,7 @@ "devDependencies": { "@babel/core": "^7.24.5", "@babel/preset-env": "^7.24.5", - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/fs-extra": "^9.0.8", "@types/jest": "^29", "jest": "^29", @@ -38,7 +38,7 @@ }, "dependencies": { "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "chokidar": "^3.5.1", "env-var": "^6.3.0", "form-data": "^4.0.0", diff --git a/packages/cubejs-backend-maven/CHANGELOG.md b/packages/cubejs-backend-maven/CHANGELOG.md index f3c27e024e49c..92ded0cad4851 100644 --- a/packages/cubejs-backend-maven/CHANGELOG.md +++ b/packages/cubejs-backend-maven/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/maven + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/maven diff --git a/packages/cubejs-backend-maven/package.json b/packages/cubejs-backend-maven/package.json index 18424b720fc77..a82cc3af3d45d 100644 --- a/packages/cubejs-backend-maven/package.json +++ b/packages/cubejs-backend-maven/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/maven", "description": "Cube.js Maven Wrapper for java dependencies downloading", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "license": "Apache-2.0", "repository": { "type": "git", @@ -31,12 +31,12 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "source-map-support": "^0.5.19", "xmlbuilder2": "^2.4.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "jest": "^29", diff --git a/packages/cubejs-backend-native/CHANGELOG.md b/packages/cubejs-backend-native/CHANGELOG.md index 92b7ea6ba74e0..48527b58c4563 100644 --- a/packages/cubejs-backend-native/CHANGELOG.md +++ b/packages/cubejs-backend-native/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/native + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/native diff --git a/packages/cubejs-backend-native/Cargo.lock b/packages/cubejs-backend-native/Cargo.lock index c14e231af0118..6d88153df1198 100644 --- a/packages/cubejs-backend-native/Cargo.lock +++ b/packages/cubejs-backend-native/Cargo.lock @@ -702,7 +702,7 @@ dependencies = [ [[package]] name = "cube-ext" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "arrow", "chrono", @@ -878,7 +878,7 @@ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "datafusion" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "ahash 0.7.8", "arrow", @@ -911,7 +911,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "arrow", "ordered-float 2.10.1", @@ -922,7 +922,7 @@ dependencies = [ [[package]] name = "datafusion-data-access" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "async-trait", "chrono", @@ -935,7 +935,7 @@ dependencies = [ [[package]] name = "datafusion-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "ahash 0.7.8", "arrow", @@ -946,7 +946,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "ahash 0.7.8", "arrow", diff --git a/packages/cubejs-backend-native/package.json b/packages/cubejs-backend-native/package.json index c7de97e81c9b2..eb12a1c05de5b 100644 --- a/packages/cubejs-backend-native/package.json +++ b/packages/cubejs-backend-native/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/native", - "version": "1.5.14", + "version": "1.5.15", "author": "Cube Dev, Inc.", "description": "Native module for Cube.js (binding to Rust codebase)", "main": "dist/js/index.js", @@ -36,7 +36,7 @@ "dist/js" ], "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "cargo-cp-artifact": "^0.1.9", @@ -47,8 +47,8 @@ "uuid": "^8.3.2" }, "dependencies": { - "@cubejs-backend/cubesql": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/cubesql": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@cubejs-infra/post-installer": "^0.0.7" }, "resources": { diff --git a/packages/cubejs-backend-shared/CHANGELOG.md b/packages/cubejs-backend-shared/CHANGELOG.md index f1449beda2fff..acb41a1f59179 100644 --- a/packages/cubejs-backend-shared/CHANGELOG.md +++ b/packages/cubejs-backend-shared/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/shared + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/shared diff --git a/packages/cubejs-backend-shared/package.json b/packages/cubejs-backend-shared/package.json index ad0e1464c4c02..9556532895608 100644 --- a/packages/cubejs-backend-shared/package.json +++ b/packages/cubejs-backend-shared/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/shared", - "version": "1.5.14", + "version": "1.5.15", "description": "Shared code for Cube.js backend packages", "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -27,7 +27,7 @@ }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/bytes": "^3.1.5", "@types/cli-progress": "^3.9.1", "@types/decompress": "^4.2.7", diff --git a/packages/cubejs-base-driver/CHANGELOG.md b/packages/cubejs-base-driver/CHANGELOG.md index ec2bca7aa9b55..46428a7823e5d 100644 --- a/packages/cubejs-base-driver/CHANGELOG.md +++ b/packages/cubejs-base-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/base-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/base-driver diff --git a/packages/cubejs-base-driver/package.json b/packages/cubejs-base-driver/package.json index dc4d2a27c68c6..0897f1d42215f 100644 --- a/packages/cubejs-base-driver/package.json +++ b/packages/cubejs-base-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/base-driver", "description": "Cube.js Base Driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -33,11 +33,11 @@ "@aws-sdk/s3-request-presigner": "^3.49.0", "@azure/identity": "^4.4.1", "@azure/storage-blob": "^12.9.0", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "@google-cloud/storage": "^7.13.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "jest": "^29", diff --git a/packages/cubejs-bigquery-driver/CHANGELOG.md b/packages/cubejs-bigquery-driver/CHANGELOG.md index 36c35b3a9ab40..668c575579bdb 100644 --- a/packages/cubejs-bigquery-driver/CHANGELOG.md +++ b/packages/cubejs-bigquery-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/bigquery-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/bigquery-driver diff --git a/packages/cubejs-bigquery-driver/package.json b/packages/cubejs-bigquery-driver/package.json index fc9555dea116f..b6e2e366fe9ee 100644 --- a/packages/cubejs-bigquery-driver/package.json +++ b/packages/cubejs-bigquery-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/bigquery-driver", "description": "Cube.js BigQuery database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -29,15 +29,15 @@ "main": "index.js", "types": "dist/src/index.d.ts", "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "@google-cloud/bigquery": "^7.7.0", "@google-cloud/storage": "^7.13.0", "ramda": "^0.27.2" }, "devDependencies": { - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/testing-shared": "1.5.15", "@types/big.js": "^6.2.2", "@types/dedent": "^0.7.0", "@types/jest": "^29", diff --git a/packages/cubejs-cli/CHANGELOG.md b/packages/cubejs-cli/CHANGELOG.md index ad789b7339952..b33bd2b3ef4b5 100644 --- a/packages/cubejs-cli/CHANGELOG.md +++ b/packages/cubejs-cli/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package cubejs-cli + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package cubejs-cli diff --git a/packages/cubejs-cli/package.json b/packages/cubejs-cli/package.json index c8e74a50d38d0..5930bb7b9845d 100644 --- a/packages/cubejs-cli/package.json +++ b/packages/cubejs-cli/package.json @@ -2,7 +2,7 @@ "name": "cubejs-cli", "description": "Cube.js Command Line Interface", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -30,10 +30,10 @@ "LICENSE" ], "dependencies": { - "@cubejs-backend/cloud": "1.5.14", + "@cubejs-backend/cloud": "1.5.15", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "chalk": "^2.4.2", "cli-progress": "^3.10", "commander": "^2.19.0", @@ -50,8 +50,8 @@ "colors": "1.4.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/server": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/server": "1.5.15", "@oclif/command": "^1.8.0", "@types/cli-progress": "^3.8.0", "@types/cross-spawn": "^6.0.2", diff --git a/packages/cubejs-clickhouse-driver/CHANGELOG.md b/packages/cubejs-clickhouse-driver/CHANGELOG.md index 0a4578a79362d..f0b9823c21877 100644 --- a/packages/cubejs-clickhouse-driver/CHANGELOG.md +++ b/packages/cubejs-clickhouse-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/clickhouse-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/clickhouse-driver diff --git a/packages/cubejs-clickhouse-driver/package.json b/packages/cubejs-clickhouse-driver/package.json index e7f6bbc1359ed..b3d50d7c5e706 100644 --- a/packages/cubejs-clickhouse-driver/package.json +++ b/packages/cubejs-clickhouse-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/clickhouse-driver", "description": "Cube.js ClickHouse database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -28,16 +28,16 @@ }, "dependencies": { "@clickhouse/client": "^1.12.0", - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "moment": "^2.24.0", "sqlstring": "^2.3.1", "uuid": "^8.3.2" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "@types/jest": "^29", "jest": "^29", "typescript": "~5.2.2" diff --git a/packages/cubejs-client-core/CHANGELOG.md b/packages/cubejs-client-core/CHANGELOG.md index 4009503397237..8244219e59f70 100644 --- a/packages/cubejs-client-core/CHANGELOG.md +++ b/packages/cubejs-client-core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-client/core + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/core diff --git a/packages/cubejs-client-core/package.json b/packages/cubejs-client-core/package.json index 7b14d7b13353c..c08e00ecada0b 100644 --- a/packages/cubejs-client-core/package.json +++ b/packages/cubejs-client-core/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-client/core", - "version": "1.5.14", + "version": "1.5.15", "engines": {}, "repository": { "type": "git", @@ -39,7 +39,7 @@ ], "license": "MIT", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/moment-range": "^4.0.0", "@types/ramda": "^0.27.34", diff --git a/packages/cubejs-client-dx/CHANGELOG.md b/packages/cubejs-client-dx/CHANGELOG.md index 4b7135b1a359a..9f0c94a86cc03 100644 --- a/packages/cubejs-client-dx/CHANGELOG.md +++ b/packages/cubejs-client-dx/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-client/dx + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/dx diff --git a/packages/cubejs-client-dx/package.json b/packages/cubejs-client-dx/package.json index a6580fcc48f16..d848ea7be4b3c 100644 --- a/packages/cubejs-client-dx/package.json +++ b/packages/cubejs-client-dx/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-client/dx", - "version": "1.5.14", + "version": "1.5.15", "engines": {}, "repository": { "type": "git", diff --git a/packages/cubejs-client-ngx/CHANGELOG.md b/packages/cubejs-client-ngx/CHANGELOG.md index 27d6003121f49..28a7c8d2443a6 100644 --- a/packages/cubejs-client-ngx/CHANGELOG.md +++ b/packages/cubejs-client-ngx/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-client/ngx + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/ngx diff --git a/packages/cubejs-client-ngx/package.json b/packages/cubejs-client-ngx/package.json index de5d8aa1369d9..1d1d5dbbef9e9 100644 --- a/packages/cubejs-client-ngx/package.json +++ b/packages/cubejs-client-ngx/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-client/ngx", - "version": "1.5.14", + "version": "1.5.15", "author": "Cube Dev, Inc.", "engines": {}, "repository": { diff --git a/packages/cubejs-client-react/CHANGELOG.md b/packages/cubejs-client-react/CHANGELOG.md index 9a8349b7c2d46..38a15faa5ea16 100644 --- a/packages/cubejs-client-react/CHANGELOG.md +++ b/packages/cubejs-client-react/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-client/react + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/react diff --git a/packages/cubejs-client-react/package.json b/packages/cubejs-client-react/package.json index 1082975557154..7ab2ed7588b96 100644 --- a/packages/cubejs-client-react/package.json +++ b/packages/cubejs-client-react/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-client/react", - "version": "1.5.14", + "version": "1.5.15", "author": "Cube Dev, Inc.", "license": "MIT", "engines": {}, @@ -24,7 +24,7 @@ ], "dependencies": { "@babel/runtime": "^7.1.2", - "@cubejs-client/core": "1.5.14", + "@cubejs-client/core": "1.5.15", "core-js": "^3.6.5", "ramda": "^0.27.2" }, diff --git a/packages/cubejs-client-vue3/CHANGELOG.md b/packages/cubejs-client-vue3/CHANGELOG.md index 5d9477b60557f..3a097788a0d6d 100644 --- a/packages/cubejs-client-vue3/CHANGELOG.md +++ b/packages/cubejs-client-vue3/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-client/vue3 + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/vue3 diff --git a/packages/cubejs-client-vue3/package.json b/packages/cubejs-client-vue3/package.json index 83242ef72009b..dd99fffc89c17 100644 --- a/packages/cubejs-client-vue3/package.json +++ b/packages/cubejs-client-vue3/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-client/vue3", - "version": "1.5.14", + "version": "1.5.15", "engines": {}, "repository": { "type": "git", @@ -28,7 +28,7 @@ "src" ], "dependencies": { - "@cubejs-client/core": "1.5.14", + "@cubejs-client/core": "1.5.15", "ramda": "^0.27.0" }, "devDependencies": { diff --git a/packages/cubejs-client-ws-transport/CHANGELOG.md b/packages/cubejs-client-ws-transport/CHANGELOG.md index 9972e00ea6187..3823783e5d300 100644 --- a/packages/cubejs-client-ws-transport/CHANGELOG.md +++ b/packages/cubejs-client-ws-transport/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +### Bug Fixes + +- **client-ws-transport:** Handle WebSocket close code 1009 (Message Too Big) ([#10246](https://github.com/cube-js/cube/issues/10246)) ([5652f0f](https://github.com/cube-js/cube/commit/5652f0f9e46fe0da942a2f23dbf41f6594fef2b8)) + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/ws-transport diff --git a/packages/cubejs-client-ws-transport/package.json b/packages/cubejs-client-ws-transport/package.json index 88808e43e98e1..d4b68da5cbecb 100644 --- a/packages/cubejs-client-ws-transport/package.json +++ b/packages/cubejs-client-ws-transport/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-client/ws-transport", - "version": "1.5.14", + "version": "1.5.15", "engines": {}, "repository": { "type": "git", @@ -20,7 +20,7 @@ }, "dependencies": { "@babel/runtime": "^7.1.2", - "@cubejs-client/core": "1.5.14", + "@cubejs-client/core": "1.5.15", "core-js": "^3.6.5", "isomorphic-ws": "^4.0.1", "ws": "^7.3.1" @@ -33,7 +33,7 @@ "@babel/core": "^7.3.3", "@babel/preset-env": "^7.3.1", "@babel/preset-typescript": "^7.12.1", - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/ws": "^7.2.9", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-crate-driver/CHANGELOG.md b/packages/cubejs-crate-driver/CHANGELOG.md index 4e047ef3cb15c..761927026427f 100644 --- a/packages/cubejs-crate-driver/CHANGELOG.md +++ b/packages/cubejs-crate-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/crate-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/crate-driver diff --git a/packages/cubejs-crate-driver/package.json b/packages/cubejs-crate-driver/package.json index 9e6c4fb83ccd9..7c97b3d42ef45 100644 --- a/packages/cubejs-crate-driver/package.json +++ b/packages/cubejs-crate-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/crate-driver", "description": "Cube.js Crate database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -28,14 +28,14 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/postgres-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/postgres-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "pg": "^8.7.1" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "testcontainers": "^10.28.0", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-cubestore-driver/CHANGELOG.md b/packages/cubejs-cubestore-driver/CHANGELOG.md index ad75e2f14b984..9b928f2a8e45c 100644 --- a/packages/cubejs-cubestore-driver/CHANGELOG.md +++ b/packages/cubejs-cubestore-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/cubestore-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/cubestore-driver diff --git a/packages/cubejs-cubestore-driver/package.json b/packages/cubejs-cubestore-driver/package.json index 8ff6861ccb6f3..537726aa4319f 100644 --- a/packages/cubejs-cubestore-driver/package.json +++ b/packages/cubejs-cubestore-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/cubestore-driver", "description": "Cube Store driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -26,10 +26,10 @@ "lint:fix": "eslint --fix src/*.ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/cubestore": "1.5.14", - "@cubejs-backend/native": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/cubestore": "1.5.15", + "@cubejs-backend/native": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "csv-write-stream": "^2.0.0", "flatbuffers": "23.3.3", "fs-extra": "^9.1.0", @@ -41,7 +41,7 @@ "ws": "^7.4.3" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/csv-write-stream": "^2.0.0", "@types/jest": "^29", "@types/node": "^20", diff --git a/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md b/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md index 661c4cd5363b0..ef24ba138d72a 100644 --- a/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md +++ b/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/databricks-jdbc-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/databricks-jdbc-driver diff --git a/packages/cubejs-databricks-jdbc-driver/package.json b/packages/cubejs-databricks-jdbc-driver/package.json index a350a03914536..58c17eb19b19b 100644 --- a/packages/cubejs-databricks-jdbc-driver/package.json +++ b/packages/cubejs-databricks-jdbc-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/databricks-jdbc-driver", "description": "Cube.js Databricks database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "license": "Apache-2.0", "repository": { "type": "git", @@ -30,17 +30,17 @@ "bin" ], "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/jdbc-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/jdbc-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "node-fetch": "^2.6.1", "ramda": "^0.27.2", "source-map-support": "^0.5.19", "uuid": "^8.3.2" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "@types/ramda": "^0.27.34", diff --git a/packages/cubejs-dbt-schema-extension/CHANGELOG.md b/packages/cubejs-dbt-schema-extension/CHANGELOG.md index 090864041aeee..40be47c59d80e 100644 --- a/packages/cubejs-dbt-schema-extension/CHANGELOG.md +++ b/packages/cubejs-dbt-schema-extension/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/dbt-schema-extension + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/dbt-schema-extension diff --git a/packages/cubejs-dbt-schema-extension/package.json b/packages/cubejs-dbt-schema-extension/package.json index 5e14838c1541c..15088a0a80e58 100644 --- a/packages/cubejs-dbt-schema-extension/package.json +++ b/packages/cubejs-dbt-schema-extension/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/dbt-schema-extension", "description": "Cube.js dbt Schema Extension", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -25,14 +25,14 @@ "lint:fix": "eslint --fix src/* --ext .ts,.js" }, "dependencies": { - "@cubejs-backend/schema-compiler": "1.5.14", + "@cubejs-backend/schema-compiler": "1.5.15", "fs-extra": "^9.1.0", "inflection": "^1.12.0", "node-fetch": "^2.6.1" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing": "1.5.15", "@types/jest": "^29", "jest": "^29", "stream-to-array": "^2.3.0", diff --git a/packages/cubejs-docker/CHANGELOG.md b/packages/cubejs-docker/CHANGELOG.md index e53753027ef06..06e77fde5afd1 100644 --- a/packages/cubejs-docker/CHANGELOG.md +++ b/packages/cubejs-docker/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/docker + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/docker diff --git a/packages/cubejs-docker/package.json b/packages/cubejs-docker/package.json index 23b4d5521249d..e3e9e6a26ea5d 100644 --- a/packages/cubejs-docker/package.json +++ b/packages/cubejs-docker/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/docker", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube.js In Docker (virtual package)", "author": "Cube Dev, Inc.", "license": "Apache-2.0", @@ -9,35 +9,35 @@ "node": ">=18.0.0" }, "dependencies": { - "@cubejs-backend/athena-driver": "1.5.14", - "@cubejs-backend/bigquery-driver": "1.5.14", - "@cubejs-backend/clickhouse-driver": "1.5.14", - "@cubejs-backend/crate-driver": "1.5.14", - "@cubejs-backend/databricks-jdbc-driver": "1.5.14", - "@cubejs-backend/dbt-schema-extension": "1.5.14", - "@cubejs-backend/dremio-driver": "1.5.14", - "@cubejs-backend/druid-driver": "1.5.14", - "@cubejs-backend/duckdb-driver": "1.5.14", - "@cubejs-backend/elasticsearch-driver": "1.5.14", - "@cubejs-backend/firebolt-driver": "1.5.14", - "@cubejs-backend/hive-driver": "1.5.14", - "@cubejs-backend/ksql-driver": "1.5.14", - "@cubejs-backend/materialize-driver": "1.5.14", - "@cubejs-backend/mongobi-driver": "1.5.14", - "@cubejs-backend/mssql-driver": "1.5.14", - "@cubejs-backend/mysql-driver": "1.5.14", - "@cubejs-backend/oracle-driver": "1.5.14", - "@cubejs-backend/pinot-driver": "1.5.14", - "@cubejs-backend/postgres-driver": "1.5.14", - "@cubejs-backend/prestodb-driver": "1.5.14", - "@cubejs-backend/questdb-driver": "1.5.14", - "@cubejs-backend/redshift-driver": "1.5.14", - "@cubejs-backend/server": "1.5.14", - "@cubejs-backend/snowflake-driver": "1.5.14", - "@cubejs-backend/sqlite-driver": "1.5.14", - "@cubejs-backend/trino-driver": "1.5.14", - "@cubejs-backend/vertica-driver": "1.5.14", - "cubejs-cli": "1.5.14", + "@cubejs-backend/athena-driver": "1.5.15", + "@cubejs-backend/bigquery-driver": "1.5.15", + "@cubejs-backend/clickhouse-driver": "1.5.15", + "@cubejs-backend/crate-driver": "1.5.15", + "@cubejs-backend/databricks-jdbc-driver": "1.5.15", + "@cubejs-backend/dbt-schema-extension": "1.5.15", + "@cubejs-backend/dremio-driver": "1.5.15", + "@cubejs-backend/druid-driver": "1.5.15", + "@cubejs-backend/duckdb-driver": "1.5.15", + "@cubejs-backend/elasticsearch-driver": "1.5.15", + "@cubejs-backend/firebolt-driver": "1.5.15", + "@cubejs-backend/hive-driver": "1.5.15", + "@cubejs-backend/ksql-driver": "1.5.15", + "@cubejs-backend/materialize-driver": "1.5.15", + "@cubejs-backend/mongobi-driver": "1.5.15", + "@cubejs-backend/mssql-driver": "1.5.15", + "@cubejs-backend/mysql-driver": "1.5.15", + "@cubejs-backend/oracle-driver": "1.5.15", + "@cubejs-backend/pinot-driver": "1.5.15", + "@cubejs-backend/postgres-driver": "1.5.15", + "@cubejs-backend/prestodb-driver": "1.5.15", + "@cubejs-backend/questdb-driver": "1.5.15", + "@cubejs-backend/redshift-driver": "1.5.15", + "@cubejs-backend/server": "1.5.15", + "@cubejs-backend/snowflake-driver": "1.5.15", + "@cubejs-backend/sqlite-driver": "1.5.15", + "@cubejs-backend/trino-driver": "1.5.15", + "@cubejs-backend/vertica-driver": "1.5.15", + "cubejs-cli": "1.5.15", "typescript": "~5.2.2" }, "resolutions": { diff --git a/packages/cubejs-dremio-driver/CHANGELOG.md b/packages/cubejs-dremio-driver/CHANGELOG.md index c58a7c1044a71..f76b34ad447e4 100644 --- a/packages/cubejs-dremio-driver/CHANGELOG.md +++ b/packages/cubejs-dremio-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/dremio-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/dremio-driver diff --git a/packages/cubejs-dremio-driver/package.json b/packages/cubejs-dremio-driver/package.json index dd2f2eb8cc07e..b4f88709f4ce6 100644 --- a/packages/cubejs-dremio-driver/package.json +++ b/packages/cubejs-dremio-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/dremio-driver", "description": "Cube.js Dremio driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -22,15 +22,15 @@ "lint:fix": "eslint driver/*.js" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "axios": "^1.8.3", "sqlstring": "^2.3.1" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "jest": "^29" }, "license": "Apache-2.0", diff --git a/packages/cubejs-druid-driver/CHANGELOG.md b/packages/cubejs-druid-driver/CHANGELOG.md index f3011d02ce728..f5bf842704ca1 100644 --- a/packages/cubejs-druid-driver/CHANGELOG.md +++ b/packages/cubejs-druid-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/druid-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/druid-driver diff --git a/packages/cubejs-druid-driver/package.json b/packages/cubejs-druid-driver/package.json index 79e96f5aa8a03..d76c54bac61a9 100644 --- a/packages/cubejs-druid-driver/package.json +++ b/packages/cubejs-druid-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/druid-driver", "description": "Cube.js Druid database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "license": "Apache-2.0", "repository": { "type": "git", @@ -28,13 +28,13 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "axios": "^1.8.3" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "jest": "^29", diff --git a/packages/cubejs-duckdb-driver/CHANGELOG.md b/packages/cubejs-duckdb-driver/CHANGELOG.md index 3ccb4ba128065..8a00525a7602c 100644 --- a/packages/cubejs-duckdb-driver/CHANGELOG.md +++ b/packages/cubejs-duckdb-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/duckdb-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/duckdb-driver diff --git a/packages/cubejs-duckdb-driver/package.json b/packages/cubejs-duckdb-driver/package.json index 08fb21d76712d..bf4d3fb925ac9 100644 --- a/packages/cubejs-duckdb-driver/package.json +++ b/packages/cubejs-duckdb-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/duckdb-driver", "description": "Cube DuckDB database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,15 +27,15 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "duckdb": "^1.4.1" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "jest": "^29", diff --git a/packages/cubejs-elasticsearch-driver/CHANGELOG.md b/packages/cubejs-elasticsearch-driver/CHANGELOG.md index 22162657a3193..daefc97fa9869 100644 --- a/packages/cubejs-elasticsearch-driver/CHANGELOG.md +++ b/packages/cubejs-elasticsearch-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/elasticsearch-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/elasticsearch-driver diff --git a/packages/cubejs-elasticsearch-driver/package.json b/packages/cubejs-elasticsearch-driver/package.json index 4a329eccb1c84..3478135bb00cd 100644 --- a/packages/cubejs-elasticsearch-driver/package.json +++ b/packages/cubejs-elasticsearch-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/elasticsearch-driver", "description": "Cube.js elasticsearch database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -23,14 +23,14 @@ "driver" ], "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@elastic/elasticsearch": "7.12.0", "sqlstring": "^2.3.1" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "jest": "^29", "testcontainers": "^10.28.0" diff --git a/packages/cubejs-firebolt-driver/CHANGELOG.md b/packages/cubejs-firebolt-driver/CHANGELOG.md index 91d7c0f2c9151..3979a91fcf647 100644 --- a/packages/cubejs-firebolt-driver/CHANGELOG.md +++ b/packages/cubejs-firebolt-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/firebolt-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/firebolt-driver diff --git a/packages/cubejs-firebolt-driver/package.json b/packages/cubejs-firebolt-driver/package.json index dc53ca117d373..c649e684f7c46 100644 --- a/packages/cubejs-firebolt-driver/package.json +++ b/packages/cubejs-firebolt-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/firebolt-driver", "description": "Cube.js Firebolt database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -28,15 +28,15 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "firebolt-sdk": "1.10.0" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "typescript": "~5.2.2" }, "publishConfig": { diff --git a/packages/cubejs-hive-driver/CHANGELOG.md b/packages/cubejs-hive-driver/CHANGELOG.md index c68fa6051a3a2..8e234b92b2650 100644 --- a/packages/cubejs-hive-driver/CHANGELOG.md +++ b/packages/cubejs-hive-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/hive-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/hive-driver diff --git a/packages/cubejs-hive-driver/package.json b/packages/cubejs-hive-driver/package.json index 7ac0f7a265e63..ca317e913cb72 100644 --- a/packages/cubejs-hive-driver/package.json +++ b/packages/cubejs-hive-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/hive-driver", "description": "Cube.js Hive database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -17,8 +17,8 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "generic-pool": "^3.8.2", "jshs2": "^0.4.4", "sasl-plain": "^0.1.0", @@ -28,7 +28,7 @@ }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14" + "@cubejs-backend/linter": "1.5.15" }, "publishConfig": { "access": "public" diff --git a/packages/cubejs-jdbc-driver/CHANGELOG.md b/packages/cubejs-jdbc-driver/CHANGELOG.md index 87e19e6c0bc56..51c686747d3f9 100644 --- a/packages/cubejs-jdbc-driver/CHANGELOG.md +++ b/packages/cubejs-jdbc-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/jdbc-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/jdbc-driver diff --git a/packages/cubejs-jdbc-driver/package.json b/packages/cubejs-jdbc-driver/package.json index b217056e52b38..f1115a21711d5 100644 --- a/packages/cubejs-jdbc-driver/package.json +++ b/packages/cubejs-jdbc-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/jdbc-driver", "description": "Cube.js JDBC database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -25,9 +25,9 @@ "index.js" ], "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", "@cubejs-backend/node-java-maven": "^0.1.3", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "generic-pool": "^3.9.0", "sqlstring": "^2.3.0" }, @@ -43,7 +43,7 @@ "testEnvironment": "node" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/node": "^20", "@types/sqlstring": "^2.3.0", "typescript": "~5.2.2" diff --git a/packages/cubejs-ksql-driver/CHANGELOG.md b/packages/cubejs-ksql-driver/CHANGELOG.md index a6642bad45c4c..5b9ac6caa758e 100644 --- a/packages/cubejs-ksql-driver/CHANGELOG.md +++ b/packages/cubejs-ksql-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/ksql-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/ksql-driver diff --git a/packages/cubejs-ksql-driver/package.json b/packages/cubejs-ksql-driver/package.json index dadfa07dfe89f..0758648ff5b5e 100644 --- a/packages/cubejs-ksql-driver/package.json +++ b/packages/cubejs-ksql-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/ksql-driver", "description": "Cube.js ksql database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -25,9 +25,9 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "async-mutex": "0.3.2", "axios": "^1.8.3", "kafkajs": "^2.2.3", @@ -41,7 +41,7 @@ "extends": "../cubejs-linter" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "typescript": "~5.2.2" } } diff --git a/packages/cubejs-linter/CHANGELOG.md b/packages/cubejs-linter/CHANGELOG.md index 775db8a137191..e2e16192fb574 100644 --- a/packages/cubejs-linter/CHANGELOG.md +++ b/packages/cubejs-linter/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/linter + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/linter diff --git a/packages/cubejs-linter/package.json b/packages/cubejs-linter/package.json index ce9b9fbc481d6..5fbd4c19ff6fd 100644 --- a/packages/cubejs-linter/package.json +++ b/packages/cubejs-linter/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/linter", "description": "Cube.js ESLint (virtual package) for linting code", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", diff --git a/packages/cubejs-materialize-driver/CHANGELOG.md b/packages/cubejs-materialize-driver/CHANGELOG.md index 161c2aefee8fa..d78a63a97d28a 100644 --- a/packages/cubejs-materialize-driver/CHANGELOG.md +++ b/packages/cubejs-materialize-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/materialize-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/materialize-driver diff --git a/packages/cubejs-materialize-driver/package.json b/packages/cubejs-materialize-driver/package.json index a3d8104db9a7d..5f4390b71d7b2 100644 --- a/packages/cubejs-materialize-driver/package.json +++ b/packages/cubejs-materialize-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/materialize-driver", "description": "Cube.js Materialize database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,17 +27,17 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/postgres-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/postgres-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@types/pg": "^8.6.0", "pg": "^8.6.0", "semver": "^7.6.3" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing": "1.5.15", "typescript": "~5.2.2" }, "publishConfig": { diff --git a/packages/cubejs-mongobi-driver/CHANGELOG.md b/packages/cubejs-mongobi-driver/CHANGELOG.md index 32f4c2aa9ee0d..aa777c6e48359 100644 --- a/packages/cubejs-mongobi-driver/CHANGELOG.md +++ b/packages/cubejs-mongobi-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/mongobi-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/mongobi-driver diff --git a/packages/cubejs-mongobi-driver/package.json b/packages/cubejs-mongobi-driver/package.json index ba377297e3638..54b3ede4306ef 100644 --- a/packages/cubejs-mongobi-driver/package.json +++ b/packages/cubejs-mongobi-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/mongobi-driver", "description": "Cube.js MongoBI driver", "author": "krunalsabnis@gmail.com", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,8 +27,8 @@ "integration:mongobi": "jest dist/test" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@types/node": "^20", "generic-pool": "^3.9.0", "moment": "^2.29.1", @@ -39,7 +39,7 @@ "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "testcontainers": "^10.28.0", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-mssql-driver/CHANGELOG.md b/packages/cubejs-mssql-driver/CHANGELOG.md index 50c5cba90ae34..e88f83b4c8342 100644 --- a/packages/cubejs-mssql-driver/CHANGELOG.md +++ b/packages/cubejs-mssql-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/mssql-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/mssql-driver diff --git a/packages/cubejs-mssql-driver/package.json b/packages/cubejs-mssql-driver/package.json index 789e1b66252ac..82ee7fe4b780b 100644 --- a/packages/cubejs-mssql-driver/package.json +++ b/packages/cubejs-mssql-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/mssql-driver", "description": "Cube.js MS SQL database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -25,8 +25,8 @@ "lint:fix": "eslint --fix src/* --ext .ts,.js" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "mssql": "^11.0.1" }, "devDependencies": { diff --git a/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md b/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md index 0db25d91f1767..15edea15ecbdf 100644 --- a/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md +++ b/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/mysql-aurora-serverless-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/mysql-aurora-serverless-driver diff --git a/packages/cubejs-mysql-aurora-serverless-driver/package.json b/packages/cubejs-mysql-aurora-serverless-driver/package.json index 22e2e81375c10..f9391de76f5ab 100644 --- a/packages/cubejs-mysql-aurora-serverless-driver/package.json +++ b/packages/cubejs-mysql-aurora-serverless-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/mysql-aurora-serverless-driver", "description": "Cube.js Aurora Serverless Mysql database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -21,14 +21,14 @@ "lint": "eslint driver/*.js test/*.js" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@types/mysql": "^2.15.15", "aws-sdk": "^2.787.0", "data-api-client": "^1.1.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/data-api-client": "^1.2.1", "@types/jest": "^29", "jest": "^29", diff --git a/packages/cubejs-mysql-driver/CHANGELOG.md b/packages/cubejs-mysql-driver/CHANGELOG.md index feb6d55d1401b..451881f2922a5 100644 --- a/packages/cubejs-mysql-driver/CHANGELOG.md +++ b/packages/cubejs-mysql-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/mysql-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/mysql-driver diff --git a/packages/cubejs-mysql-driver/package.json b/packages/cubejs-mysql-driver/package.json index dc5136c67e236..7ac030b7a43c2 100644 --- a/packages/cubejs-mysql-driver/package.json +++ b/packages/cubejs-mysql-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/mysql-driver", "description": "Cube.js Mysql database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,14 +27,14 @@ "lint:fix": "eslint --fix src/* test/* --ext .ts,.js" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "generic-pool": "^3.9.0", "mysql": "^2.18.1" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "@types/jest": "^29", "@types/mysql": "^2.15.21", "jest": "^29", diff --git a/packages/cubejs-oracle-driver/CHANGELOG.md b/packages/cubejs-oracle-driver/CHANGELOG.md index 84e346ce0191d..94cf8306e4943 100644 --- a/packages/cubejs-oracle-driver/CHANGELOG.md +++ b/packages/cubejs-oracle-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/oracle-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/oracle-driver diff --git a/packages/cubejs-oracle-driver/package.json b/packages/cubejs-oracle-driver/package.json index 7a09a741e3934..1f8d5a6e85295 100644 --- a/packages/cubejs-oracle-driver/package.json +++ b/packages/cubejs-oracle-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/oracle-driver", "description": "Cube.js oracle database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -13,7 +13,7 @@ }, "main": "driver/OracleDriver.js", "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", "ramda": "^0.27.0" }, "optionalDependencies": { diff --git a/packages/cubejs-pinot-driver/CHANGELOG.md b/packages/cubejs-pinot-driver/CHANGELOG.md index 3985460db6a84..2a46c7f2a5c29 100644 --- a/packages/cubejs-pinot-driver/CHANGELOG.md +++ b/packages/cubejs-pinot-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/pinot-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/pinot-driver diff --git a/packages/cubejs-pinot-driver/package.json b/packages/cubejs-pinot-driver/package.json index c9eb0e836f77c..3ad61ba831999 100644 --- a/packages/cubejs-pinot-driver/package.json +++ b/packages/cubejs-pinot-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/pinot-driver", "description": "Cube.js Pinot database driver", "author": "Julian Ronsse, InTheMemory, Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,9 +27,9 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "node-fetch": "^2.6.1", "ramda": "^0.27.2", "sqlstring": "^2.3.3" @@ -39,7 +39,7 @@ "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "jest": "^29", "should": "^13.2.3", diff --git a/packages/cubejs-playground/CHANGELOG.md b/packages/cubejs-playground/CHANGELOG.md index a302f04f96471..3a3e116150036 100644 --- a/packages/cubejs-playground/CHANGELOG.md +++ b/packages/cubejs-playground/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-client/playground + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-client/playground diff --git a/packages/cubejs-playground/package.json b/packages/cubejs-playground/package.json index a46cf5eeed343..d43b9d1bce07f 100644 --- a/packages/cubejs-playground/package.json +++ b/packages/cubejs-playground/package.json @@ -1,7 +1,7 @@ { "name": "@cubejs-client/playground", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "engines": {}, "repository": { "type": "git", @@ -69,8 +69,8 @@ "@ant-design/compatible": "^1.0.1", "@ant-design/icons": "^5.3.5", "@cube-dev/ui-kit": "0.52.3", - "@cubejs-client/core": "1.5.14", - "@cubejs-client/react": "1.5.14", + "@cubejs-client/core": "1.5.15", + "@cubejs-client/react": "1.5.15", "@types/flexsearch": "^0.7.3", "@types/node": "^20", "@types/react": "^18.3.4", diff --git a/packages/cubejs-postgres-driver/CHANGELOG.md b/packages/cubejs-postgres-driver/CHANGELOG.md index 5ae9e2b324ae2..698f4d731f871 100644 --- a/packages/cubejs-postgres-driver/CHANGELOG.md +++ b/packages/cubejs-postgres-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/postgres-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/postgres-driver diff --git a/packages/cubejs-postgres-driver/package.json b/packages/cubejs-postgres-driver/package.json index f8d4fb6b728cb..e7bbabe792115 100644 --- a/packages/cubejs-postgres-driver/package.json +++ b/packages/cubejs-postgres-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/postgres-driver", "description": "Cube.js Postgres database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,8 +27,8 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@types/pg": "^8.6.0", "@types/pg-query-stream": "^1.0.3", "moment": "^2.24.0", @@ -37,8 +37,8 @@ }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "testcontainers": "^10.28.0", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-prestodb-driver/CHANGELOG.md b/packages/cubejs-prestodb-driver/CHANGELOG.md index 2b8d81b99fdca..b5d93823c12e8 100644 --- a/packages/cubejs-prestodb-driver/CHANGELOG.md +++ b/packages/cubejs-prestodb-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/prestodb-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/prestodb-driver diff --git a/packages/cubejs-prestodb-driver/package.json b/packages/cubejs-prestodb-driver/package.json index 68314c3aa1c53..72cee31cc0473 100644 --- a/packages/cubejs-prestodb-driver/package.json +++ b/packages/cubejs-prestodb-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/prestodb-driver", "description": "Cube.js Presto database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,8 +27,8 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "presto-client": "^1.1.0", "ramda": "^0.27.0", "sqlstring": "^2.3.1" @@ -38,7 +38,7 @@ "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "jest": "^29", "should": "^13.2.3", diff --git a/packages/cubejs-query-orchestrator/CHANGELOG.md b/packages/cubejs-query-orchestrator/CHANGELOG.md index 236f65791369e..bcab23aac3ad0 100644 --- a/packages/cubejs-query-orchestrator/CHANGELOG.md +++ b/packages/cubejs-query-orchestrator/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/query-orchestrator + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/query-orchestrator diff --git a/packages/cubejs-query-orchestrator/package.json b/packages/cubejs-query-orchestrator/package.json index 3db25d0489917..771fb883299e2 100644 --- a/packages/cubejs-query-orchestrator/package.json +++ b/packages/cubejs-query-orchestrator/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/query-orchestrator", "description": "Cube.js Query Orchestrator and Cache", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -29,15 +29,15 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/cubestore-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/cubestore-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "csv-write-stream": "^2.0.0", "lru-cache": "^11.1.0", "ramda": "^0.27.2" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "@types/node": "^20", "@types/ramda": "^0.27.32", diff --git a/packages/cubejs-questdb-driver/CHANGELOG.md b/packages/cubejs-questdb-driver/CHANGELOG.md index 556d68eb90e7a..85445e6991fcb 100644 --- a/packages/cubejs-questdb-driver/CHANGELOG.md +++ b/packages/cubejs-questdb-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/questdb-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/questdb-driver diff --git a/packages/cubejs-questdb-driver/package.json b/packages/cubejs-questdb-driver/package.json index bb7c0f1269743..063ec9f508905 100644 --- a/packages/cubejs-questdb-driver/package.json +++ b/packages/cubejs-questdb-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/questdb-driver", "description": "Cube.js QuestDB database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,9 +27,9 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@types/pg": "^8.6.0", "moment": "^2.24.0", "pg": "^8.7.0", @@ -37,8 +37,8 @@ }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "testcontainers": "^10.28.0", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-redshift-driver/CHANGELOG.md b/packages/cubejs-redshift-driver/CHANGELOG.md index d162f8295421e..11a2f15ccea49 100644 --- a/packages/cubejs-redshift-driver/CHANGELOG.md +++ b/packages/cubejs-redshift-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/redshift-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/redshift-driver diff --git a/packages/cubejs-redshift-driver/package.json b/packages/cubejs-redshift-driver/package.json index 34d18cc50b926..667b8e2b080a5 100644 --- a/packages/cubejs-redshift-driver/package.json +++ b/packages/cubejs-redshift-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/redshift-driver", "description": "Cube.js Redshift database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -25,13 +25,13 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/postgres-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14" + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/postgres-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "typescript": "~5.2.2" }, "publishConfig": { diff --git a/packages/cubejs-schema-compiler/CHANGELOG.md b/packages/cubejs-schema-compiler/CHANGELOG.md index 1445af84c590d..e8208373a2bed 100644 --- a/packages/cubejs-schema-compiler/CHANGELOG.md +++ b/packages/cubejs-schema-compiler/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/schema-compiler + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/schema-compiler diff --git a/packages/cubejs-schema-compiler/package.json b/packages/cubejs-schema-compiler/package.json index 0f88570b2ae24..dd66cc58f301f 100644 --- a/packages/cubejs-schema-compiler/package.json +++ b/packages/cubejs-schema-compiler/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/schema-compiler", "description": "Cube schema compiler", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -40,8 +40,8 @@ "@babel/standalone": "^7.24", "@babel/traverse": "^7.24", "@babel/types": "^7.24", - "@cubejs-backend/native": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/native": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "antlr4": "^4.13.2", "camelcase": "^6.2.0", "cron-parser": "^4.9.0", @@ -60,8 +60,8 @@ }, "devDependencies": { "@clickhouse/client": "^1.12.0", - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", "@types/babel__code-frame": "^7.0.6", "@types/babel__generator": "^7.6.8", "@types/babel__traverse": "^7.20.5", diff --git a/packages/cubejs-server-core/CHANGELOG.md b/packages/cubejs-server-core/CHANGELOG.md index 425ddd79e0b1e..11f77c699f222 100644 --- a/packages/cubejs-server-core/CHANGELOG.md +++ b/packages/cubejs-server-core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/server-core + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) ### Bug Fixes diff --git a/packages/cubejs-server-core/package.json b/packages/cubejs-server-core/package.json index f395804c15dc9..6d6095c99e0b3 100644 --- a/packages/cubejs-server-core/package.json +++ b/packages/cubejs-server-core/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/server-core", "description": "Cube.js base component to wire all backend components together", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -29,16 +29,16 @@ "unit": "jest --runInBand --forceExit --coverage dist/test" }, "dependencies": { - "@cubejs-backend/api-gateway": "1.5.14", - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/cloud": "1.5.14", - "@cubejs-backend/cubestore-driver": "1.5.14", + "@cubejs-backend/api-gateway": "1.5.15", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/cloud": "1.5.15", + "@cubejs-backend/cubestore-driver": "1.5.15", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/native": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", - "@cubejs-backend/templates": "1.5.14", + "@cubejs-backend/native": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", + "@cubejs-backend/templates": "1.5.15", "codesandbox-import-utils": "^2.1.12", "cross-spawn": "^7.0.1", "fs-extra": "^8.1.0", @@ -62,8 +62,8 @@ "ws": "^7.5.3" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-client/playground": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-client/playground": "1.5.15", "@types/cross-spawn": "^6.0.2", "@types/express": "^4.17.21", "@types/fs-extra": "^9.0.8", diff --git a/packages/cubejs-server/CHANGELOG.md b/packages/cubejs-server/CHANGELOG.md index 68de8c8d4dad6..dbb16a3c8dbdd 100644 --- a/packages/cubejs-server/CHANGELOG.md +++ b/packages/cubejs-server/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/server + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/server diff --git a/packages/cubejs-server/package.json b/packages/cubejs-server/package.json index 68cda4a84a38d..56ba709009486 100644 --- a/packages/cubejs-server/package.json +++ b/packages/cubejs-server/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/server", "description": "Cube.js all-in-one server", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "types": "index.d.ts", "repository": { "type": "git", @@ -40,11 +40,11 @@ "jest:shapshot": "jest --updateSnapshot test" }, "dependencies": { - "@cubejs-backend/cubestore-driver": "1.5.14", + "@cubejs-backend/cubestore-driver": "1.5.15", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/native": "1.5.14", - "@cubejs-backend/server-core": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/native": "1.5.15", + "@cubejs-backend/server-core": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@oclif/color": "^1.0.0", "@oclif/command": "^1.8.13", "@oclif/config": "^1.18.2", @@ -61,8 +61,8 @@ "ws": "^7.1.2" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", "@oclif/dev-cli": "^1.23.1", "@types/body-parser": "^1.19.0", "@types/cors": "^2.8.8", diff --git a/packages/cubejs-snowflake-driver/CHANGELOG.md b/packages/cubejs-snowflake-driver/CHANGELOG.md index 4039075e22d65..52474a5321aed 100644 --- a/packages/cubejs-snowflake-driver/CHANGELOG.md +++ b/packages/cubejs-snowflake-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/snowflake-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/snowflake-driver diff --git a/packages/cubejs-snowflake-driver/package.json b/packages/cubejs-snowflake-driver/package.json index ec36e24babeab..6c709d5f4cbf7 100644 --- a/packages/cubejs-snowflake-driver/package.json +++ b/packages/cubejs-snowflake-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/snowflake-driver", "description": "Cube.js Snowflake database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -26,8 +26,8 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.726.0", - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "date-fns-timezone": "^0.1.4", "snowflake-sdk": "^2.2.0" }, @@ -39,7 +39,7 @@ "extends": "../cubejs-linter" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "typescript": "~5.2.2" } } diff --git a/packages/cubejs-sqlite-driver/CHANGELOG.md b/packages/cubejs-sqlite-driver/CHANGELOG.md index a5bb911833556..d78f484e8de11 100644 --- a/packages/cubejs-sqlite-driver/CHANGELOG.md +++ b/packages/cubejs-sqlite-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/sqlite-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/sqlite-driver diff --git a/packages/cubejs-sqlite-driver/package.json b/packages/cubejs-sqlite-driver/package.json index 8c549b02099e9..a020604abe551 100644 --- a/packages/cubejs-sqlite-driver/package.json +++ b/packages/cubejs-sqlite-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/sqlite-driver", "description": "Cube.js Sqlite database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -18,13 +18,13 @@ "unit": "jest" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "sqlite3": "^5.1.7" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "jest": "^29" }, "publishConfig": { diff --git a/packages/cubejs-templates/CHANGELOG.md b/packages/cubejs-templates/CHANGELOG.md index c21e36bc4c4a2..f7fc9520834ee 100644 --- a/packages/cubejs-templates/CHANGELOG.md +++ b/packages/cubejs-templates/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/templates + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/templates diff --git a/packages/cubejs-templates/package.json b/packages/cubejs-templates/package.json index 4b0bc2229ec89..c87610117cb5e 100644 --- a/packages/cubejs-templates/package.json +++ b/packages/cubejs-templates/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/templates", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube.js Templates helpers", "author": "Cube Dev, Inc.", "repository": { @@ -31,7 +31,7 @@ "extends": "../cubejs-linter" }, "dependencies": { - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "cross-spawn": "^7.0.3", "decompress": "^4.2.1", "decompress-targz": "^4.1.1", @@ -41,7 +41,7 @@ "source-map-support": "^0.5.19" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "typescript": "~5.2.2" } } diff --git a/packages/cubejs-testing-drivers/CHANGELOG.md b/packages/cubejs-testing-drivers/CHANGELOG.md index 8c1b2f3730fe7..fd4cf1825c00a 100644 --- a/packages/cubejs-testing-drivers/CHANGELOG.md +++ b/packages/cubejs-testing-drivers/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/testing-drivers + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/testing-drivers diff --git a/packages/cubejs-testing-drivers/package.json b/packages/cubejs-testing-drivers/package.json index 451b25675d5d6..c0cc3d08f61e8 100644 --- a/packages/cubejs-testing-drivers/package.json +++ b/packages/cubejs-testing-drivers/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/testing-drivers", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube.js drivers test suite", "author": "Cube Dev, Inc.", "repository": { @@ -72,24 +72,24 @@ "dist/src" ], "dependencies": { - "@cubejs-backend/athena-driver": "1.5.14", - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/bigquery-driver": "1.5.14", - "@cubejs-backend/clickhouse-driver": "1.5.14", - "@cubejs-backend/cubestore-driver": "1.5.14", - "@cubejs-backend/databricks-jdbc-driver": "1.5.14", + "@cubejs-backend/athena-driver": "1.5.15", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/bigquery-driver": "1.5.15", + "@cubejs-backend/clickhouse-driver": "1.5.15", + "@cubejs-backend/cubestore-driver": "1.5.15", + "@cubejs-backend/databricks-jdbc-driver": "1.5.15", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/mssql-driver": "1.5.14", - "@cubejs-backend/mysql-driver": "1.5.14", - "@cubejs-backend/postgres-driver": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", - "@cubejs-backend/server-core": "1.5.14", - "@cubejs-backend/shared": "1.5.14", - "@cubejs-backend/snowflake-driver": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", - "@cubejs-client/core": "1.5.14", - "@cubejs-client/ws-transport": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/mssql-driver": "1.5.15", + "@cubejs-backend/mysql-driver": "1.5.15", + "@cubejs-backend/postgres-driver": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", + "@cubejs-backend/server-core": "1.5.15", + "@cubejs-backend/shared": "1.5.15", + "@cubejs-backend/snowflake-driver": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", + "@cubejs-client/core": "1.5.15", + "@cubejs-client/ws-transport": "1.5.15", "@jest/globals": "^29", "@types/jest": "^29", "@types/node": "^20", diff --git a/packages/cubejs-testing-shared/CHANGELOG.md b/packages/cubejs-testing-shared/CHANGELOG.md index 2b2691b209b57..7ac404b922eb7 100644 --- a/packages/cubejs-testing-shared/CHANGELOG.md +++ b/packages/cubejs-testing-shared/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/testing-shared + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/testing-shared diff --git a/packages/cubejs-testing-shared/package.json b/packages/cubejs-testing-shared/package.json index f55dee8f1fea6..d76bd4e5d9f6e 100644 --- a/packages/cubejs-testing-shared/package.json +++ b/packages/cubejs-testing-shared/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/testing-shared", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube.js Testing Helpers", "author": "Cube Dev, Inc.", "repository": { @@ -26,16 +26,16 @@ ], "dependencies": { "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/query-orchestrator": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/query-orchestrator": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "@testcontainers/kafka": "~10.28.0", "dedent": "^0.7.0", "node-fetch": "^2.6.7", "testcontainers": "^10.28.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@jest/globals": "^29", "@types/dedent": "^0.7.0", "@types/jest": "^29", diff --git a/packages/cubejs-testing/CHANGELOG.md b/packages/cubejs-testing/CHANGELOG.md index 4a87dc38e480f..b19c1eea05eda 100644 --- a/packages/cubejs-testing/CHANGELOG.md +++ b/packages/cubejs-testing/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/testing + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/testing diff --git a/packages/cubejs-testing/package.json b/packages/cubejs-testing/package.json index e32c4a89c908d..578f272426c25 100644 --- a/packages/cubejs-testing/package.json +++ b/packages/cubejs-testing/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/testing", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube.js e2e tests", "author": "Cube Dev, Inc.", "repository": { @@ -99,15 +99,15 @@ "birdbox-fixtures" ], "dependencies": { - "@cubejs-backend/cubestore-driver": "1.5.14", + "@cubejs-backend/cubestore-driver": "1.5.15", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/ksql-driver": "1.5.14", - "@cubejs-backend/postgres-driver": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", - "@cubejs-client/ws-transport": "1.5.14", + "@cubejs-backend/ksql-driver": "1.5.15", + "@cubejs-backend/postgres-driver": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", + "@cubejs-client/ws-transport": "1.5.15", "dedent": "^0.7.0", "fs-extra": "^8.1.0", "http-proxy": "^1.18.1", @@ -118,8 +118,8 @@ }, "devDependencies": { "@4tw/cypress-drag-drop": "^1.6.0", - "@cubejs-backend/linter": "1.5.14", - "@cubejs-client/core": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-client/core": "1.5.15", "@jest/globals": "^29", "@types/dedent": "^0.7.0", "@types/http-proxy": "^1.17.5", diff --git a/packages/cubejs-trino-driver/CHANGELOG.md b/packages/cubejs-trino-driver/CHANGELOG.md index 779d9041e1861..d9be63bacf6b2 100644 --- a/packages/cubejs-trino-driver/CHANGELOG.md +++ b/packages/cubejs-trino-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/trino-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/trino-driver diff --git a/packages/cubejs-trino-driver/package.json b/packages/cubejs-trino-driver/package.json index 485a0619743ac..122727385ff53 100644 --- a/packages/cubejs-trino-driver/package.json +++ b/packages/cubejs-trino-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/trino-driver", "description": "Cube.js Trino database driver", "author": "Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,10 +27,10 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/prestodb-driver": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/prestodb-driver": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "node-fetch": "^2.6.1", "presto-client": "^1.1.0", "sqlstring": "^2.3.1" @@ -40,7 +40,7 @@ "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^29", "jest": "^29", "testcontainers": "^10.28.0", diff --git a/packages/cubejs-vertica-driver/CHANGELOG.md b/packages/cubejs-vertica-driver/CHANGELOG.md index 1d4954991f57b..a73a9a292c126 100644 --- a/packages/cubejs-vertica-driver/CHANGELOG.md +++ b/packages/cubejs-vertica-driver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/vertica-driver + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/vertica-driver diff --git a/packages/cubejs-vertica-driver/package.json b/packages/cubejs-vertica-driver/package.json index eeabf6e700d47..f82ab6b05051f 100644 --- a/packages/cubejs-vertica-driver/package.json +++ b/packages/cubejs-vertica-driver/package.json @@ -2,7 +2,7 @@ "name": "@cubejs-backend/vertica-driver", "description": "Cube.js Vertica database driver", "author": "Eduard Karacharov, Tim Brown, Cube Dev, Inc.", - "version": "1.5.14", + "version": "1.5.15", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -19,16 +19,16 @@ "lint:fix": "eslint --fix **/*.js" }, "dependencies": { - "@cubejs-backend/base-driver": "1.5.14", - "@cubejs-backend/query-orchestrator": "1.5.14", - "@cubejs-backend/schema-compiler": "1.5.14", - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/base-driver": "1.5.15", + "@cubejs-backend/query-orchestrator": "1.5.15", + "@cubejs-backend/schema-compiler": "1.5.15", + "@cubejs-backend/shared": "1.5.15", "vertica-nodejs": "^1.0.3" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", - "@cubejs-backend/testing-shared": "1.5.14", + "@cubejs-backend/linter": "1.5.15", + "@cubejs-backend/testing-shared": "1.5.15", "@types/jest": "^29", "jest": "^29", "testcontainers": "^10.28.0" diff --git a/rust/cubesql/CHANGELOG.md b/rust/cubesql/CHANGELOG.md index ffcb73af22f1c..0d46e7adf8ffd 100644 --- a/rust/cubesql/CHANGELOG.md +++ b/rust/cubesql/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/cubesql + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/cubesql diff --git a/rust/cubesql/Cargo.lock b/rust/cubesql/Cargo.lock index 2c7426dd1861a..39544a664031a 100644 --- a/rust/cubesql/Cargo.lock +++ b/rust/cubesql/Cargo.lock @@ -707,7 +707,7 @@ dependencies = [ [[package]] name = "cube-ext" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "arrow", "chrono", @@ -832,7 +832,7 @@ dependencies = [ [[package]] name = "datafusion" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "ahash 0.7.8", "arrow", @@ -865,7 +865,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "arrow", "ordered-float 2.10.0", @@ -876,7 +876,7 @@ dependencies = [ [[package]] name = "datafusion-data-access" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "async-trait", "chrono", @@ -889,7 +889,7 @@ dependencies = [ [[package]] name = "datafusion-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "ahash 0.7.8", "arrow", @@ -900,7 +900,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=6dcbac9d7823327751d484aac8c7604f9faef299#6dcbac9d7823327751d484aac8c7604f9faef299" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f#50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f" dependencies = [ "ahash 0.7.8", "arrow", diff --git a/rust/cubesql/cubesql/Cargo.toml b/rust/cubesql/cubesql/Cargo.toml index a292db47c50f4..b9c77ed9c2d3b 100644 --- a/rust/cubesql/cubesql/Cargo.toml +++ b/rust/cubesql/cubesql/Cargo.toml @@ -10,7 +10,7 @@ homepage = "https://cube.dev" [dependencies] arc-swap = "1" -datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "6dcbac9d7823327751d484aac8c7604f9faef299", default-features = false, features = [ +datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "50a3b1192fcd8c6b95d66cda41a2b1dbf95c253f", default-features = false, features = [ "regex_expressions", "unicode_expressions", ] } diff --git a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/plan_normalize.rs b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/plan_normalize.rs index 663258e085c1e..2fcfef593d671 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/plan_normalize.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/plan_normalize.rs @@ -1018,7 +1018,11 @@ fn expr_normalize_cold_path( })) } - Expr::AggregateUDF { fun, args } => { + Expr::AggregateUDF { + fun, + args, + distinct, + } => { let fun = Arc::clone(fun); let args = args .iter() @@ -1032,7 +1036,12 @@ fn expr_normalize_cold_path( ) }) .collect::>>()?; - Ok(Box::new(Expr::AggregateUDF { fun, args })) + let distinct = *distinct; + Ok(Box::new(Expr::AggregateUDF { + fun, + args, + distinct, + })) } Expr::InSubquery { diff --git a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/utils.rs b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/utils.rs index ab8496f9053c2..47774d7003894 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/optimizers/utils.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/optimizers/utils.rs @@ -302,13 +302,18 @@ pub fn rewrite(expr: &Expr, map: &HashMap>) -> Result args + Expr::AggregateUDF { + fun, + args, + distinct, + } => args .iter() .map(|arg| rewrite(arg, map)) .collect::>>>()? .map(|args| Expr::AggregateUDF { fun: fun.clone(), args, + distinct: *distinct, }), Expr::InList { expr, diff --git a/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs b/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs index bdd37112e145e..383a11ace73d9 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs @@ -1190,11 +1190,21 @@ impl WrappedSelectNode { ) .await } - Expr::AggregateUDF { fun, args } => { + Expr::AggregateUDF { + fun, + args, + distinct, + } => { if fun.name != PATCH_MEASURE_UDAF_NAME { return Ok((None, sql_query)); } + if *distinct { + return Err(CubeError::internal( + "Patch measure with DISTINCT flag is not supported".to_string(), + )); + } + let Some(push_to_cube_context) = push_to_cube_context else { return Err(CubeError::internal(format!( "Unexpected UDAF expression without push-to-Cube context: {}", @@ -2861,10 +2871,20 @@ impl WrappedSelectNode { })?; Ok((resulting_sql, sql_query)) } - Expr::AggregateUDF { ref fun, ref args } => { + Expr::AggregateUDF { + ref fun, + ref args, + distinct, + } => { match fun.name.as_str() { // TODO allow this only in agg expr MEASURE_UDAF_NAME => { + if distinct { + return Err(DataFusionError::Internal( + "MEASURE function with DISTINCT flag is not supported".to_string(), + )); + } + let Some(PushToCubeContext { ungrouped_scan_node, .. diff --git a/rust/cubesql/cubesql/src/compile/engine/udf/common.rs b/rust/cubesql/cubesql/src/compile/engine/udf/common.rs index 8a40f628085f8..56dd7ceff34bc 100644 --- a/rust/cubesql/cubesql/src/compile/engine/udf/common.rs +++ b/rust/cubesql/cubesql/src/compile/engine/udf/common.rs @@ -61,9 +61,10 @@ type IntervalMonthDayNano = ::Na pub type ReturnTypeFunction = Arc Result> + Send + Sync>; pub type ScalarFunctionImplementation = Arc Result + Send + Sync>; -pub type StateTypeFunction = Arc Result>> + Send + Sync>; +pub type StateTypeFunction = + Arc Result>> + Send + Sync>; pub type AccumulatorFunctionImplementation = - Arc Result> + Send + Sync>; + Arc Result> + Send + Sync>; pub fn create_version_udf(v: String) -> ScalarUDF { let fun = make_scalar_function(move |_args: &[ArrayRef]| { @@ -2167,10 +2168,10 @@ pub fn create_measure_udaf() -> AggregateUDF { } }); - let accumulator: AccumulatorFunctionImplementation = Arc::new(|| todo!("Not implemented")); + let accumulator: AccumulatorFunctionImplementation = Arc::new(|_| todo!("Not implemented")); let state_type = Arc::new(vec![DataType::Float64]); - let state_type: StateTypeFunction = Arc::new(move |_| Ok(state_type.clone())); + let state_type: StateTypeFunction = Arc::new(move |_, _| Ok(state_type.clone())); AggregateUDF::new( MEASURE_UDAF_NAME, @@ -2200,10 +2201,10 @@ pub fn create_patch_measure_udaf() -> AggregateUDF { }); let accumulator: AccumulatorFunctionImplementation = - Arc::new(|| todo!("Internal, should not execute")); + Arc::new(|_| todo!("Internal, should not execute")); let state_type = Arc::new(vec![DataType::Float64]); - let state_type: StateTypeFunction = Arc::new(move |_| Ok(state_type.clone())); + let state_type: StateTypeFunction = Arc::new(move |_, _| Ok(state_type.clone())); AggregateUDF::new( PATCH_MEASURE_UDAF_NAME, @@ -3825,7 +3826,7 @@ pub fn create_udaf_stub( return_type: Option, volatility: Option, ) -> AggregateUDF { - let fun: AccumulatorFunctionImplementation = Arc::new(move || { + let fun: AccumulatorFunctionImplementation = Arc::new(move |_| { Err(DataFusionError::NotImplemented(format!( "{} is not implemented, it's a stub", name @@ -3844,7 +3845,7 @@ pub fn create_udaf_stub( Ok(Arc::new(DataType::Null)) }); - let state_type: StateTypeFunction = Arc::new(move |dt| Ok(Arc::new(vec![dt.clone()]))); + let state_type: StateTypeFunction = Arc::new(move |dt, _| Ok(Arc::new(vec![dt.clone()]))); AggregateUDF::new( name, diff --git a/rust/cubesql/cubesql/src/compile/engine/udf/extension/xirr.rs b/rust/cubesql/cubesql/src/compile/engine/udf/extension/xirr.rs index 9ed5eb2cd1ad8..460c8276269e9 100644 --- a/rust/cubesql/cubesql/src/compile/engine/udf/extension/xirr.rs +++ b/rust/cubesql/cubesql/src/compile/engine/udf/extension/xirr.rs @@ -91,9 +91,16 @@ pub fn create_xirr_udaf() -> AggregateUDF { Volatility::Volatile, // due to the usage of [`f64::powf`] ); let return_type: ReturnTypeFunction = Arc::new(|_| Ok(Arc::new(DataType::Float64))); - let accumulator: AccumulatorFunctionImplementation = - Arc::new(|| Ok(Box::new(XirrAccumulator::new()))); - let state_type: StateTypeFunction = Arc::new(|_| { + let accumulator: AccumulatorFunctionImplementation = Arc::new(|distinct| { + if distinct { + Err(DataFusionError::NotImplemented( + "XIRR with DISTINCT flag is not supported".to_string(), + )) + } else { + Ok(Box::new(XirrAccumulator::new())) + } + }); + let state_type: StateTypeFunction = Arc::new(|_, _| { Ok(Arc::new(vec![ DataType::List(Box::new(Field::new("item", DataType::Float64, true))), DataType::List(Box::new(Field::new("item", DataType::Date32, true))), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/converter.rs b/rust/cubesql/cubesql/src/compile/rewrite/converter.rs index 6f2487ffdb4ed..9207df9f950e0 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/converter.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/converter.rs @@ -10,13 +10,14 @@ use crate::{ extract_exprlist_from_groupping_set, rewriter::{CubeEGraph, Rewriter}, AggregateFunctionExprDistinct, AggregateFunctionExprFun, AggregateSplit, - AggregateUDFExprFun, AliasExprAlias, AnyExprAll, AnyExprOp, BetweenExprNegated, - BinaryExprOp, CastExprDataType, ChangeUserMemberValue, ColumnExprColumn, - CubeScanAliasToCube, CubeScanJoinHints, CubeScanLimit, CubeScanOffset, - CubeScanUngrouped, CubeScanWrapped, DimensionName, EmptyRelationDerivedSourceTableName, - EmptyRelationIsWrappable, EmptyRelationProduceOneRow, FilterMemberMember, - FilterMemberOp, FilterMemberValues, FilterOpOp, GroupingSetExprType, GroupingSetType, - InListExprNegated, InSubqueryExprNegated, JoinJoinConstraint, JoinJoinType, JoinLeftOn, + AggregateUDFExprDistinct, AggregateUDFExprFun, AliasExprAlias, AnyExprAll, AnyExprOp, + BetweenExprNegated, BinaryExprOp, CastExprDataType, ChangeUserMemberValue, + ColumnExprColumn, CubeScanAliasToCube, CubeScanJoinHints, CubeScanLimit, + CubeScanOffset, CubeScanUngrouped, CubeScanWrapped, DimensionName, + EmptyRelationDerivedSourceTableName, EmptyRelationIsWrappable, + EmptyRelationProduceOneRow, FilterMemberMember, FilterMemberOp, FilterMemberValues, + FilterOpOp, GroupingSetExprType, GroupingSetType, InListExprNegated, + InSubqueryExprNegated, JoinJoinConstraint, JoinJoinType, JoinLeftOn, JoinNullEqualsNull, JoinRightOn, LikeExprEscapeChar, LikeExprLikeType, LikeExprNegated, LikeType, LimitFetch, LimitSkip, LiteralExprValue, LiteralMemberRelation, LiteralMemberValue, LogicalPlanLanguage, MeasureName, MemberErrorError, OrderAsc, @@ -481,11 +482,16 @@ impl LogicalPlanToLanguageConverter { window_frame, ])) } - Expr::AggregateUDF { fun, args } => { + Expr::AggregateUDF { + fun, + args, + distinct, + } => { let fun = add_expr_data_node!(graph, fun.name, AggregateUDFExprFun); let args = add_expr_list_node!(graph, args, query_params, AggregateUDFExprArgs, flat_list); - graph.add(LogicalPlanLanguage::AggregateUDFExpr([fun, args])) + let distinct = add_expr_data_node!(graph, distinct, AggregateUDFExprDistinct); + graph.add(LogicalPlanLanguage::AggregateUDFExpr([fun, args, distinct])) } Expr::TableUDF { fun, args } => { let fun = add_expr_data_node!(graph, fun.name, TableUDFExprFun); @@ -1188,13 +1194,18 @@ pub fn node_to_expr( LogicalPlanLanguage::AggregateUDFExpr(params) => { let fun_name = match_data_node!(node_by_id, params[0], AggregateUDFExprFun); let args = match_expr_list_node!(node_by_id, to_expr, params[1], AggregateUDFExprArgs); + let distinct = match_data_node!(node_by_id, params[2], AggregateUDFExprDistinct); let fun = cube_context .get_aggregate_meta(&fun_name) .ok_or(CubeError::user(format!( "Aggregate UDF '{}' is not found", fun_name )))?; - Expr::AggregateUDF { fun, args } + Expr::AggregateUDF { + fun, + args, + distinct, + } } LogicalPlanLanguage::TableUDFExpr(params) => { let fun_name = match_data_node!(node_by_id, params[0], TableUDFExprFun); diff --git a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs index 8cff4ed6bf223..47562dde09be4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs @@ -247,6 +247,7 @@ crate::plan_to_language! { AggregateUDFExpr { fun: Arc, args: Vec, + distinct: bool, }, TableUDFExpr { fun: Arc, @@ -1470,15 +1471,23 @@ fn window_fun_expr_var_arg( ) } -fn udaf_expr(fun_name: impl Display, args: Vec) -> String { +fn udaf_expr(fun_name: impl Display, args: Vec, distinct: impl Display) -> String { + udaf_expr_var_arg(fun_name, list_expr("AggregateUDFExprArgs", args), distinct) +} + +fn udaf_expr_var_arg( + fun_name: impl Display, + arg_list: impl Display, + distinct: impl Display, +) -> String { let prefix = if fun_name.to_string().starts_with("?") { "" } else { "AggregateUDFExprFun:" }; format!( - "(AggregateUDFExpr {prefix}{fun_name} {})", - list_expr("AggregateUDFExprArgs", args), + "(AggregateUDFExpr {}{} {} {})", + prefix, fun_name, arg_list, distinct ) } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs index 981006b80bace..ee22d1b6f6680 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs @@ -143,7 +143,11 @@ impl RewriteRules for MemberRules { ), self.measure_rewrite( "measure-fun", - udaf_expr(MEASURE_UDAF_NAME, vec![column_expr("?column")]), + udaf_expr( + MEASURE_UDAF_NAME, + vec![column_expr("?column")], + "AggregateUDFExprDistinct:false", + ), Some("?column"), None, None, @@ -647,7 +651,11 @@ impl MemberRules { )); rules.push(find_matching_old_member( "udaf-fun", - udaf_expr(MEASURE_UDAF_NAME, vec![column_expr("?column")]), + udaf_expr( + MEASURE_UDAF_NAME, + vec![column_expr("?column")], + "AggregateUDFExprDistinct:false", + ), ColumnToSearch::Var("?column"), None, )); @@ -1129,7 +1137,11 @@ impl MemberRules { )); rules.push(pushdown_measure_rewrite( "member-pushdown-replacer-udaf-fun", - udaf_expr(MEASURE_UDAF_NAME, vec![column_expr("?column")]), + udaf_expr( + MEASURE_UDAF_NAME, + vec![column_expr("?column")], + "AggregateUDFExprDistinct:false", + ), measure_expr("?name", "?old_alias"), None, None, @@ -1138,7 +1150,11 @@ impl MemberRules { )); rules.push(pushdown_measure_rewrite( "member-pushdown-replacer-udaf-fun-on-dimension", - udaf_expr(MEASURE_UDAF_NAME, vec![column_expr("?column")]), + udaf_expr( + MEASURE_UDAF_NAME, + vec![column_expr("?column")], + "AggregateUDFExprDistinct:false", + ), dimension_expr("?name", "?old_alias"), None, None, diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs index 9f3945b44f57d..bdf41b3985b1d 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs @@ -15,9 +15,9 @@ use crate::{ wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, wrapper_replacer_context, AggregateFunctionExprDistinct, - AggregateFunctionExprFun, AggregateUDFExprFun, AliasExprAlias, ColumnExprColumn, - ListType, LiteralExprValue, LogicalPlanData, LogicalPlanLanguage, - WrappedSelectPushToCube, WrapperReplacerContextAliasToCube, + AggregateFunctionExprFun, AggregateUDFExprDistinct, AggregateUDFExprFun, + AliasExprAlias, ColumnExprColumn, ListType, LiteralExprValue, LogicalPlanData, + LogicalPlanLanguage, WrappedSelectPushToCube, WrapperReplacerContextAliasToCube, WrapperReplacerContextPushToCube, }, }, @@ -389,6 +389,7 @@ impl WrapperRules { "?context", ), ], + "AggregateUDFExprDistinct:false", ), "?out_measure_alias", ), @@ -411,6 +412,7 @@ impl WrapperRules { "?new_agg_type".to_string(), wrapper_pullup_replacer("?filter_expr", "?context"), ], + "AggregateUDFExprDistinct:false", ), wrapper_pullup_replacer( udaf_expr( @@ -420,6 +422,7 @@ impl WrapperRules { "?new_agg_type".to_string(), "?filter_expr".to_string(), ], + "AggregateUDFExprDistinct:false", ), "?context", ), @@ -959,9 +962,13 @@ impl WrapperRules { )); let udaf_args_expr = egraph.add(LogicalPlanLanguage::AggregateUDFExprArgs(vec![column_expr])); + let udaf_distinct_expr = egraph.add(LogicalPlanLanguage::AggregateUDFExprDistinct( + AggregateUDFExprDistinct(false), + )); let udaf_expr = egraph.add(LogicalPlanLanguage::AggregateUDFExpr([ udaf_name_expr, udaf_args_expr, + udaf_distinct_expr, ])); subst.insert(out_expr_var, udaf_expr); @@ -1012,9 +1019,13 @@ impl WrapperRules { new_aggregation_expr, add_filters_expr, ])); + let udaf_distinct_expr = egraph.add(LogicalPlanLanguage::AggregateUDFExprDistinct( + AggregateUDFExprDistinct(false), + )); let udaf_expr = egraph.add(LogicalPlanLanguage::AggregateUDFExpr([ udaf_name_expr, udaf_args_expr, + udaf_distinct_expr, ])); if let Some(out_expr_var) = out_expr_var { diff --git a/rust/cubesql/package.json b/rust/cubesql/package.json index 856338e5e086c..7d804a7120750 100644 --- a/rust/cubesql/package.json +++ b/rust/cubesql/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/cubesql", - "version": "1.5.14", + "version": "1.5.15", "description": "SQL API for Cube as proxy over MySQL protocol.", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" diff --git a/rust/cubestore/CHANGELOG.md b/rust/cubestore/CHANGELOG.md index c24fa05bbb23a..34b2089f9e456 100644 --- a/rust/cubestore/CHANGELOG.md +++ b/rust/cubestore/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.5.15](https://github.com/cube-js/cube/compare/v1.5.14...v1.5.15) (2025-12-15) + +**Note:** Version bump only for package @cubejs-backend/cubestore + ## [1.5.14](https://github.com/cube-js/cube/compare/v1.5.13...v1.5.14) (2025-12-11) **Note:** Version bump only for package @cubejs-backend/cubestore diff --git a/rust/cubestore/package.json b/rust/cubestore/package.json index 480da79200d51..1aac32ba5c8b9 100644 --- a/rust/cubestore/package.json +++ b/rust/cubestore/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/cubestore", - "version": "1.5.14", + "version": "1.5.15", "description": "Cube.js pre-aggregation storage layer.", "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", @@ -32,7 +32,7 @@ }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.5.14", + "@cubejs-backend/linter": "1.5.15", "@types/jest": "^27", "@types/node": "^18", "jest": "^27", @@ -42,7 +42,7 @@ "access": "public" }, "dependencies": { - "@cubejs-backend/shared": "1.5.14", + "@cubejs-backend/shared": "1.5.15", "@octokit/core": "^3.2.5", "source-map-support": "^0.5.19" },