Skip to content

Commit 871a974

Browse files
authored
Merge branch 'master' into drill-down-custom-granularities
2 parents 2c1bfb1 + e4d767e commit 871a974

File tree

163 files changed

+3242
-860
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

163 files changed

+3242
-860
lines changed

.github/workflows/drivers-tests.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ jobs:
241241
# secrets as job-level environment variables, then referencing the environment variables
242242
# to conditionally run steps in the job.
243243
DRIVERS_TESTS_ATHENA_CUBEJS_AWS_KEY: ${{ secrets.DRIVERS_TESTS_ATHENA_CUBEJS_AWS_KEY }}
244+
245+
# redshift Test Serverless Instance is so tiny that it can't serve a few test suites at once,
246+
# so we constrain it to 1 test suite at time.
247+
concurrency:
248+
group: ${{ contains(matrix.database, 'redshift') && 'redshift-global' || format('drivers-tests-{0}-{1}', matrix.database, github.run_id) }}
249+
cancel-in-progress: false
250+
244251
strategy:
245252
matrix:
246253
database:

.github/workflows/push.yml

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,29 @@ env:
5050
PYTHON_VERSION_CURRENT: 3.11
5151

5252
jobs:
53+
latest-tag-sha:
54+
runs-on: ubuntu-24.04
55+
outputs:
56+
sha: ${{ steps.get-tag.outputs.sha }}
57+
steps:
58+
- uses: actions/checkout@v4
59+
with:
60+
fetch-depth: 0
61+
- id: git-log
62+
run: git log HEAD~30..HEAD
63+
- id: get-tag-test
64+
run: echo "$SHA $(git rev-list -n 1 "$(git tag --contains "$SHA")")"
65+
env:
66+
SHA: ${{ github.sha }}
67+
- id: get-tag
68+
run: echo "sha=$(git rev-list -n 1 "$(git tag --contains "$SHA")")" >> "$GITHUB_OUTPUT"
69+
env:
70+
SHA: ${{ github.sha }}
71+
- id: get-tag-out
72+
run: echo "$OUT"
73+
env:
74+
OUT: ${{ steps.get-tag.outputs.sha }}
75+
5376
unit:
5477
runs-on: ubuntu-24.04
5578
timeout-minutes: 60
@@ -63,11 +86,8 @@ jobs:
6386
node-version: [22.x]
6487
# Don't forget to update build-native-release
6588
python-version: [3.11]
66-
transpile-worker-threads: [false, true]
6789
fail-fast: false
6890

69-
env:
70-
CUBEJS_TRANSPILATION_WORKER_THREADS: ${{ matrix.transpile-worker-threads }}
7191
steps:
7292
- id: get-tag-out
7393
run: echo "$OUT"
@@ -121,16 +141,16 @@ jobs:
121141
- name: Lerna test
122142
run: yarn lerna run --concurrency 1 --stream --no-prefix unit
123143
- name: Fix lcov paths
124-
if: (matrix.node-version == '22.x' && matrix.transpile-worker-threads == true)
144+
if: (matrix.node-version == '22.x')
125145
run: |
126146
./.github/actions/codecov-fix.sh
127147
- name: Combine all fixed LCOV files
128-
if: (matrix.node-version == '22.x' && matrix.transpile-worker-threads == true)
148+
if: (matrix.node-version == '22.x')
129149
run: |
130150
echo "" > ./combined-unit.lcov
131151
find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-unit.lcov || true
132152
- name: Upload coverage artifact
133-
if: (matrix.node-version == '22.x' && matrix.transpile-worker-threads == true)
153+
if: (matrix.node-version == '22.x')
134154
uses: actions/upload-artifact@v4
135155
with:
136156
name: coverage-unit
@@ -505,7 +525,7 @@ jobs:
505525
- name: Combine all fixed LCOV files
506526
run: |
507527
echo "" > ./combined-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}.lcov
508-
find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-integration-${{ matrix.db }}.lcov || true
528+
find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}.lcov || true
509529
- name: Upload coverage artifact
510530
uses: actions/upload-artifact@v4
511531
with:
@@ -598,29 +618,6 @@ jobs:
598618
env:
599619
GITHUB_SHA: ${{ github.sha }}
600620

