Skip to main content

gramps-object-query-language

A small, closed query AST and SQL compiler for fast object queries against Gramps genealogy data.

This is not a general query language, not GraphQL, and not a raw-SQL passthrough. It compiles a structured Query (select/where/order_by/ limit/after) -- or an "almost Python" expression string -- into parameterized SQL against Gramps' flattened secondary columns, with every column checked against a fixed per-type whitelist before the compiler ever touches it.

Paths into the JSON blob are checked, not trusted: every Gramps class publishes a complete recursive get_schema(), so primary_name.surname_list[0].surname is whitelisted the same way a flat column name is, and a typo is a compile-time error naming the fields that exist rather than an all-NULL column.

It is standalone and privacy-agnostic: it carries no knowledge of proxies, permissions, or any particular web API. An evaluator/proxied_query path is also included for evaluating the same query AST directly against real (possibly proxied) Gramps objects, for callers that can't run raw SQL against an unproxied database.

Install

pip install gramps-object-query-language

Documentation

  • README-query-language.md -- a plain-language, goal-first guide to where_expr for non-programmers ("Find all the families where the mom died before the dad" -> the query for it).
  • docs/where_expr.md -- the technical reference for the "almost Python" where_expr filter language (Person "gender == Person.MALE", Family "mother.death.date.sortval < father.death.date.sortval", ...), with every example tested against real SQLite.

Modules

  • gramps_object_query_language.query -- the query AST and SQL compiler.
  • gramps_object_query_language.query_lang -- an "almost Python" expression parser (parse_expr) that translates into the same where shape, plus compile_expr, which translates it the rest of the way into query.py's executable AST for callers that want to run it directly, and parse_select, which parses select entries ("birth.place.title as birthplace", "count(events) as n_events") written in that same path grammar. See docs/where_expr.md.
  • gramps_object_query_language.evaluator -- evaluates the AST directly against real Gramps objects (no SQL), for use with a proxied database.
  • gramps_object_query_language.proxied_query -- runs a where expression through Gramps' own Filter/Rule machinery against a possibly-proxied database.

Benchmarks

benchmarks/sort_cost.py measures what each kind of sort column costs (indexed flat column vs. JSON path vs. relationship hop), with SQLite's own query plans. Its output is quoted in docs/where_expr.md -- run it rather than trusting the numbers there.

python benchmarks/sort_cost.py --people 20000

Development

pip install -e ".[test]"
pytest

License

GNU Affero General Public License v3 or later (AGPL-3.0-or-later). See LICENSE.

Metadata

Release files for gramps-object-query-language 0.5.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gramps-object-query-language 0.5.5
File Size Uploaded
gramps_object_query_language-0.5.5.tar.gz 91.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gramps-object-query-language 0.5.5
File Interpreter ABI Platform
gramps_object_query_language-0.5.5-py3-none-any.whl Python 3 none any Details

Total release size: 186.3 kB

Release files / gramps_object_query_language-0.5.5.tar.gz

Download URL gramps_object_query_language-0.5.5.tar.gz
Size 91.2 kB
Tags Source
SHA-256 checksum
How to use checksums
80c2bc8b76f9a994951bf582c50d05de6d46df7dd399a1eb770465e092e6d7cb
BLAKE2b-256 checksum
How to use checksums
786fd1dd05db796facb514b2de4d2783a2b1cf2f9b1e3607b110e67d732f65ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.2

Release files / gramps_object_query_language-0.5.5-py3-none-any.whl

Download URL gramps_object_query_language-0.5.5-py3-none-any.whl
Size 95.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a7b00ca25c2fbb13d32024408a5d3d46afc4ace187d7402edba1ec649b16cd63
BLAKE2b-256 checksum
How to use checksums
9fdf72922f2a2023c6ac32b01c2b0f22a2c3e4ceea493ce89a04afdf59cada35
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.2

Release history Release notifications | RSS feed

0.5.6

2 release files

This release

0.5.5 This release

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page