From d2b8ecd2403de7c0e0b3d7b02ab7f0fec8984024 Mon Sep 17 00:00:00 2001 From: Tolu Aina <7848930+toluaina@users.noreply.github.com> Date: Sun, 8 Dec 2024 13:55:22 +0100 Subject: [PATCH] fib bug not tracking through table on insert and filtering on inner qubquery --- pgsync/querybuilder.py | 35 ++++++++--------------------------- pgsync/sync.py | 9 ++++----- requirements/base.txt | 6 +++--- requirements/dev.txt | 8 ++++---- 4 files changed, 19 insertions(+), 39 deletions(-) diff --git a/pgsync/querybuilder.py b/pgsync/querybuilder.py index 311ab6d7..cbc53640 100644 --- a/pgsync/querybuilder.py +++ b/pgsync/querybuilder.py @@ -346,6 +346,7 @@ def _root( < txmax ) + # NB: only apply filters to the root node if node._filters: node._subquery = node._subquery.where(sa.and_(*node._filters)) node._subquery = node._subquery.alias() @@ -420,11 +421,6 @@ def _children(self, node: Node) -> None: if child._filters: - self.isouter = not any( - column in child.table_columns - for column in child.relationship.foreign_key.parent - ) - for _filter in child._filters: if isinstance(_filter, sa.sql.elements.BinaryExpression): for column in _filter._orig: @@ -575,11 +571,6 @@ def _through(self, node: Node) -> None: # noqa: C901 if child._filters: - self.isouter = not any( - column in child.table_columns - for column in child.relationship.foreign_key.parent - ) - for _filter in child._filters: if isinstance(_filter, sa.sql.elements.BinaryExpression): for column in _filter._orig: @@ -698,12 +689,6 @@ def _through(self, node: Node) -> None: # noqa: C901 == through.model.c[right_foreign_keys[i]] ) - if node._filters: - self.isouter = not any( - column in node.table_columns - for column in node.relationship.foreign_key.parent - ) - op = sa.and_ if node.table == node.parent.table: op = sa.or_ @@ -715,8 +700,10 @@ def _through(self, node: Node) -> None: # noqa: C901 ) node._subquery = inner_subquery.select_from(from_obj) - if node._filters: - node._subquery = node._subquery.where(sa.and_(*node._filters)) + + # NB do not apply filters to the child node as they are applied to the parent + # if node._filters: + # node._subquery = node._subquery.where(sa.and_(*node._filters)) node._subquery = node._subquery.group_by( *[through.model.c[column] for column in foreign_keys[through.name]] @@ -759,13 +746,6 @@ def _non_through(self, node: Node) -> None: # noqa: C901 if child._filters: - # NB:sometimes the FK is in the parent not the child - # if none of child.relationship.foreign_key.parent is in child.table_columns then isouter = True - self.isouter = not any( - column in child.table_columns - for column in child.relationship.foreign_key.parent - ) - for _filter in child._filters: if isinstance(_filter, sa.sql.elements.BinaryExpression): for column in _filter._orig: @@ -882,8 +862,9 @@ def _non_through(self, node: Node) -> None: # noqa: C901 ) node._subquery = node._subquery.where(sa.and_(*where)) - if node._filters: - node._subquery = node._subquery.where(sa.and_(*node._filters)) + # NB do not apply filters to the child node as they are applied to the parent + # if node._filters: + # node._subquery = node._subquery.where(sa.and_(*node._filters)) if node.relationship.type == ONE_TO_MANY: node._subquery = node._subquery.group_by( diff --git a/pgsync/sync.py b/pgsync/sync.py index e6f8ca27..21545170 100644 --- a/pgsync/sync.py +++ b/pgsync/sync.py @@ -577,11 +577,10 @@ def _insert_op( node, payload, foreign_keys, _filters ) - # through table with a direct references to root - if not _filters: - _filters = self._through_node_resolver( - node, payload, _filters - ) + # also check through table with a direct references to root + _filters = self._through_node_resolver( + node, payload, _filters + ) if _filters: filters[self.tree.root.table].extend(_filters) diff --git a/requirements/base.txt b/requirements/base.txt index 79b3162d..eb3211aa 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -6,9 +6,9 @@ # async-timeout==5.0.1 # via redis -boto3==1.35.75 +boto3==1.35.76 # via -r requirements/base.in -botocore==1.35.75 +botocore==1.35.76 # via # boto3 # s3transfer @@ -63,7 +63,7 @@ python-dotenv==1.0.1 # via # -r requirements/base.in # environs -redis==5.2.0 +redis==5.2.1 # via -r requirements/base.in requests==2.32.3 # via diff --git a/requirements/dev.txt b/requirements/dev.txt index a24bf48d..f318eb82 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -8,9 +8,9 @@ async-timeout==5.0.1 # via redis black==24.10.0 # via -r requirements/dev.in -boto3==1.35.75 +boto3==1.35.76 # via -r /Users/tolu/pgsync/requirements/base.in -botocore==1.35.75 +botocore==1.35.76 # via # boto3 # s3transfer @@ -27,7 +27,7 @@ click==8.1.7 # via # -r /Users/tolu/pgsync/requirements/base.in # black -coverage[toml]==7.6.8 +coverage[toml]==7.6.9 # via # -r requirements/dev.in # pytest-cov @@ -129,7 +129,7 @@ python-dotenv==1.0.1 # environs pyyaml==6.0.2 # via pre-commit -redis==5.2.0 +redis==5.2.1 # via -r /Users/tolu/pgsync/requirements/base.in requests==2.32.3 # via