From 2d806b5d6d0239fab096be351b0accb92f254ab9 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Thu, 31 Mar 2022 13:40:09 +0530 Subject: [PATCH] fix: Ported subqry to branch for compatibility Via https://github.com/frappe/frappe/pull/16107 --- frappe/query_builder/terms.py | 15 +++++++++++++-- frappe/utils/nestedset.py | 4 +++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/frappe/query_builder/terms.py b/frappe/query_builder/terms.py index 205f1f9dcd..d3785e049a 100644 --- a/frappe/query_builder/terms.py +++ b/frappe/query_builder/terms.py @@ -1,10 +1,12 @@ from datetime import timedelta from typing import Any, Dict, Optional -from frappe.utils.data import format_timedelta -from pypika.terms import Function, ValueWrapper +from pypika.queries import QueryBuilder +from pypika.terms import Criterion, Function, ValueWrapper from pypika.utils import format_alias_sql +from frappe.utils.data import format_timedelta + class NamedParameterWrapper: """Utility class to hold parameter values and keys""" @@ -100,3 +102,12 @@ class ParameterizedFunction(Function): ) return function_sql + +class subqry(Criterion): + def __init__(self, subq: QueryBuilder, alias: Optional[str] = None,) -> None: + super().__init__(alias) + self.subq = subq + + def get_sql(self, **kwg: Any) -> str: + kwg["subquery"] = True + return self.subq.get_sql(**kwg) diff --git a/frappe/utils/nestedset.py b/frappe/utils/nestedset.py index f1ebf8eeea..1b6bd3e66d 100644 --- a/frappe/utils/nestedset.py +++ b/frappe/utils/nestedset.py @@ -295,6 +295,8 @@ class NestedSet(Document): def get_root_of(doctype): """Get root element of a DocType with a tree structure""" from frappe.query_builder.functions import Count + from frappe.query_builder.terms import subqry + Table = DocType(doctype) t1 = Table.as_("t1") t2 = Table.as_("t2") @@ -303,7 +305,7 @@ def get_root_of(doctype): (t2.lft < t1.lft) & (t2.rgt > t1.rgt) ) result = frappe.qb.from_(t1).select(t1.name).where( - (subq == 0) & (t1.rgt > t1.lft) # depends on https://github.com/frappe/frappe/pull/16107 + (subqry(subq) == 0) & (t1.rgt > t1.lft) ).run() return result[0][0] if result else None