From f8743d1cfb0e018dad6a15c346c17be45d493bf7 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 5 Feb 2024 16:45:04 +0530 Subject: [PATCH 1/2] fix: support running QB union queries closes https://github.com/frappe/frappe/issues/15609 --- frappe/query_builder/utils.py | 6 +++++- frappe/tests/test_query_builder.py | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/frappe/query_builder/utils.py b/frappe/query_builder/utils.py index bb1152b2ec..98cc0bd45e 100644 --- a/frappe/query_builder/utils.py +++ b/frappe/query_builder/utils.py @@ -3,7 +3,7 @@ from enum import Enum from importlib import import_module from typing import Any, get_type_hints -from pypika.queries import Column, QueryBuilder +from pypika.queries import Column, QueryBuilder, _SetOperation from pypika.terms import PseudoColumn import frappe @@ -136,6 +136,10 @@ def patch_query_execute(): builder_class.run = execute_query builder_class.walk = prepare_query + + # To support running union queries + _SetOperation.run = execute_query + _SetOperation.walk = prepare_query frappe._qb_patched[frappe.conf.db_type] = True diff --git a/frappe/tests/test_query_builder.py b/frappe/tests/test_query_builder.py index e3ca63abf1..801394429c 100644 --- a/frappe/tests/test_query_builder.py +++ b/frappe/tests/test_query_builder.py @@ -493,3 +493,11 @@ class TestMisc(FrappeTestCase): DocType = Table("DocType") self.assertEqual(DocType.get_sql(), "DocType") + + def test_union(self): + user = frappe.qb.DocType("User") + role = frappe.qb.DocType("Role") + users = frappe.qb.from_(user).select(user.name) + roles = frappe.qb.from_(role).select(role.name) + + self.assertEqual(set(users.run() + roles.run()), set((users + roles).run())) From 7504ccaca8a683a95253510d0576ddfb947ef9ea Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Mon, 5 Feb 2024 16:45:48 +0530 Subject: [PATCH 2/2] fix: Pin pypika We've multiple monkey patched changes, we can't rely on loose pinning. --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6b27ea77b9..1bd9439dc0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dependencies = [ # do NOT add loose requirements on PyMySQL versions. "PyMySQL==1.1.0", "pypdf~=3.17.0", - "PyPika~=0.48.9", + "PyPika==0.48.9", "PyQRCode~=1.2.1", "PyYAML~=6.0.1", "RestrictedPython~=7.0",