From 25277e02da994dafe7bfe4da81f81ac6bdfd70e0 Mon Sep 17 00:00:00 2001 From: Aradhya-Tripathi Date: Tue, 5 Oct 2021 15:48:52 +0530 Subject: [PATCH 1/4] fix: Fixed get_values --- frappe/database/database.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 4af7252cc1..381247ffa2 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -20,6 +20,7 @@ from frappe.query_builder.functions import Count from frappe.query_builder.functions import Min, Max, Avg, Sum from frappe.query_builder.utils import Column from .query import Query +from pypika.terms import PseudoColumn class Database(object): @@ -521,11 +522,19 @@ class Database(object): return self.get_single_value(*args, **kwargs) def _get_values_from_table(self, fields, filters, doctype, as_dict, debug, order_by=None, update=None, for_update=False): + field_objects = [] + for field in fields: + if "(" in field or " as " in field: + field_objects.append(PseudoColumn(field)) + else: + field_objects.append(field) + criterion = self.query.build_conditions(table=doctype, filters=filters, orderby=order_by, for_update=for_update) + if isinstance(fields, (list, tuple)): - query = self.query.build_conditions(table=doctype, filters=filters, orderby=order_by, for_update=for_update).select(*fields) + query = criterion.select(*field_objects) else: if fields=="*": - query = self.query.build_conditions(table=doctype, filters=filters, orderby=order_by, for_update=for_update).select(fields) + query = criterion.select(fields) as_dict = True r = self.sql(query, as_dict=as_dict, debug=debug, update=update) From f0010439c77796879e1455997974849732176d3b Mon Sep 17 00:00:00 2001 From: Aradhya-Tripathi Date: Tue, 5 Oct 2021 15:54:27 +0530 Subject: [PATCH 2/4] style: formatted code --- frappe/database/database.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/database/database.py b/frappe/database/database.py index 381247ffa2..f07e0c38e3 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -523,11 +523,13 @@ class Database(object): def _get_values_from_table(self, fields, filters, doctype, as_dict, debug, order_by=None, update=None, for_update=False): field_objects = [] + for field in fields: if "(" in field or " as " in field: field_objects.append(PseudoColumn(field)) else: field_objects.append(field) + criterion = self.query.build_conditions(table=doctype, filters=filters, orderby=order_by, for_update=for_update) if isinstance(fields, (list, tuple)): From 4919d1ba627c43c8067a267b2cb042f1795d5616 Mon Sep 17 00:00:00 2001 From: Aradhya-Tripathi Date: Tue, 5 Oct 2021 16:02:51 +0530 Subject: [PATCH 3/4] feat: Added tests for get_value with sql functions --- frappe/tests/test_db.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py index 20f38dc964..2607bf7393 100644 --- a/frappe/tests/test_db.py +++ b/frappe/tests/test_db.py @@ -22,6 +22,8 @@ class TestDB(unittest.TestCase): self.assertNotEqual(frappe.db.get_value("User", {"name": ["!=", "Guest"]}), "Guest") self.assertEqual(frappe.db.get_value("User", {"name": ["<", "Adn"]}), "Administrator") self.assertEqual(frappe.db.get_value("User", {"name": ["<=", "Administrator"]}), "Administrator") + self.assertEqual(frappe.db.get_value("User", {}, ["Max(name)"]), "Guest") + self.assertEqual(frappe.db.get_value("User", {}, "Max(name)"), "Guest") self.assertEqual(frappe.db.sql("""SELECT name FROM `tabUser` WHERE name > 's' ORDER BY MODIFIED DESC""")[0][0], frappe.db.get_value("User", {"name": [">", "s"]})) From 162645d7037ad2029408eff4927b8c2384a2d149 Mon Sep 17 00:00:00 2001 From: Aradhya-Tripathi Date: Tue, 5 Oct 2021 16:23:37 +0530 Subject: [PATCH 4/4] fix: fixed get_value tests --- frappe/tests/test_db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/tests/test_db.py b/frappe/tests/test_db.py index 2607bf7393..0d32a72756 100644 --- a/frappe/tests/test_db.py +++ b/frappe/tests/test_db.py @@ -22,8 +22,8 @@ class TestDB(unittest.TestCase): self.assertNotEqual(frappe.db.get_value("User", {"name": ["!=", "Guest"]}), "Guest") self.assertEqual(frappe.db.get_value("User", {"name": ["<", "Adn"]}), "Administrator") self.assertEqual(frappe.db.get_value("User", {"name": ["<=", "Administrator"]}), "Administrator") - self.assertEqual(frappe.db.get_value("User", {}, ["Max(name)"]), "Guest") - self.assertEqual(frappe.db.get_value("User", {}, "Max(name)"), "Guest") + self.assertEqual(frappe.db.get_value("User", {}, ["Max(name)"]), frappe.db.sql("SELECT Max(name) FROM tabUser")[0][0]) + self.assertEqual(frappe.db.get_value("User", {}, "Min(name)"), frappe.db.sql("SELECT Min(name) FROM tabUser")[0][0]) self.assertEqual(frappe.db.sql("""SELECT name FROM `tabUser` WHERE name > 's' ORDER BY MODIFIED DESC""")[0][0], frappe.db.get_value("User", {"name": [">", "s"]}))