diff --git a/.github/actions/integration/elasticsearch.sh b/.github/actions/integration/elasticsearch.sh
deleted file mode 100755
index a8e992bd1e48a..0000000000000
--- a/.github/actions/integration/elasticsearch.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-set -eo pipefail
-
-# Debug log for test containers
-export DEBUG=testcontainers
-
-export TEST_ELASTIC_OPENDISTRO_VERSION=1.13.1
-
-echo "::group::ElasticSearch Open Distro ${TEST_ELASTIC_OPENDISTRO_VERSION}";
-docker pull amazon/opendistro-for-elasticsearch:${TEST_ELASTIC_OPENDISTRO_VERSION}
-yarn lerna run --concurrency 1 --stream --no-prefix integration:elastic
-echo "::endgroup::"
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 4ba956abe5a3f..2c1f7027c041e 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -44,10 +44,6 @@ driver:duckdb:
- changed-files:
- any-glob-to-any-file: packages/cubejs-duckdb-driver/**/*
-driver:elasticsearch:
-- changed-files:
- - any-glob-to-any-file: packages/cubejs-elasticsearch-driver/**/*
-
driver:firebolt:
- changed-files:
- any-glob-to-any-file: packages/cubejs-firebolt-driver/**/*
diff --git a/.github/workflows/bridge-tests.yml b/.github/workflows/bridge-tests.yml
index 30469aa1df583..cb6e2348b9dd1 100644
--- a/.github/workflows/bridge-tests.yml
+++ b/.github/workflows/bridge-tests.yml
@@ -36,7 +36,7 @@ jobs:
- name: Install Node.js
uses: actions/setup-node@v4
with:
- node-version: 22.x
+ node-version: 24.x
- name: Set Yarn version
run: yarn policies set-version v1.22.22
- name: Get yarn cache directory path
diff --git a/.github/workflows/drivers-tests.yml b/.github/workflows/drivers-tests.yml
index 46e3b6e4b8a36..e7454ff7043cc 100644
--- a/.github/workflows/drivers-tests.yml
+++ b/.github/workflows/drivers-tests.yml
@@ -62,7 +62,7 @@ on:
use_tesseract_sql_planner:
description: 'Enable TESSERACT_SQL_PLANNER?'
required: true
- default: 'false'
+ default: 'true'
type: choice
options:
- 'true'
@@ -98,12 +98,12 @@ jobs:
name: Build native Linux ${{ matrix.node-version }} ${{ matrix.target }} Python ${{ matrix.python-version }}
strategy:
matrix:
- node-version: [ 22 ]
+ node-version: [ 24 ]
python-version: [ "fallback" ]
target: [ "x86_64-unknown-linux-gnu" ]
fail-fast: false
container:
- image: cubejs/rust-cross:${{ matrix.target }}-15082024
+ image: cubejs/rust-cross:${{ matrix.target }}-31072025
steps:
- name: Checkout
@@ -279,36 +279,36 @@ jobs:
- snowflake-export-bucket-azure-via-storage-integration
- snowflake-export-bucket-gcs
- snowflake-export-bucket-gcs-prefix
- use_tesseract_sql_planner: [ false ]
+ use_tesseract_sql_planner: [ true ]
include:
- database: postgres
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: snowflake
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: redshift
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: bigquery-export-bucket-gcs
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: athena-export-bucket-s3
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: databricks-jdbc
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: mysql
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: clickhouse
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
- database: mssql
- use_tesseract_sql_planner: true
+ use_tesseract_sql_planner: false
fail-fast: false
steps:
- name: Checkout
uses: actions/checkout@v4
- - name: Install Node.js 22.x
+ - name: Install Node.js 24.x
uses: actions/setup-node@v4
with:
- node-version: 22.x
+ node-version: 24.x
- name: Configure `yarn`
run: yarn policies set-version v1.22.22
diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml
index b58f3b75adde8..ab0c6d65571d5 100644
--- a/.github/workflows/master.yml
+++ b/.github/workflows/master.yml
@@ -45,7 +45,7 @@ jobs:
timeout-minutes: 60
name: Build Linux Native backend for Dev image
container:
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024-python-3.11
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-3.13
steps:
- name: Checkout
@@ -64,10 +64,10 @@ jobs:
workspaces: ./rust/cubesql -> target
key: cubesql-x86_64-unknown-linux-gnu
shared-key: cubesql-x86_64-unknown-linux-gnu
- - name: Install Node.js 22
+ - name: Install Node.js 24
uses: actions/setup-node@v4
with:
- node-version: 22
+ node-version: 24
- name: Install Yarn
run: npm install -g yarn
- name: Set Yarn version
@@ -77,14 +77,14 @@ jobs:
run: npm install -g cargo-cp-artifact@0.1
- name: Build native (with Python)
env:
- PYO3_PYTHON: python3.11
+ PYO3_PYTHON: python3.13
CARGO_BUILD_TARGET: x86_64-unknown-linux-gnu
working-directory: ./packages/cubejs-backend-native
run: yarn run native:build-debug-python
- name: Store build artifact for dev image
uses: actions/upload-artifact@v4
with:
- name: "native-linux-x64-glibc-3.11.node" # this name is referenced below in docker-image-dev
+ name: "native-linux-x64-glibc-3.13.node" # this name is referenced below in docker-image-dev
path: ./packages/cubejs-backend-native/index.node
overwrite: true
@@ -99,7 +99,7 @@ jobs:
- name: Download backend-native artifact
uses: actions/download-artifact@v4
with:
- name: "native-linux-x64-glibc-3.11.node" # this name is referenced in above in native_linux
+ name: "native-linux-x64-glibc-3.13.node" # this name is referenced in above in native_linux
path: ./packages/cubejs-backend-native/
- name: Login to DockerHub
uses: docker/login-action@v3
diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml
index 13663db586b1f..25bcfa04d0f77 100644
--- a/.github/workflows/post-release.yml
+++ b/.github/workflows/post-release.yml
@@ -28,7 +28,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- node-version: [22.x]
+ node-version: [24.x]
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -106,10 +106,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- - name: Install Node.js 22.x
+ - name: Install Node.js 24.x
uses: actions/setup-node@v4
with:
- node-version: 22.x
+ node-version: 24.x
- name: Restore lerna
uses: actions/cache@v4
with:
@@ -170,10 +170,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- - name: Install Node.js 22.x
+ - name: Install Node.js 24.x
uses: actions/setup-node@v4
with:
- node-version: 22.x
+ node-version: 24.x
- name: Restore lerna
uses: actions/cache@v4
with:
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index a78142e6bfd52..92d806deee2b3 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -27,10 +27,10 @@ jobs:
# override: true # this is by default on
rustflags: ""
components: rustfmt
- - name: Install Node.js 22.x
+ - name: Install Node.js 24.x
uses: actions/setup-node@v4
with:
- node-version: 22.x
+ node-version: 24.x
registry-url: 'https://registry.npmjs.org/'
- name: Upgrade npm for OIDC support
run: npm install -g npm@11.7.0
@@ -75,8 +75,8 @@ jobs:
name: Build native Linux ${{ matrix.node-version }} ${{ matrix.target }} Python ${{ matrix.python-version }}
strategy:
matrix:
- node-version: [22]
- python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"]
+ node-version: [24]
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"]
target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"]
include:
- target: x86_64-unknown-linux-gnu
@@ -89,7 +89,7 @@ jobs:
package_target_libc: glibc
fail-fast: false
container:
- image: cubejs/rust-cross:${{ matrix.target }}-15082024${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }}
+ image: cubejs/rust-cross:${{ matrix.target }}-31072025${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }}
permissions:
contents: write
steps:
@@ -154,9 +154,9 @@ jobs:
name: Build ${{ matrix.os-version }} ${{ matrix.target }} ${{ matrix.node-version }} Python ${{ matrix.python-version }}
strategy:
matrix:
- node-version: [22.x]
+ node-version: [24.x]
target: ["x86_64-apple-darwin", "aarch64-apple-darwin"]
- python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"]
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"]
include:
- target: x86_64-apple-darwin
os-version: macos-15-intel
@@ -243,7 +243,7 @@ jobs:
name: Build ${{ matrix.os-version }} ${{ matrix.node-version }} Python ${{ matrix.python-version }}
strategy:
matrix:
- node-version: [22.x]
+ node-version: [24.x]
python-version: ["fallback"]
os-version: [windows-2022]
include:
@@ -596,13 +596,13 @@ jobs:
# Please use minimal possible version of ubuntu, because it produces constraint on glibc
- os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025
executable_name: cubestored
strip: true
compress: false
- os: ubuntu-22.04
target: x86_64-unknown-linux-musl
- image: cubejs/rust-cross:x86_64-unknown-linux-musl-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-musl-31072025
executable_name: cubestored
strip: true
# cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890
@@ -729,7 +729,7 @@ jobs:
run: vcpkg integrate install; vcpkg install openssl:x64-windows
- name: Instal LLVM for Windows
if: ${{ startsWith(matrix.os, 'windows') }}
- run: choco install -y --force llvm --version 18.1.6
+ run: choco install -y --force llvm --version 22.1.0
- name: Set Env Variables for Windows
uses: allenevans/set-env@v4.0.0
if: ${{ startsWith(matrix.os, 'windows') }}
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
index afb169236f123..edc3e50c56a8a 100644
--- a/.github/workflows/push.yml
+++ b/.github/workflows/push.yml
@@ -40,7 +40,7 @@ on:
env:
# Current user version for Python. Should be aligned between build-native & docker-dev
- PYTHON_VERSION_CURRENT: 3.11
+ PYTHON_VERSION_CURRENT: 3.13
jobs:
latest-tag-sha:
@@ -75,10 +75,12 @@ jobs:
strategy:
matrix:
# Current docker version + next LTS
- # TODO: Add 24 after it's been released
- node-version: [22.x]
+ # TODO: Re-add 26.x after cubejs-duckdb-driver migrates off the frozen `duckdb`
+ # package (no prebuilt binaries for Node.js 26)
+ # node-version: [24.x, 26.x]
+ node-version: [24.x]
# Don't forget to update build-native-release
- python-version: [3.11]
+ python-version: [3.13]
fail-fast: false
steps:
@@ -134,16 +136,16 @@ jobs:
- name: Lerna test
run: yarn lerna run --concurrency 1 --stream --no-prefix unit
- name: Fix lcov paths
- if: (matrix.node-version == '22.x')
+ if: (matrix.node-version == '24.x')
run: |
./.github/actions/codecov-fix.sh
- name: Combine all fixed LCOV files
- if: (matrix.node-version == '22.x')
+ if: (matrix.node-version == '24.x')
run: |
echo "" > ./combined-unit.lcov
find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-unit.lcov || true
- name: Upload coverage artifact
- if: (matrix.node-version == '22.x')
+ if: (matrix.node-version == '24.x')
uses: actions/upload-artifact@v4
with:
name: coverage-unit
@@ -165,10 +167,10 @@ jobs:
# override: true # this is by default on
rustflags: ""
components: rustfmt
- - name: Install Node.js 22.x
+ - name: Install Node.js 24.x
uses: actions/setup-node@v4
with:
- node-version: 22.x
+ node-version: 24.x
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> "$GITHUB_OUTPUT"
@@ -228,7 +230,7 @@ jobs:
timeout-minutes: 60
if: (needs['latest-tag-sha'].outputs.sha != github.sha)
container:
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -264,10 +266,10 @@ jobs:
strategy:
matrix:
# Don't forget to align with PYTHON_VERSION_CURRENT
- python-version: [ 3.11 ]
+ python-version: [ 3.13 ]
fail-fast: false
container:
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024-python-${{ matrix.python-version }}
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025-python-${{ matrix.python-version }}
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -285,10 +287,10 @@ jobs:
workspaces: ./packages/cubejs-backend-native
key: native-${{ runner.OS }}-x86_64-unknown-linux-gnu
shared-key: native-${{ runner.OS }}-x86_64-unknown-linux-gnu
- - name: Install Node.js 22
+ - name: Install Node.js 24
uses: actions/setup-node@v4
with:
- node-version: 22
+ node-version: 24
- name: Install Yarn
run: npm install -g yarn
- name: Set Yarn version
@@ -317,7 +319,7 @@ jobs:
strategy:
matrix:
- node-version: [22.x]
+ node-version: [24.x]
fail-fast: false
steps:
@@ -394,25 +396,28 @@ jobs:
strategy:
matrix:
- node-version: [22.x]
+ # TODO: Re-add 26.x after cubejs-duckdb-driver migrates off the frozen `duckdb`
+ # package (no prebuilt binaries for Node.js 26)
+ # node-version: [24.x, 26.x]
+ node-version: [24.x]
# Vertica tests are disabled because around 20.08.2025 someone
# totally removed all vertica-ce docker repository from dockerhub.
# @see https://github.com/vertica/vertica-containers/issues/64
db: [
'athena', 'bigquery', 'snowflake', 'trino',
- 'clickhouse', 'druid', 'elasticsearch', 'mssql', 'mysql', 'postgres', 'prestodb',
+ 'clickhouse', 'druid', 'mssql', 'mysql', 'postgres', 'prestodb',
'mysql-aurora-serverless', 'crate', 'mongobi', 'firebolt',
# 'dremio' # Commented out because of flaky integration tests
# 'vertica'
]
- use_tesseract_sql_planner: [ false ]
+ use_tesseract_sql_planner: [ true ]
include:
- db: postgres
- node-version: 22.x
- use_tesseract_sql_planner: true
+ node-version: 24.x
+ use_tesseract_sql_planner: false
- db: mssql
- node-version: 22.x
- use_tesseract_sql_planner: true
+ node-version: 24.x
+ use_tesseract_sql_planner: false
fail-fast: false
steps:
@@ -479,7 +484,6 @@ jobs:
(!contains(env.CLOUD_DATABASES, matrix.db))
env:
CUBEJS_TESSERACT_SQL_PLANNER: ${{ matrix.use_tesseract_sql_planner }}
- CUBEJS_TESSERACT_PRE_AGGREGATIONS: ${{ matrix.use_tesseract_sql_planner }}
# Firebolt Integration
DRIVERS_TESTS_FIREBOLT_CUBEJS_FIREBOLT_ENGINE_NAME: ${{ secrets.DRIVERS_TESTS_FIREBOLT_CUBEJS_FIREBOLT_ENGINE_NAME }}
@@ -503,13 +507,16 @@ jobs:
DRIVERS_TESTS_SNOWFLAKE_CUBEJS_DB_USER: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_USER }}
DRIVERS_TESTS_SNOWFLAKE_CUBEJS_DB_PASS: ${{ secrets.DRIVERS_TESTS_CUBEJS_DB_SNOWFLAKE_PASS }}
- name: Fix lcov paths
+ if: (matrix.node-version == '24.x')
run: |
./.github/actions/codecov-fix.sh
- name: Combine all fixed LCOV files
+ if: (matrix.node-version == '24.x')
run: |
echo "" > ./combined-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}.lcov
find ./packages -type f -name lcov.fixed.info -exec cat {} + >> ./combined-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}.lcov || true
- name: Upload coverage artifact
+ if: (matrix.node-version == '24.x')
uses: actions/upload-artifact@v4
with:
name: coverage-integration-${{ matrix.db }}-${{ matrix.use_tesseract_sql_planner }}
@@ -523,8 +530,8 @@ jobs:
strategy:
matrix:
- node-version: [ 22.x ]
- python-version: [ 3.11 ]
+ node-version: [ 24.x ]
+ python-version: [ 3.13 ]
use_tesseract_sql_planner: [ true, false ]
fail-fast: false
@@ -587,7 +594,6 @@ jobs:
timeout-minutes: 30
env:
CUBEJS_TESSERACT_SQL_PLANNER: ${{ matrix.use_tesseract_sql_planner }}
- CUBEJS_TESSERACT_PRE_AGGREGATIONS: ${{ matrix.use_tesseract_sql_planner }}
run: ./.github/actions/smoke.sh
docker-image-latest-set-tag:
@@ -618,7 +624,7 @@ jobs:
- 5000:5000
strategy:
matrix:
- node-version: [ 22 ]
+ node-version: [ 24 ]
target: [ "x86_64-unknown-linux-gnu" ]
dockerfile:
- dev.Dockerfile
diff --git a/.github/workflows/rust-cubesql.yml b/.github/workflows/rust-cubesql.yml
index 860285a48a759..a5a089855b97b 100644
--- a/.github/workflows/rust-cubesql.yml
+++ b/.github/workflows/rust-cubesql.yml
@@ -22,7 +22,7 @@ jobs:
timeout-minutes: 20
name: Check fmt/clippy
container:
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025
steps:
- name: Checkout
@@ -120,14 +120,16 @@ jobs:
strategy:
matrix:
# Current used version + 1 LTS
- # TODO: Add 24 after it's been released (don't forget to uncomment excludes below!)
- node-version: [22]
- python-version: ["3.9", "3.10", "3.11", "3.12", "fallback"]
+ # TODO: Re-add 26 after cubejs-duckdb-driver migrates off the frozen `duckdb`
+ # package (no prebuilt binaries for Node.js 26, don't forget to uncomment excludes below!)
+ # node-version: [24, 26]
+ node-version: [24]
+ python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "fallback"]
target: ["x86_64-unknown-linux-gnu", "aarch64-unknown-linux-gnu"]
# minimize number of jobs
exclude:
-# TODO: uncomment after adding v24
-# - node-version: 22
+# TODO: uncomment after re-adding v26
+# - node-version: 26
# target: "aarch64-unknown-linux-gnu"
- python-version: 3.10
target: "aarch64-unknown-linux-gnu"
@@ -135,7 +137,7 @@ jobs:
target: "aarch64-unknown-linux-gnu"
fail-fast: false
container:
- image: cubejs/rust-cross:${{ matrix.target }}-15082024${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }}
+ image: cubejs/rust-cross:${{ matrix.target }}-31072025${{ matrix.python-version != 'fallback' && format('-python-{0}', matrix.python-version) || '' }}
steps:
- name: Checkout
@@ -225,7 +227,7 @@ jobs:
strategy:
matrix:
# We do not need to test under all versions, we do it under linux
- node-version: [22.x]
+ node-version: [24.x]
target: ["x86_64-apple-darwin", "aarch64-apple-darwin"]
include:
- target: x86_64-apple-darwin
@@ -240,6 +242,9 @@ jobs:
- target: x86_64-apple-darwin
os-version: macos-15-intel
python-version: "3.12"
+ - target: x86_64-apple-darwin
+ os-version: macos-15-intel
+ python-version: "3.13"
- target: x86_64-apple-darwin
os-version: macos-15-intel
python-version: "fallback"
@@ -323,7 +328,7 @@ jobs:
strategy:
matrix:
# We do not need to test under all versions, we do it under linux
- node-version: [22.x]
+ node-version: [24.x]
os-version: [windows-2022]
python-version: ["fallback"]
fail-fast: false
diff --git a/.github/workflows/rust-cubestore-master.yml b/.github/workflows/rust-cubestore-master.yml
index b4deccbab7e6a..88dbace7749e9 100644
--- a/.github/workflows/rust-cubestore-master.yml
+++ b/.github/workflows/rust-cubestore-master.yml
@@ -211,7 +211,7 @@ jobs:
run: vcpkg integrate install; vcpkg install openssl:x64-windows
- name: Instal LLVM for Windows
if: ${{ startsWith(matrix.os, 'windows') }}
- run: choco install -y --force llvm --version 18.1.6
+ run: choco install -y --force llvm --version 22.1.0
- name: Set Env Variables for Windows
uses: allenevans/set-env@v4.0.0
if: ${{ startsWith(matrix.os, 'windows') }}
@@ -264,13 +264,13 @@ jobs:
# Please use minimal possible version of ubuntu, because it produces constraint on glibc
- os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025
executable_name: cubestored
strip: true
compress: false
- os: ubuntu-22.04
target: x86_64-unknown-linux-musl
- image: cubejs/rust-cross:x86_64-unknown-linux-musl-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-musl-31072025
executable_name: cubestored
strip: true
# cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890
diff --git a/.github/workflows/rust-cubestore.yml b/.github/workflows/rust-cubestore.yml
index c76e7e8c0f444..6e55bee599df1 100644
--- a/.github/workflows/rust-cubestore.yml
+++ b/.github/workflows/rust-cubestore.yml
@@ -28,7 +28,7 @@ jobs:
matrix:
rust: [nightly-2025-08-01]
container:
- image: cubejs/rust-builder:bookworm-llvm-18
+ image: cubejs/rust-builder:trixie-llvm-22
env:
RUST: ${{ matrix.rust }}
steps:
@@ -150,7 +150,7 @@ jobs:
run: vcpkg integrate install; vcpkg install openssl:x64-windows
- name: Instal LLVM for Windows
if: ${{ startsWith(matrix.os, 'windows') }}
- run: choco install -y --force llvm --version 18.1.6
+ run: choco install -y --force llvm --version 22.1.0
- name: Set Env Variables for Windows
uses: allenevans/set-env@v4.0.0
if: ${{ startsWith(matrix.os, 'windows') }}
@@ -203,13 +203,13 @@ jobs:
# Please use minimal possible version of ubuntu, because it produces constraint on glibc
- os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
- image: cubejs/rust-cross:x86_64-unknown-linux-gnu-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-gnu-31072025
executable_name: cubestored
strip: true
compress: false
- os: ubuntu-22.04
target: x86_64-unknown-linux-musl
- image: cubejs/rust-cross:x86_64-unknown-linux-musl-15082024
+ image: cubejs/rust-cross:x86_64-unknown-linux-musl-31072025
executable_name: cubestored
strip: true
# cubestored: CantPackException: bad DT_HASH nbucket=0x344 len=0x1890
diff --git a/.nvmrc b/.nvmrc
index 85e502778f623..b832e4001dbc9 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-22.22.0
+24.16.0
diff --git a/CLAUDE.md b/CLAUDE.md
index db985ff947ba3..d390d624cce7e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -87,7 +87,7 @@ yarn dev # Start the Mintlify dev server
3. **API Gateway**: Provides REST, GraphQL, and SQL APIs
4. **CubeSQL**: Postgres-compatible SQL interface (Rust)
5. **CubeStore**: Distributed OLAP storage engine (Rust)
-6. **Tesseract**: Native SQL planner (Rust) located in `/rust/cube/cubesqlplanner` - enabled via `CUBESQL_SQL_PUSH_DOWN=true` environment variable
+6. **Tesseract**: Native SQL planner (Rust) located in `/rust/cube/cubesqlplanner` - the default planner; set `CUBEJS_TESSERACT_SQL_PLANNER=false` to fall back to the deprecated legacy planner. Tesseract pre-aggregation planning follows this flag and cannot be toggled independently
### Package Management
- Uses Yarn workspaces with Lerna for package management
diff --git a/DEPRECATION.md b/DEPRECATION.md
index e1ea79ecd51a4..144218e4f3e9a 100644
--- a/DEPRECATION.md
+++ b/DEPRECATION.md
@@ -52,23 +52,24 @@ features:
| Removed | [Node.js 12](#nodejs-12) | v0.29.0 | v0.32.0 |
| Deprecated | [`CUBEJS_EXTERNAL_DEFAULT` and `CUBEJS_SCHEDULED_REFRESH_DEFAULT`](#cubejs_external_default-and-cubejs_scheduled_refresh_default) | v0.30.0 | |
| Deprecated | [Using external databases for pre-aggregations](#using-external-databases-for-pre-aggregations) | v0.30.0 | |
-| Deprecated | [`dbType`](#dbtype) | v0.30.30 | |
+| Removed | [`dbType`](#dbtype) | v0.30.30 | v1.7.0 |
| Removed | [Serverless Deployments](#serverless-deployments) | v0.31.64 | v0.35.0 |
| Removed | [Node.js 14](#nodejs-14) | v0.32.0 | v0.35.0 |
| Removed | [Using Redis for in-memory cache and queue](#using-redis-for-in-memory-cache-and-queue) | v0.32.0 | v0.36.0 |
| Deprecated | [`SECURITY_CONTEXT`](#security_context) | v0.33.0 | |
-| Deprecated | [`running_total` measure type](#running_total-measure-type) | v0.33.39 | |
+| Removed | [`running_total` measure type](#running_total-measure-type) | v0.33.39 | v1.7.0 |
| Removed | [Top-level `includes` parameter in views](#top-level-includes-parameter-in-views) | v0.34.34 | v1.3.0 |
| Removed | [Node.js 16](#nodejs-16) | v0.35.0 | v0.36.0 |
| Removed | [MySQL-based SQL API](#mysql-based-sql-api) | v0.35.0 | v0.35.0 |
| Removed | [`initApp` hook](#initapp-hook) | v0.35.0 | v0.35.0 |
| Removed | [`/v1/run-scheduled-refresh` REST API endpoint](#v1run-scheduled-refresh-rest-api-endpoint) | v0.35.0 | v0.36.0 |
| Removed | [Node.js 18](#nodejs-18) | v0.36.0 | v1.3.0 |
-| Deprecated | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | |
-| Deprecated | [Node.js 20](#nodejs-20) | v1.3.0 | |
-| Deprecated | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | |
-| Deprecated | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | |
-| Deprecated | [`context_to_roles`](#context-to-roles) | v1.6.4 | |
+| Removed | [`CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`](#cubejs_scheduled_refresh_concurrency) | v1.2.7 | v1.7.0 |
+| Removed | [Node.js 20](#nodejs-20) | v1.3.0 | v1.7.0 |
+| Removed | [`renewQuery` parameter of the `/v1/load` endpoint](#renewquery-parameter-of-the-v1load-endpoint) | v1.3.73 | v1.7.0 |
+| Removed | [Elasticsearch driver](#elasticsearch-driver) | v1.6.0 | v1.7.0 |
+| Removed | [`context_to_roles`](#context-to-roles) | v1.6.4 | v1.7.0 |
+| Deprecated | [Node.js 22](#nodejs-22) | v1.7.0 | |
### Node.js 8
@@ -312,9 +313,11 @@ recommend [using Cube Store as a solution][ref-caching-in-prod].
**Deprecated in Release: v0.30.30**
-Using `dbType` is now deprecated, and we recommend using
-[`driverFactory`][self-driver-factory] to return a `DriverConfig` object
-instead.
+**Removed in Release: v1.7.0**
+
+`dbType` has been removed. Passing `CreateOptions.dbType` now throws an error.
+Use [`driverFactory`][self-driver-factory] to return a `DriverConfig` object
+(`{ type, ... }`) instead, or set the `CUBEJS_DB_TYPE` environment variable.
### Serverless Deployments
@@ -348,9 +351,11 @@ instead.
**Deprecated in Release: v0.33.39**
-The `running_total` measure type is now deprecated, and we recommend using
+**Removed in Release: v1.7.0**
+
+The `running_total` measure type has been removed. Use a
[`rolling_window`](https://cube.dev/docs/product/data-modeling/reference/measures#rolling_window)
-to calculate running totals instead.
+with an `unbounded` trailing window to calculate running totals instead.
### Top-level `includes` parameter in views
@@ -401,6 +406,8 @@ no more updates. Please upgrade to Node.js 20 or higher.
**Deprecated in Release: v1.2.7**
+**Removed in Release: v1.7.0**
+
This environment variable was renamed to [`CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_APP_ID`](https://cube.dev/docs/reference/configuration/environment-variables#cubejs_scheduled_refresh_queries_per_app_id). Please use the new name.
### Node.js 18
@@ -411,27 +418,39 @@ This environment variable was renamed to [`CUBEJS_SCHEDULED_REFRESH_QUERIES_PER_
### Node.js 20
-**Deprecated in Release: v1.3.0**
+**Removed in Release: v1.7.0**
-Node.js 20 is in maintenance mode from [November 22, 2024][link-nodejs-eol]. This means
-no more new features, only security updates. Please upgrade to Node.js 22 or higher.
+Node.js 20 reached [End of Life on April 30, 2026][link-nodejs-eol]. This means
+no more updates. Please upgrade to Node.js 22 or higher.
### `renewQuery` parameter of the `/v1/load` endpoint
**Deprecated in Release: v1.3.73**
-This parameter is deprecated and will be removed in future releases. See [cache control](https://cube.dev/docs/product/apis-integrations/rest-api#cache-control)
-options and use the new `cache` parameter of the `/v1/load` endpoint instead.
+**Removed in Release: v1.7.0**
+
+This parameter has been removed. See [cache control](https://cube.dev/docs/product/apis-integrations/rest-api#cache-control)
+options and use the `cache` parameter of the `/v1/load` endpoint instead.
### Elasticsearch driver
**Deprecated in Release: v1.6.0**
-The Elasticsearch driver is deprecated and will be removed in a future release.
+**Removed in Release: v1.7.0**
+
+The Elasticsearch driver has been removed.
### `context_to_roles`
**Deprecated in Release: v1.6.4**
-The `context_to_roles` configuration option is deprecated and will be removed in a future
-release. Please use `context_to_groups` instead.
\ No newline at end of file
+**Removed in Release: v1.7.0**
+
+The `context_to_roles` configuration option has been removed. Please use `context_to_groups` instead.
+
+### Node.js 22
+
+**Deprecated in Release: v1.7.0**
+
+Node.js 22 is in maintenance mode from [October 21, 2025][link-nodejs-eol]. This means
+no more new features, only security updates. Please upgrade to Node.js 24 or higher.
diff --git a/docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx b/docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx
deleted file mode 100644
index ec4544d7707f0..0000000000000
--- a/docs-mintlify/admin/connect-to-data/data-sources/elasticsearch.mdx
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: Elasticsearch
-description: The driver for Elasticsearch is community-supported and is not maintained by Cube or the database vendor.
----
-
-
-
-The driver for Elasticsearch is community-supported and is not maintained by Cube or the database vendor.
-
-
-
-
-
-Elasticsearch driver is deprecated and will be removed in a future release.
-
-
-
-## Prerequisites
-
-To connect to an [Elasticsearch][elasticsearch] database, use [`CUBEJS_DB_URL`](/reference/configuration/environment-variables#cubejs_db_url)
-with the username and password embedded in the URL, if required.
-
-
-
-If you're not using [Elastic Cloud][elastic-cloud], you **must** specify
-[`CUBEJS_DB_ELASTIC_QUERY_FORMAT`](/reference/configuration/environment-variables#cubejs_db_elastic_query_format).
-
-
-
-## Setup
-
-### Manual
-
-For a self-hosted Elasticsearch instance, add the following to a `.env` file in
-your Cube project:
-
-```dotenv
-CUBEJS_DB_TYPE=elasticsearch
-CUBEJS_DB_URL=https://my.elasticsearch.host:9200
-CUBEJS_DB_ELASTIC_QUERY_FORMAT=json
-```
-
-For an Elasticsearch instanced hosted by [Elastic.co][elastic-co], add the
-following to a `.env` file in your Cube project:
-
-```dotenv
-CUBEJS_DB_TYPE=elasticsearch
-CUBEJS_DB_URL=https://my.elasticsearch.host:9200
-CUBEJS_DB_ELASTIC_APIKEY_ID=VuaCfGcBCdbkQm-e5aOx
-CUBEJS_DB_ELASTIC_APIKEY_KEY=ui2lp2axTNmsyakw9tvNnw
-```
-
-## Environment Variables
-
-| Environment Variable | Description | Possible Values | Required |
-| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | :------: |
-| [`CUBEJS_DB_URL`](/reference/configuration/environment-variables#cubejs_db_url) | The URL for a database | A valid database URL for Elasticsearch | ✅ |
-| [`CUBEJS_DB_ELASTIC_QUERY_FORMAT`](/reference/configuration/environment-variables#cubejs_db_elastic_query_format) | By default, queries return data in JDBC format, but you can also return data in standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC are currently supported) | `json`, `jdbc` | ❌ |
-| [`CUBEJS_DB_ELASTIC_OPENDISTRO`](/reference/configuration/environment-variables#cubejs_db_elastic_opendistro) | If `true`, then use the Open Distro for Elasticsearch | `true`, `false` | ❌ |
-| [`CUBEJS_DB_ELASTIC_APIKEY_ID`](/reference/configuration/environment-variables#cubejs_db_elastic_apikey_id) | [ID of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key ID | ❌ |
-| [`CUBEJS_DB_ELASTIC_APIKEY_KEY`](/reference/configuration/environment-variables#cubejs_db_elastic_apikey_key) | [Value of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key value | ❌ |
-| [`CUBEJS_DB_MAX_POOL`](/reference/configuration/environment-variables#cubejs_db_max_pool) | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ |
-| [`CUBEJS_CONCURRENCY`](/reference/configuration/environment-variables#cubejs_concurrency) | The number of [concurrent queries][ref-data-source-concurrency] to the data source | A valid number | ❌ |
-
-[ref-data-source-concurrency]: /admin/connect-to-data/concurrency#data-source-concurrency
-## SSL
-
-Cube does not require any additional configuration to enable SSL as
-Elasticsearch connections are made over HTTPS.
-
-[elastic-co]: https://elastic.co/
-[elastic-cloud]: https://cloud.elastic.co/
-[elasticsearch]: https://www.elastic.co/elasticsearch/
-[elastic-docs-api-keys]:
- https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key
diff --git a/docs-mintlify/admin/connect-to-data/data-sources/index.mdx b/docs-mintlify/admin/connect-to-data/data-sources/index.mdx
index 49fa42ffbcc8b..d29cab0553b8f 100644
--- a/docs-mintlify/admin/connect-to-data/data-sources/index.mdx
+++ b/docs-mintlify/admin/connect-to-data/data-sources/index.mdx
@@ -107,9 +107,6 @@ sources.
## Other data sources
-
- Connect to Elasticsearch.
-
Connect to MongoDB.
diff --git a/docs-mintlify/admin/deployment/providers/aws.mdx b/docs-mintlify/admin/deployment/providers/aws.mdx
index f63a75aa218eb..88731f57fe4f2 100644
--- a/docs-mintlify/admin/deployment/providers/aws.mdx
+++ b/docs-mintlify/admin/deployment/providers/aws.mdx
@@ -21,7 +21,6 @@ Cube Cloud integrates with the following [data sources](/admin/connect-to-data/d
- [Amazon Athena](/admin/connect-to-data/data-sources/aws-athena)
- [Postgres](/admin/connect-to-data/data-sources/postgres), [Microsoft SQL Server](/admin/connect-to-data/data-sources/ms-sql), [MySQL](/admin/connect-to-data/data-sources/mysql), and [Oracle](/admin/connect-to-data/data-sources/oracle) on [Amazon RDS](https://aws.amazon.com/rds/)
- [Hive / SparkSQL](/admin/connect-to-data/data-sources/hive), [Presto](/admin/connect-to-data/data-sources/presto), and [Trino](/admin/connect-to-data/data-sources/trino) on [Amazon EMR](https://aws.amazon.com/emr/)
-- [Elasticsearch](/admin/connect-to-data/data-sources/elasticsearch) on [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/)
- [Parquet, CSV, and JSON files](/admin/connect-to-data/data-sources/duckdb) on [Amazon S3](https://aws.amazon.com/s3/)
## Data visualization tools
diff --git a/docs-mintlify/docs.json b/docs-mintlify/docs.json
index 6353ba0c4f484..5f867afa4cce4 100644
--- a/docs-mintlify/docs.json
+++ b/docs-mintlify/docs.json
@@ -245,7 +245,6 @@
"admin/connect-to-data/data-sources/databricks-jdbc",
"admin/connect-to-data/data-sources/druid",
"admin/connect-to-data/data-sources/duckdb",
- "admin/connect-to-data/data-sources/elasticsearch",
"admin/connect-to-data/data-sources/firebolt",
"admin/connect-to-data/data-sources/google-bigquery",
"admin/connect-to-data/data-sources/hive",
diff --git a/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx b/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx
index a7f952f0f68fa..6752eb65647af 100644
--- a/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx
+++ b/docs-mintlify/docs/data-modeling/concepts/calendar-cubes.mdx
@@ -13,8 +13,7 @@ the default granularities of time dimensions.
Calendar cubes are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/docs/data-modeling/data-access-policies.mdx b/docs-mintlify/docs/data-modeling/data-access-policies.mdx
index a5a811cdabaef..77fbd1d47461d 100644
--- a/docs-mintlify/docs/data-modeling/data-access-policies.mdx
+++ b/docs-mintlify/docs/data-modeling/data-access-policies.mdx
@@ -773,7 +773,6 @@ cube(`orders`, {
[ref-mls-public]: /docs/data-modeling/access-control/member-level-security#managing-member-level-access
[ref-sec-ctx]: /docs/data-modeling/access-control/context
[ref-ref-dap]: /reference/data-modeling/data-access-policies
-[ref-ref-dap-role]: /reference/data-modeling/data-access-policies#role
[ref-ref-dap-masking]: /reference/data-modeling/data-access-policies#member-masking
[ref-ref-mask-dim]: /reference/data-modeling/dimensions#mask
[ref-core-data-apis]: /reference/core-data-apis
\ No newline at end of file
diff --git a/docs-mintlify/docs/data-modeling/measures.mdx b/docs-mintlify/docs/data-modeling/measures.mdx
index 22a889d1d37fd..11d1b15416888 100644
--- a/docs-mintlify/docs/data-modeling/measures.mdx
+++ b/docs-mintlify/docs/data-modeling/measures.mdx
@@ -210,9 +210,7 @@ CTEs in the generated SQL query.
Multi-stage measures are powered by Tesseract, the [next-generation data
-modeling engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`][ref-tesseract-env] environment variable to
-enable it.
+modeling engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/docs/data-modeling/multi-fact-views.mdx b/docs-mintlify/docs/data-modeling/multi-fact-views.mdx
index d957b1d535f27..102d5f91b1948 100644
--- a/docs-mintlify/docs/data-modeling/multi-fact-views.mdx
+++ b/docs-mintlify/docs/data-modeling/multi-fact-views.mdx
@@ -43,9 +43,7 @@ No fanout, no manual workarounds.
Multi-fact views are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`][ref-tesseract-env] environment variable to
-enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx b/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx
index 0697c613b7466..e96b03c3b6d68 100644
--- a/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx
+++ b/docs-mintlify/docs/pre-aggregations/matching-pre-aggregations.mdx
@@ -115,10 +115,7 @@ requiring a single pre-aggregation that covers the whole query.
Matching separate pre-aggregations to multi-fact and multi-stage subqueries is
-powered by Tesseract, the [next-generation data modeling engine][link-tesseract].
-Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`][ref-tesseract-env] environment variable to
-enable it.
+powered by Tesseract, the [next-generation data modeling engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/recipes/data-modeling/period-over-period.mdx b/docs-mintlify/recipes/data-modeling/period-over-period.mdx
index e0052ae572217..dec13d92e64fa 100644
--- a/docs-mintlify/recipes/data-modeling/period-over-period.mdx
+++ b/docs-mintlify/recipes/data-modeling/period-over-period.mdx
@@ -22,8 +22,7 @@ these measures and uses them in a calculation, e.g., divides or subtracts them.
Multi-stage calculations are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/recipes/data-modeling/share-of-total.mdx b/docs-mintlify/recipes/data-modeling/share-of-total.mdx
index 5b84327ba9a0f..a2cc3a8ed5029 100644
--- a/docs-mintlify/recipes/data-modeling/share-of-total.mdx
+++ b/docs-mintlify/recipes/data-modeling/share-of-total.mdx
@@ -66,9 +66,7 @@ back and groups by the query's dimensions as usual.
Multi-stage calculations are powered by Tesseract, the [next-generation data
-modeling engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner)
-environment variable to enable it.
+modeling engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/recipes/data-modeling/xirr.mdx b/docs-mintlify/recipes/data-modeling/xirr.mdx
index e2da7ca1a89ae..9b5f2f5eeb965 100644
--- a/docs-mintlify/recipes/data-modeling/xirr.mdx
+++ b/docs-mintlify/recipes/data-modeling/xirr.mdx
@@ -29,8 +29,7 @@ Consequently, queries that don't hit pre-aggregations would fail with the follow
Multi-stage calculations are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/reference/configuration/config.mdx b/docs-mintlify/reference/configuration/config.mdx
index 164e21e353403..16121ac4fb150 100644
--- a/docs-mintlify/reference/configuration/config.mdx
+++ b/docs-mintlify/reference/configuration/config.mdx
@@ -1485,70 +1485,6 @@ module.exports = {
-## Deprecated
-
-### `dbType`
-
-
-
-`dbType` is deprecated and will be removed in a future release.
-Use [`driverFactory`][self-driver-factory] instead.
-
-
-
-Data source type. Called only once per [`appId`][self-opts-ctx-to-appid].
-
-```javascript
-module.exports = {
- // string
- dbType: 'snowflake',
-
- // function
- dbType: ({ securityContext }) => 'databricks'
-}
-```
-
-Either `string` or `function` could be passed. Providing a `Function` allows
-to dynamically select a database type depending on the security context.
-Usually used for [multitenancy][ref-multitenancy].
-
-If not defined, Cube will lookup for environment variable
-[`CUBEJS_DB_TYPE`](/reference/configuration/environment-variables#cubejs_db_type) to resolve the data source type.
-
-### `context_to_roles`
-
-
-
-`context_to_roles` is deprecated and will be removed in a future release.
-Use [`context_to_groups`](#context_to_groups) instead.
-
-
-
-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].
-
-
-
-```python title="Python"
-from cube import config
-
-@config('context_to_roles')
-def context_to_roles(ctx: dict) -> list[str]:
- return ctx['securityContext'].get('roles', ['default'])
-```
-
-```javascript title="JavaScript"
-
-module.exports = {
- contextToRoles: ({ securityContext }) => {
- return securityContext.roles || ['default']
- }
-}
-```
-
-
-
-
[gh-jsonwebtoken-algs]:
https://github.com/auth0/node-jsonwebtoken#algorithms-supported
[link-express-cors-opts]:
@@ -1568,7 +1504,6 @@ module.exports = {
[ref-sec-ctx]: /docs/data-modeling/access-control/context
[self-pre-aggregations-schema]: #pre_aggregations_schema
[self-opts-ctx-to-appid]: #context_to_app_id
-[self-driver-factory]: #driver_factory
[ref-schema-ref-datasource]: /reference/data-modeling/cube#data_source
[self-repofactory]: #repository_factory
[ref-exec-environment-globals]: /docs/data-modeling/dynamic/schema-execution-environment#nodejs-globals-processenv-consolelog-and-others
diff --git a/docs-mintlify/reference/configuration/environment-variables.mdx b/docs-mintlify/reference/configuration/environment-variables.mdx
index 6bf869d010021..fc6914f04a9e2 100644
--- a/docs-mintlify/reference/configuration/environment-variables.mdx
+++ b/docs-mintlify/reference/configuration/environment-variables.mdx
@@ -154,12 +154,6 @@ it should be adjusted accordingly.
| ------------------------------------ | ---------------------- | --------------------- |
| A valid number of concurrent queries | 10 | 10 |
-
-
-Previously, this environment variable was named `CUBEJS_SCHEDULED_REFRESH_CONCURRENCY`.
-
-
-
## `CUBEJS_CUBESTORE_HOST`
The hostname of the Cube Store deployment
@@ -430,42 +424,6 @@ A flag to use credentials chain for secrets for S3 connections.
| ----------------------------------------------------- | ---------------------- | --------------------- |
| `true`, `false` | `false` | `false` |
-## `CUBEJS_DB_ELASTIC_APIKEY_ID`
-
-The [ID of the API key from elastic.co][elastic-docs-api-keys]. Required when
-using Elastic Cloud.
-
-| Possible Values | Default in Development | Default in Production |
-| ----------------------------- | ---------------------- | --------------------- |
-| A valid Elastic.co API key ID | N/A | N/A |
-
-## `CUBEJS_DB_ELASTIC_APIKEY_KEY`
-
-The [API key from elastic.co][elastic-docs-api-keys]. Required when using
-Elastic Cloud.
-
-| Possible Values | Default in Development | Default in Production |
-| -------------------------- | ---------------------- | --------------------- |
-| A valid Elastic.co API key | N/A | N/A |
-
-## `CUBEJS_DB_ELASTIC_OPENDISTRO`
-
-If `true`, then use the Open Distro for Elasticsearch.
-
-| Possible Values | Default in Development | Default in Production |
-| --------------- | ---------------------- | --------------------- |
-| `true`, `false` | N/A | N/A |
-
-## `CUBEJS_DB_ELASTIC_QUERY_FORMAT`
-
-By default, queries return data in JDBC format, but you can also return data in
-standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC
-are currently supported).
-
-| Possible Values | Default in Development | Default in Production |
-| --------------- | ---------------------- | --------------------- |
-| `json`, `jdbc` | N/A | N/A |
-
## `CUBEJS_DB_EXPORT_BUCKET`
The name of a bucket in cloud storage to store the database export snapshots.
@@ -1709,18 +1667,18 @@ If `true`, then use WebSocket for data fetching.
## `CUBEJS_TESSERACT_SQL_PLANNER`
-If `true`, enables Tesseract, the [next-generation data modeling engine][link-tesseract].
-Tesseract powers [multi-stage calculations][ref-multi-stage-calculations].
+Enables Tesseract, the [next-generation data modeling engine][link-tesseract],
+which is the default SQL planner and powers
+[multi-stage calculations][ref-multi-stage-calculations]. In versions before v1.7.0,
+Tesseract was not enabled by default. Set to `false` to fall back to the legacy
+planner, which is deprecated and will be removed in the near future.
| Possible Values | Default in Development | Default in Production |
| --------------- | ---------------------- | --------------------- |
-| `true`, `false` | `false` | `false` |
-
-
-
-Tesseract is currently in preview.
+| `true`, `false` | `true` | `true` |
-
+Tesseract-based pre-aggregation matching and planning follows this flag and cannot be
+toggled independently.
## `CUBESTORE_AWS_ACCESS_KEY_ID`
@@ -2122,8 +2080,6 @@ The port for a Cube deployment to listen to API connections on.
https://docs.databricks.com/data/databricks-file-system.html#mount-object-storage-to-dbfs
[databricks-docs-pat]:
https://docs.databricks.com/dev-tools/api/latest/authentication.html#token-management
-[elastic-docs-api-keys]:
- https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key
[firebolt-docs-account-name]:
https://docs.firebolt.io/managing-your-account/concepts-and-terminology.html#firebolt-account
[firebolt-docs-engine-name]:
diff --git a/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx b/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx
index 4dfa238678fc3..eba1746674fcb 100644
--- a/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx
+++ b/docs-mintlify/reference/core-data-apis/graphql-api/reference.mdx
@@ -40,7 +40,6 @@ object with query metadata:
- **`timezone` (`String`):** The [time zone][ref-time-zone] for your query. You can set the
desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database)
format, e.g., `America/Los_Angeles`.
-- **`renewQuery` (`Boolean`):** If `renewQuery` is set to `true`, Cube will renew all `refreshKey` for queries and query results in the foreground. The default value is `false`.
- **`ungrouped` (`Boolean`):** If set to `true`, Cube will run an
[ungrouped query][ref-ungrouped-query].
diff --git a/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx b/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx
index b881a7dc8f37d..654c66fd0eeae 100644
--- a/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx
+++ b/docs-mintlify/reference/core-data-apis/rest-api/query-format.mdx
@@ -45,23 +45,6 @@ The default value is `false`.
- `timezone`: A [time zone][ref-time-zone] for your query. You can set the
desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database)
format, e.g., `America/Los_Angeles`.
-- `renewQuery`: If `renewQuery` is set to `true`, Cube will renew all
- [`refreshKey`][ref-schema-ref-preaggs-refreshkey] for queries and query
- results in the foreground. However, if the
- [`refreshKey`][ref-schema-ref-preaggs-refreshkey] (or
- [`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every]) doesn't
- indicate that there's a need for an update this setting has no effect. The
- default value is `false`.
-
-
-
-Cube provides only eventual consistency guarantee. Using a small
-[`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every] value together
-with `renewQuery` to achieve immediate consistency can lead to endless
-refresh loops and overall system instability.
-
-
-
- `ungrouped`: If set to `true`, Cube will run an [ungrouped
query][ref-ungrouped-query].
- `joinHints`: Query-time [join hints][ref-join-hints], provided as an array of
@@ -675,8 +658,6 @@ refer to its documentation for more examples.
[ref-client-core-resultset-drilldown]: /reference/javascript-sdk/reference/cubejs-client-core#drilldown
-[ref-schema-ref-preaggs-refreshkey]: /reference/data-modeling/pre-aggregations#refresh_key
-[ref-schema-ref-preaggs-refreshkey-every]: /reference/data-modeling/pre-aggregations#every
[ref-schema-ref-preaggs-dimensions]: /reference/data-modeling/pre-aggregations#dimensions
[ref-schema-ref-preaggs-time-dimension]: /reference/data-modeling/pre-aggregations#time_dimension
[ref-relative-date-range]: #relative-date-range
diff --git a/docs-mintlify/reference/data-modeling/dimensions.mdx b/docs-mintlify/reference/data-modeling/dimensions.mdx
index 0cf4d9f40f4b1..574239b0ade9c 100644
--- a/docs-mintlify/reference/data-modeling/dimensions.mdx
+++ b/docs-mintlify/reference/data-modeling/dimensions.mdx
@@ -923,8 +923,7 @@ a dimension. A dimension can only have one type.
`switch` dimensions are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/reference/data-modeling/measures.mdx b/docs-mintlify/reference/data-modeling/measures.mdx
index 80fb96c84da3c..3c5da051b5e57 100644
--- a/docs-mintlify/reference/data-modeling/measures.mdx
+++ b/docs-mintlify/reference/data-modeling/measures.mdx
@@ -380,8 +380,7 @@ a measure. A measure can only have one type.
The `number_agg` type is only available in Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
@@ -462,9 +461,7 @@ with a provided date range. It is used to calculate the minimum and maximum valu
for the series of time windows.
With Tesseract, the [next-generation data modeling engine][link-tesseract],
-rolling window calculations don't require the date range for the time dimension.
-Tesseract is currently in preview. Use the [`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner)
-environment variable to enable it.
+rolling window calculations don't require the date range for the time dimension. In versions before v1.7.0, Tesseract was not enabled by default.
@@ -1186,8 +1183,7 @@ calculated based on the value of a [`switch` dimension][ref-switch-dimensions].
`case` measures are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-[`CUBEJS_TESSERACT_SQL_PLANNER`](/reference/configuration/environment-variables#cubejs_tesseract_sql_planner) environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx b/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx
index dd34fc532d727..ca8bd6bdce097 100644
--- a/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx
+++ b/docs-mintlify/reference/javascript-sdk/reference/cubejs-client-core.mdx
@@ -979,7 +979,6 @@ limit? | number |
measures? | string[] |
offset? | number |
order? | [TQueryOrderObject](#tqueryorderobject) | [TQueryOrderArray](#tqueryorderarray) |
-renewQuery? | boolean |
segments? | string[] |
timeDimensions? | [TimeDimension](#timedimension)[] |
timezone? | string |
diff --git a/docs/content/product/administration/deployment/providers/aws.mdx b/docs/content/product/administration/deployment/providers/aws.mdx
index b2eb06a1ceb5c..d771ac75122cc 100644
--- a/docs/content/product/administration/deployment/providers/aws.mdx
+++ b/docs/content/product/administration/deployment/providers/aws.mdx
@@ -18,7 +18,6 @@ Cube Cloud integrates with the following [data sources](/product/configuration/d
- [Amazon Athena](/product/configuration/data-sources/aws-athena)
- [Postgres](/product/configuration/data-sources/postgres), [Microsoft SQL Server](/product/configuration/data-sources/ms-sql), [MySQL](/product/configuration/data-sources/mysql), and [Oracle](/product/configuration/data-sources/oracle) on [Amazon RDS](https://aws.amazon.com/rds/)
- [Hive / SparkSQL](/product/configuration/data-sources/hive), [Presto](/product/configuration/data-sources/presto), and [Trino](/product/configuration/data-sources/trino) on [Amazon EMR](https://aws.amazon.com/emr/)
-- [Elasticsearch](/product/configuration/data-sources/elasticsearch) on [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/)
- [Parquet, CSV, and JSON files](/product/configuration/data-sources/duckdb) on [Amazon S3](https://aws.amazon.com/s3/)
## Data visualization tools
diff --git a/docs/content/product/administration/pricing.mdx b/docs/content/product/administration/pricing.mdx
index 9a051a24c7193..541a922848558 100644
--- a/docs/content/product/administration/pricing.mdx
+++ b/docs/content/product/administration/pricing.mdx
@@ -88,7 +88,7 @@ terms][ref-enterprise-tier-support], and [limits][ref-cloud-limits].
mission-critical production deployments with security and compliance needs.**
It offers everything in the [Enterprise product tier](#enterprise) as well as
-unlimited pre-aggregation sizes, and support for kSQL and Elasticsearch. Cube
+unlimited pre-aggregation sizes, and support for kSQL. Cube
Cloud provides a 99.995% uptime SLA for this product tier.
You can review its [pricing][cube-pricing], [support
diff --git a/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx b/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx
index 66fc15c81ff9c..323317348f092 100644
--- a/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx
+++ b/docs/content/product/apis-integrations/core-data-apis/graphql-api/reference.mdx
@@ -27,7 +27,6 @@ query {
- **`timezone` (`String`):** The [time zone][ref-time-zone] for your query. You can set the
desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database)
format, e.g., `America/Los_Angeles`.
-- **`renewQuery` (`Boolean`):** If `renewQuery` is set to `true`, Cube will renew all `refreshKey` for queries and query results in the foreground. The default value is `false`.
- **`ungrouped` (`Boolean`):** If set to `true`, Cube will run an
[ungrouped query][ref-ungrouped-query].
diff --git a/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx b/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx
index 32405961d0d7c..712788ff3582f 100644
--- a/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx
+++ b/docs/content/product/apis-integrations/core-data-apis/rest-api/query-format.mdx
@@ -42,23 +42,6 @@ The default value is `false`.
- `timezone`: A [time zone][ref-time-zone] for your query. You can set the
desired time zone in the [TZ Database Name](https://en.wikipedia.org/wiki/Tz_database)
format, e.g., `America/Los_Angeles`.
-- `renewQuery`: If `renewQuery` is set to `true`, Cube will renew all
- [`refreshKey`][ref-schema-ref-preaggs-refreshkey] for queries and query
- results in the foreground. However, if the
- [`refreshKey`][ref-schema-ref-preaggs-refreshkey] (or
- [`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every]) doesn't
- indicate that there's a need for an update this setting has no effect. The
- default value is `false`.
-
-
-
-Cube provides only eventual consistency guarantee. Using a small
-[`refreshKey.every`][ref-schema-ref-preaggs-refreshkey-every] value together
-with `renewQuery` to achieve immediate consistency can lead to endless
-refresh loops and overall system instability.
-
-
-
- `ungrouped`: If set to `true`, Cube will run an [ungrouped
query][ref-ungrouped-query].
- `joinHints`: Query-time [join hints][ref-join-hints], provided as an array of
@@ -672,10 +655,6 @@ refer to its documentation for more examples.
[ref-client-core-resultset-drilldown]: /product/apis-integrations/javascript-sdk/reference/cubejs-client-core#drilldown
-[ref-schema-ref-preaggs-refreshkey]:
- /product/data-modeling/reference/pre-aggregations#refresh_key
-[ref-schema-ref-preaggs-refreshkey-every]:
- /product/data-modeling/reference/pre-aggregations#every
[ref-schema-ref-preaggs-dimensions]:
/product/data-modeling/reference/pre-aggregations#dimensions
[ref-schema-ref-preaggs-time-dimension]:
diff --git a/docs/content/product/auth/data-access-policies.mdx b/docs/content/product/auth/data-access-policies.mdx
index 076b2173efc76..5d6bfa8376860 100644
--- a/docs/content/product/auth/data-access-policies.mdx
+++ b/docs/content/product/auth/data-access-policies.mdx
@@ -569,7 +569,6 @@ cube(`orders`, {
[ref-mls-public]: /product/auth/member-level-security#managing-member-level-access
[ref-sec-ctx]: /product/auth/context
[ref-ref-dap]: /product/data-modeling/reference/data-access-policies
-[ref-ref-dap-role]: /product/data-modeling/reference/data-access-policies#role
[ref-ref-dap-masking]: /product/data-modeling/reference/data-access-policies#member-masking
[ref-ref-mask-dim]: /product/data-modeling/reference/dimensions#mask
[ref-core-data-apis]: /product/apis-integrations/core-data-apis
\ No newline at end of file
diff --git a/docs/content/product/configuration/data-sources/_meta.js b/docs/content/product/configuration/data-sources/_meta.js
index d17eb6899dfd6..73d391bcda7de 100644
--- a/docs/content/product/configuration/data-sources/_meta.js
+++ b/docs/content/product/configuration/data-sources/_meta.js
@@ -6,7 +6,6 @@ export default {
"databricks-jdbc": "Databricks",
"druid": "Druid",
"duckdb": "DuckDB / MotherDuck",
- "elasticsearch": "Elasticsearch",
"firebolt": "Firebolt",
"google-bigquery": "Google BigQuery",
"hive": "Hive / SparkSQL",
diff --git a/docs/content/product/configuration/data-sources/elasticsearch.mdx b/docs/content/product/configuration/data-sources/elasticsearch.mdx
deleted file mode 100644
index ec26d00c30955..0000000000000
--- a/docs/content/product/configuration/data-sources/elasticsearch.mdx
+++ /dev/null
@@ -1,69 +0,0 @@
-# Elasticsearch
-
-
-
-
-
-Elasticsearch driver is deprecated and will be removed in a future release.
-
-
-
-## Prerequisites
-
-To connect to an [Elasticsearch][elasticsearch] database, use CUBEJS_DB_URL
-with the username and password embedded in the URL, if required.
-
-
-
-If you're not using [Elastic Cloud][elastic-cloud], you **must** specify
-CUBEJS_DB_ELASTIC_QUERY_FORMAT.
-
-
-
-## Setup
-
-### Manual
-
-For a self-hosted Elasticsearch instance, add the following to a `.env` file in
-your Cube project:
-
-```dotenv
-CUBEJS_DB_TYPE=elasticsearch
-CUBEJS_DB_URL=https://my.elasticsearch.host:9200
-CUBEJS_DB_ELASTIC_QUERY_FORMAT=json
-```
-
-For an Elasticsearch instanced hosted by [Elastic.co][elastic-co], add the
-following to a `.env` file in your Cube project:
-
-```dotenv
-CUBEJS_DB_TYPE=elasticsearch
-CUBEJS_DB_URL=https://my.elasticsearch.host:9200
-CUBEJS_DB_ELASTIC_APIKEY_ID=VuaCfGcBCdbkQm-e5aOx
-CUBEJS_DB_ELASTIC_APIKEY_KEY=ui2lp2axTNmsyakw9tvNnw
-```
-
-## Environment Variables
-
-| Environment Variable | Description | Possible Values | Required |
-| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | :------: |
-| CUBEJS_DB_URL | The URL for a database | A valid database URL for Elasticsearch | ✅ |
-| CUBEJS_DB_ELASTIC_QUERY_FORMAT | By default, queries return data in JDBC format, but you can also return data in standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC are currently supported) | `json`, `jdbc` | ❌ |
-| CUBEJS_DB_ELASTIC_OPENDISTRO | If `true`, then use the Open Distro for Elasticsearch | `true`, `false` | ❌ |
-| CUBEJS_DB_ELASTIC_APIKEY_ID | [ID of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key ID | ❌ |
-| CUBEJS_DB_ELASTIC_APIKEY_KEY | [Value of the API key from elastic.co][elastic-docs-api-keys] | A valid Elastic.co API key value | ❌ |
-| CUBEJS_DB_MAX_POOL | The maximum number of concurrent database connections to pool. Default is `8` | A valid number | ❌ |
-| CUBEJS_CONCURRENCY | The number of [concurrent queries][ref-data-source-concurrency] to the data source | A valid number | ❌ |
-
-[ref-data-source-concurrency]: /product/configuration/concurrency#data-source-concurrency
-
-## SSL
-
-Cube does not require any additional configuration to enable SSL as
-Elasticsearch connections are made over HTTPS.
-
-[elastic-co]: https://elastic.co/
-[elastic-cloud]: https://cloud.elastic.co/
-[elasticsearch]: https://www.elastic.co/elasticsearch/
-[elastic-docs-api-keys]:
- https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key
diff --git a/docs/content/product/configuration/data-sources/index.mdx b/docs/content/product/configuration/data-sources/index.mdx
index f575c35d2544f..45e055d44539a 100644
--- a/docs/content/product/configuration/data-sources/index.mdx
+++ b/docs/content/product/configuration/data-sources/index.mdx
@@ -158,11 +158,6 @@ sources.
## Other data sources
-
CUBEJS_DB_TYPE to resolve the data source type.
-### `context_to_roles`
-
-
-
-`context_to_roles` is deprecated and will be removed in a future release.
-Use [`context_to_groups`](#context_to_groups) instead.
-
-
-
-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].
-
-
-
-```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']
- }
-}
-```
-
-
-
-
[gh-jsonwebtoken-algs]:
https://github.com/auth0/node-jsonwebtoken#algorithms-supported
[link-express-cors-opts]:
diff --git a/docs/content/product/configuration/reference/environment-variables.mdx b/docs/content/product/configuration/reference/environment-variables.mdx
index cab568d98042d..2cbb59678d717 100644
--- a/docs/content/product/configuration/reference/environment-variables.mdx
+++ b/docs/content/product/configuration/reference/environment-variables.mdx
@@ -151,12 +151,6 @@ it should be adjusted accordingly.
| ------------------------------------ | ---------------------- | --------------------- |
| A valid number of concurrent queries | 10 | 10 |
-
-
-Previously, this environment variable was named CUBEJS_SCHEDULED_REFRESH_CONCURRENCY.
-
-
-
## `CUBEJS_CUBESTORE_HOST`
The hostname of the Cube Store deployment
@@ -416,42 +410,6 @@ A flag to use credentials chain for secrets for S3 connections.
| ----------------------------------------------------- | ---------------------- | --------------------- |
| `true`, `false` | `false` | `false` |
-## `CUBEJS_DB_ELASTIC_APIKEY_ID`
-
-The [ID of the API key from elastic.co][elastic-docs-api-keys]. Required when
-using Elastic Cloud.
-
-| Possible Values | Default in Development | Default in Production |
-| ----------------------------- | ---------------------- | --------------------- |
-| A valid Elastic.co API key ID | N/A | N/A |
-
-## `CUBEJS_DB_ELASTIC_APIKEY_KEY`
-
-The [API key from elastic.co][elastic-docs-api-keys]. Required when using
-Elastic Cloud.
-
-| Possible Values | Default in Development | Default in Production |
-| -------------------------- | ---------------------- | --------------------- |
-| A valid Elastic.co API key | N/A | N/A |
-
-## `CUBEJS_DB_ELASTIC_OPENDISTRO`
-
-If `true`, then use the Open Distro for Elasticsearch.
-
-| Possible Values | Default in Development | Default in Production |
-| --------------- | ---------------------- | --------------------- |
-| `true`, `false` | N/A | N/A |
-
-## `CUBEJS_DB_ELASTIC_QUERY_FORMAT`
-
-By default, queries return data in JDBC format, but you can also return data in
-standard Elasticsearch JDBC, JSON, CSV, YAML or raw formats (only JSON and JDBC
-are currently supported).
-
-| Possible Values | Default in Development | Default in Production |
-| --------------- | ---------------------- | --------------------- |
-| `json`, `jdbc` | N/A | N/A |
-
## `CUBEJS_DB_EXPORT_BUCKET`
The name of a bucket in cloud storage to store the database export snapshots.
@@ -1507,18 +1465,18 @@ If `true`, then use WebSocket for data fetching.
## `CUBEJS_TESSERACT_SQL_PLANNER`
-If `true`, enables Tesseract, the [next-generation data modeling engine][link-tesseract].
-Tesseract powers [multi-stage calculations][ref-multi-stage-calculations].
+Enables Tesseract, the [next-generation data modeling engine][link-tesseract],
+which is the default SQL planner and powers
+[multi-stage calculations][ref-multi-stage-calculations]. In versions before v1.7.0,
+Tesseract was not enabled by default. Set to `false` to fall back to the legacy
+planner, which is deprecated and will be removed in the near future.
| Possible Values | Default in Development | Default in Production |
| --------------- | ---------------------- | --------------------- |
-| `true`, `false` | `false` | `false` |
-
-
-
-Tesseract is currently in preview.
+| `true`, `false` | `true` | `true` |
-
+Tesseract-based pre-aggregation matching and planning follows this flag and cannot be
+toggled independently.
## `CUBESTORE_AWS_ACCESS_KEY_ID`
@@ -1866,8 +1824,6 @@ The port for a Cube deployment to listen to API connections on.
https://docs.databricks.com/data/databricks-file-system.html#mount-object-storage-to-dbfs
[databricks-docs-pat]:
https://docs.databricks.com/dev-tools/api/latest/authentication.html#token-management
-[elastic-docs-api-keys]:
- https://www.elastic.co/guide/en/kibana/master/api-keys.html#create-api-key
[firebolt-docs-account-name]:
https://docs.firebolt.io/managing-your-account/concepts-and-terminology.html#firebolt-account
[firebolt-docs-engine-name]:
diff --git a/docs/content/product/data-modeling/concepts/calendar-cubes.mdx b/docs/content/product/data-modeling/concepts/calendar-cubes.mdx
index 22ee578c23514..7e666baf8a966 100644
--- a/docs/content/product/data-modeling/concepts/calendar-cubes.mdx
+++ b/docs/content/product/data-modeling/concepts/calendar-cubes.mdx
@@ -10,8 +10,7 @@ the default granularities of time dimensions.
Calendar cubes are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx b/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx
index 5c4df921fd423..d946ecdcc2842 100644
--- a/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx
+++ b/docs/content/product/data-modeling/concepts/multi-fact-queries.mdx
@@ -9,8 +9,7 @@ common dimensions.
Multi-fact queries are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx b/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx
index 8aad5d477ebeb..d444ee230e655 100644
--- a/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx
+++ b/docs/content/product/data-modeling/concepts/multi-stage-calculations.mdx
@@ -11,8 +11,7 @@ aggregated data. Each stage results in one or more [common table expressions][li
Multi-stage calculations are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/content/product/data-modeling/recipes/period-over-period.mdx b/docs/content/product/data-modeling/recipes/period-over-period.mdx
index e872e549649a5..c325df1507ed6 100644
--- a/docs/content/product/data-modeling/recipes/period-over-period.mdx
+++ b/docs/content/product/data-modeling/recipes/period-over-period.mdx
@@ -19,8 +19,7 @@ these measures and uses them in a calculation, e.g., divides or subtracts them.
Multi-stage calculations are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/content/product/data-modeling/recipes/xirr.mdx b/docs/content/product/data-modeling/recipes/xirr.mdx
index 9aff36e1bc3b5..1057142991385 100644
--- a/docs/content/product/data-modeling/recipes/xirr.mdx
+++ b/docs/content/product/data-modeling/recipes/xirr.mdx
@@ -25,8 +25,7 @@ Consequently, queries that don't hit pre-aggregations would fail with the follow
Multi-stage calculations are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/content/product/data-modeling/reference/measures.mdx b/docs/content/product/data-modeling/reference/measures.mdx
index 1a2c817469e19..b32817091f36c 100644
--- a/docs/content/product/data-modeling/reference/measures.mdx
+++ b/docs/content/product/data-modeling/reference/measures.mdx
@@ -396,9 +396,7 @@ with a provided date range. It is used to calculate the minimum and maximum valu
for the series of time windows.
With Tesseract, the [next-generation data modeling engine][link-tesseract],
-rolling window calculations don't require the date range for the time dimension.
-Tesseract is currently in preview. Use the CUBEJS_TESSERACT_SQL_PLANNER
-environment variable to enable it.
+rolling window calculations don't require the date range for the time dimension. In versions before v1.7.0, Tesseract was not enabled by default.
@@ -1056,8 +1054,7 @@ calculated based on the value of a [`switch` dimension][ref-switch-dimensions].
`case` measures are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/content/product/data-modeling/reference/types-and-formats.mdx b/docs/content/product/data-modeling/reference/types-and-formats.mdx
index e6011881eb927..f7ba64198d789 100644
--- a/docs/content/product/data-modeling/reference/types-and-formats.mdx
+++ b/docs/content/product/data-modeling/reference/types-and-formats.mdx
@@ -209,8 +209,7 @@ in the `sql` parameter that isn't covered by standard measure types like `sum`,
The `number_agg` type is only available in Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
@@ -881,8 +880,7 @@ particularly useful for defining [`case` measures][ref-case-measures].
`switch` dimensions are powered by Tesseract, the [next-generation data modeling
-engine][link-tesseract]. Tesseract is currently in preview. Use the
-CUBEJS_TESSERACT_SQL_PLANNER environment variable to enable it.
+engine][link-tesseract]. In versions before v1.7.0, it was not enabled by default.
diff --git a/docs/redirects-new-docs.json b/docs/redirects-new-docs.json
index 1999ea8ccb53f..9ee3fbbd1d357 100644
--- a/docs/redirects-new-docs.json
+++ b/docs/redirects-new-docs.json
@@ -1234,11 +1234,6 @@
"destination": "https://docs.cube.dev/admin/connect-to-data/data-sources/firebolt",
"permanent": true
},
- {
- "source": "/config/databases/elasticsearch",
- "destination": "https://docs.cube.dev/admin/connect-to-data/data-sources/elasticsearch",
- "permanent": true
- },
{
"source": "/config/databases/druid",
"destination": "https://docs.cube.dev/admin/connect-to-data/data-sources/druid",
@@ -3069,11 +3064,6 @@
"destination": "https://docs.cube.dev/admin/connect-to-data/data-sources/duckdb",
"permanent": true
},
- {
- "source": "/product/configuration/data-sources/elasticsearch",
- "destination": "https://docs.cube.dev/admin/connect-to-data/data-sources/elasticsearch",
- "permanent": true
- },
{
"source": "/product/configuration/data-sources/firebolt",
"destination": "https://docs.cube.dev/admin/connect-to-data/data-sources/firebolt",
diff --git a/docs/redirects.json b/docs/redirects.json
index 4b2c6a92362d1..caa2169923786 100644
--- a/docs/redirects.json
+++ b/docs/redirects.json
@@ -1234,11 +1234,6 @@
"destination": "/product/configuration/data-sources/firebolt",
"permanent": true
},
- {
- "source": "/config/databases/elasticsearch",
- "destination": "/product/configuration/data-sources/elasticsearch",
- "permanent": true
- },
{
"source": "/config/databases/druid",
"destination": "/product/configuration/data-sources/druid",
diff --git a/package.json b/package.json
index b2fa0414be60d..a7c17a9587f89 100644
--- a/package.json
+++ b/package.json
@@ -68,7 +68,7 @@
"resolutions": {
"es5-ext": "0.10.53",
"lodash": "^4.17.0",
- "@types/node": "^20",
+ "@types/node": "^22",
"@types/ramda": "0.27.40",
"thrift": "0.20.0"
},
diff --git a/packages/cubejs-api-gateway/package.json b/packages/cubejs-api-gateway/package.json
index 7787d91e0431e..c406c3921bd38 100644
--- a/packages/cubejs-api-gateway/package.json
+++ b/packages/cubejs-api-gateway/package.json
@@ -9,7 +9,7 @@
"directory": "packages/cubejs-api-gateway"
},
"engines": {
- "node": "^14.0.0 || ^16.0.0 || >=17.0.0"
+ "node": ">=20.0.0"
},
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
diff --git a/packages/cubejs-api-gateway/src/graphql.ts b/packages/cubejs-api-gateway/src/graphql.ts
index b3a8d89fc714f..4a328d1cd6a02 100644
--- a/packages/cubejs-api-gateway/src/graphql.ts
+++ b/packages/cubejs-api-gateway/src/graphql.ts
@@ -363,7 +363,7 @@ function parseDates(result: any) {
}
export function getJsonQuery(metaConfig: any, args: Record, infos: GraphQLResolveInfo) {
- const { where, limit, offset, timezone, orderBy, renewQuery, ungrouped, cache } = args;
+ const { where, limit, offset, timezone, orderBy, ungrouped, cache } = args;
const measures: string[] = [];
const dimensions: string[] = [];
@@ -460,7 +460,6 @@ export function getJsonQuery(metaConfig: any, args: Record, infos:
...(offset && { offset }),
...(timezone && { timezone }),
...(filters.length && { filters }),
- ...(renewQuery && { renewQuery }),
...(cache && { cache }),
...(ungrouped && { ungrouped }),
};
@@ -639,7 +638,6 @@ export function makeSchema(metaConfig: any): GraphQLSchema {
limit: intArg(),
offset: intArg(),
timezone: stringArg(),
- renewQuery: booleanArg(),
cache: stringArg(),
ungrouped: booleanArg(),
orderBy: arg({
diff --git a/packages/cubejs-api-gateway/src/query.js b/packages/cubejs-api-gateway/src/query.js
index 88d5132648848..07be6953b19f3 100644
--- a/packages/cubejs-api-gateway/src/query.js
+++ b/packages/cubejs-api-gateway/src/query.js
@@ -187,8 +187,6 @@ const querySchema = Joi.object().keys({
limit: Joi.number().integer().strict().min(0),
offset: Joi.number().integer().strict().min(0),
total: Joi.boolean(),
- // @deprecated
- renewQuery: Joi.boolean(),
cacheMode: Joi.valid('stale-if-slow', 'stale-while-revalidate', 'must-revalidate', 'no-cache'),
cache: Joi.valid('stale-if-slow', 'stale-while-revalidate', 'must-revalidate', 'no-cache'),
ungrouped: Joi.boolean(),
@@ -304,19 +302,12 @@ function parseInputMemberExpression(expression) {
function normalizeQueryCacheMode(query, cacheMode) {
if (cacheMode !== undefined) {
query.cacheMode = cacheMode;
- } else if (!query.cache && query?.renewQuery !== undefined) {
- // TODO: Drop this when renewQuery will be removed
- query.cacheMode = query.renewQuery === true
- ? 'must-revalidate'
- : 'stale-if-slow';
} else if (!query.cache) {
query.cacheMode = 'stale-if-slow';
} else {
query.cacheMode = query.cache;
}
- // TODO: Drop this when renewQuery will be removed
- query.renewQuery = undefined;
query.cache = undefined;
return query;
diff --git a/packages/cubejs-api-gateway/src/types/query.ts b/packages/cubejs-api-gateway/src/types/query.ts
index 26b0e26e263da..7b42fd7c046d7 100644
--- a/packages/cubejs-api-gateway/src/types/query.ts
+++ b/packages/cubejs-api-gateway/src/types/query.ts
@@ -140,8 +140,6 @@ interface Query {
totalQuery?: boolean;
order?: any;
timezone?: string;
- // @deprecated
- renewQuery?: boolean;
cacheMode?: CacheMode; // used after query normalization
cache?: CacheMode; // Used in public interface
ungrouped?: boolean;
diff --git a/packages/cubejs-api-gateway/src/types/request.ts b/packages/cubejs-api-gateway/src/types/request.ts
index 8478d008354a2..9b78a1afda503 100644
--- a/packages/cubejs-api-gateway/src/types/request.ts
+++ b/packages/cubejs-api-gateway/src/types/request.ts
@@ -121,7 +121,6 @@ type BaseRequest = {
};
type RequestQuery = Record | Record[] & {
- renewQuery?: boolean;
cacheMode?: CacheMode;
};
diff --git a/packages/cubejs-athena-driver/package.json b/packages/cubejs-athena-driver/package.json
index c4680876e0017..5adff993c9499 100644
--- a/packages/cubejs-athena-driver/package.json
+++ b/packages/cubejs-athena-driver/package.json
@@ -9,7 +9,7 @@
"directory": "packages/cubejs-athena-driver"
},
"engines": {
- "node": "^14.0.0 || ^16.0.0 || >=17.0.0"
+ "node": ">=20.0.0"
},
"scripts": {
"build": "rm -rf dist && npm run tsc",
diff --git a/packages/cubejs-backend-cloud/package.json b/packages/cubejs-backend-cloud/package.json
index 49b20d840c46a..278099f569817 100644
--- a/packages/cubejs-backend-cloud/package.json
+++ b/packages/cubejs-backend-cloud/package.json
@@ -18,7 +18,7 @@
"dist/src/*"
],
"engines": {
- "node": "^14.0.0 || ^16.0.0 || >=17.0.0"
+ "node": ">=20.0.0"
},
"author": "Cube Dev, Inc.",
"repository": {
diff --git a/packages/cubejs-backend-maven/package.json b/packages/cubejs-backend-maven/package.json
index 156a140ac8444..a11b0d7260942 100644
--- a/packages/cubejs-backend-maven/package.json
+++ b/packages/cubejs-backend-maven/package.json
@@ -10,7 +10,7 @@
"directory": "packages/cubejs-druid-driver"
},
"engines": {
- "node": "^14.0.0 || ^16.0.0 || >=17.0.0"
+ "node": ">=20.0.0"
},
"bin": {
"maven-resolve": "bin/maven-resolve"
@@ -38,7 +38,7 @@
"devDependencies": {
"@cubejs-backend/linter": "1.6.62",
"@types/jest": "^29",
- "@types/node": "^20",
+ "@types/node": "^22",
"jest": "^29",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-backend-native/.gitignore b/packages/cubejs-backend-native/.gitignore
index 67cbee8dc09f3..214ec7423edc4 100644
--- a/packages/cubejs-backend-native/.gitignore
+++ b/packages/cubejs-backend-native/.gitignore
@@ -7,4 +7,5 @@ index.node
**/.DS_Store
npm-debug.log
benchmarks/result.txt
-test/__pycache__/
\ No newline at end of file
+test/__pycache__/
+test/subdir_for_test/__pycache__/
diff --git a/packages/cubejs-backend-native/Cargo.lock b/packages/cubejs-backend-native/Cargo.lock
index b52628243878d..945f3e8f04858 100644
--- a/packages/cubejs-backend-native/Cargo.lock
+++ b/packages/cubejs-backend-native/Cargo.lock
@@ -742,7 +742,7 @@ dependencies = [
"neon",
"once_cell",
"pyo3",
- "pyo3-asyncio",
+ "pyo3-async-runtimes",
"serde",
"serde_json",
"simple_logger",
@@ -1358,6 +1358,12 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
[[package]]
name = "hermit-abi"
version = "0.1.19"
@@ -2508,15 +2514,16 @@ dependencies = [
[[package]]
name = "pyo3"
-version = "0.20.0"
+version = "0.22.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b"
+checksum = "f402062616ab18202ae8319da13fa4279883a2b8a9d9f83f20dbade813ce1884"
dependencies = [
"cfg-if",
"indoc",
"libc",
"memoffset",
- "parking_lot",
+ "once_cell",
+ "portable-atomic",
"pyo3-build-config",
"pyo3-ffi",
"pyo3-macros",
@@ -2524,35 +2531,35 @@ dependencies = [
]
[[package]]
-name = "pyo3-asyncio"
-version = "0.20.0"
+name = "pyo3-async-runtimes"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea6b68e93db3622f3bb3bf363246cf948ed5375afe7abff98ccbdd50b184995"
+checksum = "2529f0be73ffd2be0cc43c013a640796558aa12d7ca0aab5cc14f375b4733031"
dependencies = [
"futures",
"once_cell",
"pin-project-lite",
"pyo3",
- "pyo3-asyncio-macros",
+ "pyo3-async-runtimes-macros",
"tokio",
]
[[package]]
-name = "pyo3-asyncio-macros"
-version = "0.20.0"
+name = "pyo3-async-runtimes-macros"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c467178e1da6252c95c29ecf898b133f742e9181dca5def15dc24e19d45a39"
+checksum = "22c26fd8e9fc19f53f0c1e00bf61471de6789f7eb263056f7f944a9cceb5823e"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.98",
]
[[package]]
name = "pyo3-build-config"
-version = "0.20.0"
+version = "0.22.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5"
+checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38"
dependencies = [
"once_cell",
"target-lexicon",
@@ -2560,9 +2567,9 @@ dependencies = [
[[package]]
name = "pyo3-ffi"
-version = "0.20.0"
+version = "0.22.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b"
+checksum = "9ab5bcf04a2cdcbb50c7d6105de943f543f9ed92af55818fd17b660390fc8636"
dependencies = [
"libc",
"pyo3-build-config",
@@ -2570,9 +2577,9 @@ dependencies = [
[[package]]
name = "pyo3-macros"
-version = "0.20.0"
+version = "0.22.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b"
+checksum = "0fd24d897903a9e6d80b968368a34e1525aeb719d568dba8b3d4bfa5dc67d453"
dependencies = [
"proc-macro2",
"pyo3-macros-backend",
@@ -2582,12 +2589,13 @@ dependencies = [
[[package]]
name = "pyo3-macros-backend"
-version = "0.20.0"
+version = "0.22.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424"
+checksum = "36c011a03ba1e50152b4b394b479826cad97e7a21eb52df179cd91ac411cbfbe"
dependencies = [
- "heck 0.4.1",
+ "heck 0.5.0",
"proc-macro2",
+ "pyo3-build-config",
"quote",
"syn 2.0.98",
]
@@ -3365,9 +3373,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "target-lexicon"
-version = "0.12.12"
+version = "0.12.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "tempfile"
diff --git a/packages/cubejs-backend-native/Cargo.toml b/packages/cubejs-backend-native/Cargo.toml
index 5801a68f9d259..60e9defdcfa8b 100644
--- a/packages/cubejs-backend-native/Cargo.toml
+++ b/packages/cubejs-backend-native/Cargo.toml
@@ -34,11 +34,8 @@ log-reroute = "0.1"
minijinja = { version = "1", features = ["json", "loader"] }
once_cell = "1.10"
# python
-pyo3 = { version = "0.20.0", features = [], optional = true }
-pyo3-asyncio = { version = "0.20.0", features = [
- "tokio-runtime",
- "attributes",
-], optional = true }
+pyo3 = { version = "0.22.6", optional = true }
+pyo3-async-runtimes = { version = "0.22.0", features = ["tokio-runtime", "attributes"], optional = true }
serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0.127"
simple_logger = "1.7.0"
@@ -55,7 +52,7 @@ features = ["napi-1", "napi-4", "napi-6", "futures"]
default = ["neon-entrypoint", "async-log"]
neon-debug = []
neon-entrypoint = []
-python = ["pyo3", "pyo3-asyncio"]
+python = ["pyo3", "pyo3-async-runtimes"]
async-log = ["log_nonblock"]
# Exposes `__testBridge_*` endpoints used by the bridge regression test
# harness. Off by default — never enable in production builds.
diff --git a/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py b/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py
index a14a6608d9448..53682050db7cd 100644
--- a/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py
+++ b/packages/cubejs-backend-native/benchmarks/fixtures/config-async.py
@@ -95,14 +95,6 @@ async def logger(msg, params):
pass
-@config
-async def context_to_roles(ctx):
- # Removed print statements for benchmarking
- return [
- "admin",
- ]
-
-
@config
async def context_to_groups(ctx):
# Removed print statements for benchmarking
diff --git a/packages/cubejs-backend-native/benchmarks/fixtures/config.py b/packages/cubejs-backend-native/benchmarks/fixtures/config.py
index b00cce6560e3e..3bab1a5baf764 100644
--- a/packages/cubejs-backend-native/benchmarks/fixtures/config.py
+++ b/packages/cubejs-backend-native/benchmarks/fixtures/config.py
@@ -95,14 +95,6 @@ def logger(msg, params):
pass
-@config
-def context_to_roles(ctx):
- # Removed print statements for benchmarking
- return [
- "admin",
- ]
-
-
@config
def context_to_groups(ctx):
# Removed print statements for benchmarking
diff --git a/packages/cubejs-backend-native/js/index.ts b/packages/cubejs-backend-native/js/index.ts
index b5dbf3cdc4ad2..24715c926b0e0 100644
--- a/packages/cubejs-backend-native/js/index.ts
+++ b/packages/cubejs-backend-native/js/index.ts
@@ -535,7 +535,6 @@ export interface PyConfiguration {
contextToApiScopes?: () => Promise
scheduledRefreshContexts?: (ctx: unknown) => Promise
scheduledRefreshTimeZones?: (ctx: unknown) => Promise
- contextToRoles?: (ctx: unknown) => Promise
contextToGroups?: (ctx: unknown) => Promise
}
diff --git a/packages/cubejs-backend-native/package.json b/packages/cubejs-backend-native/package.json
index d9f3f36e91071..fb7539e380696 100644
--- a/packages/cubejs-backend-native/package.json
+++ b/packages/cubejs-backend-native/package.json
@@ -33,7 +33,7 @@
"lint:fix": "eslint --fix test/ js/ --ext .ts"
},
"engines": {
- "node": "^14.0.0 || ^16.0.0 || >=17.0.0"
+ "node": ">=20.0.0"
},
"files": [
"dist/js"
@@ -41,7 +41,7 @@
"devDependencies": {
"@cubejs-backend/linter": "1.6.62",
"@types/jest": "^29",
- "@types/node": "^20",
+ "@types/node": "^22",
"cargo-cp-artifact": "^0.1.9",
"jest": "^29",
"jest-bench": "^29",
@@ -61,6 +61,7 @@
"value": [
"libpython",
[
+ "3.13",
"3.12",
"3.11",
"3.10",
diff --git a/packages/cubejs-backend-native/python/cube/src/__init__.py b/packages/cubejs-backend-native/python/cube/src/__init__.py
index f779f8d13864f..c793af0869056 100644
--- a/packages/cubejs-backend-native/python/cube/src/__init__.py
+++ b/packages/cubejs-backend-native/python/cube/src/__init__.py
@@ -65,7 +65,6 @@ class Configuration:
context_to_cube_store_router_id: Union[str, Callable[[RequestContext], str]]
driver_factory: Callable[[RequestContext], Dict]
external_driver_factory: Callable[[RequestContext], Dict]
- db_type: Union[str, Callable[[RequestContext], str]]
check_auth: Callable
check_sql_auth: Callable
can_switch_sql_user: Callable
@@ -77,7 +76,6 @@ class Configuration:
semantic_layer_sync: Union[Dict, Callable[[], Dict]]
pre_aggregations_schema: Union[Callable[[RequestContext], str], str]
orchestrator_options: Union[Dict, Callable[[RequestContext], Dict]]
- context_to_roles: Callable[[RequestContext], list[str]]
context_to_groups: Callable[[RequestContext], list[str]]
fast_reload: bool
@@ -114,7 +112,6 @@ def __init__(self):
self.context_to_cube_store_router_id = None
self.driver_factory = None
self.external_driver_factory = None
- self.db_type = None
self.check_auth = None
self.check_sql_auth = None
self.can_switch_sql_user = None
@@ -128,7 +125,6 @@ def __init__(self):
self.semantic_layer_sync = None
self.pre_aggregations_schema = None
self.orchestrator_options = None
- self.context_to_roles = None
self.context_to_groups = None
self.fast_reload = None
diff --git a/packages/cubejs-backend-native/src/cross/clrepr.rs b/packages/cubejs-backend-native/src/cross/clrepr.rs
index 1326c7b9c780c..2c30694dde6a4 100644
--- a/packages/cubejs-backend-native/src/cross/clrepr.rs
+++ b/packages/cubejs-backend-native/src/cross/clrepr.rs
@@ -10,6 +10,8 @@ use neon::prelude::*;
use neon::result::Throw;
use neon::types::JsDate;
#[cfg(feature = "python")]
+use pyo3::Python;
+#[cfg(feature = "python")]
use std::cell::RefCell;
use std::collections::hash_map::{IntoIter, Iter, Keys};
use std::collections::HashMap;
@@ -96,9 +98,9 @@ pub enum StringType {
Safe,
}
-/// Cross language representation is abstraction to transfer values between
+/// Cross-language representation is an abstraction to transfer values between
/// JavaScript and Python across Rust. Converting between two different languages requires
-/// to use Context which is available on the call (one for python and one for js), which result as
+/// using Context which is available on the call (one for python and one for js), which results as
/// blocking.
#[derive(Debug, Clone)]
pub enum CLRepr {
@@ -240,7 +242,7 @@ impl CLRepr {
#[cfg(feature = "python")]
if from.is_a::(cx) {
let ref_wrap = from.downcast_or_throw::(cx)?;
- let fun = ref_wrap.borrow().get_fun().clone();
+ let fun = Python::with_gil(|py| ref_wrap.borrow().get_fun().clone_ref(py));
return Ok(CLRepr::PythonRef(PythonRef::PyFunction(fun)));
}
diff --git a/packages/cubejs-backend-native/src/cross/clrepr_python.rs b/packages/cubejs-backend-native/src/cross/clrepr_python.rs
index 387aa42eb1025..34e2a8301ba54 100644
--- a/packages/cubejs-backend-native/src/cross/clrepr_python.rs
+++ b/packages/cubejs-backend-native/src/cross/clrepr_python.rs
@@ -3,12 +3,14 @@ use crate::cross::{CLRepr, CLReprObjectKind, StringType};
use crate::python::utils::PyAnyHelpers;
use pyo3::exceptions::{PyException, PyNotImplementedError, PyTypeError};
use pyo3::types::{
- PyBool, PyComplex, PyDate, PyDateTime, PyDelta, PyDict, PyFloat, PyFrame, PyFrozenSet,
- PyFunction, PyInt, PyList, PySequence, PySet, PyString, PyTraceback, PyTuple,
+ PyAnyMethods, PyBool, PyBoolMethods, PyComplex, PyDate, PyDateTime, PyDelta, PyDict,
+ PyDictMethods, PyFloat, PyFloatMethods, PyFrame, PyFrozenSet, PyFunction, PyInt, PyList,
+ PyListMethods, PySequence, PySet, PySetMethods, PyString, PyTraceback, PyTuple, PyTupleMethods,
+ PyTypeMethods,
};
-use pyo3::{Py, PyAny, PyErr, PyObject, Python, ToPyObject};
+use pyo3::{Bound, Py, PyAny, PyErr, PyObject, Python, ToPyObject};
-#[derive(Debug, Clone)]
+#[derive(Debug)]
pub enum PythonRef {
PyObject(PyObject),
PyFunction(Py),
@@ -17,9 +19,19 @@ pub enum PythonRef {
PyExternalFunction(Py),
}
+impl Clone for PythonRef {
+ fn clone(&self) -> Self {
+ Python::with_gil(|py| match self {
+ PythonRef::PyObject(obj) => PythonRef::PyObject(obj.clone_ref(py)),
+ PythonRef::PyFunction(fun) => PythonRef::PyFunction(fun.clone_ref(py)),
+ PythonRef::PyExternalFunction(fun) => PythonRef::PyExternalFunction(fun.clone_ref(py)),
+ })
+ }
+}
+
impl CLRepr {
/// Convert python value to CLRepr
- pub fn from_python_ref(v: &PyAny) -> Result {
+ pub fn from_python_ref(v: &Bound<'_, PyAny>) -> Result {
if v.is_none() {
return Ok(Self::Null);
}
@@ -31,7 +43,7 @@ impl CLRepr {
StringType::Normal
};
- Self::String(v.to_string(), string_type)
+ Self::String(v.str()?.to_string(), string_type)
} else if v.get_type().is_subclass_of::()? {
Self::Bool(v.downcast::()?.is_true())
} else if v.get_type().is_subclass_of::()? {
@@ -48,7 +60,7 @@ impl CLRepr {
if k.get_type().is_subclass_of::()? {
let key_str = k.downcast::()?;
- obj.insert(key_str.to_string(), Self::from_python_ref(v)?);
+ obj.insert(key_str.to_string(), Self::from_python_ref(&v)?);
}
}
@@ -58,7 +70,7 @@ impl CLRepr {
let mut r = Vec::with_capacity(l.len());
for v in l.iter() {
- r.push(Self::from_python_ref(v)?);
+ r.push(Self::from_python_ref(&v)?);
}
Self::Array(r)
@@ -67,7 +79,7 @@ impl CLRepr {
let mut r = Vec::with_capacity(l.len());
for v in l.iter() {
- r.push(Self::from_python_ref(v)?);
+ r.push(Self::from_python_ref(&v)?);
}
Self::Array(r)
@@ -76,12 +88,12 @@ impl CLRepr {
let mut r = Vec::with_capacity(l.len());
for v in l.iter() {
- r.push(Self::from_python_ref(v)?);
+ r.push(Self::from_python_ref(&v)?);
}
Self::Tuple(r)
} else if v.get_type().is_subclass_of::()? {
- let fun: Py = v.downcast::()?.into();
+ let fun: Py = v.downcast::()?.clone().unbind();
Self::PythonRef(PythonRef::PyFunction(fun))
} else if v.get_type().is_subclass_of::()? {
@@ -140,12 +152,12 @@ impl CLRepr {
)));
} else {
// Fallback to PyObject, it will lead to throw error in the JS side
- Self::PythonRef(PythonRef::PyObject(v.into()))
+ Self::PythonRef(PythonRef::PyObject(v.clone().unbind()))
})
}
- fn into_py_dict_impl(obj: CLReprObject, py: Python<'_>) -> Result<&PyDict, PyErr> {
- let r = PyDict::new(py);
+ fn into_py_dict_impl(obj: CLReprObject, py: Python<'_>) -> Result, PyErr> {
+ let r = PyDict::new_bound(py);
for (k, v) in obj.into_iter() {
r.set_item(k, Self::into_py_impl(v, py)?)?;
@@ -156,11 +168,11 @@ impl CLRepr {
fn into_py_impl(from: CLRepr, py: Python) -> Result {
Ok(match from {
- CLRepr::String(v, _) => PyString::new(py, &v).to_object(py),
- CLRepr::Bool(v) => PyBool::new(py, v).to_object(py),
- CLRepr::Float(v) => PyFloat::new(py, v).to_object(py),
+ CLRepr::String(v, _) => PyString::new_bound(py, &v).to_object(py),
+ CLRepr::Bool(v) => PyBool::new_bound(py, v).to_object(py),
+ CLRepr::Float(v) => PyFloat::new_bound(py, v).to_object(py),
CLRepr::Int(v) => {
- let py_int: &PyInt = unsafe { py.from_owned_ptr(pyo3::ffi::PyLong_FromLong(v)) };
+ let py_int = unsafe { Bound::from_owned_ptr(py, pyo3::ffi::PyLong_FromLong(v)) };
py_int.to_object(py)
}
@@ -171,7 +183,7 @@ impl CLRepr {
elements.push(Self::into_py_impl(el, py)?);
}
- PyList::new(py, elements).to_object(py)
+ PyList::new_bound(py, elements).to_object(py)
}
CLRepr::Tuple(arr) => {
let mut elements = Vec::with_capacity(arr.len());
@@ -180,7 +192,7 @@ impl CLRepr {
elements.push(Self::into_py_impl(el, py)?);
}
- PyTuple::new(py, elements).to_object(py)
+ PyTuple::new_bound(py, elements).to_object(py)
}
CLRepr::Object(obj) => {
let r = Self::into_py_dict_impl(obj, py)?;
@@ -213,7 +225,7 @@ impl CLRepr {
})
}
- pub fn into_py_dict(self, py: Python<'_>) -> Result<&PyDict, PyErr> {
+ pub fn into_py_dict(self, py: Python<'_>) -> Result, PyErr> {
Ok(match self {
CLRepr::Object(obj) => Self::into_py_dict_impl(obj, py)?,
other => {
diff --git a/packages/cubejs-backend-native/src/cross/py_in_js.rs b/packages/cubejs-backend-native/src/cross/py_in_js.rs
index 2d1626d3f3060..fad7fe2dbd40b 100644
--- a/packages/cubejs-backend-native/src/cross/py_in_js.rs
+++ b/packages/cubejs-backend-native/src/cross/py_in_js.rs
@@ -2,7 +2,7 @@ use crate::cross::CLRepr;
use crate::python::runtime::py_runtime;
use neon::prelude::*;
use pyo3::types::PyFunction;
-use pyo3::Py;
+use pyo3::{Py, Python};
use std::cell::RefCell;
pub struct JsPyFunctionWrapper {
@@ -43,7 +43,7 @@ pub fn cl_repr_py_function_wrapper(mut cx: FunctionContext) -> JsResult r,
Err(err) => return cx.throw_error(format!("Unable to init python runtime: {:?}", err)),
diff --git a/packages/cubejs-backend-native/src/python/cube_config.rs b/packages/cubejs-backend-native/src/python/cube_config.rs
index 0dcb71a44531f..aa9a5f38afe25 100644
--- a/packages/cubejs-backend-native/src/python/cube_config.rs
+++ b/packages/cubejs-backend-native/src/python/cube_config.rs
@@ -1,6 +1,7 @@
use convert_case::{Case, Casing};
use neon::prelude::*;
-use pyo3::{PyAny, PyResult};
+use pyo3::types::PyAnyMethods;
+use pyo3::{Bound, PyAny, PyResult};
use crate::cross::{CLRepr, CLReprObject, CLReprObjectKind};
@@ -51,9 +52,7 @@ impl CubeConfigPy {
"context_to_app_id",
"context_to_orchestrator_id",
"context_to_cube_store_router_id",
- "context_to_roles",
"context_to_groups",
- "db_type",
"driver_factory",
"extend_context",
"external_driver_factory",
@@ -69,10 +68,10 @@ impl CubeConfigPy {
]
}
- pub fn attr(&mut self, config_module: &PyAny, key: &str) -> PyResult<()> {
+ pub fn attr(&mut self, config_module: &Bound<'_, PyAny>, key: &str) -> PyResult<()> {
let v = config_module.getattr(key)?;
if !v.is_none() {
- let value = CLRepr::from_python_ref(v)?;
+ let value = CLRepr::from_python_ref(&v)?;
self.properties.insert(key.to_case(Case::Camel), value);
};
diff --git a/packages/cubejs-backend-native/src/python/entry.rs b/packages/cubejs-backend-native/src/python/entry.rs
index 6305a0ab77502..161a75b9f6c0b 100644
--- a/packages/cubejs-backend-native/src/python/entry.rs
+++ b/packages/cubejs-backend-native/src/python/entry.rs
@@ -6,18 +6,19 @@ use crate::python::runtime::py_runtime_init;
use neon::prelude::*;
use pyo3::exceptions::PyException;
use pyo3::prelude::*;
-use pyo3::types::{PyDict, PyFunction, PyList, PyString, PyTuple};
+use pyo3::types::{PyAnyMethods, PyDict, PyFunction, PyList, PyString, PyTuple};
use std::path::Path;
fn extend_sys_path(py: Python, file_name: &String) -> PyResult<()> {
- let sys_path = py.import("sys")?.getattr("path")?.downcast::()?;
+ let binding = py.import_bound("sys")?.getattr("path")?;
+ let sys_path = binding.downcast::()?;
let config_dir = Path::new(&file_name)
.parent()
.unwrap_or_else(|| Path::new("."));
let config_dir_str = config_dir.to_str().unwrap_or(".");
- sys_path.insert(0, PyString::new(py, config_dir_str))?;
+ sys_path.insert(0, PyString::new_bound(py, config_dir_str))?;
Ok(())
}
@@ -40,9 +41,10 @@ fn python_load_config(mut cx: FunctionContext) -> JsResult {
env!("CARGO_MANIFEST_DIR"),
"/python/cube/src/__init__.py"
));
- PyModule::from_code(py, cube_code, "__init__.py", "cube")?;
+ PyModule::from_code_bound(py, cube_code, "__init__.py", "cube")?;
- let config_module = PyModule::from_code(py, &file_content_arg, &options_file_name, "")?;
+ let config_module =
+ PyModule::from_code_bound(py, &file_content_arg, &options_file_name, "")?;
let settings_py = if config_module.hasattr("config")? {
config_module.getattr("config")?
} else {
@@ -60,7 +62,7 @@ fn python_load_config(mut cx: FunctionContext) -> JsResult {
let mut cube_conf = CubeConfigPy::new();
for attr_name in cube_conf.get_attrs() {
- cube_conf.attr(settings_py, attr_name)?;
+ cube_conf.attr(&settings_py, attr_name)?;
}
Ok(cube_conf)
@@ -90,9 +92,9 @@ fn python_load_model(mut cx: FunctionContext) -> JsResult {
env!("CARGO_MANIFEST_DIR"),
"/python/cube/src/__init__.py"
));
- PyModule::from_code(py, cube_code, "__init__.py", "cube")?;
+ PyModule::from_code_bound(py, cube_code, "__init__.py", "cube")?;
- let model_module = PyModule::from_code(py, &model_content, &model_file_name, "")?;
+ let model_module = PyModule::from_code_bound(py, &model_content, &model_file_name, "")?;
let mut collected_functions = CLReprObject::new(CLReprObjectKind::Object);
let mut collected_variables = CLReprObject::new(CLReprObjectKind::Object);
@@ -101,48 +103,55 @@ fn python_load_model(mut cx: FunctionContext) -> JsResult {
if model_module.hasattr("template")? {
let template = model_module.getattr("template")?;
- let functions = template.getattr("functions")?.downcast::()?;
+ let functions_attr = template.getattr("functions")?;
+ let functions = functions_attr.downcast::()?;
for (local_key, local_value) in functions.iter() {
if local_value.is_instance_of::() {
- let fun: Py = local_value.downcast::()?.into();
+ let fun: Py =
+ local_value.downcast::()?.clone().unbind();
collected_functions.insert(
- local_key.to_string(),
+ local_key.str()?.to_string(),
CLRepr::PythonRef(PythonRef::PyExternalFunction(fun)),
);
}
}
- let variables = template.getattr("variables")?.downcast::()?;
+ let variables_attr = template.getattr("variables")?;
+ let variables = variables_attr.downcast::()?;
for (local_key, local_value) in variables.iter() {
- collected_variables
- .insert(local_key.to_string(), CLRepr::from_python_ref(local_value)?);
+ collected_variables.insert(
+ local_key.str()?.to_string(),
+ CLRepr::from_python_ref(&local_value)?,
+ );
}
- let filters = template.getattr("filters")?.downcast::()?;
+ let filters_attr = template.getattr("filters")?;
+ let filters = filters_attr.downcast::()?;
for (local_key, local_value) in filters.iter() {
- let fun: Py = local_value.downcast::()?.into();
+ let fun: Py = local_value.downcast::()?.clone().unbind();
collected_filters.insert(
- local_key.to_string(),
+ local_key.str()?.to_string(),
CLRepr::PythonRef(PythonRef::PyExternalFunction(fun)),
);
}
} else {
// backward compatibility, was used in private preview, not as Public API
// TODO: Remove after 1.4
- let inspect_module = py.import("inspect")?;
+ let inspect_module = py.import_bound("inspect")?;
let args = (model_module, inspect_module.getattr("isfunction")?);
- let functions_with_names = inspect_module
- .call_method1("getmembers", args)?
- .downcast::()?;
+ let getmembers_result = inspect_module.call_method1("getmembers", args)?;
+ let functions_with_names = getmembers_result.downcast::()?;
for function_details in functions_with_names.iter() {
let function_details = function_details.downcast::()?;
- let fun_name = function_details.get_item(0)?.downcast::()?;
- let fun = function_details.get_item(1)?.downcast::()?;
+ let fun_name_item = function_details.get_item(0)?;
+ let fun_name = fun_name_item.downcast::()?;
+ let fun_item = function_details.get_item(1)?;
+ let fun = fun_item.downcast::()?;
let has_attr = fun.hasattr("cube_context_func")?;
if has_attr {
- let fun: Py = fun.into();
+ let fun: Py = fun.clone().unbind();
collected_functions.insert(
fun_name.to_string(),
CLRepr::PythonRef(PythonRef::PyExternalFunction(fun)),
diff --git a/packages/cubejs-backend-native/src/python/neon_py.rs b/packages/cubejs-backend-native/src/python/neon_py.rs
index c2049195574f8..573583aff5cdf 100644
--- a/packages/cubejs-backend-native/src/python/neon_py.rs
+++ b/packages/cubejs-backend-native/src/python/neon_py.rs
@@ -5,7 +5,7 @@ pub(crate) fn format_python_error(py_err: PyErr) -> String {
let err = format!("Python error: {}", py_err);
let bt = Python::with_gil(move |py| -> PyResult