Skip to main content

Native Python bindings for the Qdrant Query Language parser and runtime

Project description

pyqql

Native Python bindings for the Qdrant Query Language (QQL) parser, router, and execution engine, compiled with PyO3 0.23.

Features

  • Live Qdrant Execution: Connect to live Qdrant instances over REST (default) or gRPC
  • Automated Embedding Inference: Integrate custom HTTP embedder models (Ollama, OpenAI, vLLM, TEI) for text-to-vector search
  • Zero-Copy Route Lowering: Lower QQL queries to typed { method, path, payload } route dicts via compile_query
  • Native parsing: Rust-speed QQL parsing in Python returning typed Stmt objects or Python dicts
  • Filter injection: Add tenant isolation filters programmatically
  • Smart batching: Auto-batches contiguous same-collection query/mutation statements into single network calls
  • Shard key: Read/write the shard key on QUERY, COUNT, SCROLL, UPSERT, and DELETE statements
  • Validation: Check if a query string is valid QQL

Compatibility

  • Python 3.8+: Published wheels use Python's stable ABI (abi3-py38) and support Python 3.8 and newer.
  • REST and gRPC: Published wheels include both transports by default.

Installation

pip install pyqql

Quick Start

import pyqql

# 1. Connect to live Qdrant with optional custom embedding provider (e.g. Ollama)
embedder = pyqql.HttpEmbedder(
    endpoint="http://localhost:11434/v1/embeddings",
    model="all-minilm:l6-v2",
    dimension=384,
    api_key=""
)

client = pyqql.Client(
    url="http://localhost:6333",
    api_key="optional-qdrant-secret",
    use_grpc=False,
    embedder=embedder
)

# Execute QQL query (auto-embeds text to vector)
result = client.execute("QUERY 'cardiology' FROM medical_records USING dense LIMIT 5")
print(result)

# Async variant
future = client.execute_async("QUERY 'cardiology' FROM medical_records USING dense LIMIT 5")

# Explain query execution plan
plan = client.explain("QUERY 'cardiology' FROM medical_records USING dense LIMIT 5")
print(plan)

# 2. Pure AST Parsing & Filter Injection
stmt = pyqql.parse("QUERY 'vector database' FROM docs USING dense LIMIT 10")[0]
valid = pyqql.is_valid("QUERY 'test' FROM docs")
secured_stmt = pyqql.inject_filter("QUERY 'patients' FROM medical LIMIT 5", "org_id", "=", "acme-corp")

# 3. Working with Stmt objects
ast_dict = stmt.to_dict()                    # Python dict
ast_json = stmt.to_json()                    # JSON string
stmt.shard_key = "shard-01"                  # setter (QUERY/COUNT/SCROLL/UPSERT/DELETE only)
stmt.inject_filter("tenant_id", "=", "acme") # mutate in-place

# 4. Free-function execute (convenience)
result = pyqql.execute("SHOW COLLECTIONS", url="http://localhost:6333")

# 5. Lower to Qdrant route without executing
route = pyqql.compile_query("QUERY 'search' FROM docs LIMIT 10")
# route = { "method": "POST", "path": "/collections/docs/points/query", "payload": {...} }

All execution methods return an ExecutionReport dict: {"ok": bool, "results": list, "succeeded": int, "failed": int}. The results list always contains one entry per executed statement.

API Summary

Export Description
Client(url, api_key, use_grpc, embedder) Client for executing QQL against a live Qdrant database
HttpEmbedder(endpoint, model, dimension, api_key) First-class HTTP embedding provider configuration
Stmt Parsed statement object with inject_filter(), to_json(), to_dict(), shard_key property
parse(input) Parse one statement or a semicolon-delimited script into a list of Stmt objects
is_valid(input) Validate QQL syntax
inject_filter(query, field, op, value) Inject tenant filter into statement AST (accepts str or Stmt)
tokenize(input) Tokenize QQL string for syntax highlighting or inspection
compile_query(input) Lower QQL statement into typed { method, path, payload } route dict
explain(query) Inspect the execution plan without executing network calls (accepts str or Stmt)
execute(query, ..., on_error="stop") Free-function convenience execute
execute_async(query, ..., on_error="stop") Free-function async execute
Client.execute(query, on_error="stop") Execute a string, Stmt, list[str], or list[Stmt]
Client.execute_async(query, on_error="stop") Async variant of execute
Client.explain(query) Inspect execution plan (accepts str or Stmt)

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

pyqql-0.1.0-cp38-abi3-win_amd64.whl (3.4 MB view details)

Uploaded CPython 3.8+Windows x86-64

pyqql-0.1.0-cp38-abi3-manylinux_2_28_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ x86-64

pyqql-0.1.0-cp38-abi3-macosx_11_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

pyqql-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file pyqql-0.1.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: pyqql-0.1.0-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 3.4 MB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pyqql-0.1.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 71f6c1d88cc76aaed566f34ba4f008a37fc16e27e9d95f92fe659ed4f015c719
MD5 677107fee2120cbfd2aa204520e0c0cc
BLAKE2b-256 34489da4a1aae3332056c3476750e0dddc4ba713861655381b26e392d9e30faf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyqql-0.1.0-cp38-abi3-win_amd64.whl:

Publisher: release.yml on srimon12/qql-rs

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

File details

Details for the file pyqql-0.1.0-cp38-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyqql-0.1.0-cp38-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0dccae9452d7f502a9bbe7952f8808c8bb3f64a89a26178c33e965c5f19fae3f
MD5 ed0e45109ba9b6463fcb0b0e74e0ea02
BLAKE2b-256 5af4262802b54e08f06b59fd42274972e5963a2703253e56d0052ce4cd4070cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyqql-0.1.0-cp38-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on srimon12/qql-rs

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

File details

Details for the file pyqql-0.1.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: pyqql-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 3.0 MB
  • Tags: CPython 3.8+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pyqql-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bb5125775700f61aa60681d4ee10e256fd40257eab9ff23cd8de753f42643814
MD5 9aa22b48d09a0edadd9fa6e162992aba
BLAKE2b-256 e08d0a5bba7a542a7bbcbe6f72af6d303460d739f6d1e86e8585a3f023ffe354

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyqql-0.1.0-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on srimon12/qql-rs

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

File details

Details for the file pyqql-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyqql-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f1a468b970903d71255ef651780a70cc81cf6be1cb8dda1a98b755accb8dc026
MD5 4e19b42746bff00b37ff1bafa2e097b0
BLAKE2b-256 b1037756c1932ecccd5bcd72c5ecf53be98a8f320030e968871f05ad55738eeb

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyqql-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on srimon12/qql-rs

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