Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
4fabaa4
V1 T1.1 + T1.2
FFTLabs Feb 19, 2026
3cec808
V2 T2.1
FFTLabs Feb 19, 2026
a79eb2f
V2 T2.2
FFTLabs Feb 19, 2026
258e556
V2 T2.3
FFTLabs Feb 19, 2026
a3daa04
V2 T2.4
FFTLabs Feb 19, 2026
026eaa8
V2 DOCSV2-01 - 06
FFTLabs Feb 19, 2026
dd45319
V2 DOCV2-07 - 12
FFTLabs Feb 19, 2026
705c794
V2 DOCV2-13 - 17
FFTLabs Feb 19, 2026
b301fb6
V2 T3.1 + T3.2
FFTLabs Feb 19, 2026
5cc1484
V2 T3.3
FFTLabs Feb 19, 2026
cd54d5f
V2 T3.3.1
FFTLabs Feb 19, 2026
2ebe2f6
V2 T3.3.2
FFTLabs Feb 19, 2026
8069ba9
V2 T3.3.3
FFTLabs Feb 19, 2026
370487d
V2 T3.3.4
FFTLabs Feb 19, 2026
5f0c161
V2 T3.3.5
FFTLabs Feb 19, 2026
eb61308
V2 T3.3.6
FFTLabs Feb 19, 2026
25dd268
V2 T3.3.7
FFTLabs Feb 19, 2026
a2f05e4
V2 T3.3.8
FFTLabs Feb 19, 2026
c33cf88
V2 T3.3.9
FFTLabs Feb 19, 2026
ac9eed1
V2 T3.3.10
FFTLabs Feb 20, 2026
5f586b8
V2 T3.3.11
FFTLabs Feb 20, 2026
b6569de
V2 T3.3.12
FFTLabs Feb 20, 2026
5438631
V2 T3.3.13
FFTLabs Feb 20, 2026
b6ccc9e
V2 T3.3.14
FFTLabs Feb 20, 2026
c0ccab0
V2 T3.4
FFTLabs Feb 20, 2026
dda59ed
V2 T3.4.1
FFTLabs Feb 20, 2026
879618c
V2 T3.4.2
FFTLabs Feb 20, 2026
fa1b54c
V2 T3.4.3
FFTLabs Feb 20, 2026
91c3127
V2 T3.4.4
FFTLabs Feb 20, 2026
fec97e3
V2 T3.4.5
FFTLabs Feb 20, 2026
fb51f44
V2 T3.4.6
FFTLabs Feb 20, 2026
09832b7
V2 T3.4.7
FFTLabs Feb 20, 2026
f2de2b5
V2 T3.4.8
FFTLabs Feb 20, 2026
90fd9e7
V2 T3.4.9
FFTLabs Feb 20, 2026
f9f2bb3
V2 T3.4.10
FFTLabs Feb 20, 2026
c52c357
V2 T3.4.11
FFTLabs Feb 20, 2026
0e9490b
V2 T3.4.12
FFTLabs Feb 20, 2026
0aba8ba
V2 T3.4.13
FFTLabs Feb 20, 2026
cd8aae6
V2 T3.4.14
FFTLabs Feb 20, 2026
65c0df8
V2 T3.4.15
FFTLabs Feb 20, 2026
f3ffae1
V2 T3.4.1
FFTLabs Feb 20, 2026
3464c0d
V2 T4.2
FFTLabs Feb 20, 2026
a56b6f5
V2 T4.3
FFTLabs Feb 20, 2026
f278079
V2 T4.3.1
FFTLabs Feb 20, 2026
51af96d
V2 T4.3.2
FFTLabs Feb 20, 2026
849ce51
V2 T4.3.3
FFTLabs Feb 20, 2026
d2a7059
V2 T4.3.4
FFTLabs Feb 20, 2026
d292b71
V2 T4.3.5
FFTLabs Feb 20, 2026
517ba26
V2 T4.3.6
FFTLabs Feb 20, 2026
f4a9337
V2 T4.3.7
FFTLabs Feb 20, 2026
75497ae
V2 T4.3.8
FFTLabs Feb 20, 2026
cb62673
V2 T4.3.9
FFTLabs Feb 20, 2026
84e5970
V2 T4.3.10
FFTLabs Feb 20, 2026
cf9b625
V2 T4.3.11
FFTLabs Feb 20, 2026
8632011
V2 T4.3.12
FFTLabs Feb 20, 2026
1cf1d1d
V2 T4.3.13
FFTLabs Feb 20, 2026
a3f8326
V2 T4.3.14
FFTLabs Feb 20, 2026
0c34c2a
V2 T4.3.15
FFTLabs Feb 20, 2026
74b0584
V2 T4.4
FFTLabs Feb 20, 2026
cc68775
V2 moved unittests to separate files for worker and runtime
FFTLabs Feb 20, 2026
a1ea60e
V2 T5.1
FFTLabs Feb 20, 2026
102c2ab
V2 T5.2
FFTLabs Feb 20, 2026
948ed49
V2 T5.3
FFTLabs Feb 21, 2026
0aca1d7
V2 T5.4
FFTLabs Feb 21, 2026
ed7fcfb
V2 T6.1
FFTLabs Feb 21, 2026
f475c76
V2 T6.2
FFTLabs Feb 21, 2026
c1baf26
V2 T6.3
FFTLabs Feb 21, 2026
0878c05
V2 T6.3 distributed parity
FFTLabs Feb 21, 2026
f5b929a
V2 T7.1
FFTLabs Feb 21, 2026
b2e0108
V2 T7.2
FFTLabs Feb 21, 2026
0d76172
V2 T7.2.1
FFTLabs Feb 21, 2026
9748009
V2 T7.2.2
FFTLabs Feb 21, 2026
dc09e7a
V2 T7.2.3
FFTLabs Feb 21, 2026
763bdc0
V2 T7.2.4
FFTLabs Feb 21, 2026
c583046
V2 T7.2.5
FFTLabs Feb 21, 2026
6bc22df
V2 T7.2.6
FFTLabs Feb 21, 2026
ab44b06
V2 T7.2.7
FFTLabs Feb 21, 2026
1ffe102
V2 T7.2.8
FFTLabs Feb 21, 2026
b672280
V2 T7.2.9
FFTLabs Feb 21, 2026
51304e4
V2 T7.2.10
FFTLabs Feb 21, 2026
5b8cb62
V2 T7.2.11
FFTLabs Feb 21, 2026
343bf55
V2 T7.2.12
FFTLabs Feb 21, 2026
e2baae0
V2 T7.2.13
FFTLabs Feb 21, 2026
189dc43
V2 T7.2.13 - added verification metadata
FFTLabs Feb 21, 2026
0547e2a
V2 T7.3
FFTLabs Feb 21, 2026
3b60048
V2 T7.4
FFTLabs Feb 21, 2026
5015c1b
V2 T7.5
FFTLabs Feb 21, 2026
56c447f
V2 T8.1
FFTLabs Feb 21, 2026
1b278fa
V2 T8.2
FFTLabs Feb 21, 2026
7837c4b
V2 T8.3
FFTLabs Feb 21, 2026
14c3f73
V2 T8.4
FFTLabs Feb 21, 2026
2c9b3f2
V2 T8.4 unittests + docs
FFTLabs Feb 21, 2026
2765cbb
V2 T8.4 Makefile targets
FFTLabs Feb 21, 2026
32a1b5e
V2 T9.1
FFTLabs Feb 21, 2026
86a899c
V2 T9.2
FFTLabs Feb 21, 2026
2cf3399
V2 T9.3
FFTLabs Feb 21, 2026
70d8f4b
V2 T9.4
FFTLabs Feb 21, 2026
398c8f1
V2 T9.5
FFTLabs Feb 21, 2026
7888e4c
V2 Fixed unittest errors
FFTLabs Feb 21, 2026
5f59092
V2 Updated docs
FFTLabs Feb 22, 2026
0c73fca
Fixed errors for embedded and distributed tests
FFTLabs Feb 22, 2026
35ee451
Fixed Vecotr tests and flaky tests
FFTLabs Feb 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .github/workflows/api-semver.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: api-semver

