graphddb-runtime 1.0.0__tar.gz → 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/PKG-INFO +1 -1
  2. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/filters.py +12 -0
  3. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/runtime.py +8 -0
  4. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/transactions.py +10 -0
  5. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime.egg-info/PKG-INFO +1 -1
  6. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/pyproject.toml +1 -1
  7. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/README.md +0 -0
  8. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/__init__.py +0 -0
  9. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/async_runtime.py +0 -0
  10. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/batch.py +0 -0
  11. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/behavior_exec.py +0 -0
  12. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/concurrency.py +0 -0
  13. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/cursor.py +0 -0
  14. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/errors.py +0 -0
  15. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/handler_registry.py +0 -0
  16. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/hydration.py +0 -0
  17. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/limits.py +0 -0
  18. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/middleware.py +0 -0
  19. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/per_key_cursor.py +0 -0
  20. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime/templates.py +0 -0
  21. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime.egg-info/SOURCES.txt +0 -0
  22. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime.egg-info/dependency_links.txt +0 -0
  23. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime.egg-info/requires.txt +0 -0
  24. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/graphddb_runtime.egg-info/top_level.txt +0 -0
  25. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/setup.cfg +0 -0
  26. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_atomic_add_command.py +0 -0
  27. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_concurrency.py +0 -0
  28. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_contract_runtime.py +0 -0
  29. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_crosslang_python_cells.py +0 -0
  30. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_description.py +0 -0
  31. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_description_followups.py +0 -0
  32. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_description_jsdoc.py +0 -0
  33. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_error_policy.py +0 -0
  34. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_generated_module.py +0 -0
  35. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_guard_eval.py +0 -0
  36. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_handler_registry.py +0 -0
  37. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration.py +0 -0
  38. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_batch_write.py +0 -0
  39. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_binding_contract.py +0 -0
  40. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_command.py +0 -0
  41. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_compose.py +0 -0
  42. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_contract.py +0 -0
  43. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_edge_derive.py +0 -0
  44. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_edge_write.py +0 -0
  45. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_events.py +0 -0
  46. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_maintain.py +0 -0
  47. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_middleware.py +0 -0
  48. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_referential.py +0 -0
  49. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_relations.py +0 -0
  50. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_integration_unique.py +0 -0
  51. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_maintain.py +0 -0
  52. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_middleware.py +0 -0
  53. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_relations.py +0 -0
  54. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_spec_version_guard.py +0 -0
  55. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_ttl.py +0 -0
  56. {graphddb_runtime-1.0.0 → graphddb_runtime-1.0.1}/tests/test_unit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphddb-runtime
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Thin DynamoDB executor for GraphDDB-generated Python repositories (single-operation core, issue #44).
5
5
  License: MIT
6
6
  Requires-Python: >=3.9
@@ -148,6 +148,18 @@ def _compile_field(ctx: _Ctx, field: str, condition: Any) -> str:
148
148
 
149
149
 
150
150
  def _compile_node(ctx: _Ctx, node: Any) -> str:
151
+ # Structural primitives (notExists / attributeExists / attributeNotExists) may be
152
+ # nested inside an and/or/not group, not only at the top level (issue #330). Render
153
+ # them here; otherwise the loop treats them as a field named "attributeNotExists"
154
+ # with an equality operand — a never-satisfied clause.
155
+ if node.get("notExists") is True:
156
+ return f"attribute_not_exists({ctx.name_alias('PK')})"
157
+ ae = node.get("attributeExists")
158
+ if isinstance(ae, str) and ae:
159
+ return f"attribute_exists({ctx.name_alias(ae)})"
160
+ ane = node.get("attributeNotExists")
161
+ if isinstance(ane, str) and ane:
162
+ return f"attribute_not_exists({ctx.name_alias(ane)})"
151
163
  clauses: List[str] = []
152
164
  for key, value in node.items():
153
165
  if value is None:
@@ -218,6 +218,14 @@ def _resolve_condition_tree(node: Any, params: Mapping[str, Any]) -> Any:
218
218
  typed caller-param values, and returns a tree shaped exactly like a
219
219
  declarative ``filter`` so :func:`compile_filter` compiles it identically.
220
220
  """
221
+ # Structural primitives (notExists / attributeExists / attributeNotExists) may be
222
+ # nested in an and/or/not group (issue #330); pass them through verbatim.
223
+ if node.get("notExists") is True:
224
+ return {"notExists": True}
225
+ if isinstance(node.get("attributeExists"), str):
226
+ return {"attributeExists": node["attributeExists"]}
227
+ if isinstance(node.get("attributeNotExists"), str):
228
+ return {"attributeNotExists": node["attributeNotExists"]}
221
229
  out: Dict[str, Any] = {}
222
230
  for key, value in node.items():
223
231
  if key in ("and", "or"):
@@ -108,6 +108,16 @@ def _resolve_condition_tree(
108
108
  Mirrors the runtime's resolver but element-aware, producing a tree shaped
109
109
  like a declarative ``filter`` for :func:`compile_filter`.
110
110
  """
111
+ # Structural primitives (notExists / attributeExists / attributeNotExists) carry a
112
+ # static field name / flag and no param leaf; they may be nested in an and/or/not
113
+ # group (issue #330). Pass them through verbatim, else the default branch iterates
114
+ # the string field name as operator entries.
115
+ if node.get("notExists") is True:
116
+ return {"notExists": True}
117
+ if isinstance(node.get("attributeExists"), str):
118
+ return {"attributeExists": node["attributeExists"]}
119
+ if isinstance(node.get("attributeNotExists"), str):
120
+ return {"attributeNotExists": node["attributeNotExists"]}
111
121
  out: Dict[str, Any] = {}
112
122
  for key, value in node.items():
113
123
  if key in ("and", "or"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphddb-runtime
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Thin DynamoDB executor for GraphDDB-generated Python repositories (single-operation core, issue #44).
5
5
  License: MIT
6
6
  Requires-Python: >=3.9
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "graphddb-runtime"
7
- version = "1.0.0"
7
+ version = "1.0.1"
8
8
  description = "Thin DynamoDB executor for GraphDDB-generated Python repositories (single-operation core, issue #44)."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"