from .interface import AnalyticsModuleInterface from .params import Param, ParamSchema class AttributeSumBySegment(AnalyticsModuleInterface): description = """""" inputs = [ ParamSchema, Param("field_name", list), Param("segment_attribute", str), Param("target_attribute", str), Param("collection_id", required=False), Param("collection_ids", list, required=False), ] outputs = [Param("label", idx=0), Param("value", int, idx=1)] @staticmethod def get_query( # type: ignore schema: str, segment_attribute: str, target_attribute: str, collection_id: str, collection_ids: list, field_name: list = None, **kwargs, ) -> str: result_query = f""" WITH fan_segment AS ( SELECT fa.fan_id, fa.value AS segment FROM {schema}.fan_attribute fa JOIN {schema}.attribute a ON a.id = fa.attribute_id WHERE {f"fa.collection_id IN ({', '.join(map(str, collection_ids))}) AND" if collection_ids else ""} {f"fa.fan_id IN ( SELECT fan_id FROM {schema}.collection_fan WHERE collection_id = %(collection_id)s ) AND" if collection_id else ""} a.name = %(segment_attribute)s ) SELECT fs.segment, SUM(fa.value::numeric) FROM {schema}.fan_attribute fa JOIN {schema}.attribute a ON a.id = fa.attribute_id JOIN fan_segment fs ON fs.fan_id = fa.fan_id WHERE {f"fa.collection_id IN ({', '.join(map(str, collection_ids))}) AND" if collection_ids else ""} {f"fa.fan_id IN ( SELECT fan_id FROM {schema}.collection_fan WHERE collection_id = %(collection_id)s ) AND" if collection_id else ""} a.name = %(target_attribute)s GROUP BY fs.segment ORDER BY 2 DESC; """ return result_query