601-
latest-tag-sha:
602-
runs-on: ubuntu-24.04
603-
outputs:
604-
sha: ${{ steps.get-tag.outputs.sha }}
605-
steps:
606-
- uses: actions/checkout@v4
607-
with:
608-
fetch-depth: 0
609-
- id: git-log
610-
run: git log HEAD~30..HEAD
611-
- id: get-tag-test
612-
run: echo "$SHA $(git rev-list -n 1 "$(git tag --contains "$SHA")")"
613-
env:
614-
SHA: ${{ github.sha }}
615-
- id: get-tag
616-
run: echo "sha=$(git rev-list -n 1 "$(git tag --contains "$SHA")")" >> "$GITHUB_OUTPUT"
617-
env:
618-
SHA: ${{ github.sha }}
619-
- id: get-tag-out
620-
run: echo "$OUT"
621-
env:
622-
OUT: ${{ steps.get-tag.outputs.sha }}
623-
624621
docker-dev:
625622
needs: [latest-tag-sha, build-native-linux]
626623
if: (needs['latest-tag-sha'].outputs.sha != github.sha)

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,22 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6+
# [1.5.0](https://github.com/cube-js/cube/compare/v1.4.0...v1.5.0) (2025-10-29)
7+
8+
**Note:** Version bump only for package cubejs
9+
10+
# [1.4.0](https://github.com/cube-js/cube/compare/v1.3.86...v1.4.0) (2025-10-29)
11+
12+
### Bug Fixes
13+
14+
- **cubesql:** Always repartition joins when right side has multiple partitions ([#10105](https://github.com/cube-js/cube/issues/10105)) ([ae32748](https://github.com/cube-js/cube/commit/ae327483caabba974e271fb52f4ccc5fd5fa5789))
15+
16+
## [1.3.86](https://github.com/cube-js/cube/compare/v1.3.85...v1.3.86) (2025-10-29)
17+
18+
### Features
19+
20+
- **tesseract:** Bucketing ([#10095](https://github.com/cube-js/cube/issues/10095)) ([2dacac4](https://github.com/cube-js/cube/commit/2dacac406815285a82ee07d125d8519b93be9f4a))
21+
622
## [1.3.85](https://github.com/cube-js/cube/compare/v1.3.84...v1.3.85) (2025-10-28)
723

824
### Bug Fixes

README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
![]()
2-
<p align="center">
3-
<a href="https://cube.registration.goldcast.io/events/a6a3b4b8-a99f-489a-b740-060182dbce7b"><img src="https://lgo0ecceic.ucarecd.net/cd698180-3d96-4644-9c9e-daf299ecf3ea/" alt="Agentic Analytics Summit" width="100%"></a>
4-
</p>
52
<p align="center">
63
<a href="https://cube.dev?ref=github-readme"><img src="https://raw.githubusercontent.com/cube-js/cube/master/docs/content/cube-logo-with-bg.png" alt="Cube — Semantic Layer for Data Applications" width="300px"></a>
74
</p>

docs/pages/product/apis-integrations/rest-api/query-format.mdx

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,31 @@ The default value is `false`.
3434
- `offset`: The number of initial rows to be skipped for your query. The default
3535
value is `0`.
3636
- `order`: An object, where the keys are measures or dimensions to order by and
37-
their corresponding values are either `asc` or `desc`. The order of the fields
38-
to order on is based on the order of the keys in the object. If not provided,
39-
[default ordering][ref-default-order] is applied. If an empty object (`[]`) is
40-
provided, no ordering is applied.
37+
their corresponding values are either `asc` or `desc`. For [time dimensions][ref-default-granularities],
38+
a granularity can be optionally provided, e.g., `orders.created_at.month`.
39+
The order of the fields to order on is based on the order of the keys in the object.
40+
If not provided, the [default ordering][ref-default-order] is applied.
41+
If an empty object (`[]`) is provided, no ordering is applied.
4142
- `timezone`: A [time zone][ref-time-zone] for your query. You can set the
4243
desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database)
4344
format, e.g., `America/Los_Angeles`.
45+
- `renewQuery`: If `renewQuery` is set to `true`, Cube will renew all
46+
[`refreshKey`][ref-schema-ref-preaggs-refreshkey] for queries and query
47+
results in the foreground. However, if the
48+
[`refreshKey`][ref-schema-ref-preaggs-refreshkey] (or
49+
[`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every]) doesn't
50+
indicate that there's a need for an update this setting has no effect. The
51+
default value is `false`.
52+
53+
<InfoBox>
54+
55+
Cube provides only eventual consistency guarantee. Using a small
56+
[`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every] value together
57+
with `renewQuery` to achieve immediate consistency can lead to endless
58+
refresh loops and overall system instability.
59+
60+
</InfoBox>
61+
4462
- `ungrouped`: If set to `true`, Cube will run an [ungrouped
4563
query][ref-ungrouped-query].
4664
- `joinHints`: Query-time [join hints][ref-join-hints], provided as an array of
@@ -673,4 +691,4 @@ refer to its documentation for more examples.
673691
[ref-default-granularities]: /product/data-modeling/concepts#time-dimensions
674692
[ref-custom-granularities]: /product/data-modeling/reference/dimensions#granularities
675693
[wiki-iso-8601]: https://en.wikipedia.org/wiki/ISO_8601
676-
[ref-join-hints]: /product/data-modeling/concepts/working-with-joins#join-hints
694+
[ref-join-hints]: /product/data-modeling/concepts/working-with-joins#join-hints

docs/pages/product/caching/recipes/non-additivity.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,7 @@ cube(`users`, {
165165

166166
### Decomposing into a formula with additive measures
167167

168-
Non-additive `avg` measures can be rewritten as
169-
[calculated measures](/product/data-modeling/reference/measures#calculated-measures)
168+
Non-additive `avg` measures can be rewritten as [calculated measures][ref-calculated-measures]
170169
that reference additive measures only. Then, this additive measures can be used
171170
in pre-aggregations. Please note, however, that you shouldn't include `avg_age`
172171
measure in your pre-aggregation as it renders it non-additive.
@@ -245,4 +244,5 @@ or run it with the `docker-compose up` command. You'll see the result, including
245244
queried data, in the console.
246245

247246

248-
[ref-percentile-recipe]: /product/data-modeling/recipes/percentiles
247+
[ref-percentile-recipe]: /product/data-modeling/recipes/percentiles
248+
[ref-calculated-measures]: /product/data-modeling/concepts/calculated-members#calculated-measures

docs/pages/product/configuration/data-sources/databricks-jdbc.mdx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ docker run -it -p 4000:4000 --env-file=.env cube-jdk
5252
| `CUBEJS_DB_NAME` | The name of the database to connect to | A valid database name ||
5353
| `CUBEJS_DB_DATABRICKS_URL` | The URL for a JDBC connection | A valid JDBC URL ||
5454
| `CUBEJS_DB_DATABRICKS_ACCEPT_POLICY` | Whether or not to accept the license terms for the Databricks JDBC driver | `true`, `false` ||
55-
| `CUBEJS_DB_DATABRICKS_TOKEN` | The [personal access token][databricks-docs-pat] used to authenticate the Databricks connection | A valid token ||
55+
| `CUBEJS_DB_DATABRICKS_OAUTH_CLIENT_ID` | The OAuth client ID for [service principal][ref-databricks-m2m-oauth] authentication | A valid client ID ||
56+
| `CUBEJS_DB_DATABRICKS_OAUTH_CLIENT_SECRET` | The OAuth client secret for [service principal][ref-databricks-m2m-oauth] authentication | A valid client secret ||
57+
| `CUBEJS_DB_DATABRICKS_TOKEN` | The [personal access token][databricks-docs-pat] used to authenticate the Databricks connection | A valid token ||
5658
| `CUBEJS_DB_DATABRICKS_CATALOG` | The name of the [Databricks catalog][databricks-catalog] to connect to | A valid catalog name ||
5759
| `CUBEJS_DB_EXPORT_BUCKET_MOUNT_DIR` | The path for the [Databricks DBFS mount][databricks-docs-dbfs] (Not needed if using Unity Catalog connection) | A valid mount path ||
5860
| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number ||
@@ -201,3 +203,4 @@ bucket][self-preaggs-export-bucket] **must be** configured.
201203
[databricks-docs-approx-agg-fns]: https://docs.databricks.com/en/sql/language-manual/functions/approx_count_distinct.html
202204
[self-preaggs-simple]: #simple
203205
[self-preaggs-export-bucket]: #export-bucket
206+
[ref-databricks-m2m-oauth]: https://docs.databricks.com/aws/en/dev-tools/auth/oauth-m2m

docs/pages/product/configuration/data-sources/duckdb.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ deployment][ref-demo-deployment] in Cube Cloud.
7272
| `CUBEJS_DB_DUCKDB_S3_USE_SSL` | Use SSL for connection | A boolean ||
7373
| `CUBEJS_DB_DUCKDB_S3_URL_STYLE` | To choose the S3 URL style(vhost or path) | `vhost` or `path` ||
7474
| `CUBEJS_DB_DUCKDB_S3_SESSION_TOKEN` | The token for the S3 session | A valid Session Token ||
75-
| `CUBEJS_DB_DUCKDB_EXTENSIONS` | A comma-separated list of DuckDB extensions to install and load | A comma-separated list of DuckDB extensions ||
76-
| `CUBEJS_DB_DUCKDB_COMMUNITY_EXTENSIONS` | A comma-separated list of DuckDB community extensions to install and load | A comma-separated list of DuckDB community extensions ||
75+
| `CUBEJS_DB_DUCKDB_EXTENSIONS` | A comma-separated list of DuckDB extensions to install and load | A comma-separated list of DuckDB extensions ||
76+
| `CUBEJS_DB_DUCKDB_COMMUNITY_EXTENSIONS` | A comma-separated list of DuckDB community extensions to install and load | A comma-separated list of DuckDB community extensions ||
7777
| `CUBEJS_DB_DUCKDB_S3_USE_CREDENTIAL_CHAIN` | A flag to use credentials chain for secrets for S3 connections | `true`, `false`. Defaults to `false` ||
7878
| `CUBEJS_CONCURRENCY` | The number of [concurrent queries][ref-data-source-concurrency] to the data source | A valid number ||
7979

docs/pages/product/configuration/data-sources/presto.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ CUBEJS_DB_SCHEMA=my_presto_schema
3030
| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username ||
3131
| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password ||
3232
| `CUBEJS_DB_PRESTO_CATALOG` | The catalog within Presto to connect to | A valid catalog name within a Presto database ||
33+
| `CUBEJS_DB_PRESTO_AUTH_TOKEN` | The authentication token to use when connecting to Presto/Trino. It will be sent in the `Authorization` header. | A valid authentication token ||
3334
| `CUBEJS_DB_SCHEMA` | The schema within the database to connect to | A valid schema name within a Presto database ||
3435
| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube | `true`, `false` ||
3536
| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number ||

docs/pages/product/configuration/data-sources/trino.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ CUBEJS_DB_SCHEMA=my_trino_schema
3030
| `CUBEJS_DB_USER` | The username used to connect to the database | A valid database username ||
3131
| `CUBEJS_DB_PASS` | The password used to connect to the database | A valid database password ||
3232
| `CUBEJS_DB_PRESTO_CATALOG` | The catalog within Presto to connect to | A valid catalog name within a Presto database ||
33+
| `CUBEJS_DB_PRESTO_AUTH_TOKEN` | The authentication token to use when connecting to Presto/Trino. It will be sent in the `Authorization` header. | A valid authentication token ||
3334
| `CUBEJS_DB_SCHEMA` | The schema within the database to connect to | A valid schema name within a Presto database ||
3435
| `CUBEJS_DB_SSL` | If `true`, enables SSL encryption for database connections from Cube | `true`, `false` ||
3536
| `CUBEJS_DB_MAX_POOL` | The maximum number of concurrent database connections to pool. Default is `8` | A valid number ||

0 commit comments

Comments
 (0)