on:
pull_request:
workflow_dispatch:

jobs:
public-api-contract:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Public API contract test
run: cargo test -p ffq-client --test public_api_contract

semver-check:
runs-on: ubuntu-latest
steps:
- name: Checkout (full history)
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Install cargo-semver-checks
run: cargo install cargo-semver-checks --locked

- name: SemVer check (ffq-client vs base branch)
env:
BASE_REF: ${{ github.base_ref }}
run: |
BASE_REF="${BASE_REF:-main}"
git fetch origin "${BASE_REF}" --depth=1
cargo semver-checks check-release \
--manifest-path crates/client/Cargo.toml \
--baseline-rev "origin/${BASE_REF}"
112 changes: 112 additions & 0 deletions .github/workflows/bench-13_3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,15 @@ jobs:
echo "warmup=1" >> "$GITHUB_OUTPUT"
echo "iterations=3" >> "$GITHUB_OUTPUT"
echo "rag_matrix=1000,16,10,1.0;5000,32,10,0.8;10000,64,10,0.2" >> "$GITHUB_OUTPUT"
echo "window_matrix=narrow;wide;skewed;many_exprs" >> "$GITHUB_OUTPUT"
echo "adaptive_shuffle_matrix=tiny;large;skewed;mixed" >> "$GITHUB_OUTPUT"
else
echo "mode=reduced" >> "$GITHUB_OUTPUT"
echo "warmup=0" >> "$GITHUB_OUTPUT"
echo "iterations=2" >> "$GITHUB_OUTPUT"
echo "rag_matrix=1000,16,5,1.0;5000,32,10,0.5" >> "$GITHUB_OUTPUT"
echo "window_matrix=narrow;many_exprs" >> "$GITHUB_OUTPUT"
echo "adaptive_shuffle_matrix=tiny;skewed" >> "$GITHUB_OUTPUT"
fi

