diff --git a/aw_analysis/query2.py b/aw_analysis/query2.py index 01542fd4..0c1bb186 100644 --- a/aw_analysis/query2.py +++ b/aw_analysis/query2.py @@ -325,8 +325,8 @@ def _parse_token(string: str, namespace: dict): # TODO: Add return type def create_namespace() -> dict: namespace = { - "TRUE": 1, - "FALSE": 0, + "True": True, + "False": False, } return namespace diff --git a/aw_analysis/query2_functions.py b/aw_analysis/query2_functions.py index eec2120b..d8f258d1 100644 --- a/aw_analysis/query2_functions.py +++ b/aw_analysis/query2_functions.py @@ -17,6 +17,7 @@ sort_by_timestamp, sort_by_duration, sum_durations, + concat, split_url_events, simplify_string, flood @@ -215,6 +216,13 @@ def q2_sum_durations(events: list) -> timedelta: return sum_durations(events) +@q2_function +def q2_concat(events1: list, events2: list) -> List[Event]: + _verify_variable_is_type(events1, list) + _verify_variable_is_type(events2, list) + return concat(events1, events2) + + """ Flood functions """ diff --git a/aw_transform/__init__.py b/aw_transform/__init__.py index d7e96d90..40d1e52b 100644 --- a/aw_transform/__init__.py +++ b/aw_transform/__init__.py @@ -3,7 +3,7 @@ from .heartbeats import heartbeat_merge, heartbeat_reduce from .merge_events_by_keys import merge_events_by_keys from .chunk_events_by_key import chunk_events_by_key -from .sort_by import sort_by_timestamp, sort_by_duration, sum_durations +from .sort_by import sort_by_timestamp, sort_by_duration, sum_durations, concat from .split_url_events import split_url_events from .simplify import simplify_string from .flood import flood diff --git a/aw_transform/sort_by.py b/aw_transform/sort_by.py index ebe832ea..7860c07d 100644 --- a/aw_transform/sort_by.py +++ b/aw_transform/sort_by.py @@ -1,7 +1,6 @@ import logging from datetime import datetime, timedelta from typing import List - from aw_core.models import Event logger = logging.getLogger(__name__) @@ -10,11 +9,19 @@ def sort_by_timestamp(events) -> List[Event]: return sorted(events, key=lambda e: e.timestamp) + def sort_by_duration(events) -> List[Event]: return sorted(events, key=lambda e: e.duration, reverse=True) + def limit_events(events, count) -> List[Event]: return events[:count] + def sum_durations(events) -> timedelta: return timedelta(seconds=(sum(event.duration.total_seconds() for event in events))) + + +def concat(events1, events2) -> List[Event]: + events = events1 + events2 + return events