GFQL: Cypher-style row pipeline + parser-backed where_rows hardening#931
Merged
GFQL: Cypher-style row pipeline + parser-backed where_rows hardening#931
Conversation
lmeyerov
commented
Mar 6, 2026
Contributor
Author
There was a problem hiding this comment.
move to standalone pr
lmeyerov
commented
Mar 6, 2026
…ne operator tests
lmeyerov
commented
Mar 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds a Cypher-style GFQL row pipeline to
g.gfql(...), expands/guards expression support, and hardens validation/runtime behavior for pure-vector execution.Primary outcomes:
rows,select/with_/return_,where_rows,order_by,skip,limit,distinct,unwind,group_by).where_rows(expr=...).ast.literal_evalsinks in new GFQL parser paths).Complete GFQL Example 1: Pattern Matching +
where=[...]This is the graph-pattern flow (
MATCH ... WHERE alias.prop ...) using same-path constraints:Complete GFQL Example 2: Row Pipeline (
MATCH ... RETURN ... ORDER BY ... LIMIT)This is the new row-table pipeline flow for projection/filter/sort/paging:
New/Expanded GFQL Forms
Row-pipeline calls in this PR:
rows(table='nodes'|'edges', source=...)select(items=[(alias, expr), ...])with_(items=[...])return_(...)(row projection alias)where_rows(filter_dict=..., expr=...)order_by(keys=[(expr, 'asc'|'desc'), ...])skip(value=...)limit(value=...)distinct()unwind(expr=..., as_=...)group_by(keys=[...], aggregations=[...])Expression coverage (validator-gated):
NOT,AND,OR, precedence/parentheses=,!=,<>,<,<=,>,>=,IS NULL,IS NOT NULLCONTAINS,STARTS WITH,ENDS WITHANY,ALL,NONE,SINGLE[x IN list WHERE ... | ...]CASE WHEN ... THEN ... ELSE ... ENDValidation / Safety
iterrows/itertuples/.applyadditions in these changes).Tests
Main test coverage additions/expansions:
graphistry/tests/compute/gfql/test_row_pipeline_ops.pygraphistry/tests/compute/gfql/test_expr_parser.pygraphistry/tests/compute/test_gfql.pyLocal validation on current branch:
PYTHONPATH=. pytest -q graphistry/tests/compute/gfql/test_expr_parser.py graphistry/tests/compute/gfql/test_row_pipeline_ops.py graphistry/tests/compute/test_gfql.py graphistry/tests/compute/test_call_operations.py152 passed, 26 skippedpy_compileon touched GFQL files: passruff checkon touched GFQL files: passmypy --ignore-missing-imports --follow-imports=skipon touched GFQL files: pass