- name: Run embedded benchmark
Expand Down Expand Up @@ -156,6 +160,114 @@ jobs:
fi
make bench-13.3-compare BASELINE="${BASELINE}" CANDIDATE="${{ steps.candidate.outputs.json }}" THRESHOLD="${THRESHOLD}"

- name: Run window benchmark matrix
shell: bash
run: |
set -euo pipefail
export FFQ_BENCH_MODE=embedded
export FFQ_BENCH_INCLUDE_RAG=0
export FFQ_BENCH_WARMUP="${{ steps.matrix.outputs.warmup }}"
export FFQ_BENCH_ITERATIONS="${{ steps.matrix.outputs.iterations }}"
export FFQ_BENCH_WINDOW_MATRIX="${{ steps.matrix.outputs.window_matrix }}"
make bench-v2-window-embedded

- name: Resolve window candidate artifact
id: window_candidate
shell: bash
run: |
set -euo pipefail
CANDIDATE_JSON="$(ls -t tests/bench/results/*.json | head -n1)"
echo "json=${CANDIDATE_JSON}" >> "$GITHUB_OUTPUT"
echo "window_candidate_json=${CANDIDATE_JSON}" >> "$GITHUB_STEP_SUMMARY"

- name: Window regression gate (optional)
if: >-
${{
github.event_name == 'workflow_dispatch' &&
inputs.regression_gate &&
steps.matrix.outputs.mode == 'reduced'
}}
shell: bash
run: |
set -euo pipefail
BASELINE="${{ inputs.baseline_path }}"
THRESHOLD="${{ inputs.threshold }}"
if [[ -z "${BASELINE}" ]]; then
echo "baseline_path is required when regression_gate=true"
exit 1
fi
make bench-v2-window-compare BASELINE="${BASELINE}" CANDIDATE="${{ steps.window_candidate.outputs.json }}" THRESHOLD="${THRESHOLD}"

- name: Run adaptive shuffle benchmark matrix
shell: bash
run: |
set -euo pipefail
export FFQ_BENCH_MODE=embedded
export FFQ_BENCH_INCLUDE_RAG=0
export FFQ_BENCH_INCLUDE_WINDOW=0
export FFQ_BENCH_WARMUP="${{ steps.matrix.outputs.warmup }}"
export FFQ_BENCH_ITERATIONS="${{ steps.matrix.outputs.iterations }}"
export FFQ_BENCH_ADAPTIVE_SHUFFLE_MATRIX="${{ steps.matrix.outputs.adaptive_shuffle_matrix }}"
make bench-v2-adaptive-shuffle-embedded

- name: Resolve adaptive shuffle candidate artifact
id: adaptive_candidate
shell: bash
run: |
set -euo pipefail
CANDIDATE_JSON="$(ls -t tests/bench/results/*.json | head -n1)"
echo "json=${CANDIDATE_JSON}" >> "$GITHUB_OUTPUT"
echo "adaptive_candidate_json=${CANDIDATE_JSON}" >> "$GITHUB_STEP_SUMMARY"

- name: Adaptive shuffle regression gate (optional)
if: >-
${{
github.event_name == 'workflow_dispatch' &&
inputs.regression_gate &&
steps.matrix.outputs.mode == 'reduced'
}}
shell: bash
run: |
set -euo pipefail
BASELINE="${{ inputs.baseline_path }}"
THRESHOLD="${{ inputs.threshold }}"
if [[ -z "${BASELINE}" ]]; then
echo "baseline_path is required when regression_gate=true"
exit 1
fi
make bench-v2-adaptive-shuffle-compare BASELINE="${BASELINE}" CANDIDATE="${{ steps.adaptive_candidate.outputs.json }}" THRESHOLD="${THRESHOLD}"

