diff --git a/api/chalicelib/core/product_analytics/events.py b/api/chalicelib/core/product_analytics/events.py index 41363e7c6..26f71834c 100644 --- a/api/chalicelib/core/product_analytics/events.py +++ b/api/chalicelib/core/product_analytics/events.py @@ -27,7 +27,7 @@ def get_events(project_id: int, page: schemas.PaginatedSchema): total = rows[0]["total"] for i, row in enumerate(rows): row["id"] = f"event_{i}" - row["icon"] = None + row["dataType"] = "string" row["possibleTypes"] = ["string"] row.pop("total") return {"total": total, "list": helper.list_to_camel_case(rows)} @@ -133,7 +133,7 @@ def get_lexicon(project_id: int, page: schemas.PaginatedSchema): total = rows[0]["total"] for i, row in enumerate(rows): row["id"] = f"event_{i}" - row["icon"] = None + row["dataType"] = "string" row["possibleTypes"] = ["string"] row.pop("total") return {"total": total, "list": helper.list_to_camel_case(rows)} diff --git a/api/chalicelib/core/product_analytics/properties.py b/api/chalicelib/core/product_analytics/properties.py index 704f1794c..635ced5f4 100644 --- a/api/chalicelib/core/product_analytics/properties.py +++ b/api/chalicelib/core/product_analytics/properties.py @@ -52,11 +52,11 @@ def get_all_properties(project_id: int, page: schemas.PaginatedSchema): predefined_properties = get_predefined_property_types() for i, p in enumerate(properties): p["id"] = f"prop_{i}" - p["icon"] = None + p["_foundInPredefinedList"] = False if p["name"] in predefined_properties: - p["possibleTypes"].insert(0, predefined_properties[p["name"]]) - p["possibleTypes"] = list(set(p["possibleTypes"])) - p["possibleTypes"] = exp_ch_helper.simplify_clickhouse_types(p["possibleTypes"]) + p["dataType"] = exp_ch_helper.simplify_clickhouse_type(predefined_properties[p["name"]]) + p["_foundInPredefinedList"] = True + p["possibleTypes"] = list(set(exp_ch_helper.simplify_clickhouse_types(p["possibleTypes"]))) p.pop("total") return {"total": total, "list": properties} @@ -64,18 +64,29 @@ def get_all_properties(project_id: int, page: schemas.PaginatedSchema): def get_event_properties(project_id: int, event_name): with ClickHouseClient() as ch_client: r = ch_client.format( - """SELECT all_properties.property_name, - all_properties.display_name + """SELECT all_properties.property_name AS name, + all_properties.display_name, + array_agg(DISTINCT event_properties.value_type) AS possible_types FROM product_analytics.event_properties INNER JOIN product_analytics.all_properties USING (property_name) WHERE event_properties.project_id=%(project_id)s AND all_properties.project_id=%(project_id)s AND event_properties.event_name=%(event_name)s - ORDER BY created_at;""", + GROUP BY ALL + ORDER BY 1;""", parameters={"project_id": project_id, "event_name": event_name}) properties = ch_client.execute(r) + properties = helper.list_to_camel_case(properties) + predefined_properties = get_predefined_property_types() + for i, p in enumerate(properties): + p["id"] = f"prop_{i}" + p["_foundInPredefinedList"] = False + if p["name"] in predefined_properties: + p["dataType"] = exp_ch_helper.simplify_clickhouse_type(predefined_properties[p["name"]]) + p["_foundInPredefinedList"] = True + p["possibleTypes"] = list(set(exp_ch_helper.simplify_clickhouse_types(p["possibleTypes"]))) - return helper.list_to_camel_case(properties) + return properties def get_lexicon(project_id: int, page: schemas.PaginatedSchema): @@ -108,6 +119,5 @@ def get_lexicon(project_id: int, page: schemas.PaginatedSchema): total = properties[0]["total"] for i, p in enumerate(properties): p["id"] = f"prop_{i}" - p["icon"] = None p.pop("total") return {"total": total, "list": helper.list_to_camel_case(properties)} diff --git a/api/chalicelib/utils/exp_ch_helper.py b/api/chalicelib/utils/exp_ch_helper.py index b2c061533..babef4d57 100644 --- a/api/chalicelib/utils/exp_ch_helper.py +++ b/api/chalicelib/utils/exp_ch_helper.py @@ -99,12 +99,13 @@ def simplify_clickhouse_type(ch_type: str) -> str: return "int" # Floats: Float32, Float64 - if re.match(r'^float(32|64)$', normalized_type): + if re.match(r'^float(32|64)|double$', normalized_type): return "float" # Decimal: Decimal(P, S) if normalized_type.startswith("decimal"): - return "decimal" + # return "decimal" + return "float" # Date/DateTime if normalized_type.startswith("date"): @@ -120,11 +121,13 @@ def simplify_clickhouse_type(ch_type: str) -> str: # UUID if normalized_type.startswith("uuid"): - return "uuid" + # return "uuid" + return "string" # Enums: Enum8(...) or Enum16(...) if normalized_type.startswith("enum8") or normalized_type.startswith("enum16"): - return "enum" + # return "enum" + return "string" # Arrays: Array(T) if normalized_type.startswith("array"):