Skip to main content

In-process executor for semql FederatedPlans — runs per-backend fragments via caller-supplied adapters and merges results in DuckDB.

Project description

semql-engine

In-process executor for semql FederatedPlan results. Runs each per-backend fragment via a caller-supplied Adapter, materialises the rows into in-memory DuckDB, then runs the plan's merge SQL against the assembled tables.

semql core stays sans-io. semql-engine is the opt-in package that turns a FederatedPlan into result rows when you want the cross-source execution done for you.

Install

pip install semql-engine

Quickstart

import duckdb
from semql import Catalog, Dialect, compile_federated_query
from semql_engine import DuckDBAdapter, Engine

catalog = Catalog([...])  # cubes spanning multiple backends
plan = compile_federated_query(query, catalog.as_dict())

engine = Engine()
engine.register(Dialect.POSTGRES, my_pg_adapter)
engine.register(Dialect.BIGQUERY, my_bq_adapter)
result = engine.run(plan)
result.columns  # ['region', 'revenue', ...]
result.rows     # [(...), ...]   — or stream with engine.iter_rows(plan)

What it does

For every fragment in the plan, the engine calls the adapter registered for that backend with (sql, params). It loads the resulting rows into a DuckDB table named frag_<i> (matching FederatedPlan.fragments indices) and finally applies plan.merge_spec — rendered to DuckDB SQL by semql_engine.merge — to produce the merged shape.

Single-fragment plans (single-backend queries that went through compile_federated_query anyway) work transparently — the merge is a pass-through.

Adapters

An Adapter is anything with execute(sql, params) -> AdapterResult where AdapterResult carries columns: list[str] and an iterable of row dicts. Built-ins:

  • DuckDBAdapter(con) — runs the SQL inside an existing DuckDB connection. Useful for local CSV / Parquet enrichment cubes.
  • DBAPIAdapter(con) — wraps any PEP-249 connection (psycopg, mysql, sqlite, etc).

Bring your own for warehouses that need a vendor SDK.

Semi-joins

A cross-backend semi-join (restrict an outer dimension to the value set of an inner query, shipped as a value list rather than a join) compiles to a SemiJoinPlan via semql.compile_semi_join_query. Run it with run_semi_join(plan, engine) — it executes each inner plan, projects the key column to a value list, and runs the outer query with that list bound as an IN / NOT IN filter:

from semql import compile_semi_join_query
from semql_engine import Engine, run_semi_join

plan = compile_semi_join_query(query, catalog.as_dict())
result = run_semi_join(plan, engine)  # same ExecutionResult shape as run()

Scope

v1 mirrors compile_federated_query v1:

  • Sum / count / avg supported (avg is decomposed at compile and recomposed in the merge SQL); other aggregations are refused by the compiler before the engine ever sees them.
  • Equality bridge joins only.
  • No compare mode, no boolean where tree across backends.

The engine itself is small; most of the federation logic lives in semql.federate.

Status

Early development. The Adapter contract is stable; the federation shape mirrors compile_federated_query v1 (sum / count / avg and equality bridge joins only).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

semql_engine-0.6.0.tar.gz (24.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

semql_engine-0.6.0-py3-none-any.whl (28.3 kB view details)

Uploaded Python 3

File details

Details for the file semql_engine-0.6.0.tar.gz.

File metadata

  • Download URL: semql_engine-0.6.0.tar.gz
  • Upload date:
  • Size: 24.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for semql_engine-0.6.0.tar.gz
Algorithm Hash digest
SHA256 106d499ee0e7d60a432e2fbf32a70fe8aff7ae3fbd03616b462490c83dfda334
MD5 c55378b7d6534c84a6a31f48030fae98
BLAKE2b-256 586ee362cae30b06e9a62ab906926eec83dd8d3134c07f138e8c0358eb490d5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for semql_engine-0.6.0.tar.gz:

Publisher: release.yml on semql-io/semql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file semql_engine-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: semql_engine-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 28.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for semql_engine-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 979664ad85e1b4646cb22f652f43602d0620a6964493d9612d4cd0d46e31fd56
MD5 5dad5b44e9e3ad1703245ba3496ba836
BLAKE2b-256 e43558cae52f19e712633c21cc5b82c2c8918dd546a1fbacb9978910308207e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for semql_engine-0.6.0-py3-none-any.whl:

Publisher: release.yml on semql-io/semql

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page