- name: Run pipelined-shuffle TTFR benchmark
shell: bash
run: |
set -euo pipefail
if [[ "${{ steps.matrix.outputs.mode }}" == "full" ]]; then
export FFQ_PIPE_TTFR_ROWS=600000
export FFQ_PIPE_TTFR_WARMUP=1
export FFQ_PIPE_TTFR_ITERATIONS=3
else
export FFQ_PIPE_TTFR_ROWS=250000
export FFQ_PIPE_TTFR_WARMUP=1
export FFQ_PIPE_TTFR_ITERATIONS=2
fi
export FFQ_PIPE_TTFR_SHUFFLE_PARTITIONS=64
make bench-v2-pipelined-shuffle

- name: Resolve pipelined TTFR candidate artifact
id: pipelined_candidate
shell: bash
run: |
set -euo pipefail
CANDIDATE_JSON="$(ls -t tests/bench/results/bench_v2_pipelined_shuffle_ttfr_*.json | head -n1)"
echo "json=${CANDIDATE_JSON}" >> "$GITHUB_OUTPUT"
echo "pipelined_candidate_json=${CANDIDATE_JSON}" >> "$GITHUB_STEP_SUMMARY"

- name: Pipelined TTFR threshold gate
shell: bash
run: |
set -euo pipefail
make bench-v2-pipelined-shuffle-gate CANDIDATE="${{ steps.pipelined_candidate.outputs.json }}"

- name: Upload benchmark artifacts
uses: actions/upload-artifact@v4
with:
Expand Down
21 changes: 21 additions & 0 deletions .github/workflows/docs-v2-guardrails.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: docs-v2-guardrails

on:
pull_request:
workflow_dispatch:

jobs:
docs-v2-guardrails:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Validate v2 docs guardrails
run: python3 scripts/validate-docs-v2.py

34 changes: 34 additions & 0 deletions .github/workflows/feature-matrix.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: feature-matrix

on:
push:
branches: ["**"]
pull_request:

jobs:
build-matrix:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Build core-only (no default features)
run: cargo build --no-default-features

- name: Build minimal preset
run: cargo build -p ffq-client --no-default-features --features minimal

- name: Build distributed + python + s3
run: cargo build --features distributed,python,s3

- name: Build full feature matrix
run: cargo build -p ffq-client --no-default-features --features core,distributed,s3,vector,qdrant,python,ffi

- name: FFI C example smoke
run: make ffi-example
76 changes: 76 additions & 0 deletions .github/workflows/python-wheels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: python-wheels

on:
pull_request:
workflow_dispatch:

jobs:
wheel-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Build manylinux wheel
uses: PyO3/maturin-action@v1
with:
command: build
args: --release --out dist
- name: Wheel smoke test (pip install + collect)
run: |
python -m pip install --upgrade pip
python -m pip install pyarrow dist/*.whl
python - <<'PY'
import os
import ffq
root = os.getcwd()
lineitem = os.path.join(root, "tests/fixtures/parquet/lineitem.parquet")
e = ffq.Engine()
e.register_table("lineitem", lineitem)
df = e.sql("SELECT l_orderkey FROM lineitem LIMIT 1")
t = df.collect()
assert t.num_rows == 1, t
print("python wheel smoke: OK")
PY
- name: Upload Linux wheel
uses: actions/upload-artifact@v4
with:
name: wheel-linux
path: dist/*

wheel-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Build macOS wheel
uses: PyO3/maturin-action@v1
with:
command: build
args: --release --out dist
- name: Wheel smoke test (pip install + collect)
run: |
python -m pip install --upgrade pip
python -m pip install pyarrow dist/*.whl
python - <<'PY'
import os
import ffq
root = os.getcwd()
lineitem = os.path.join(root, "tests/fixtures/parquet/lineitem.parquet")
e = ffq.Engine()
e.register_table("lineitem", lineitem)
df = e.sql("SELECT l_orderkey FROM lineitem LIMIT 1")
t = df.collect()
assert t.num_rows == 1, t
print("python wheel smoke: OK")
PY
- name: Upload macOS wheel
uses: actions/upload-artifact@v4
with:
name: wheel-macos
path: dist/*
Loading
Loading