From 368366c73ab5729a2133690f144c37f9a7c0bcde Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 9 Jan 2025 08:29:19 +0530 Subject: [PATCH] feat: support 'quarter' in `get_retention_data` --- .../insights_data_source_v3/ibis/functions.py | 21 +++++++++++++++++++ .../insights_data_source_v3/ibis_utils.py | 8 ++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/insights/insights/doctype/insights_data_source_v3/ibis/functions.py b/insights/insights/doctype/insights_data_source_v3/ibis/functions.py index 0abd7ce7..fbe4b16d 100644 --- a/insights/insights/doctype/insights_data_source_v3/ibis/functions.py +++ b/insights/insights/doctype/insights_data_source_v3/ibis/functions.py @@ -963,6 +963,23 @@ def week_start(column) return week_start +def quarter_start(column: ir.DateValue): + """ + def quarter_start(column) + + Get the start date of the quarter for a given date. + + Examples: + - quarter_start(order_date) + """ + + year = column.year() + quarter = column.quarter() + month = (quarter * 3) - 2 + quarter_start = ibis.date(year, month, 1) + return quarter_start + + def get_retention_data(date_column: ir.DateValue, id_column: ir.Column, unit: str): """ def get_retention_data(date_column, id_column, unit) @@ -983,6 +1000,9 @@ def get_retention_data(date_column, id_column, unit) if isinstance(id_column, str): id_column = getattr(query, id_column) + if date_column.type().is_timestamp(): + date_column = date_column.cast("date") + if not date_column.type().is_date(): frappe.throw(f"Invalid date column. Expected date, got {date_column.type()}") @@ -990,6 +1010,7 @@ def get_retention_data(date_column, id_column, unit) "day": lambda column: column.strftime("%Y-%m-%d").cast("date"), "week": week_start, "month": lambda column: column.strftime("%Y-%m-01").cast("date"), + "quarter": quarter_start, "year": lambda column: column.strftime("%Y-01-01").cast("date"), }[unit] diff --git a/insights/insights/doctype/insights_data_source_v3/ibis_utils.py b/insights/insights/doctype/insights_data_source_v3/ibis_utils.py index a7d78ee1..913bb7c5 100644 --- a/insights/insights/doctype/insights_data_source_v3/ibis_utils.py +++ b/insights/insights/doctype/insights_data_source_v3/ibis_utils.py @@ -24,7 +24,7 @@ from insights.utils import create_execution_log from insights.utils import deep_convert_dict_to_dict as _dict -from .ibis.functions import week_start +from .ibis.functions import quarter_start, week_start from .ibis.utils import get_functions @@ -494,11 +494,7 @@ def apply_granularity(self, column, granularity): if granularity == "week": return week_start(column).strftime("%Y-%m-%d").name(column.get_name()) if granularity == "quarter": - year = column.year() - quarter = column.quarter() - month = (quarter * 3) - 2 - quarter_start = ibis.date(year, month, 1) - return quarter_start.strftime("%Y-%m-%d").name(column.get_name()) + return quarter_start(column).strftime("%Y-%m-01").name(column.get_name()) format_str = { "day": "%Y-%m-%d",