feat(qb-engine): Added Aggregation function support

* Added Min, Max
* Added tests
This commit is contained in:
Aradhya 2022-06-15 13:06:56 +05:30 committed by Gavin D'souza
parent fca026927e
commit 960952cfc3
7 changed files with 67 additions and 15 deletions

View file

@ -462,7 +462,8 @@ class Query:
fields = updated_fields
if not is_list:
# Need to check instance again since fields modified.
if not isinstance(fields, (list, tuple, set)):
fields = [fields] if fields else []
fields.extend(function_objects)

View file

@ -25,7 +25,7 @@ def run_webhooks(doc, method):
# query webhooks
webhooks_list = frappe.get_all(
"Webhook",
fields=["name", "condition", "webhook_docevent", "webhook_doctype"],
fields=["name", "`condition`", "webhook_docevent", "webhook_doctype"],
filters={"enabled": True},
)

View file

@ -89,9 +89,6 @@ class DatabaseQuery(object):
ignore_ddl=False,
parent_doctype=None,
) -> List:
from frappe.database.query import Query
self.query = Query()
if (
not ignore_permissions
@ -115,8 +112,6 @@ class DatabaseQuery(object):
# if `filters` is a list of strings, its probably fields
filters, fields = fields, filters
self.temp_filters, self.temp_fields = filters, fields
if fields:
self.fields = fields
else:
@ -202,6 +197,7 @@ class DatabaseQuery(object):
%(limit)s"""
% args
)
return frappe.db.sql(
query,
as_dict=not self.as_list,

View file

@ -95,6 +95,8 @@ class SqlFunctions(Enum):
Count = "count"
Sum = "sum"
Avg = "avg"
Max = "max"
Min = "min"
def _max(dt, fieldname, filters=None, **kwargs):

View file

@ -104,12 +104,12 @@ def get_users(doctype, name):
return frappe.db.get_all(
"DocShare",
fields=[
"name",
"user",
"read",
"write",
"submit",
"share",
"`name`",
"`user`",
"`read`",
"`write`",
"`submit`",
"`share`",
"everyone",
"owner",
"creation",

View file

@ -1,11 +1,12 @@
import unittest
import frappe
from frappe.query_builder import Field
from frappe.tests.test_query_builder import db_type_is, run_only_if
@run_only_if(db_type_is.MARIADB)
class TestQuery(unittest.TestCase):
@run_only_if(db_type_is.MARIADB)
def test_multiple_tables_in_filters(self):
self.assertEqual(
frappe.db.query.get_sql(
@ -18,3 +19,55 @@ class TestQuery(unittest.TestCase):
).get_sql(),
"SELECT * FROM `tabDocType` LEFT JOIN `tabBOM Update Log` ON `tabBOM Update Log`.`parent`=`tabDocType`.`name` WHERE `tabBOM Update Log`.`name` LIKE 'f%' AND `tabDocType`.`parent`='something'",
)
def test_string_fields(self):
self.assertEqual(
frappe.db.query.get_sql("User", fields="name, email", filters={"name": "Administrator"}),
frappe.qb.from_("User")
.select(Field("name"), Field("email"))
.where(Field("name") == "Administrator"),
)
self.assertEqual(
frappe.db.query.get_sql("User", fields=["name, email"], filters={"name": "Administrator"}),
frappe.qb.from_("User")
.select(Field("name"), Field("email"))
.where(Field("name") == "Administrator"),
)
def test_functions_fields(self):
from frappe.query_builder.functions import Count
self.assertEqual(
frappe.db.query.get_sql("User", fields="Count(name)", filters={}),
frappe.qb.from_("User").select(Count(Field("name"))),
)
self.assertEqual(
frappe.db.query.get_sql("User", fields="Count(name), Max(name)", filters={}),
frappe.qb.from_("User").select(Count(Field("name")), Max(Field("name"))),
)
self.assertEqual(
frappe.db.query.get_sql("User", fields=["Count(name)", "Max(name)"], filters={}),
frappe.qb.from_("User").select(Count(Field("name")), Max(Field("name"))),
)
self.assertEqual(
frappe.db.query.get_sql("User", fields=[Count("*")], filters={}),
frappe.qb.from_("User").select(Count(Field("name")), Max(Field("name"))),
)
def test_qb_fields(self):
user_doctype = frappe.qb.DocType("User")
self.assertEqual(
frappe.db.query.get_sql(
user_doctype, fields=[user_doctype.name, user_doctype.email], filters={}
),
frappe.qb.from_(user_doctype).select(user_doctype.name, user_doctype.email),
)
self.assertEqual(
frappe.db.query.get_sql(user_doctype, fields=user_doctype.email, filters={}),
frappe.qb.from_(user_doctype).select(user_doctype.email),
)

View file

@ -290,7 +290,7 @@ def update_completed_workflow_actions_using_user(doc, user=None):
def get_next_possible_transitions(workflow_name, state, doc=None):
transitions = frappe.get_all(
"Workflow Transition",
fields=["allowed", "action", "state", "allow_self_approval", "next_state", "condition"],
fields=["allowed", "action", "state", "allow_self_approval", "next_state", "`condition`"],
filters=[["parent", "=", workflow_name], ["state", "=", state]],
)