From 25f0eacaec9f7f792fd49199b7282eff62e832de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Far=C3=ADas=20Santana?= Date: Wed, 4 Dec 2024 16:23:49 +0100 Subject: [PATCH 01/13] refactor: S3 batch export with SPMC abstractions (#26577) --- posthog/settings/temporal.py | 6 + .../batch_exports/bigquery_batch_export.py | 2 +- .../temporal/batch_exports/s3_batch_export.py | 310 +++++++++--------- posthog/temporal/batch_exports/spmc.py | 16 +- posthog/temporal/batch_exports/sql.py | 20 ++ .../test_s3_batch_export_workflow.py | 4 +- 6 files changed, 194 insertions(+), 164 deletions(-) diff --git a/posthog/settings/temporal.py b/posthog/settings/temporal.py index 34450437c6dcd..33daed600cebf 100644 --- a/posthog/settings/temporal.py +++ b/posthog/settings/temporal.py @@ -16,9 +16,15 @@ MAX_CONCURRENT_ACTIVITIES: int | None = get_from_env("MAX_CONCURRENT_ACTIVITIES", None, optional=True, type_cast=int) BATCH_EXPORT_S3_UPLOAD_CHUNK_SIZE_BYTES: int = 1024 * 1024 * 50 # 50MB +BATCH_EXPORT_S3_RECORD_BATCH_QUEUE_MAX_SIZE_BYTES: int = get_from_env( + "BATCH_EXPORT_S3_RECORD_BATCH_QUEUE_MAX_SIZE_BYTES", 0, type_cast=int +) BATCH_EXPORT_SNOWFLAKE_UPLOAD_CHUNK_SIZE_BYTES: int = 1024 * 1024 * 100 # 100MB BATCH_EXPORT_POSTGRES_UPLOAD_CHUNK_SIZE_BYTES: int = 1024 * 1024 * 50 # 50MB BATCH_EXPORT_BIGQUERY_UPLOAD_CHUNK_SIZE_BYTES: int = 1024 * 1024 * 100 # 100MB +BATCH_EXPORT_BIGQUERY_RECORD_BATCH_QUEUE_MAX_SIZE_BYTES: int = get_from_env( + "BATCH_EXPORT_BIGQUERY_RECORD_BATCH_QUEUE_MAX_SIZE_BYTES", 0, type_cast=int +) BATCH_EXPORT_HTTP_UPLOAD_CHUNK_SIZE_BYTES: int = 1024 * 1024 * 50 # 50MB BATCH_EXPORT_HTTP_BATCH_SIZE: int = 5000 BATCH_EXPORT_BUFFER_QUEUE_MAX_SIZE_BYTES: int = 1024 * 1024 * 300 # 300MB diff --git a/posthog/temporal/batch_exports/bigquery_batch_export.py b/posthog/temporal/batch_exports/bigquery_batch_export.py index 3774f983754af..ae5a7f58733c9 100644 --- a/posthog/temporal/batch_exports/bigquery_batch_export.py +++ b/posthog/temporal/batch_exports/bigquery_batch_export.py @@ -454,7 +454,7 @@ async def insert_into_bigquery_activity(inputs: BigQueryInsertInputs) -> Records data_interval_end = dt.datetime.fromisoformat(inputs.data_interval_end) full_range = (data_interval_start, data_interval_end) - queue = RecordBatchQueue() + queue = RecordBatchQueue(max_size_bytes=settings.BATCH_EXPORT_BIGQUERY_RECORD_BATCH_QUEUE_MAX_SIZE_BYTES) producer = Producer(clickhouse_client=client) producer_task = producer.start( queue=queue, diff --git a/posthog/temporal/batch_exports/s3_batch_export.py b/posthog/temporal/batch_exports/s3_batch_export.py index 41383c8e17114..62071fa866363 100644 --- a/posthog/temporal/batch_exports/s3_batch_export.py +++ b/posthog/temporal/batch_exports/s3_batch_export.py @@ -1,4 +1,5 @@ import asyncio +import collections.abc import contextlib import dataclasses import datetime as dt @@ -6,7 +7,6 @@ import json import posixpath import typing -import collections.abc import aioboto3 import botocore.exceptions @@ -30,36 +30,62 @@ default_fields, execute_batch_export_insert_activity, get_data_interval, - iter_model_records, start_batch_export_run, wait_for_delta_past_data_interval_end, ) -from posthog.temporal.batch_exports.metrics import ( - get_bytes_exported_metric, - get_rows_exported_metric, +from posthog.temporal.batch_exports.heartbeat import ( + BatchExportRangeHeartbeatDetails, + DateRange, + HeartbeatParseError, + should_resume_from_activity_heartbeat, +) +from posthog.temporal.batch_exports.spmc import ( + Consumer, + Producer, + RecordBatchQueue, + run_consumer_loop, + wait_for_schema_or_producer, ) from posthog.temporal.batch_exports.temporary_file import ( BatchExportTemporaryFile, - BatchExportWriter, - FlushCallable, - JSONLBatchExportWriter, - ParquetBatchExportWriter, - UnsupportedFileFormatError, + WriterFormat, ) from posthog.temporal.batch_exports.utils import ( - apeek_first_and_rewind, - cast_record_batch_json_columns, set_status_to_running_task, ) from posthog.temporal.common.clickhouse import get_client from posthog.temporal.common.heartbeat import Heartbeater from posthog.temporal.common.logger import bind_temporal_worker_logger -from posthog.temporal.batch_exports.heartbeat import ( - BatchExportRangeHeartbeatDetails, - DateRange, - HeartbeatParseError, - should_resume_from_activity_heartbeat, -) + +NON_RETRYABLE_ERROR_TYPES = [ + # S3 parameter validation failed. + "ParamValidationError", + # This error usually indicates credentials are incorrect or permissions are missing. + "ClientError", + # An S3 bucket doesn't exist. + "NoSuchBucket", + # Couldn't connect to custom S3 endpoint + "EndpointConnectionError", + # Input contained an empty S3 endpoint URL + "EmptyS3EndpointURLError", + # User provided an invalid S3 key + "InvalidS3Key", + # All consumers failed with non-retryable errors. + "RecordBatchConsumerNonRetryableExceptionGroup", +] + +FILE_FORMAT_EXTENSIONS = { + "Parquet": "parquet", + "JSONLines": "jsonl", +} + +COMPRESSION_EXTENSIONS = { + "gzip": "gz", + "snappy": "sz", + "brotli": "br", + "ztsd": "zst", + "lz4": "lz4", +} def get_allowed_template_variables(inputs) -> dict[str, str]: @@ -78,20 +104,6 @@ def get_allowed_template_variables(inputs) -> dict[str, str]: } -FILE_FORMAT_EXTENSIONS = { - "Parquet": "parquet", - "JSONLines": "jsonl", -} - -COMPRESSION_EXTENSIONS = { - "gzip": "gz", - "snappy": "sz", - "brotli": "br", - "ztsd": "zst", - "lz4": "lz4", -} - - def get_s3_key(inputs) -> str: """Return an S3 key given S3InsertInputs.""" template_variables = get_allowed_template_variables(inputs) @@ -199,6 +211,7 @@ def __init__( self.kms_key_id = kms_key_id self.upload_id: str | None = None self.parts: list[Part] = [] + self.pending_parts: list[Part] = [] if self.endpoint_url == "": raise EmptyS3EndpointURLError() @@ -214,7 +227,7 @@ def to_state(self) -> S3MultiPartUploadState: @property def part_number(self): """Return the current part number.""" - return len(self.parts) + return len(self.parts) + len(self.pending_parts) def is_upload_in_progress(self) -> bool: """Whether this S3MultiPartUpload is in progress or not.""" @@ -311,6 +324,8 @@ async def upload_part( ): """Upload a part of this multi-part upload.""" next_part_number = self.part_number + 1 + part = {"PartNumber": next_part_number, "ETag": ""} + self.pending_parts.append(part) if rewind is True: body.rewind() @@ -335,7 +350,9 @@ async def upload_part( finally: reader.detach() # BufferedReader closes the file otherwise. - self.parts.append({"PartNumber": next_part_number, "ETag": etag}) + self.pending_parts.pop(self.pending_parts.index(part)) + part["ETag"] = etag + self.parts.append(part) async def upload_part_retryable( self, @@ -441,6 +458,52 @@ def append_upload_state(self, upload_state: S3MultiPartUploadState): self.upload_state.parts.append(part) +class S3Consumer(Consumer): + def __init__( + self, + heartbeater: Heartbeater, + heartbeat_details: S3HeartbeatDetails, + data_interval_start: dt.datetime | str | None, + s3_upload: S3MultiPartUpload, + ): + super().__init__(heartbeater, heartbeat_details, data_interval_start) + self.heartbeat_details: S3HeartbeatDetails = heartbeat_details + self.s3_upload = s3_upload + + async def flush( + self, + batch_export_file: BatchExportTemporaryFile, + records_since_last_flush: int, + bytes_since_last_flush: int, + flush_counter: int, + last_date_range: DateRange, + is_last: bool, + error: Exception | None, + ): + if error is not None: + await self.logger.adebug("Error while writing part %d", self.s3_upload.part_number + 1, exc_info=error) + await self.logger.awarning( + "An error was detected while writing part %d. Partial part will not be uploaded in case it can be retried.", + self.s3_upload.part_number + 1, + ) + return + + await self.logger.adebug( + "Uploading part %s containing %s records with size %s bytes", + self.s3_upload.part_number + 1, + records_since_last_flush, + bytes_since_last_flush, + ) + + await self.s3_upload.upload_part(batch_export_file) + + self.rows_exported_counter.add(records_since_last_flush) + self.bytes_exported_counter.add(bytes_since_last_flush) + + self.heartbeat_details.track_done_range(last_date_range, self.data_interval_start) + self.heartbeat_details.append_upload_state(self.s3_upload.to_state()) + + @dataclasses.dataclass class S3InsertInputs: """Inputs for S3 exports.""" @@ -576,143 +639,85 @@ async def insert_into_s3_activity(inputs: S3InsertInputs) -> RecordsCompleted: raise ConnectionError("Cannot establish connection to ClickHouse") s3_upload, details = await initialize_and_resume_multipart_upload(inputs) - - # TODO: Switch to single-producer multiple consumer done_ranges: list[DateRange] = details.done_ranges - if done_ranges: - data_interval_start: str | None = done_ranges[-1][1].isoformat() - else: - data_interval_start = inputs.data_interval_start model: BatchExportModel | BatchExportSchema | None = None if inputs.batch_export_schema is None and "batch_export_model" in { field.name for field in dataclasses.fields(inputs) }: model = inputs.batch_export_model + if model is not None: + model_name = model.name + extra_query_parameters = model.schema["values"] if model.schema is not None else None + fields = model.schema["fields"] if model.schema is not None else None + else: + model_name = "events" + extra_query_parameters = None + fields = None else: model = inputs.batch_export_schema + model_name = "custom" + extra_query_parameters = model["values"] if model is not None else {} + fields = model["fields"] if model is not None else None - record_iterator = iter_model_records( - model=model, - client=client, + data_interval_start = ( + dt.datetime.fromisoformat(inputs.data_interval_start) if inputs.data_interval_start else None + ) + data_interval_end = dt.datetime.fromisoformat(inputs.data_interval_end) + full_range = (data_interval_start, data_interval_end) + + queue = RecordBatchQueue(max_size_bytes=settings.BATCH_EXPORT_S3_RECORD_BATCH_QUEUE_MAX_SIZE_BYTES) + producer = Producer(clickhouse_client=client) + producer_task = producer.start( + queue=queue, + model_name=model_name, + is_backfill=inputs.is_backfill, team_id=inputs.team_id, - interval_start=data_interval_start, - interval_end=inputs.data_interval_end, + full_range=full_range, + done_ranges=done_ranges, + fields=fields, + destination_default_fields=s3_default_fields(), exclude_events=inputs.exclude_events, include_events=inputs.include_events, - is_backfill=inputs.is_backfill, - destination_default_fields=s3_default_fields(), + extra_query_parameters=extra_query_parameters, ) - - first_record_batch, record_iterator = await apeek_first_and_rewind(record_iterator) - records_completed = 0 - if first_record_batch is None: - return records_completed - async with s3_upload as s3_upload: + record_batch_schema = await wait_for_schema_or_producer(queue, producer_task) + if record_batch_schema is None: + return records_completed - async def flush_to_s3( - local_results_file, - records_since_last_flush: int, - bytes_since_last_flush: int, - flush_counter: int, - last_date_range: DateRange, - last: bool, - error: Exception | None, - ): - if error is not None: - await logger.adebug("Error while writing part %d", s3_upload.part_number + 1, exc_info=error) - await logger.awarning( - "An error was detected while writing part %d. Partial part will not be uploaded in case it can be retried.", - s3_upload.part_number + 1, - ) - return - - await logger.adebug( - "Uploading %s part %s containing %s records with size %s bytes", - "last " if last else "", - s3_upload.part_number + 1, - records_since_last_flush, - bytes_since_last_flush, - ) - - await s3_upload.upload_part(local_results_file) - - rows_exported.add(records_since_last_flush) - bytes_exported.add(bytes_since_last_flush) - - details.track_done_range(last_date_range, data_interval_start) - details.append_upload_state(s3_upload.to_state()) - heartbeater.set_from_heartbeat_details(details) - - first_record_batch = cast_record_batch_json_columns(first_record_batch) - column_names = first_record_batch.column_names - column_names.pop(column_names.index("_inserted_at")) - - schema = pa.schema( - # NOTE: For some reason, some batches set non-nullable fields as non-nullable, whereas other - # record batches have them as nullable. - # Until we figure it out, we set all fields to nullable. There are some fields we know - # are not nullable, but I'm opting for the more flexible option until we out why schemas differ - # between batches. - [field.with_nullable(True) for field in first_record_batch.select(column_names).schema] - ) + record_batch_schema = pa.schema( + # NOTE: For some reason, some batches set non-nullable fields as non-nullable, whereas other + # record batches have them as nullable. + # Until we figure it out, we set all fields to nullable. There are some fields we know + # are not nullable, but I'm opting for the more flexible option until we out why schemas differ + # between batches. + [field.with_nullable(True) for field in record_batch_schema if field.name != "_inserted_at"] + ) - writer = get_batch_export_writer( - inputs, - flush_callable=flush_to_s3, + async with s3_upload as s3_upload: + records_completed = await run_consumer_loop( + queue=queue, + consumer_cls=S3Consumer, + producer_task=producer_task, + heartbeater=heartbeater, + heartbeat_details=details, + data_interval_end=data_interval_end, + data_interval_start=data_interval_start, + schema=record_batch_schema, + writer_format=WriterFormat.from_str(inputs.file_format, "S3"), max_bytes=settings.BATCH_EXPORT_S3_UPLOAD_CHUNK_SIZE_BYTES, - schema=schema, + s3_upload=s3_upload, + writer_file_kwargs={"compression": inputs.compression}, + non_retryable_error_types=NON_RETRYABLE_ERROR_TYPES, ) - async with writer.open_temporary_file(): - rows_exported = get_rows_exported_metric() - bytes_exported = get_bytes_exported_metric() - - async for record_batch in record_iterator: - record_batch = cast_record_batch_json_columns(record_batch) - - await writer.write_record_batch(record_batch) - - details.complete_done_ranges(inputs.data_interval_end) - heartbeater.set_from_heartbeat_details(details) - - records_completed = writer.records_total await s3_upload.complete() return records_completed -def get_batch_export_writer( - inputs: S3InsertInputs, flush_callable: FlushCallable, max_bytes: int, schema: pa.Schema | None = None -) -> BatchExportWriter: - """Return the `BatchExportWriter` corresponding to configured `file_format`. - - Raises: - UnsupportedFileFormatError: If no writer exists for given `file_format`. - """ - writer: BatchExportWriter - - if inputs.file_format == "Parquet": - writer = ParquetBatchExportWriter( - max_bytes=max_bytes, - flush_callable=flush_callable, - compression=inputs.compression, - schema=schema, - ) - elif inputs.file_format == "JSONLines": - writer = JSONLBatchExportWriter( - max_bytes=max_bytes, - flush_callable=flush_callable, - compression=inputs.compression, - ) - else: - raise UnsupportedFileFormatError(inputs.file_format, "S3") - - return writer - - @workflow.defn(name="s3-export", failure_exception_types=[workflow.NondeterminismError]) class S3BatchExportWorkflow(PostHogWorkflow): """A Temporal Workflow to export ClickHouse data into S3. @@ -789,19 +794,6 @@ async def run(self, inputs: S3BatchExportInputs): insert_into_s3_activity, insert_inputs, interval=inputs.interval, - non_retryable_error_types=[ - # S3 parameter validation failed. - "ParamValidationError", - # This error usually indicates credentials are incorrect or permissions are missing. - "ClientError", - # An S3 bucket doesn't exist. - "NoSuchBucket", - # Couldn't connect to custom S3 endpoint - "EndpointConnectionError", - # Input contained an empty S3 endpoint URL - "EmptyS3EndpointURLError", - # User provided an invalid S3 key - "InvalidS3Key", - ], + non_retryable_error_types=NON_RETRYABLE_ERROR_TYPES, finish_inputs=finish_inputs, ) diff --git a/posthog/temporal/batch_exports/spmc.py b/posthog/temporal/batch_exports/spmc.py index 23a1737f24de6..34a503646a3e4 100644 --- a/posthog/temporal/batch_exports/spmc.py +++ b/posthog/temporal/batch_exports/spmc.py @@ -16,6 +16,7 @@ from posthog.temporal.batch_exports.sql import ( SELECT_FROM_EVENTS_VIEW, SELECT_FROM_EVENTS_VIEW_BACKFILL, + SELECT_FROM_EVENTS_VIEW_RECENT, SELECT_FROM_EVENTS_VIEW_UNBOUNDED, SELECT_FROM_PERSONS_VIEW, SELECT_FROM_PERSONS_VIEW_BACKFILL, @@ -362,6 +363,8 @@ def consumer_done_callback(task: asyncio.Task): consumer_number += 1 while not consumer.flush_start_event.is_set() and not consumer_task.done(): + # Block until we either start flushing or we are done consuming. + # Flush start should always happen first unless the consumer task fails. await asyncio.sleep(0) if consumer_task.done(): @@ -472,7 +475,7 @@ def start( done_ranges: list[tuple[dt.datetime, dt.datetime]], fields: list[BatchExportField] | None = None, destination_default_fields: list[BatchExportField] | None = None, - use_latest_schema: bool = True, + use_latest_schema: bool = False, **parameters, ) -> asyncio.Task: if fields is None: @@ -503,7 +506,16 @@ def start( else: parameters["include_events"] = [] - if str(team_id) in settings.UNCONSTRAINED_TIMESTAMP_TEAM_IDS: + start_at, end_at = full_range + + if start_at: + is_5_min_batch_export = (end_at - start_at) == dt.timedelta(seconds=300) + else: + is_5_min_batch_export = False + + if is_5_min_batch_export and not is_backfill: + query_template = SELECT_FROM_EVENTS_VIEW_RECENT + elif str(team_id) in settings.UNCONSTRAINED_TIMESTAMP_TEAM_IDS: query_template = SELECT_FROM_EVENTS_VIEW_UNBOUNDED elif is_backfill: query_template = SELECT_FROM_EVENTS_VIEW_BACKFILL diff --git a/posthog/temporal/batch_exports/sql.py b/posthog/temporal/batch_exports/sql.py index 921cb8f437287..7cb3922268ead 100644 --- a/posthog/temporal/batch_exports/sql.py +++ b/posthog/temporal/batch_exports/sql.py @@ -114,6 +114,26 @@ """ ) +SELECT_FROM_EVENTS_VIEW_RECENT = Template( + """ +SELECT + $fields +FROM + events_batch_export_recent( + team_id={team_id}, + interval_start={interval_start}, + interval_end={interval_end}, + include_events={include_events}::Array(String), + exclude_events={exclude_events}::Array(String) + ) AS events +FORMAT ArrowStream +SETTINGS + -- This is half of configured MAX_MEMORY_USAGE for batch exports. + max_bytes_before_external_sort=50000000000, + max_replica_delay_for_distributed_queries=1 +""" +) + SELECT_FROM_EVENTS_VIEW_UNBOUNDED = Template( """ SELECT diff --git a/posthog/temporal/tests/batch_exports/test_s3_batch_export_workflow.py b/posthog/temporal/tests/batch_exports/test_s3_batch_export_workflow.py index d5d8d26b40373..979869c4b31d7 100644 --- a/posthog/temporal/tests/batch_exports/test_s3_batch_export_workflow.py +++ b/posthog/temporal/tests/batch_exports/test_s3_batch_export_workflow.py @@ -28,10 +28,10 @@ ) from posthog.temporal.batch_exports.s3_batch_export import ( FILE_FORMAT_EXTENSIONS, - S3HeartbeatDetails, IntermittentUploadPartTimeoutError, S3BatchExportInputs, S3BatchExportWorkflow, + S3HeartbeatDetails, S3InsertInputs, S3MultiPartUpload, get_s3_key, @@ -1589,7 +1589,7 @@ def __init__(self, *args, **kwargs): assert run.records_completed is None assert ( run.latest_error - == "IntermittentUploadPartTimeoutError: An intermittent `RequestTimeout` was raised while attempting to upload part 1" + == "RecordBatchConsumerRetryableExceptionGroup: At least one unhandled retryable errors in a RecordBatch consumer TaskGroup (1 sub-exception)" ) run = runs[1] From b4ccec2db655e317dad9e2024c3ea8a65529090f Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 4 Dec 2024 16:43:11 +0100 Subject: [PATCH 02/13] fix: squash a flakey snapshot (#26643) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../api/test/__snapshots__/test_action.ambr | 12 +-- .../test/__snapshots__/test_annotation.ambr | 12 +-- .../api/test/__snapshots__/test_decide.ambr | 4 +- .../api/test/__snapshots__/test_element.ambr | 4 +- .../test/__snapshots__/test_feature_flag.ambr | 8 +- .../api/test/__snapshots__/test_insight.ambr | 8 +- .../__snapshots__/test_dashboard.ambr | 100 +++++++++--------- .../__snapshots__/test_notebook.ambr | 12 +-- .../test_session_recordings.ambr | 48 ++++----- posthog/test/base.py | 9 ++ 10 files changed, 113 insertions(+), 104 deletions(-) diff --git a/posthog/api/test/__snapshots__/test_action.ambr b/posthog/api/test/__snapshots__/test_action.ambr index 2b453c3a24b20..8ac1823a033c1 100644 --- a/posthog/api/test/__snapshots__/test_action.ambr +++ b/posthog/api/test/__snapshots__/test_action.ambr @@ -156,12 +156,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '99' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '99' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -471,12 +471,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '99' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '99' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -667,12 +667,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '99' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '99' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/api/test/__snapshots__/test_annotation.ambr b/posthog/api/test/__snapshots__/test_annotation.ambr index 457607fc74fc8..9340e03a2a4d8 100644 --- a/posthog/api/test/__snapshots__/test_annotation.ambr +++ b/posthog/api/test/__snapshots__/test_annotation.ambr @@ -144,12 +144,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '107' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '107' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -454,12 +454,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '107' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '107' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -669,12 +669,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '107' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '107' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/api/test/__snapshots__/test_decide.ambr b/posthog/api/test/__snapshots__/test_decide.ambr index beb108518df40..a1f1ebcced5c8 100644 --- a/posthog/api/test/__snapshots__/test_decide.ambr +++ b/posthog/api/test/__snapshots__/test_decide.ambr @@ -754,12 +754,12 @@ INNER JOIN "posthog_team" ON ("ee_accesscontrol"."team_id" = "posthog_team"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '253' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '253' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/api/test/__snapshots__/test_element.ambr b/posthog/api/test/__snapshots__/test_element.ambr index 414a8a1831062..e3ce7d60cebca 100644 --- a/posthog/api/test/__snapshots__/test_element.ambr +++ b/posthog/api/test/__snapshots__/test_element.ambr @@ -151,12 +151,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '272' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '272' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/api/test/__snapshots__/test_feature_flag.ambr b/posthog/api/test/__snapshots__/test_feature_flag.ambr index 93dfa76ea2cdb..b51af7a796f7d 100644 --- a/posthog/api/test/__snapshots__/test_feature_flag.ambr +++ b/posthog/api/test/__snapshots__/test_feature_flag.ambr @@ -2001,12 +2001,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '313' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '313' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -2021,12 +2021,12 @@ AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'feature_flag' - AND "ee_accesscontrol"."resource_id" = '130' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'feature_flag' - AND "ee_accesscontrol"."resource_id" = '130' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999)) ''' diff --git a/posthog/api/test/__snapshots__/test_insight.ambr b/posthog/api/test/__snapshots__/test_insight.ambr index cea3c1e49dcab..01390b5f4b341 100644 --- a/posthog/api/test/__snapshots__/test_insight.ambr +++ b/posthog/api/test/__snapshots__/test_insight.ambr @@ -1380,12 +1380,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '447' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '447' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -1493,12 +1493,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '447' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '447' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/api/test/dashboards/__snapshots__/test_dashboard.ambr b/posthog/api/test/dashboards/__snapshots__/test_dashboard.ambr index 7d964fa88087f..dfd916657a89b 100644 --- a/posthog/api/test/dashboards/__snapshots__/test_dashboard.ambr +++ b/posthog/api/test/dashboards/__snapshots__/test_dashboard.ambr @@ -332,12 +332,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -352,12 +352,12 @@ AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '1' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '1' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999)) ''' @@ -1057,12 +1057,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -2298,12 +2298,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -2402,12 +2402,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -2530,52 +2530,52 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '55' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '55' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '56' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '56' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '57' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '57' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '58' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '58' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '59' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '59' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999)) ''' @@ -3459,12 +3459,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -4634,12 +4634,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -4654,12 +4654,12 @@ AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '60' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '60' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999)) ''' @@ -5590,12 +5590,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -6140,12 +6140,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -6220,12 +6220,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -7580,12 +7580,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -8592,12 +8592,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -9328,12 +9328,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -9348,12 +9348,12 @@ AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '67' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '67' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999)) ''' @@ -10348,12 +10348,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -10898,12 +10898,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -10978,12 +10978,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '76' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -11186,22 +11186,22 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '69' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '69' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '70' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'dashboard' - AND "ee_accesscontrol"."resource_id" = '70' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999)) ''' diff --git a/posthog/api/test/notebooks/__snapshots__/test_notebook.ambr b/posthog/api/test/notebooks/__snapshots__/test_notebook.ambr index 6527545701a76..f585776717839 100644 --- a/posthog/api/test/notebooks/__snapshots__/test_notebook.ambr +++ b/posthog/api/test/notebooks/__snapshots__/test_notebook.ambr @@ -110,12 +110,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '83' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '83' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -552,12 +552,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '83' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '83' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -719,12 +719,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '83' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '83' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/session_recordings/test/__snapshots__/test_session_recordings.ambr b/posthog/session_recordings/test/__snapshots__/test_session_recordings.ambr index c893026d31baf..88a534a569646 100644 --- a/posthog/session_recordings/test/__snapshots__/test_session_recordings.ambr +++ b/posthog/session_recordings/test/__snapshots__/test_session_recordings.ambr @@ -640,12 +640,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '444' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '444' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -1690,12 +1690,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -2445,12 +2445,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -3136,12 +3136,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -3890,12 +3890,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -4608,12 +4608,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -5408,12 +5408,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -5673,12 +5673,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -6107,12 +6107,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -6573,12 +6573,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -7267,12 +7267,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL @@ -8018,12 +8018,12 @@ LEFT OUTER JOIN "posthog_organizationmembership" ON ("ee_accesscontrol"."organization_member_id" = "posthog_organizationmembership"."id") WHERE (("ee_accesscontrol"."organization_member_id" IS NULL AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("posthog_organizationmembership"."user_id" = 99999 AND "ee_accesscontrol"."resource" = 'project' - AND "ee_accesscontrol"."resource_id" = '451' + AND "ee_accesscontrol"."resource_id" = '99999' AND "ee_accesscontrol"."role_id" IS NULL AND "ee_accesscontrol"."team_id" = 99999) OR ("ee_accesscontrol"."organization_member_id" IS NULL diff --git a/posthog/test/base.py b/posthog/test/base.py index c3ff194e0c146..43dcc0e130964 100644 --- a/posthog/test/base.py +++ b/posthog/test/base.py @@ -263,6 +263,15 @@ def clean_varying_query_parts(query, replace_all_numbers): "SELECT distinct_id, 1 as value", query, ) + + # rbac has some varying IDs we can replace + # e.g. AND "ee_accesscontrol"."resource_id" = '450' + query = re.sub( + r"\"resource_id\" = '\d+'", + "\"resource_id\" = '99999'", + query, + ) + return query From f94c2378c58be44362dfedf69be5d7f0f7596a85 Mon Sep 17 00:00:00 2001 From: Robbie Date: Wed, 4 Dec 2024 15:47:44 +0000 Subject: [PATCH 03/13] fix(web-analytics): Don't share web analytics state across teams (#26640) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../web-analytics/webAnalyticsLogic.tsx | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/frontend/src/scenes/web-analytics/webAnalyticsLogic.tsx b/frontend/src/scenes/web-analytics/webAnalyticsLogic.tsx index 207f8f99f0247..d5d93400466d3 100644 --- a/frontend/src/scenes/web-analytics/webAnalyticsLogic.tsx +++ b/frontend/src/scenes/web-analytics/webAnalyticsLogic.tsx @@ -216,6 +216,9 @@ const getDashboardItemId = (section: TileId, tab: string | undefined, isModal?: // pretend to be a new-AdHoc to get the correct behaviour elsewhere return `new-AdHoc.web-analytics.${section}.${tab || 'default'}.${isModal ? 'modal' : 'default'}` } + +const teamId = window.POSTHOG_APP_CONTEXT?.current_team?.id +const persistConfig = { persist: true, prefix: `${teamId}__` } export const webAnalyticsLogic = kea([ path(['scenes', 'webAnalytics', 'webAnalyticsSceneLogic']), connect(() => ({ @@ -280,7 +283,7 @@ export const webAnalyticsLogic = kea([ reducers({ webAnalyticsFilters: [ initialWebAnalyticsFilter, - { persist: true }, + persistConfig, { setWebAnalyticsFilters: (_, { webAnalyticsFilters }) => webAnalyticsFilters, togglePropertyFilter: (oldPropertyFilters, { key, value, type }): WebAnalyticsPropertyFilters => { @@ -352,7 +355,7 @@ export const webAnalyticsLogic = kea([ ], _graphsTab: [ null as string | null, - { persist: true }, + persistConfig, { setGraphsTab: (_, { tab }) => tab, togglePropertyFilter: (oldTab, { tabChange }) => tabChange?.graphsTab || oldTab, @@ -360,7 +363,7 @@ export const webAnalyticsLogic = kea([ ], _sourceTab: [ null as string | null, - { persist: true }, + persistConfig, { setSourceTab: (_, { tab }) => tab, togglePropertyFilter: (oldTab, { tabChange }) => tabChange?.sourceTab || oldTab, @@ -368,7 +371,7 @@ export const webAnalyticsLogic = kea([ ], _deviceTab: [ null as string | null, - { persist: true }, + persistConfig, { setDeviceTab: (_, { tab }) => tab, togglePropertyFilter: (oldTab, { tabChange }) => tabChange?.deviceTab || oldTab, @@ -376,7 +379,7 @@ export const webAnalyticsLogic = kea([ ], _pathTab: [ null as string | null, - { persist: true }, + persistConfig, { setPathTab: (_, { tab }) => tab, togglePropertyFilter: (oldTab, { tabChange }) => tabChange?.pathTab || oldTab, @@ -384,7 +387,7 @@ export const webAnalyticsLogic = kea([ ], _geographyTab: [ null as string | null, - { persist: true }, + persistConfig, { setGeographyTab: (_, { tab }) => tab, togglePropertyFilter: (oldTab, { tabChange }) => tabChange?.geographyTab || oldTab, @@ -392,7 +395,7 @@ export const webAnalyticsLogic = kea([ ], isPathCleaningEnabled: [ null as boolean | null, - { persist: true }, + persistConfig, { setIsPathCleaningEnabled: (_, { isPathCleaningEnabled }) => isPathCleaningEnabled, }, @@ -413,7 +416,7 @@ export const webAnalyticsLogic = kea([ dateTo: initialDateTo, interval: initialInterval, }, - { persist: true }, + persistConfig, { setDates: (_, { dateTo, dateFrom }) => ({ dateTo, @@ -443,21 +446,21 @@ export const webAnalyticsLogic = kea([ ], shouldFilterTestAccounts: [ false as boolean, - { persist: true }, + persistConfig, { setShouldFilterTestAccounts: (_, { shouldFilterTestAccounts }) => shouldFilterTestAccounts, }, ], shouldStripQueryParams: [ false as boolean, - { persist: true }, + persistConfig, { setShouldStripQueryParams: (_, { shouldStripQueryParams }) => shouldStripQueryParams, }, ], conversionGoal: [ null as WebAnalyticsConversionGoal | null, - { persist: true }, + persistConfig, { setConversionGoal: (_, { conversionGoal }) => conversionGoal, }, From f0d9c4971d2da7e717de369a308585b882655429 Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Wed, 4 Dec 2024 17:01:39 +0100 Subject: [PATCH 04/13] fix(data-warehouse): Use distinct_id field if present (#26635) --- .../DefinitionPopover/definitionPopoverLogic.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/DefinitionPopover/definitionPopoverLogic.ts b/frontend/src/lib/components/DefinitionPopover/definitionPopoverLogic.ts index 9781c1e8e2bbd..c85c57d67a883 100644 --- a/frontend/src/lib/components/DefinitionPopover/definitionPopoverLogic.ts +++ b/frontend/src/lib/components/DefinitionPopover/definitionPopoverLogic.ts @@ -134,9 +134,11 @@ export const definitionPopoverLogic = kea([ } if (!('distinct_id_field' in item)) { - const idField = Object.values(warehouseItem.fields).find((n) => n.name === 'id') - if (idField) { - warehouseItem['distinct_id_field'] = idField.name + const distinctIdField = + Object.values(warehouseItem.fields).find((n) => n.name === 'distinct_id') ?? + Object.values(warehouseItem.fields).find((n) => n.name === 'id') + if (distinctIdField) { + warehouseItem['distinct_id_field'] = distinctIdField.name } } From f79cb71d32872c7353e02df600bcc514b5dfc203 Mon Sep 17 00:00:00 2001 From: Surbhi Date: Wed, 4 Dec 2024 12:24:44 -0400 Subject: [PATCH 05/13] feat: delete capture events in reverse proxy (#26625) --- posthog/api/proxy_record.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/posthog/api/proxy_record.py b/posthog/api/proxy_record.py index 8c8f9d488f07b..552835aa9562f 100644 --- a/posthog/api/proxy_record.py +++ b/posthog/api/proxy_record.py @@ -25,6 +25,20 @@ def generate_target_cname(organization_id, domain) -> str: return f"{digest}.{settings.PROXY_BASE_CNAME}" +def _capture_proxy_event(request, record: ProxyRecord, event_type: str) -> None: + organization = Organization.objects.get(id=record.organization_id) + posthoganalytics.capture( + request.user.distinct_id, + f"managed reverse proxy {event_type}", + properties={ + "proxy_record_id": record.id, + "domain": record.domain, + "target_cname": record.target_cname, + }, + groups=groups(organization), + ) + + class ProxyRecordSerializer(serializers.ModelSerializer): class Meta: model = ProxyRecord @@ -79,17 +93,7 @@ def create(self, request, *args, **kwargs): ) serializer = self.get_serializer(record) - organization = Organization.objects.get(id=record.organization_id) - posthoganalytics.capture( - request.user.distinct_id, - "managed reverse proxy created", - properties={ - "proxy_record_id": record.id, - "domain": record.domain, - "target_cname": record.target_cname, - }, - groups=groups(organization), - ) + _capture_proxy_event(request, record, "created") return Response(serializer.data) def destroy(self, request, *args, pk=None, **kwargs): @@ -120,6 +124,8 @@ def destroy(self, request, *args, pk=None, **kwargs): record.status = ProxyRecord.Status.DELETING record.save() + _capture_proxy_event(request, record, "deleted") + return Response( {"success": True}, status=status.HTTP_200_OK, From 8eef6954be154dc71c5894752205137c5383ed9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Far=C3=ADas=20Santana?= Date: Wed, 4 Dec 2024 17:31:23 +0100 Subject: [PATCH 06/13] fix: Complete S3 batch export with parts in sorted order (#26645) --- .../temporal/batch_exports/redshift_batch_export.py | 12 +++++++----- posthog/temporal/batch_exports/s3_batch_export.py | 4 +++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/posthog/temporal/batch_exports/redshift_batch_export.py b/posthog/temporal/batch_exports/redshift_batch_export.py index d9d634d78858c..3b02efddb5a0b 100644 --- a/posthog/temporal/batch_exports/redshift_batch_export.py +++ b/posthog/temporal/batch_exports/redshift_batch_export.py @@ -32,6 +32,11 @@ start_batch_export_run, start_produce_batch_export_record_batches, ) +from posthog.temporal.batch_exports.heartbeat import ( + BatchExportRangeHeartbeatDetails, + DateRange, + should_resume_from_activity_heartbeat, +) from posthog.temporal.batch_exports.metrics import get_rows_exported_metric from posthog.temporal.batch_exports.postgres_batch_export import ( Fields, @@ -47,11 +52,6 @@ from posthog.temporal.common.clickhouse import get_client from posthog.temporal.common.heartbeat import Heartbeater from posthog.temporal.common.logger import configure_temporal_worker_logger -from posthog.temporal.batch_exports.heartbeat import ( - BatchExportRangeHeartbeatDetails, - DateRange, - should_resume_from_activity_heartbeat, -) def remove_escaped_whitespace_recursive(value): @@ -715,6 +715,8 @@ async def run(self, inputs: RedshiftBatchExportInputs): "StringDataRightTruncation", # Raised by our PostgreSQL client when failing to connect after several attempts. "PostgreSQLConnectionError", + # Column missing in Redshift, likely the schema was altered. + "UndefinedColumn", ], finish_inputs=finish_inputs, ) diff --git a/posthog/temporal/batch_exports/s3_batch_export.py b/posthog/temporal/batch_exports/s3_batch_export.py index 62071fa866363..7201af91d2b5a 100644 --- a/posthog/temporal/batch_exports/s3_batch_export.py +++ b/posthog/temporal/batch_exports/s3_batch_export.py @@ -5,6 +5,7 @@ import datetime as dt import io import json +import operator import posixpath import typing @@ -285,12 +286,13 @@ async def complete(self) -> str: if self.is_upload_in_progress() is False: raise NoUploadInProgressError() + sorted_parts = sorted(self.parts, key=operator.itemgetter("PartNumber")) async with self.s3_client() as s3_client: response = await s3_client.complete_multipart_upload( Bucket=self.bucket_name, Key=self.key, UploadId=self.upload_id, - MultipartUpload={"Parts": self.parts}, + MultipartUpload={"Parts": sorted_parts}, ) self.upload_id = None From 5e9ae6493e1d62e480e79f03797f2a811704c83c Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 4 Dec 2024 19:02:32 +0100 Subject: [PATCH 07/13] fix: incorrect date range selection (#26646) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- ...est_session_recording_list_from_query.ambr | 420 ++-- .../session_recording_list_from_query.py | 10 +- ...t_session_recording_list_from_filters.ambr | 347 +-- ...est_session_recording_list_from_query.ambr | 2069 +++++++++-------- ...est_session_recording_list_from_filters.py | 24 +- .../test_session_recording_list_from_query.py | 20 + 6 files changed, 1338 insertions(+), 1552 deletions(-) diff --git a/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr b/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr index a6e707bbe387a..bcd1ed1e3c8cb 100644 --- a/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr +++ b/ee/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr @@ -19,12 +19,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_7)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), now64(6, %(hogql_val_9)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_10)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_11)s), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_9)s), now64(6, %(hogql_val_10)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_12)s), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -51,24 +51,24 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, %(hogql_val_7)s), ''), 'null'), '^"|"$', ''), person.version) AS properties___rgInternal, person.id AS id - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, %(hogql_val_8)s), person.version), plus(now64(6, %(hogql_val_9)s), toIntervalDay(1))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_10)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), now64(6, %(hogql_val_12)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_13)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___rgInternal, %(hogql_val_14)s), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, %(hogql_val_8)s), ''), 'null'), '^"|"$', ''), person.version) AS properties___rgInternal, person.id AS id + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, %(hogql_val_9)s), person.version), plus(now64(6, %(hogql_val_10)s), toIntervalDay(1))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_12)s), now64(6, %(hogql_val_13)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_14)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___rgInternal, %(hogql_val_15)s), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -95,24 +95,24 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, %(hogql_val_7)s), ''), 'null'), '^"|"$', ''), person.version) AS properties___rgInternal, person.id AS id - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, %(hogql_val_8)s), person.version), plus(now64(6, %(hogql_val_9)s), toIntervalDay(1))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_10)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), now64(6, %(hogql_val_12)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_13)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___rgInternal, %(hogql_val_14)s), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, %(hogql_val_8)s), ''), 'null'), '^"|"$', ''), person.version) AS properties___rgInternal, person.id AS id + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, %(hogql_val_9)s), person.version), plus(now64(6, %(hogql_val_10)s), toIntervalDay(1))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_12)s), now64(6, %(hogql_val_13)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_14)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___rgInternal, %(hogql_val_15)s), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -139,12 +139,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_7)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), now64(6, %(hogql_val_9)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_10)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_11)s), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_9)s), now64(6, %(hogql_val_10)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_12)s), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -171,12 +171,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, %(hogql_val_3)s)), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff(%(hogql_val_4)s, start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_7)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), now64(6, %(hogql_val_9)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_10)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_11)s), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_6)s), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, %(hogql_val_7)s), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_8)s), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, %(hogql_val_9)s), now64(6, %(hogql_val_10)s)), greaterOrEquals(toTimeZone(events.timestamp, %(hogql_val_11)s), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_rgInternal, ''), 'null'), %(hogql_val_12)s), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -203,7 +203,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -238,12 +238,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -278,7 +278,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -313,12 +313,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -353,7 +353,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -388,12 +388,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -428,7 +428,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -463,12 +463,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -503,7 +503,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -538,27 +538,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -593,7 +593,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -628,27 +628,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -683,7 +683,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -718,27 +718,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -773,7 +773,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -808,27 +808,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -863,7 +863,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -898,12 +898,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -938,7 +938,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -973,12 +973,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1013,7 +1013,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1048,12 +1048,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1088,7 +1088,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1123,12 +1123,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(mat_pp_email, ''), 'null'), 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1166,7 +1166,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1204,7 +1204,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1242,7 +1242,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1280,7 +1280,7 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT DISTINCT events.`$session_id` AS `$session_id` FROM events - WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), equals(events.person_id, '00000000-0000-0000-0000-000000000000'), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1324,7 +1324,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1368,7 +1368,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1412,7 +1412,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1456,7 +1456,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1500,7 +1500,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1544,7 +1544,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1588,7 +1588,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1632,7 +1632,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC diff --git a/posthog/session_recordings/queries/session_recording_list_from_query.py b/posthog/session_recordings/queries/session_recording_list_from_query.py index ae047e0191e0b..fe08fb85590f2 100644 --- a/posthog/session_recordings/queries/session_recording_list_from_query.py +++ b/posthog/session_recordings/queries/session_recording_list_from_query.py @@ -276,21 +276,23 @@ def _where_predicates(self) -> Union[ast.And, ast.Or]: ) ) - if self._query.date_from: + query_date_from = self.query_date_range.date_from() + if query_date_from: exprs.append( ast.CompareOperation( op=ast.CompareOperationOp.GtEq, left=ast.Field(chain=["s", "min_first_timestamp"]), - right=ast.Constant(value=self.query_date_range.date_from()), + right=ast.Constant(value=query_date_from), ) ) - if self._query.date_to: + query_date_to = self.query_date_range.date_to() + if query_date_to: exprs.append( ast.CompareOperation( op=ast.CompareOperationOp.LtEq, left=ast.Field(chain=["s", "min_first_timestamp"]), - right=ast.Constant(value=self.query_date_range.date_to()), + right=ast.Constant(value=query_date_to), ) ) diff --git a/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_filters.ambr b/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_filters.ambr index d55237d3ca55c..82e70f3063a2b 100644 --- a/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_filters.ambr +++ b/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_filters.ambr @@ -2806,129 +2806,6 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_filter_for_recordings_by_console_text_0__key_level_value_warn_error_operator_exact_type_log_entry_key_message_value_message_4_operator_icontains_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE or(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 4%'), 0))))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- -# name: TestSessionRecordingsListFromFilters.test_filter_for_recordings_by_console_text_1__key_level_value_warn_error_operator_exact_type_log_entry_key_message_value_message_5_operator_icontains_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 5%'), 0))))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- -# name: TestSessionRecordingsListFromFilters.test_filter_for_recordings_by_console_text_2__key_level_value_info_operator_exact_type_log_entry_key_message_value_message_5_operator_icontains_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 20:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(ifNull(equals(console_logs_log_entries.level, 'info'), 0), ifNull(ilike(console_logs_log_entries.message, '%message 5%'), 0))))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- # name: TestSessionRecordingsListFromFilters.test_filter_for_recordings_by_snapshot_source ''' SELECT s.session_id AS session_id, @@ -3916,7 +3793,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters +# name: TestSessionRecordingsListFromFilters.test_listing_ignores_future_replays ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -3933,15 +3810,10 @@ sum(s.console_log_count) AS console_log_count, sum(s.console_warn_count) AS console_warn_count, sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, + ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-08-30 11:55:01.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'new-event'), 1))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-09 12:00:01.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-23 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-30 12:00:01.000000', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3956,7 +3828,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.1 +# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -3979,9 +3851,9 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'new-event2'), 1))) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'new-event'), 1))) GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3996,7 +3868,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.2 +# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.1 ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4021,7 +3893,7 @@ FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'new-event2'), 1))) GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4036,7 +3908,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.3 +# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.2 ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4059,9 +3931,9 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'bar'), ''), 'null'), '^"|"$', ''), 'foo'), 0)))) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'new-event2'), 1))) GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4076,7 +3948,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.4 +# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.3 ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4099,9 +3971,9 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'bar'), ''), 'null'), '^"|"$', ''), 'foo'), 0)))) GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4116,7 +3988,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.5 +# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.4 ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4141,7 +4013,7 @@ FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event'])))) + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4156,7 +4028,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_event_filters +# name: TestSessionRecordingsListFromFilters.test_multiple_event_filters.5 ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4179,9 +4051,9 @@ WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, (SELECT events.`$session_id` AS session_id FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'custom_event'), 1))) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) + HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4196,7 +4068,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_event_filters.1 +# name: TestSessionRecordingsListFromFilters.test_operand_or_event_filters ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4221,171 +4093,7 @@ FROM events WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'custom_event'), 1))) GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_filters_0__key_level_value_warn_operator_exact_type_log_entry_key_message_value_random_operator_exact_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_filters_1__key_level_value_info_operator_exact_type_log_entry_key_message_value_random_operator_exact_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(ifNull(equals(console_logs_log_entries.level, 'info'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_filters_2__key_level_value_warn_operator_exact_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) - GROUP BY s.session_id - HAVING 1 - ORDER BY start_time DESC - LIMIT 51 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0, - allow_experimental_analyzer=0 - ''' -# --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_filters_3__key_message_value_random_operator_exact_type_log_entry_ - ''' - SELECT s.session_id AS session_id, - any(s.team_id), - any(s.distinct_id), - min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, - max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, - dateDiff('SECOND', start_time, end_time) AS duration, - argMinMerge(s.first_url) AS first_url, - sum(s.click_count) AS click_count, - sum(s.keypress_count) AS keypress_count, - sum(s.mouse_activity_count) AS mouse_activity_count, - divide(sum(s.active_milliseconds), 1000) AS active_seconds, - minus(duration, active_seconds) AS inactive_seconds, - sum(s.console_log_count) AS console_log_count, - sum(s.console_warn_count) AS console_warn_count, - sum(s.console_error_count) AS console_error_count, - ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, - round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score - FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.message, 'random'), 0)))) + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4400,7 +4108,7 @@ allow_experimental_analyzer=0 ''' # --- -# name: TestSessionRecordingsListFromFilters.test_operand_or_filters_4__key_level_value_warn_operator_exact_type_log_entry_key_message_value_random_operator_exact_type_log_entry_ +# name: TestSessionRecordingsListFromFilters.test_operand_or_event_filters.1 ''' SELECT s.session_id AS session_id, any(s.team_id), @@ -4421,12 +4129,11 @@ round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-25 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-24 23:58:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), 1), and(equals(events.event, 'custom_event'), 1))) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC diff --git a/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr b/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr index c74794ef87e62..34f0b42e60970 100644 --- a/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr +++ b/posthog/session_recordings/queries/test/__snapshots__/test_session_recording_list_from_query.ambr @@ -19,12 +19,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'custom-event'), and(ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0), ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0)))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'custom-event'), and(ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0), ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0)))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -59,12 +59,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0)))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0)))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -99,12 +99,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0))), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0))), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -139,12 +139,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-01-03 23:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0))), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-01-04 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-14 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-12-31 23:58:00.000000', 6, 'UTC')), and(and(equals(events.event, 'custom-event'), and(ifNull(equals(nullIf(nullIf(events.`$session_id`, ''), 'null'), 'test_action_filter-session-one'), 0), ifNull(equals(nullIf(nullIf(events.`$window_id`, ''), 'null'), 'test_action_filter-window-id'), 0))), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['custom-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -228,12 +228,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), 1) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), 1) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -268,12 +268,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -308,12 +308,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -348,12 +348,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), 1) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), 1) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -388,12 +388,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -428,12 +428,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(1, ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -468,7 +468,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -503,7 +503,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(duration, 60.0), 0) ORDER BY start_time DESC @@ -538,7 +538,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(active_seconds, '60'), 0) ORDER BY start_time DESC @@ -573,7 +573,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(inactive_seconds, '60'), 0) ORDER BY start_time DESC @@ -608,7 +608,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY active_seconds DESC @@ -643,7 +643,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY console_error_count DESC @@ -678,7 +678,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -713,7 +713,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -748,7 +748,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -783,7 +783,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -818,7 +818,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -853,7 +853,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-30 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-30 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -888,7 +888,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 12:41:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-12 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-12 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -923,7 +923,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 12:41:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -958,7 +958,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 12:41:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-10 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 12:46:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-10 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1063,7 +1063,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(greater(duration, 60.0), 0) ORDER BY start_time DESC @@ -1098,7 +1098,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(less(duration, 60.0), 0) ORDER BY start_time DESC @@ -1133,12 +1133,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1173,12 +1173,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$autocapture')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$autocapture'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$autocapture')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$autocapture'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1213,12 +1213,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1253,7 +1253,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1288,12 +1288,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING ifNull(greater(duration, 60.0), 0) ORDER BY start_time DESC @@ -1328,12 +1328,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING ifNull(greater(active_seconds, 60.0), 0) ORDER BY start_time DESC @@ -1368,17 +1368,17 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT JOIN - (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, 'name'), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, 'UTC')) AS properties___name, groups.group_type_index AS index, groups.group_key AS key - FROM groups - WHERE and(equals(groups.team_id, 99999), equals(index, 1)) - GROUP BY groups.group_type_index, groups.group_key) AS events__group_1 ON equals(events.`$group_1`, events__group_1.key) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(events__group_1.properties___name, 'org one'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT JOIN + (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, 'name'), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, 'UTC')) AS properties___name, groups.group_type_index AS index, groups.group_key AS key + FROM groups + WHERE and(equals(groups.team_id, 99999), equals(index, 1)) + GROUP BY groups.group_type_index, groups.group_key) AS events__group_1 ON equals(events.`$group_1`, events__group_1.key) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(events__group_1.properties___name, 'org one'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1413,17 +1413,17 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT JOIN - (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, 'name'), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, 'UTC')) AS properties___name, groups.group_type_index AS index, groups.group_key AS key - FROM groups - WHERE and(equals(groups.team_id, 99999), equals(index, 1)) - GROUP BY groups.group_type_index, groups.group_key) AS events__group_1 ON equals(events.`$group_1`, events__group_1.key) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__group_1.properties___name, 'org one'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT JOIN + (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, 'name'), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, 'UTC')) AS properties___name, groups.group_type_index AS index, groups.group_key AS key + FROM groups + WHERE and(equals(groups.team_id, 99999), equals(index, 1)) + GROUP BY groups.group_type_index, groups.group_key) AS events__group_1 ON equals(events.`$group_1`, events__group_1.key) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__group_1.properties___name, 'org one'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1458,17 +1458,17 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT JOIN - (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, 'name'), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, 'UTC')) AS properties___name, groups.group_type_index AS index, groups.group_key AS key - FROM groups - WHERE and(equals(groups.team_id, 99999), equals(index, 2)) - GROUP BY groups.group_type_index, groups.group_key) AS events__group_2 ON equals(events.`$group_2`, events__group_2.key) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__group_2.properties___name, 'org one'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT JOIN + (SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, 'name'), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, 'UTC')) AS properties___name, groups.group_type_index AS index, groups.group_key AS key + FROM groups + WHERE and(equals(groups.team_id, 99999), equals(index, 2)) + GROUP BY groups.group_type_index, groups.group_key) AS events__group_2 ON equals(events.`$group_2`, events__group_2.key) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__group_2.properties___name, 'org one'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1503,12 +1503,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1543,27 +1543,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1598,27 +1598,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1653,12 +1653,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1693,27 +1693,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1748,27 +1748,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1803,27 +1803,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'bla'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'bla'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1858,27 +1858,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'something else'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(events__person.properties___email, 'something else'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1913,12 +1913,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1953,12 +1953,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -1993,12 +1993,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2033,12 +2033,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2073,12 +2073,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2113,12 +2113,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$autocapture')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$autocapture'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$autocapture')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$autocapture'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2153,12 +2153,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2193,12 +2193,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2233,12 +2233,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2273,12 +2273,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Safari'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Safari'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2313,12 +2313,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2353,12 +2353,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, '$pageview'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Firefox'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2393,12 +2393,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Chrome'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2433,12 +2433,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Safari'), 0))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(equals(events.event, 'a_different_event'), ifNull(equals(nullIf(nullIf(events.`mat_$browser`, ''), 'null'), 'Safari'), 0))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['a_different_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2473,27 +2473,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), and(ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0)), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), and(ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0)), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2528,12 +2528,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2568,27 +2568,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), and(ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0)), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), and(ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$browser'), ''), 'null'), '^"|"$', ''), 'Chrome'), 0)), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2623,12 +2623,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2663,12 +2663,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, '$pageleave'))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageleave', '$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, '$pageleave'))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageleave', '$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2703,13 +2703,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE or(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 4%'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE or(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 4%'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2744,13 +2744,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 4%'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE and(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 4%'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2785,13 +2785,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 5%'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE and(or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0)), ifNull(ilike(console_logs_log_entries.message, '%message 5%'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2826,13 +2826,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(ifNull(equals(console_logs_log_entries.level, 'info'), 0), ifNull(ilike(console_logs_log_entries.message, '%message 5%'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE and(ifNull(equals(console_logs_log_entries.level, 'info'), 0), ifNull(ilike(console_logs_log_entries.message, '%message 5%'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2867,7 +2867,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(equals(argMinMerge(s.snapshot_source), 'web'), 0) ORDER BY start_time DESC @@ -2902,7 +2902,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING ifNull(equals(argMinMerge(s.snapshot_source), 'mobile'), 0) ORDER BY start_time DESC @@ -2937,13 +2937,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'error'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'error'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -2978,13 +2978,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3019,13 +3019,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3060,13 +3060,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3101,13 +3101,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3142,13 +3142,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3183,13 +3183,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.level, 'error'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3224,13 +3224,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'info'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3269,7 +3269,8 @@ ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001' /* ... */], - ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), + ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3308,7 +3309,8 @@ ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001' /* ... */], - ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), + ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3363,21 +3365,21 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) - GROUP BY person_distinct_id2.distinct_id - HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) + GROUP BY person_distinct_id2.distinct_id + HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3432,26 +3434,26 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), and(in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-08-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview']))), in(s.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) - GROUP BY person_distinct_id2.distinct_id - HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0))))))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), and(in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-08-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview']))), in(s.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) + GROUP BY person_distinct_id2.distinct_id + HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0))))))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3486,26 +3488,26 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), and(in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-08-17 23:58:00.000000', 6, 'UTC')), equals(events.event, 'custom_event')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['custom_event']))), in(s.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) - GROUP BY person_distinct_id2.distinct_id - HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0))))))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), and(in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-08-17 23:58:00.000000', 6, 'UTC')), equals(events.event, 'custom_event')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['custom_event']))), in(s.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) + GROUP BY person_distinct_id2.distinct_id + HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0))))))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3540,27 +3542,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla@gmail.com'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla@gmail.com'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3595,27 +3597,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(notILike(events__person.properties___email, '%gmail.com%'), 1)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), ifNull(notILike(events__person.properties___email, '%gmail.com%'), 1)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3699,21 +3701,21 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, - (SELECT person_static_cohort.person_id AS person_id - FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999)))))))) - GROUP BY person_distinct_id2.distinct_id - HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, - (SELECT person_static_cohort.person_id AS person_id - FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999)))))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, + (SELECT person_static_cohort.person_id AS person_id + FROM person_static_cohort + WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999)))))))) + GROUP BY person_distinct_id2.distinct_id + HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, + (SELECT person_static_cohort.person_id AS person_id + FROM person_static_cohort + WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999)))))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3748,21 +3750,21 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) - GROUP BY person_distinct_id2.distinct_id - HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), 1, in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) + GROUP BY person_distinct_id2.distinct_id + HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3797,27 +3799,62 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-08-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), in(s.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, - (SELECT person_distinct_id2.distinct_id AS distinct_id - FROM person_distinct_id2 - WHERE and(equals(person_distinct_id2.team_id, 99999), 1, and(in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))), in(person_distinct_id2.person_id, - (SELECT person_static_cohort.person_id AS person_id - FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999))))))))) - GROUP BY person_distinct_id2.distinct_id - HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), and(in(person_distinct_id2.person_id, - (SELECT cohortpeople.person_id AS person_id - FROM cohortpeople - WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))), in(person_distinct_id2.person_id, - (SELECT person_static_cohort.person_id AS person_id - FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999))))))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-07-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-08-21 23:59:59.999999', 6, 'UTC')), 0), in(s.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), in(person_distinct_id2.distinct_id, + (SELECT person_distinct_id2.distinct_id AS distinct_id + FROM person_distinct_id2 + WHERE and(equals(person_distinct_id2.team_id, 99999), 1, and(in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))), in(person_distinct_id2.person_id, + (SELECT person_static_cohort.person_id AS person_id + FROM person_static_cohort + WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999))))))))) + GROUP BY person_distinct_id2.distinct_id + HAVING and(ifNull(equals(argMax(person_distinct_id2.is_deleted, person_distinct_id2.version), 0), 0), and(in(person_distinct_id2.person_id, + (SELECT cohortpeople.person_id AS person_id + FROM cohortpeople + WHERE and(equals(cohortpeople.team_id, 99999), equals(cohortpeople.cohort_id, 99999), equals(cohortpeople.version, 0)))), in(person_distinct_id2.person_id, + (SELECT person_static_cohort.person_id AS person_id + FROM person_static_cohort + WHERE and(equals(person_static_cohort.team_id, 99999), equals(person_static_cohort.cohort_id, 99999))))))))) + GROUP BY s.session_id + HAVING 1 + ORDER BY start_time DESC + LIMIT 51 + OFFSET 0 SETTINGS readonly=2, + max_execution_time=60, + allow_experimental_object_type=1, + format_csv_allow_double_quotes=0, + max_ast_elements=4000000, + max_expanded_ast_elements=4000000, + max_bytes_before_external_group_by=0, + allow_experimental_analyzer=0 + ''' +# --- +# name: TestSessionRecordingsListFromQuery.test_listing_ignores_future_replays + ''' + SELECT s.session_id AS session_id, + any(s.team_id), + any(s.distinct_id), + min(toTimeZone(s.min_first_timestamp, 'UTC')) AS start_time, + max(toTimeZone(s.max_last_timestamp, 'UTC')) AS end_time, + dateDiff('SECOND', start_time, end_time) AS duration, + argMinMerge(s.first_url) AS first_url, + sum(s.click_count) AS click_count, + sum(s.keypress_count) AS keypress_count, + sum(s.mouse_activity_count) AS mouse_activity_count, + divide(sum(s.active_milliseconds), 1000) AS active_seconds, + minus(duration, active_seconds) AS inactive_seconds, + sum(s.console_log_count) AS console_log_count, + sum(s.console_warn_count) AS console_warn_count, + sum(s.console_error_count) AS console_error_count, + ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2023-08-30 11:55:01.000000', 6, 'UTC')), 0) AS ongoing, + round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score + FROM session_replay_events AS s + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-09 12:00:01.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-27 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2023-08-30 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3852,12 +3889,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event'))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event'))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3892,12 +3929,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event2'))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event2'))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3932,12 +3969,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event2'))) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'new-event2'))) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event2'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -3972,12 +4009,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'bar'), ''), 'null'), '^"|"$', ''), 'foo'), 0)))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'bar'), ''), 'null'), '^"|"$', ''), 'foo'), 0)))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4012,12 +4049,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'new-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4052,12 +4089,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(and(equals(events.event, '$pageview'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)), and(equals(events.event, 'new-event'), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'foo'), ''), 'null'), '^"|"$', ''), 'bar'), 0)))) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'new-event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4092,12 +4129,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'custom_event'))) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'custom_event'))) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4132,12 +4169,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'custom_event'))) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(equals(events.event, '$pageview'), equals(events.event, 'custom_event'))) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview', 'custom_event'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4172,13 +4209,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE and(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4213,13 +4250,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE and(ifNull(equals(console_logs_log_entries.level, 'info'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE and(ifNull(equals(console_logs_log_entries.level, 'info'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4254,13 +4291,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.level, 'warn'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4295,13 +4332,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE ifNull(equals(console_logs_log_entries.message, 'random'), 0)))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE ifNull(equals(console_logs_log_entries.message, 'random'), 0)))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4336,13 +4373,13 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT console_logs_log_entries.log_source_id AS log_source_id - FROM - (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message - FROM log_entries - WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries - WHERE or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT console_logs_log_entries.log_source_id AS log_source_id + FROM + (SELECT log_entries.log_source_id AS log_source_id, log_entries.level AS level, log_entries.message AS message + FROM log_entries + WHERE and(equals(log_entries.team_id, 99999), equals(log_entries.log_source, 'session_replay'))) AS console_logs_log_entries + WHERE or(ifNull(equals(console_logs_log_entries.level, 'warn'), 0), ifNull(equals(console_logs_log_entries.message, 'random'), 0))))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4386,12 +4423,12 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4435,12 +4472,12 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4475,12 +4512,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_one']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), in(events.`$session_id`, ['session_id_one'])) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_one']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), in(events.`$session_id`, ['session_id_one'])) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4515,12 +4552,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_two']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), in(events.`$session_id`, ['session_id_two'])) - GROUP BY events.`$session_id` - HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), in(s.session_id, ['session_id_two']), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview'), in(events.`$session_id`, ['session_id_two'])) + GROUP BY events.`$session_id` + HAVING hasAny(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4555,27 +4592,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(ifNull(equals(events__person.properties___email, 'test@posthog.com'), 0), ifNull(equals(events__person.properties___email, 'david@posthog.com'), 0))) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), and(ifNull(equals(events__person.properties___email, 'test@posthog.com'), 0), ifNull(equals(events__person.properties___email, 'david@posthog.com'), 0))) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4610,27 +4647,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(ifNull(equals(events__person.properties___email, 'test@posthog.com'), 0), ifNull(equals(events__person.properties___email, 'david@posthog.com'), 0))) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-28 23:58:00.000000', 6, 'UTC')), or(ifNull(equals(events__person.properties___email, 'test@posthog.com'), 0), ifNull(equals(events__person.properties___email, 'david@posthog.com'), 0))) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4665,7 +4702,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4700,7 +4737,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY mouse_activity_count DESC @@ -4744,7 +4781,7 @@ WHERE equals(person_distinct_id_overrides.team_id, 99999) GROUP BY person_distinct_id_overrides.distinct_id HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(events.team_id, 99999), ifNull(equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), '00000000-0000-0000-0000-000000000000'), 0), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-01 13:46:23.000000', 6, 'UTC')), notEmpty(events.`$session_id`)))), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4779,7 +4816,7 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-01 13:41:23.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0)) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-11 13:46:23.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-29 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-01 23:59:59.999999', 6, 'UTC')), 0)) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4814,12 +4851,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4854,12 +4891,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(not(match(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$host'), ''), 'null'), '^"|"$', '')), '^(localhost|127\\.0\\.0\\.1)($|:)')), 1)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(not(match(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$host'), ''), 'null'), '^"|"$', '')), '^(localhost|127\\.0\\.0\\.1)($|:)')), 1)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4894,12 +4931,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4934,12 +4971,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(not(match(toString(nullIf(nullIf(events.`mat_$host`, ''), 'null')), '^(localhost|127\\.0\\.0\\.1)($|:)')), 1)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(not(match(toString(nullIf(nullIf(events.`mat_$host`, ''), 'null')), '^(localhost|127\\.0\\.0\\.1)($|:)')), 1)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -4974,12 +5011,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5014,12 +5051,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5054,12 +5091,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5094,12 +5131,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'false'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5134,12 +5171,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5174,12 +5211,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5214,12 +5251,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5254,12 +5291,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'false'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5294,12 +5331,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5334,12 +5371,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'true'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, 'is_internal_user'), ''), 'null'), '^"|"$', ''), 'true'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5374,12 +5411,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5414,12 +5451,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'true'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(nullIf(nullIf(events.mat_is_internal_user, ''), 'null'), 'true'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5454,12 +5491,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5494,27 +5531,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5549,12 +5586,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5589,27 +5626,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5644,12 +5681,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5684,27 +5721,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, 'email'), ''), 'null'), '^"|"$', '') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5739,12 +5776,12 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) - GROUP BY events.`$session_id` - HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), equals(events.event, '$pageview')) + GROUP BY events.`$session_id` + HAVING hasAll(groupUniqArray(events.event), ['$pageview'])))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC @@ -5779,27 +5816,27 @@ ifNull(greaterOrEquals(max(toTimeZone(s._timestamp, 'UTC')), toDateTime64('2021-01-21 19:55:00.000000', 6, 'UTC')), 0) AS ongoing, round(multiply(divide(plus(plus(plus(divide(sum(s.active_milliseconds), 1000), sum(s.click_count)), sum(s.keypress_count)), sum(s.console_error_count)), plus(plus(plus(plus(sum(s.mouse_activity_count), dateDiff('SECOND', start_time, end_time)), sum(s.console_error_count)), sum(s.console_log_count)), sum(s.console_warn_count))), 100), 2) AS activity_score FROM session_replay_events AS s - WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), in(s.session_id, - (SELECT events.`$session_id` AS session_id - FROM events - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 99999) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) - LEFT JOIN - (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email - FROM person - WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), - (SELECT person.id AS id, max(person.version) AS version - FROM person - WHERE equals(person.team_id, 99999) - GROUP BY person.id - HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) - GROUP BY events.`$session_id` - HAVING 1))) + WHERE and(equals(s.team_id, 99999), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), 0), ifNull(greaterOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-18 00:00:00.000000', 6, 'UTC')), 0), ifNull(lessOrEquals(toTimeZone(s.min_first_timestamp, 'UTC'), toDateTime64('2021-01-21 23:59:59.999999', 6, 'UTC')), 0), in(s.session_id, + (SELECT events.`$session_id` AS session_id + FROM events + LEFT OUTER JOIN + (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, person_distinct_id_overrides.distinct_id AS distinct_id + FROM person_distinct_id_overrides + WHERE equals(person_distinct_id_overrides.team_id, 99999) + GROUP BY person_distinct_id_overrides.distinct_id + HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS events__override ON equals(events.distinct_id, events__override.distinct_id) + LEFT JOIN + (SELECT person.id AS id, nullIf(nullIf(person.pmat_email, ''), 'null') AS properties___email + FROM person + WHERE and(equals(person.team_id, 99999), ifNull(in(tuple(person.id, person.version), + (SELECT person.id AS id, max(person.version) AS version + FROM person + WHERE equals(person.team_id, 99999) + GROUP BY person.id + HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) + WHERE and(equals(events.team_id, 99999), notEmpty(events.`$session_id`), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2020-12-31 20:00:00.000000', 6, 'UTC')), lessOrEquals(toTimeZone(events.timestamp, 'UTC'), now64(6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-17 23:58:00.000000', 6, 'UTC')), ifNull(equals(events__person.properties___email, 'bla'), 0)) + GROUP BY events.`$session_id` + HAVING 1))) GROUP BY s.session_id HAVING 1 ORDER BY start_time DESC diff --git a/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py b/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py index a1b730f149da2..f8ce2daccf3d5 100644 --- a/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py +++ b/posthog/session_recordings/queries/test/test_session_recording_list_from_filters.py @@ -81,8 +81,8 @@ def create_event( properties=properties, ) - def _filter_recordings_by(self, recordings_filter: dict) -> SessionRecordingQueryResult: - the_filter = SessionRecordingsFilter(team=self.team, data=recordings_filter) + def _filter_recordings_by(self, recordings_filter: dict | None = None) -> SessionRecordingQueryResult: + the_filter = SessionRecordingsFilter(team=self.team, data=recordings_filter or {}) session_recording_list_instance = SessionRecordingListFromFilters( filter=the_filter, team=self.team, hogql_query_modifiers=None ) @@ -784,6 +784,26 @@ def test_ttl_days(self): with freeze_time("2023-09-05T12:00:01Z"): assert ttl_days(self.team) == 35 + @snapshot_clickhouse_queries + def test_listing_ignores_future_replays(self): + with freeze_time("2023-08-29T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="29th Aug") + + with freeze_time("2023-09-01T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="1st-sep") + + with freeze_time("2023-09-02T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="2nd-sep") + + with freeze_time("2023-09-03T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="3rd-sep") + + with freeze_time("2023-08-30T12:00:01Z"): + recordings = self._filter_recordings_by() + + # recordings in the future don't show + assert [s["session_id"] for s in recordings.results] == ["29th Aug"] + @snapshot_clickhouse_queries def test_filter_on_session_ids(self): user = "test_session_ids-user" diff --git a/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py b/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py index 99ef6404f1ad6..abfd8ab98b956 100644 --- a/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py +++ b/posthog/session_recordings/queries/test/test_session_recording_list_from_query.py @@ -773,6 +773,26 @@ def test_ttl_days(self): with freeze_time("2023-09-05T12:00:01Z"): assert ttl_days(self.team) == 35 + @snapshot_clickhouse_queries + def test_listing_ignores_future_replays(self): + with freeze_time("2023-08-29T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="29th Aug") + + with freeze_time("2023-09-01T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="1st-sep") + + with freeze_time("2023-09-02T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="2nd-sep") + + with freeze_time("2023-09-03T12:00:01Z"): + produce_replay_summary(team_id=self.team.id, session_id="3rd-sep") + + with freeze_time("2023-08-30T12:00:01Z"): + recordings = self._filter_recordings_by() + + # recordings in the future don't show + assert [s["session_id"] for s in recordings.results] == ["29th Aug"] + @snapshot_clickhouse_queries def test_filter_on_session_ids(self): user = "test_session_ids-user" From 8b483e280211d0533ed3d8894eb037f0cd163a02 Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 4 Dec 2024 21:12:31 +0100 Subject: [PATCH 08/13] feat: player control v2 (#26642) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- ...layer-success--recent-recordings--dark.png | Bin 58581 -> 60101 bytes ...ayer-success--recent-recordings--light.png | Bin 58595 -> 60270 bytes ...uccess--second-recording-in-list--dark.png | Bin 58541 -> 58525 bytes ...ccess--second-recording-in-list--light.png | Bin 58578 -> 58799 bytes .../player/PlayerFrameOverlay.tsx | 20 +----- .../player/PlayerUpNext.scss | 31 +------- .../player/PlayerUpNext.tsx | 61 ++++++++++------ .../player/SessionRecordingPlayer.tsx | 3 + .../player/controller/PlayerController.tsx | 67 +++++++++++++----- .../controller/PlayerControllerTime.tsx | 40 ++++------- .../player/sessionRecordingPlayerLogic.ts | 7 ++ .../SessionRecordingsPlaylistSettings.tsx | 9 +-- .../src/scenes/session-recordings/utils.ts | 6 ++ 13 files changed, 120 insertions(+), 124 deletions(-) diff --git a/frontend/__snapshots__/replay-player-success--recent-recordings--dark.png b/frontend/__snapshots__/replay-player-success--recent-recordings--dark.png index 000613096ba38ed2531d059e6c7b6e8d81f7abd9..c02be573f0f342228514fcd555834640e3ccf454 100644 GIT binary patch delta 39241 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 delta 37701 zcmagG1yoc~+cu1aNSA=5gp_nQI;2QF6joPL%O7M=hu2Z z^RMq)>z_4?bvQF;pM7@Rab4FvZKL-_yY78oehoE$4!x&%pD+-e&`v_9YHaj|)MY$x zG*8XCVzl-&XVPj0uVN>NYU)ELdG{>mqlweYB{n(AH+KzD`cIcS`uAsNJnh3i3!Tn7 z@8(Bt7eAO@UUOXeb#8X{o$_|N)_J*epF)GVxc_zjHAzzpr|xiZRtzc$6^iB57!~L9 zkj^ux^gCO>@)N?8I2yE${erEnN&=ww zb@rz0)kfqa(SNM=O#iakv?oDB4S6S2l$<=f{6hDPL>myf>womlI7 zo3?N(sSb6OG=^~L@shH#^TiOQFfu{aKDnqb#Dpmh$5!tv8_rrQUdrqHFq4cN1axup zKz&_ZqZxgjN#H8Ej#we$5RUDOq-H*>kFUBsNJR9SS5! zNQ!F8+IggA4bF6{GlErAa2TvPD)P`mf+^;ksR{9hGau=-2j($+Dd&?x(fI@aqVf~^ zl%J`1{U%%r=q`Bbyw1H>Q6Ci=bLV+~3wVd6@PHO0nVWXE2GWu?Z0@8(A8MCghKN2`QBpH|X2R%YAOTXqil9%NqF&E8S4xFJ@&_kzH))jy2O+c7YzWx-8B6{nq#U z&3t5j(*5rPDk`A*L9kUk`8!A(_gdIy`uaxlGQ1+BndW0ZzoOyfRN+aSksVU*GT}(< z<>BOPla70DaN#cZWot%yDbs#tT>z4k-y>l>BFN9xZaxg}>n{Yh0O3KAX z8sLkQjk(*A4=Fr0pePhDen=UW7%P=oVu2o}`=RUcI~CrCl<;L#-J%~B=$P@{o%t>s z@D&DL*6^`k@(cqTa--;fTb};Y@*_VOuK#+;gev1>r=vR-xJ3R+xvD&gp@!1*Bl`n{ zg|)0HpA%y{28TJhxXjpydMWu|f^iT}U;Ltc1DQ`1k4=LnPyUW)`U9`Y_a3+?eyWV2 zU2hcW@o{r2+^+5noZ+MT$vOwHG&G_)%yz^HJrZ#&_;1QXyQGF+%2< z+zcwx`<h{F1N^y2kBB@yV~=ge|??Y|d@NqAqp z{&xbYRwx&!g?F|P6+QFE~wq2s-xD)6<ARdmWmZLmSUf2V(T+yG1aURGhb zvGVt;?+K)1l|=emq5B<5+8+Lxn>Ig1zGYIwWo4`7X0ZRYHnhgk&C52x`uzE*p&zrp zmU~UwhnFf<|Hh-7tM=1Dmx&X;;ro~@hK#F6OC7RAqLNb$jXL#DpRs%Fr@L3! zl)W3Qk7~6jRIhPe_u5>Ej;q4Cp$?#g+s#x9*{r=W8l}Vf*W8P;p(v%s`1oA#uJptp z-wMDc=6IKCM^ff?>WUjwZnBQm@B0x4h8D{N9i8P)GDDPW|E}zvHjgPWHaDM2^R7$0 zo!_%Sv7OQZ_0PMDkjE=e8qGE=%4_<8Rc?s~hN4h`{xuc&(9K>pnM=RMTgK?9`|<1kWRVE$OYL#q zK}&(qiEAZzcT-#=A6+i*i20+VKf>tgXGOt$M8dH=M?VJ~n}N>_0}YqgzT0zgqd^T7 zTFcVl&oMC~OPl;CY2(EikeQb-ouFWLRt6zHex4lzJ}M4OL_|LTYv+}$%+1baG!}*M zx%+iOJZBc8TRe}8ld9^`M~OLWDDUr_A>~lZP*e1Gaqb(-%kTIG zgj-Kk+3JM!C4GgoZ_!|DKU+FTcnfU*cz#YaN-pP%k*dL6NWDPU7rWN&Hmxi&jz4u{+}?T_gLgb!*o7MT>U;CV3!su-AEaXD1tQn(%?oFMT@X zzlx){Kx+d#&27)SnGG7kl>HAX3WkD`g=;C{vyGT4G18eF2q&2hPcm|}e@`pNc;=)helvdFGz z0f+T;t8nYmpxi+}d`AzQtgpX<;H}GcdNWZZbu}(ZEaRnlebT?1Vlj&Kn_dzT;G74a z4UTt&bdLXL!R2xxhy;yFG?@sjtM|b(5c%8wuI68pK-sr%Y40WS#~@z|z`odAo=f_g zRB1cIWikJrxyeqI%)co{%_TB2a;mDh|NV`35Cs;Q$jWTlVT8b z0}7>nv48zmq>y`ppb+rd8dxwUwi7bx{86y=H7<_N^p&ivuDUB`M7uNd{7UU{qQ~*U z?*`}R@v;I=%hgV0+UlddL#FvhzqhVE-5hG#QPKj!lbJNjM`ru%`ithW<&wOX*Ge!* zpu$zkKX(H5HwWuicUFeFU|f7W0X{*V9%A`7I}eM#6oxhP{I|dM;{Bv!XsEN3Q^h2L zGx70%=3?*F|C;nQzHYk6uG+%yroO`u{yqTl$FK}9WZ$AGR2?2<-@y^Ne~-od8JrFy zm#TVPX>)PmQ2XcpAiCOF=je{@G9mJ>)-C#D3T3Nx;Y%Fx1-T^ucAYk{p5!@Igys)c z%1CK5vn(4Pk}rLuAjYuanfmn$pW5)QPp&kL)ds=8?#B41x75nW$i$&nR;R;dO^N^d zfBayUP5UP%9PwcKP`a0uaeUht7$64Q|Mx0jG~e;3^c(H7amZ2PMaKqryJ)(+7S9^M zp^82{|1YzAwmvmoFGL(FVeGJsDqHl!MaRA8sm8q114(0tPE|>LeGmuyTQTJ?YWs7# zdV7}E)}Ig)a}uF<{?3*EALlD_w0Q5|^ZO4z{c~%qAo_p9#PyiWeCyvKQUdA!I#F$@ zbElfSE#Lhu(f@rqFUp1<*@Kwe$#jWgjeNBb|DR<~{Ll{;(Pi@QJU*(WYF?%1Khux2 z@m@aTk>BHg9}z&W@%j2pI4Wjv{xz8Tm^P9jwx`Xgq*8DUu|9QB>IBD5?9Ecn{haa7 zZNIlOB$CWjp0MF*R&saOlgueL_V;$z;!lz{FNwpiB#%eGcl@8WIGt)>w2`RyVL{@` zRm2-Nq=lMHMJ)~g%mmU4F<-lPf1e)-Nt-zE|8PzJ?U|6%z5ccNfB$0c<-2oqtY`haMZg(ZhOWJ{O zlF+iWwDa+yrXU8R#Q^$pA~8P1V^dRFATC|PO;G$K`Sq1W9;*b(lQKkx?(2Sd#ZQO( zFMWFa4dYa4sUtey3g}IZkQHWl5rk+3gapOh?{Fjq!vHzfv(y2o?W8xK>t%&Vhlouyr8KCr1#XG5C3P z56rk0i3-{^wyCsJ=oJR_YCFn~<;@4e25YVLH|bMkX{#nZ#Zdj~cLu$=`NE##J7MtL zFAU3NAZ*#gTCWiH7_|`b>iog>t97Itm>01An92O9;hoF3;>5m!(JmzgXO5b)t;uar zKxNI1WD0$Dv*ubMs{aOCmg$Vtkd5ueFl6AIl+%sDhlCBgxImVWXyYz)aoSp&e`9WD z)^1idV)qmq1z1ZEtQapXx(p?kmU4(uw_Hu@CXFB?A-xbLr9^Kt9d4L>6m2>K*)Spt z#3qt-)@iC=kxkO_r-Ui;!{})f!>~U}*}r6d+C7dR#w-01BkVa_frK32dqX1Mm&G~Q zxiLgUL{U*uT$XhSKSqjayATJQ=ByTV)bZl#mq#IuBIYk{8^^}fD|Y+L%1BAK$iSOS zP{`}(TR{O!i+wIgS7~*ZJk%jzU{hVie~`zvD25(D^+qhw#)p>#aOe#syjEMyr=i`1 zQ$(K-DV1FOJfV3X`CMh_8slTuSWiZFMaAejT5R;QmH-TLp0|7T59YZ4bmsFUi_@O%1n6nW?Qp`?BNIz20L4;vlKSIwMtE1exkL!ot>+zd~b1G=Cz-4u4-QQJt}-u)7HJTi3$D&Vb2B> z%-m8(5NWV}6&#(Y$X3);D$L4b`qkSWdU^2UC$(~}Y(6bC>fYg@UHvXzx2Q~tRe)d6 z^6?@b6Voqn)DRLhs>b}0`IFUbfl%9-^OPkm3w{Fem z($KBqcr}V)ZI7Q+Oe!H`Gr{n@AipK|rVh=q%kH^0GlknR2o_X|LKg1&Zl`_?2Kw-KtvVNN= za1DjTFj32dkDyS}A#F2HlmW zW@h=7Wg?@LGS!+_0rJV`AJOapFTnj=fp$b9#E+x{H9F znOez4ugq7^cZ|9XH19V6yMz*gPnKIQ zZ7#Vm&-=?O$a=>+)Qqwo#fT#zJwSAn}B)GycW3 z^#{6j19SG8(Wa>*FS7mGjFjl3=oC_3(QG_)*`6y7k4Q5#%Oap?LmHU?lkI(ZF;e=| z_hC4N=p&m}0?Xi^Z9y`7c$n zFu$fR*!%asDNflRHgHo&c6TWHa8Tv)1c7${W3*_|CCI1huRgZ6(!dp=jxe%DB4MXq z1yQv7#F-R>>s+*v{1&McF#6}u6Y0MmH^rCT@ZwRv1=049>2n;|xcwEU;nnZYsU0s_ zKZf7BGxG8(&}|nxS4_EXNuoINc>shkG|=l6KC(!owdDi><+2dHi+=e4THz9Kq%8rJn7E$Wu^1?a1WB+ z1qT7wtrr=?#dBv;kz^z$mA^n2vB!Qn$uYD$Ss`Q&=5y0W|TZL8KVeF;%?x& zjc94SwZn#A_=$dB{gE>Ao=SphScyk3vT0WyMPpT|P2!h}nJ-+0Tmm`AJz_2GirqfNjy&7nYauj!dxp^yuhK znI?Zt4HmhG`s{GgwWhaM!_0K8>g}@4cpoKLN`W;=74BX4E39WcUEQ3Wy{~D5&wiM& zK}3;sp;#!@TAHdfu{~wZPLmbRfx|wZYj0*Q6iAMu)$866@fdd=ef-i~w{Ti6{FRoN zhBf6VC4`8Xh1H~_vFKYSYq8RAJ>|WAyjg4Xf z=m!+SA}k_lH@!s)65RFmS+&M;QeMPoy0nqDv(=c?hI9%^xsX#z zww(iMEbrd5xun1U;I2_%c;UqDwogfrCq|?p^al`Esbf zK}h5J`&Qz_AujG0Gugya=SzFzb~#E|Oqv)n1_i$)rN&o2pEWVhL#Fm?$HHL7<1hnJKj1E ziKP8Roqpxx?XBMcd8lZriWl^Dc9vIFjq-H6S?^YQEh-nfDrs}rDZR9OY0}(NyRDC= zw}L2}*qY<9uXf^oah@0wu2AieJrE-nUZaoy#AaYa45oFpjNG_VDc*_oMX zYihpRxq4P{d$;ITEJKOk!y`fU!Fx;`y)vQXSF3$}YB&4uXmiNpv0leA(L_k2P!fmo z*lsM}yL8oW@Zy=@I1gD>a9JO6pBQQbQ#+cC06STNLhKdH@m0`=4?c2J#yJQ4RS<>S zWgJ@bn*lMgmcv7|WvBB^UVErlRxW5Trl)5VJ!xxY5^;V=`0QCGsvp&wL?Fj{stVoe z{AacgFX-{r;c$Pqjb&X^sgAI1DRc@LRfGlC#+nlK_V!ku&EDDmaA4;x%_8c9W}T|t zl~qEJYr3(QOowN%jr%YeP!uN!*u4{q1Pq_80Y_R^1z&SXw>6!KJ!IcuQmWtJlcAd! zn_{ng_~st>dGl0?tTObI7B}Qx(Zd4$I*;SYQTOxnQQp+g3^)4J<-+N-Zzp2s3iCG$ zr%v<4rC+kb&@nLTYHO^V@;68Gb3h{YuKG0YWOUiMKd?xToQQHz21 z?8cI}jke}GXlS&N5l~F>2W*d{v!L6~1z`MM5m`pv?g6-)F@O7a$u(F{l<=XUp&;TB zWt~FW%Bxz(&iM}k;pFBV@xWjJC_Oqqt2ZvwT{uM$H)y0SlcPV)xC3*2eH~^fp{VHa z)iKe4*Y?bGI3^f1l%;`*d8$aK&T4Ua-EbkIQAB@77z@&vqh&2dq6El%@S0n6Mn@nc zBR1@mLa5g9kRYT@mk-)WyH{6xvNyyy&b+ZL*vo4t(rI$=ozl0{MA;$Gb!G}9BKuqS z^z`)1u-mWL3`o1qYHvWPXhui{H$$-QL>xu0hB#H1RwTr`zTx8J&$MAtObhQ$X?dQI zi=$*h-@e5}$5O*TeL~MwwF1alv}xw~p_$v(K;!OvN+L-C4~yODiMcJ&clRmF9d2}= zKYu;v<7>e+*@Y)HJjA&(>&fPR0Efd{C!7fr5)-%Q>RJG?FsY;e`Wj&9dW}xKW#%ti z{4oZ8kqwU^_wjXP_J`I^C$p^jv$Ol@Lj2F3vF-7fWCT6prOS4zZQ0uT`tsgGRel+e zZg_iNM^O6@S(Jmr5#r!3oFDw~X2|Fe@y#8EO#;dcy-S);G9~bLX;`OV9k+P#xswyh3 z?MytREC-RRfscNb@szz+cj3zS0r%Q973osug-_&}lH>6ktAyP)8^fx#Sb zMnS)Bw9~yRMy-sls#$Sh&Su`i=40b1lq8;Xh`ely+ZgR2oR)ykT_%jt8yl0R*Zqls z?^m+9^KS&)wa>Hl_2|s$BBW)RnnHb~Xd|#;+f!9|A#HPg*KXJ}jV}VR54I3Eq__!5 zk$9xIJl>O0y-jv4Y)8;iH)54VS4N?q&v9!HD}SsWWZmQAvC^61fyK4PWOfH5@evVe zu(W{%HbJY1u4ORnmA2OVLTeH-R(a}|V{{6Z09WrfsMft?0Rc^fj422qY^J|go=k#$ z(s(c6{#{DgT5PWl*7ls7_<2Z^&P$sCfSz!)h`VT6Zb7jb=KXroUJ5qT<)*i@Wa9WY z2*R7&MBx+=m(s)?jmjD=*-p9P*~`=V8k$(-yy~&eGoZl*csv7sH!weTGwP9=xn7Up z5@=0&e2|^K&&}B*l^|RYt95m-zCUnkOeU|hLs%((KesE zt4IMkuX+tp+(hjFGri0uwf4volk^`fyUgn^^w}oS6xC_w&I)HQ&Da zdarx;d`vcwfURWU65-Yj*+F`KIh}(I=+S;l4_tIk<4#yUhgg7!LcLTfI8v2;ysCS zuFb#?sK=5k&*=wpiKc8uZdbhf!O_IWb7yQAA*y;s6l4UAG%peuihIO>%zln4O?={-uv04r{)w7(=v77yfqE^W%-_Iw*_I z4i69S-0SE28y_r+Q35q1qLqo7@!t77g|Sf;PGVMr^XjR9@*_-nJ2g}_;G1N>3N^?W zg5fyrQ6E*_rb8Q5&rffs%vWvk*sl1hRf3P&2DU@7e#O_81>ihB1pX#qiR&@pC@3rh z_ILJbl}Aal?YxXGy60qD5Q3y%&mCO$wS}yxp*)vQX_#NopP(ZqB!n)0o$Co!-jup; z0+5Y>S-*0BwE`j+Wx_|@1-)Kc*$xg4_P)d_)ZK50h)}Z8y_&Ws%%3SK>3cZY}ZQq`**o{=d+nVs)`@P?^(sw>L#+;ZX zdz}!c9oK7y2T5^paH+alSn3p=lw%9HIf+z5&brC3tds!c%ftz ztH(|fZ|0pBFHb=nYFZ;sl{si(R6<1AYQixhA}jiC;QjC4?~H_ads8eiF)*Ox4VUnp z8RUy&y5!m1bxo1k27{)cJOsZ_iDt7Ado;yc;zkqLw)OUwO_xb&PP)-i4h~A1M)556 zxHdX6q*q{P)UAEAJ(-=QMzFGiw$i)0{|=~b#Gf(qciXS9p<4$UhH3wPq3Kj}1+2&u z^xD#%t7g9*Qg6(C1{LAf@IbH3lijDoqa)tE@lakA3Efqk4XGc#oRWJa2)zfqSrOhnuG>(g!+jV}}`2+>X4Kd5s9}W~Hvt z%@PtlKYw7BB}7%u&B;kUG^d6WUNr;l1&ULhhm-D1W*#Qy;E{3WX|cOBqD|cWdbOK0;s3_gR^sg%BL!}uSkzn`BO@aKGKYsb^O!)Q!(t!+ z4JxBk7iu*u9&|+L1lB{T@K&05T}hMHggA%jo;;AEYF;k|yQ9UtA+p@wpkVR&T6fVs zx+!|IcU^@R^Ifx`NuG3~)TLwi$0`kOkZjg~MR`pbcf)XcrH`=iNg;{G4X>vU%;<|W zjk*YJ(Zx_yt{li~PdBH``>N1h%gAIaB&J`L*1uif7}_O}Y=S}nEd6mpV>3;=JolFD6x+p};S!Tnzs6{NSjr6t7F&!=Dx|8_GJ74M zUaWlsZFPCW2TGP8obYa@Tf^fp+osarOo$I6uWYZq8sBsjHArD@b8~S?%fHgAH*r6X zeN}%SK9JS|m0J$4ob={%5i>Ih8FdYHdtK+>;kB`~-I>Mwf$h3+Gyy%t8Oze$wv2eb ztluD#17;848!{=E#~i)f3s4I1-aHxnU2E_<6X+rC%GIor293r^S90eDL`V;^)` zc9*wkqI3JnU%l?3&tDjV;Q=tcdx8gKdk(rv*EM&0YiepWHRBQ;YG!I{ai5v@=}F7T zEUY=w%8@EiMye>!Jrv3J;@CUhq~{6Y-p=pBXMD!aa6WO^Ep@xJxQKy)-k89F)AAkS zRkF_yCoh^b&%RK#W~QRj=XmmoA(BqHbNN?6fuP&2^}B+E*0yIy>q}%f=Q8=RHYO&m zW+jV@cq2s>Wfg#97sp*GGiPli-44fAPA2g5oazWqTq>|~d9O9`cEsu-kTH%5G8Cd0 zeYO@NTF!oh62T>{j$C+W{I}+De|HyDVr)|p;UN`HY-nt(7tk&0C0$40P?pTBIz>a4 z=S`Joz*`6%@$KFCN~y(s_%b=HY^q)WEv)Twt^&Mgq(FJFCXzGU9ELus4Mb^|2WYng z0}hQZ6t%V0hs&#xxHteh`&VHyc)v@@avF|?*ILwlbdp+n4X)fUi~aOx^~C<`znHtP ztyGv50;q~gN}Rq@VZ1bGRAPM{6th3uoeJ zr?4`{o)@pSExUU9$E{|e5&?R8raaT{R!GEi$0Su8oE5LD6g|$?x>}?ZxPE_cbUHlP z;4FfyGqx2&k0TNjv(M3!Wh~v-Q$8JtGVnjw@+~aCr_?z1^u@!__p-DaVNy4P0p)Ka zq<_5`sK}F|!PQ68;BKOIJdqT$VY!gLl6SOd@i49BHG9_!)K2lr*oS3 zYdongln)&|3UpC_U5jbK2%OqaK0A|dW+Hds*hN1K?gwmmk>VmDoo&I}{9b=kCRXc( z-y{CgZDLq5*=wEq2m-nXi!eTquN(KmW1^zS`8}owOEP>Lk^r7{x%5_A4dv|P*4OFf zs1ZIg)1l2x=eNpOXIp>3Ycn%$m*;@I)xrygYuqiCCslMIc2P^@vCA{vMr3Qijb{2M zwPNX0tZfPoU6GKYOgNtSQ?kVBD5kC$W>ivYxo*aridyZJ1i6pkksQ^lc4XNu2aob2d+q28h*aoCtzi@A^E7G<^fmBmF+W z3aL3Ak=%)w1^QB;ih!kI@4aTguipKmg2@4)Ze{XRrQ4vL?V&4;@_Gzs(`y9AP&D$~ zG!n!m`0Uv;S!5kuC0G_m=oHc5`cXSpDG-+bw@Qb>b{R0|NJuFWQ3X-X;r)M+anGcB zH^ygmJ1RA!m_QzqkmMwi(za-5k^rM+WPQxN&F5!=N=B*7pECEY@Xy5wbt-PR^4-$f z?Cv$>V%NUTd1q8Vp_pMEF(VjBkucjnBT}!Doj!SJdpbLx(}S$K+~4K@UscZ%@1J(g zw(d8f#W%Rv?bTt+@mLRFQ(S;K{IgJj=E2{;9UVF26^E-hm6GEt1`3Zq>T#q{MC{7# zTQ6_I%f6y*U9v*5-q7Ap$2BNv=}>8NLGxDi(HU=0afWg_N!l}@sv7VDdZW*be{?cl zuIb<`T~x6j3#TjKj)9|*%Cz!ED0)kwx3qilZ#37a*z5bX)`wQ(IPB*$;JuXwf(+KQK4@fadI-I-mP=rO+iNo@^X z#KY36>rMePlUxvwK@Gp@sCdB=K2yCT)?4qD5PX&o6~F5)YgI%GmXv^ zlt7kg)}P>hadhq^Leaw3ufLNdz)uaw#fwaS_yEthI=|2g=r0X%B4+ApXX;&~Dx4}v zBBg04pxxQ9FtW!^=aJd{$XEwcZu4x873F<3N`D6jHj6wYB#iRH`C?u8%kT-E$j--RT$wa4S13&I4P|O5*Jige> zIz~tK&6)f00y^z0v^NL<&~A}#iE4arL6;*A41h{L0JFWiQkoMHsnF;|5Z^kQKu3vt z@AFqX!Y@lNypgD>TYN9wB$^&U`&$duB?cqPB#tD8i|`WG7GIcw(EiE66=b*nk(bri zH(8iypsBdX=Vfnb$m{Ip=5)Z}8r0o{SH)&;PA#V6Qdwu3hudWd z{V9aFx!S}JX*<}M$&bnF#OHWKO?JKnw+b{EZWs1+U3Cft3eAmTmF%f1dnqc78$B?& z^TZ^#=i|Aew--~tqQ;>zsVYhSzv~+5IJ2zr>f5*F%pUcf-zQU_4Kp}7IB{TgZZ|+7 zMkkxR^2WXiF`nY==#dZ64>H7Gb@5hhkvMHr+yPCC}2~_7CS3c!-$X}V-Os{OM zi#n15L`FIOSM&7N?(iz`%x)`N4~)8#i?d|EHaX-1k;*Q#vu#vj0x+xE1#bY-JmK`|uCFPB z03`|mdF0xL+ekq@3Z?{#5FQ?@(l{`M zdns5HJTy!~r61%2lauxDjZQC1(-=b>qeKf%@mvo(9{f|0r>YHTMX^SAb8v9rz@Eg% z!wesUn=fuIalc#3Y5lew7gs&oAS{VaQp;?|8@2?1a$#!Y(T!s(w`Hf$Z5!L>W~!6z z2}kDnc6%MSr*NLzQlCHT&7dI}tZ;wB)-XZW?NA>=U+l@c+kx~4b5PN(JBS~Ks>1tQ z88~Mpo5WDI1s&eaR+UxS&J`-si@58iJKTO~iPxHdQbgPi`ZKtQdj|$y*!pE<34vXX zm;EcygCrDNz+VPiz zDIMMEH01X>Ln@TdVa>wQa^gHB76d{svxkGKEB#7JDmP~82>lHoJn*}?_{wMvCIJYU zM89QDO-&?YHOb-=6RjyE^N~wM^K+Wu)|}*x&>H2=XeuZaS69O|S(vZgF6ej?^$zws zzI^$DjL~YGPEA~NK&z?=r+fB1&=mKPizDSQWGOd83k=H(lAVSNE*HFw^tATh?7W;3 zC^HRYFOI^$bS(#V#>U5M&3QLDofO1B*YLXK5%9PSYXJHVHCHZ9Zm?={RmuC8`y;c1 znn9+J%x7rh==dmJHcOGwxbCRDTlUj(l&YB6Jybs!DHlJ3gjOFnPnIHm0%@$Gt}^ry z8z?_eC{g`%Rs2AbIePGIIm)W|V*s|t?ajUYB_K7yffeZqtqoww^#Q5mgTft6QEv@s+*BbfZ z{3@Pm2{yWv_#i6+=n)R=g47#AwBP;kW8g<>>UV5P6AKFzW0|p+j{8jt9Q61(1?apB zMskx>f4qm9MGgwb|1brH)E(#~{APRK2j^II{IF|p=Lb8LmTHf;$Z+-#20rL@hq*sX zhX+;xS|kWY-hZF6^$i=m8P)V*VPPRg$v|V0n37V7ENxF$FC>Nna%3C?kkR`|NVMKd zND(U1=2p{G)%}QFT3SidZCg;7w-uKd8;)ICRrSngYh%UAa-uS3r2 zxl+Lt*7?H+Aj9i^OSX8fA=-3J5YUJUtCxzN7HtMD##w}@5p6<$&$f}UcLkn z4h01(F%&A3G3e!84-&wQ>slQ$frbNnW+tYB)YQ~!`l?)=KTf9{6_i?>0~oinEcRhY z+poT^N0^TiMQnqC#)X8s#a4&M-ShMh#V5e=F6!0+=#;zxnyo7HNi)6HSl*6>eWhz^ z&24k6=?jjc~ARfUe=^`_9YfMD9SiJ{$=@?Dq<1?7Z-|TVrB;W zBl;PTb=1_J;Um7Y36<;5o8Kx<|Tb;cIsxu8$)vYPW0uj6$`stI=(&DO5o#u8}?ye|0 z>2K(!IWrN`g4VC*Kt~gyDIU+UaX``jI(JPwZ~z)85ibkYfDE^#c4kx8%P*PFee|1F ze$COf8to&VkGt+n24JINKDu0X1Va4L2HNAtRPdEv$lzdeB?XA7&Tp;*sHMW}HJgb4 z0DXe47U70OVM`!9n5(zEZgb8)^ZMx@ng}3qK*c>jx)Ga9fv)A4ntaIAynR15H&1^R z8oeSV?EoW>8{Y3znm6N#Y2l+=qkFTqKMeF(RPY?tU|s!qsUk)CyD1MIh@j=oS=)|6 zak3+AeoVMalK!-+GRXcDG&D4P{QTT5bztD$6JVB=o{N(^KL(n25Q6)XueyX`3}%5E zm*R8Bw$`rb{z~=n49{`2Re2ZJ?OZRb%6%Zt2KsU@5C+D>n}&n)_s&lnpKxxe#_p8$UmP zOiYaLLoB<0g-gVayQ2Z`q>CT@tq3UZ@vzOww%=U(HG!r#qYD<=Awc~pM0^rr6U|Lb zmM40yyDK&)8|(d@mk0FYWh-xg;BdrqL9<^qisxPg7C+~Lh;3Jnib3g9Q%I2QS85=^ zIo>}`7O@58W_{g#jh?43mq@EB)(0~J($Wm|_4Tc+@{kk%1jea53C2<3*xENO8yyPC z@ksK0G$2vbS z*e+xQ0r_rH-6_doU?JYVkZ^d%(*8TS8G=7I@Uw2r;F_)Vw!av6uC4QQd+U05v?FT& z)2*h)y)_T0@Bn_#YgmgJF?-!x;I8L+v@u^2Z{CuBLC_ikW%gbrylFSMemZa##{9CG+$xOT}1wd{`km` zq=06WF}mA?!>CA$R16i>pTXgaZa_exAj^1lYHCnf!JoTNa__FdXkVP9Vv4LFN?$*}t60wJzD#>>{%1TQ! z(r107Ul(7ey1G^Z3#yzulA1cd=EhFU6K!oHD+F6u8ojjofia3(adGDHr*x(-Q{Z-L zqE!Noz3&2q@?5}*?+Dk`)w;e!X>iATOh68lkneH*VC&=K;}a7~=Q_Yud3$+JLKS5I znqy~o1nzY7bOTgDLI?e|feF}Lv&kUt>Lh!UNgngVaYE=)IQ zEM1BJS$~~RMTwLAu{Wm1dD$7XKxxmAs^>#NJaS$ho|~~GPn0xJK@~46DW}vJ^e9#) zlMwyx#6(jvi@i{vO6nx1^k@)~UP7!dmm@7(Zi7#7qB&9%zrk9s9iBKv<#v)nq z8eYW#T6YxJfWjWx*YT?L75qD3Pa#*wbzM_4Q)}zz6uYx`cyAb(n4FxqIZOtA91^l7 z{@*l2mXeV?f2VmwJiE+j0SMfhgCG>cKzIc9qd#~QED-+rjSxwc>5WRBH8uz^)cJv^)-p~5Dj&tD0A2X6Z7OlKVtyZ_DB~$AC2r&>^~*S zEkFnXiz>zgQqSJ*zWsv()tGYoU5ATb4}!#lu|4+o_B(M}0_mZlR>z2lVhBi@;dd7b zr`&)f1RJ(%WF+iaLk%ZF_pq?wQ#!loodV@xyz4!G>VRH2^MYbS;N=wTfIi3LvabQz zHpni+tF43H;6q;P0bdwC>bD;eq*Cuj*$kKnoNL;F`;1_SdWc1iSYAHA@W9Cjowp7? z094FlCwD``2wfH^*5$Jxzkn4k;_w|UEbVhYp<-^-PhVu(XW2B*o&nmff~4;4PE>Ss zVZyhc3v28|f55@-6I&xArwYl)GMTp%vGUo^vcH*_-wLMYD$>u#?;RX~rs{`EOZCZx zqw|3bt2<4htjrmpaC==R_vCU?zHKd$gu^2~O_fu|KmZaC3=u~3lK!RcpGPpqT-^9N z*^^l3PuJJCTL@dUQBhF=&3X_vs5@&3z!LSocpJ)#i~~cNn3%}S$_gW5Z=Ra+M07_# zc<_LhmKK~fGc!vO8mqLOieWX7pC;TM%;?B`9s8@dm)mCb(-Tg!UvYy~_6DH_Pe5n` zq3Y`=JDWj;3+)nZZE0x>7~@1U66e)-af0Zp?-~X(ZZe8_`N4W0Ai;qADn8Bu2e!W- z^eE^Rs8}Bz^{YmwiW~{QYhrD@y*Tu!<@-pI)`Lnup5At zqAH3C;B%JOG)Bmg@@a}hvL2Qb5KqQn4pl^;CeWvFY1|}F%ccnMc zO9X21$3RI-@wu=Bn&=Qh)<*Y3+Q_b}%iX5iv!(FU-MP!lOO4`XL{IFT*P)!FV@Xrf zZL+XukwKG)=gF4O^~FpRbURUIE-xR=OLu*BRixjbt*^hcz3sg@#w;b(QRBQy1+TQ9 zn=LkIa$IU}@I38ngW3>7nXe@zB#b-4Lc_x;ggwfOi+AHW&3ERSCJ#jd$Z%DHBl{~K{d4(qx-Eh|ZiELCYno=YT--^Q(lqKW9a7$=J zC?h(x=)BQ)0JD}y(LFHm2K*=lk-r+l?$V~MRd;?vy!~uF)cdPj5(Ow(KyF!Hex#D! zPfJ5{vVjos7(p3j_OADA^1+i>en%f29o^PO7uaS5Wa?*3Io^T~E2J0zxx~l_g4Leh zUOd$2U%n{An}Z7qwipv%(I^ua9(cU(GEwCx7)bl^V-+{Zr2Qz@;M0kMjLZt!h^ROT zF|p5CX9@JX`s{eAP3i}uu_wh^iNFG z@$$L?_sK|4KiQgSS=v`tQF(CpLve9&MaA*@a5iNtsD@gR4R|70Ez^#v&ulEU&u%HD zB;4KK*Hr?D`0hT}t>5Ge@3cMI1IoDsLdgkJK7aY5eJu_6FqIrD?J&c*a5rcdRH2N{ zD!QGLBM^v^l6`je5Gp%fBu|`N~uzP*&T@bUQ&4}J~gxW$fp~hlx|&QezP@50O94?W6d9>f=eivyo3&8_JdAvj z0Jm}br`ZP2#JIR`-@a{4*Qgj6G^MA1gr&g)0{(13Rn@)oE1>woBokmG`V>j0z|*D$ z0)kX-GPAAJ@F#+NRBAoHe~O+UG@6iJ&0`eRXC0NIYN?p;`5o5|4n z(FXOZIEepNmseaiH?%W_SXcn(dKk$p_e%cRmp>UYKdJCTP!Z!fg%(>hf9w6`4FE~I z5kRX!Cg6omIZ~9=kR8x5`hF8g?}mq|*%@m7AF|#$EULDR9!32G1POx>1YT@FKuIMP z6oc*t>5?wVt}3y`E*0 z-&dku$Z5r}eg`C~cH`Pj4Px5v3j9 z$?nR)L&_}47@qT=J~rq=0C|%l2W_XIpdbrNR(5uFTMRFQu)FI@e-2@yzdzA5Ux{X= z!$pP!ET%J2R6!vuEzL+*Hz^rOPKI(;LnAgWj;^3!xd6JsNOo-@>*;!fmI%ltZ4inE z^L6sHP<(DjMH*~qtEtZr#i5KWEe#F~41ay++I^|f5_4K_9mPyY(w(D=MeGT_Gjl|q zq58lNGv5w*bLWevmFMh>T+#x{SGcwF9j&cET`hJu%r*DrBe1J?55M!!(bKC6ei0*V zxPJ#y@1UA`>0=%_N>FqDpsI~Ffb%M`ICp6FlwLai@&7A!o=j2+!V!SE#M^~ z^~R0iVAUy{goBd93tubA6Lhg;c&?zP^zXXM#Mx>l{xxSytM|u!M}f%2d$OUt?2tdgC-d z>UHKC;zIXBF~6wj4&~tcJ(y}~3Z(VX84S7o>dTie5cDhDPn>B2#eQ}cSx&hB`O4VG zY2>gz3frJn&}Fan`{TO0I=u#e3S!EKzF&|p`h`P%wscUVK;S}IPE@n1m$+`X@vaQy zX``I&Ax=504Rb?&frxXqzh?i2!Ulo(vbn!sT3WilwG}Poc2wzzQNY}X8p&Ac5lc*v z+8XdOG-c^F|Gb8dvDwCtUbQ(|324(LwnD7mEvx%UhS{0InYDCcSv>UXW-0v>{Bl`4FvbSA-q%=h{6NQb$r$;v#?{qMAG~b{5`Ui^c zFSldwh00jpth?epL!B!WDY!NxQEHM9y%q6K$ZO0fN_wZfKT3nmhnxYg^Vgd@-(cx} zd;ODymgku-j4qSh7ZeQjo#Y-mIPodMH~#|NgM{oZ@?4=@gi-myPq`(;XG@l08hT6P zf56G%aAV2?|7`p`J#yhW`(=_{?i-)8)6<_kc~bP8Hn~T&;NKD)&$z+jv`52m;QyFt z;Kg;_(R&p-dgA=~f3_NUaZepj<>YzKJ^!EY$wxL5AsZ==f4~0`vA8MZs-msUzzAvz zS6A2JVzYr>*7JBDQ=ebX$Z+U`TSJ>xh-Q5{E!bNdSy);cLb*65)ejF>995gP zV8$wWjXVEA=I{v+R)K&R{!WyH!&3L%v#IQyen79dbNqvXOk#O@ z?=}xuX#q6hUDjyTaG4wo7;eGjS8Z)AEdS=YtqFH5z{8#0-M_N4zr47$yE?QDJDiP; zEhHp_)2Q8bbGiX`=t!~Ieae7|Dko0l{b2r|KYzBiwhHu`hKGirfk~1Aq%=_mzV!L? zXShCi165U3ef>K=b$?+=^(+DUV?I&>hC@)V`%d=s^ss=)B`4=qAWe8&oZI%iBnZqw zG!2F=$H%Vs@83_9d3`J7z_r@L!vm7{mI^Je#c2K%ZgtGjRUR>zXxd~kQQCif->$1> zT&9^>{pHJN&xaoPCp{>mu)I0xdeirb%!}(3GGFK3Va7y;WPZ?AI41I&e_IHCmp$f1 z`ow*lU3))Hqr8zl?P4_ybGN(p%v2mpoX3;1U)OjMnsT`OXQh(>uhR}fEbeF}4{G>Q zGb&XS&Yrb#f}iLz?p@h+Mvd3hF!J*9a&q>xw6vTB z@is|9#?ZfEZw*{stH^5`8yk(en6DGT5Pu>fO2E%wNle8Sru{lcN&Qsv-pu*~yv|sC zEg|z|?%!i$fwqUw>TLQ=gT2?y)|oqxZ{5DFsj1mgx;j=_>WCTVwbBv*Q6%IR5#QNa zeaJo0{FWmnYq^!{nFwmYz{m)DcsRCUg;&*9lx_ZJgA@PQOebbi%eh-{d=^t-j^uq!uSIGR%%3F zfj}}dW;rT~Gsv3()0G3jQfWj&Rdc&dxxi0k0xC%Aog);Mbku$!pPh>Rv8Luv1XsN_ zTyjO^g+|$j#m+0qU4s$?VA}A5K3caaXsPG~CKsf<8H5nmcLP5@F;eik7A%IM-L=gO z3{*9xU0f<(5)1RWEH4)1pV(?S!H5wdqn4}AUgIu0n(zHs)n?k9xMVOH!yvbHt!Ocu z|9oGDybqM#cg4{Y2TiG`Cr4oj)4h8j&s1lNBxbAX zmgeb9M+>4cwLVYNTj&ycllIur4ZBvVUTTqJ<p3ck({SaB3R++gns*0VlhTTPfvgSdRRp$~U)Jt{&fF(_d{!Q_f~0CPO> zy}u;v_%3PHXtQZ?Y-cnHtL87(|Lp;c^tqr5jN5F?+=tCyVYhyrd=fc)Dou;)i|a$~>jeNf0sm z2LyPL6E*C*?hVIAdXfW$JLjXYxHPqX&(qg0h#N(7jdmfskNLX)uV24zCn7p15073N z@TN=5Wn+W?pFe-R&+tTLOu_S5y@{^Q`?%ahTurS)F2i^rcRFV%DOs;k@JVCcm>@g* zM3LqzLhCiP@!?|HR_T=|ikf^>6qJxe4UHBE8CT!0wZ;(>5y7OeByX*imDQiTB0DG1 z5iP8)$ge{a$AqK?p*MwyyGg-Hk|s&=$E{T91U63@=I}zpwyPqS>G+Cl5+$#- zdOy-qyVN3X$@X^Y9yFhXjLy5ucRf|gZRUQy32k4)$MfKh1>CNr{U)qPwsy~@+*W)OqQ@@H=Vb42l(t)JJTHV zjN;=9=1X@|Blj4d^cIL>De389Kv&T9PPU`f*TO;`E@ahM6vf09Psi^#VLy=nDov7= znJxF1sJ=o`no+>wBDHNxSMn6BIr)2m$n@qb6iP5S;fZ2XhN^eje2H(+zt!l-8Q`z3{NJomi$j) z!U(yKoHk5js&NJVvQ+F^NBT8Jc{ogXXTDzFuG6}g@_79IQ6_~jIE`ehqphcmw4;Zw zUA>xj=T2ioLu7dP+`Ja*`VB=Dm9PZu7SyOUi!a*M;4qj)B3L?(Prh8#P)SM6)cNq_ zsaW#nM#!U{CL^;r)2@YpmFirrya|-i1hOuO^(2QqjbaCDwleXjaHVuBCQsrr!6-DE(9c0yJf`;%RGA!~a01TF3!X+0NI zD|uf4?wvLW^L>0K08aiD^zTm3Yk7>QqHc6?*gmJvL2{?LqrK)3Ag8wbszm~y$saISNBzjHp?9vb7ftF4)zp!2Oi8EDPhmmWm`l0DmNtj=O$?Les2+=hG(;D{zmpF3)q@H#<7?8yfz~ zfj^BWH?uZ(;|7J`{_bJ%o-1aoRIPX`T%;Ls>^GH6P=mGYScgG~7>lH&RELHrvSc6N zlhJfmyQyynii3D)ge5&KJjFoHW-E8hrES01yoWDeI^mreOIB}DQC#Jo2FiKO+f1IB z;sSx^fBti@WS4T~3YBPG(0Dy<18btPOfZ`!A2Fj8xKiv4ZmNw)G9y@3b#;=P93Ey}r&Q1d~BU@}33hgWuz-e>A10u~9KU%0tsoA=2!Z0&9Re9Ow5RvZ{#G?A|5 zWItp{JGLeZEVpCoKJKj>LupS4(IPlb@X`b6o8#Ei_hUyBUgYEBT8t;y)6<1isE$BK zL5AKA>O<#bJqpjt3XsdlMk;8MAK&F}d-v#jJOqTiF5_z4)O|*MM>2G>ZCa2~d%W4? ze(=5CRQq?&KH@U9m1qMSWpBSayIwhc1(G#Gis}qn`Vew(;-4{qk zuTkOQ9S;aRF|>RA8vPXK!g>FGX}PI!lG&=K7hQmF*#pl9;6HXnB$l5+_D~{|T(=|M zZK_E+I>D4{IX_+=&k_*cJ=Ja_V*Hnli6EE@Uv(~m+Y45dT&pV3#+z9r zJUXrEM?RekN5d6Z8x20gx4*?fdT0E?yECv;Suo`&hM-BGr*H| zJf~%j6TO#_VXSu(mXT{MPAKc)VaGgCGr?=VD)$(V^vQXiJyR zfC34q?$y-Pjt)L7y|uGHd~H!@>K}%gnu?DKiAvCxQBs;;&2DRMj()UWgVg{0S!mQT zut|9VoFOlW9Gw&&Y7fv7k&-S`^d{&3uxcA7Q4EsHQk-w%)AVbU14$HD#4?e~L2{Cw zh{zF4H>oGeT&C{C;ZNMLxWOF$tE_Brr|jp?7b$Z6qtym0LCdMbrMTZ^1Wk6Bevk@% z)s}J6qlRc~Ac{}+y5kRWyfNb?Eg-bEKIKTnXxQey`Bp?%zQ6N26K-dzFqHt`gYh2E zdULqv?Zj8=B^!%lm62Xv$NR!OeFCG+%{DvfSW>!6;^N}$6ZDi0tFwRQ1zqgWdV^ng zY2EV#9`W<56N0_yNhE$(SHW3>cAYo?L9Kuefb=H$)}K0gB7}&jwoY1M9Op3-0Lum{ z!?XofR&G8`leRT(YA&m1b`sf3+ZcE>_@snGMdjA)=HUN#XEIor7q_`!$XL%S9^qD~ zuUgpK`2xG;a&h<3nxilxR9nO_3{}){^YUuBZ!`e}PwcB;0o(b}hJeV{!1i`Eetv#= z3x4-$L;?CQ<|b#SvloaBf}GyYgK!xD`ZsjZE>5maj)oirJ4svZ~Wc>c=djy#6G--CU9EiKv?-;2nv||M302%$Ecq_@4)ug)$Nw7 zlI21J$Avr{9FYdQ(|e(DLbiL;6I4yvxo&;zW|=Xj+Y#m-_#_{W3toAW!{Cg1$$QI8 zUO?Kdx6kAk5WrwRfx@7$N;!fj zC&v<0QzimG|NWtJp5AooWsBm%Xr&a1k*Aa7nriXGrcMTcAe}T2o?- zh;@zrYh-zK7G85h-93dVVhlzUa#Dj}GP|MP>u@9{VsIcbo-OAg{xX z|6ZWZ4k>9gvbz%sE@HwDaZb2TqVs#VU)6e&k5xE0*)-~Pbhz`u;uSc4k*rjkW(gPa z5r1-e`na38gOZY>`nY*?>&nFHY(`H9YU8b;Qhye^FlKgkFumdHnZ@Eq{Ef*$Y&i3r zQ9yNbYxA$7-pl9}QgLxfFCl32h^gE%v1@2ED>M$ zl+(MXrBC#UHNZ8!rPJ;o|h6n2Xv>Tv~;XMu{pM#$Nc<6 zyz?k;^NJ{J<}@Zf1k+jHXAD|a*-EeFJsgx5mfK>9c`zjav~&7PgmEAoUOe* zP?>CC@a$n(D4licNwr3%R0ygFkXT;cQV}CsGg`(MCKH??*c`u{1gsq<8=5rx!k1RJE8kzvB!sz+1l zi2LO3=B)kZ^=OG(8hMf^)&Yph;^JbI11qNful&MoHidFsx>rulB{%u>zXleA^}+HU z9Y3_7(1C~E57yo})ZKo6?Y_`XL*&Hw1v0{o%Kdm)P)0@_U!bznTUc)n7J`+IBc+(%(k$*z-R4&X9Vh0NhJI~brX&i8U{yOV zad5M-XO`lv{hs~9ZQ}{lPq(%O|RR2ypS#8Fvp&?y}j*onO-6C!c{6qrxR~sPjYcIRtGR5 zUY<+vAuTR1Y|*xc+}5cU8i!;)T4fMZE_*L@cd^TSKOU93y?*7&05svBo%dc#NMt?& zZ*d=Qy0#AXC-z4Yl@8`2qQMd2;c!SA1k-k-~MKblG*jQFZJ~mbac9)d(!7n)eQ31%42`{;JOG{XI^3i zBFXX{%pBp3Qp>q}bgk@;lwfWOTf86P$>HSSkPPJE;faWd21g3p(w4|PNN*XHK4auDTN38tAyt1G`&a7JMcfy?@L*(_yQy30e*flPfip6 zq%T6)1I;pXTBfQ8px$^N`EJee{`~T#70O7mo7BGyR`zHrZUmAPYLILnZ>?Aw9Q`_y zQW;A}^O&0q{esL`Z})6$AlEzy zyo>NJg4#l!MObL) zOqoyP*>4sW5)_r_>h@{CNM|s5GtepeFmK- zsk)Z-_NRaiXrqzw)HJBaIjBi45O{yj{a6lnv6%st6Hw7%yWATkr)h$j)FR#616vv@ z_LubhO4tsHzQ8jViw}z%Uu!O~va&)cUTQI-vy3)q*-I29kc@uB#?87mId%K?I-Qmd z%!Vfc8%ajXcL2pDI7}!#JzLW>9<42Dk|=y808>Gg#;qp!8wn{?a^bSmwpE5(mD!oK z|JzU+eU`xS-`dv)(S<%QeTh7XK9j5BJ&S($@L?4Swc`vs@hy-x@@$g-&4XH2R-MEh zg2`RRp5(v?Cb(5UdAO<)nj`h!Z>zw!v(pkZj>fhCV)P=1BG$#BzqRACHk}~lIM>Dh zWv;#6FH6FwMK%k$f~jfzj%%`6ebVh8zJwuXo${zVa3Fa<=!1etq4cBUFX1f($kn7+ zs;1^Ss5*G5F9&Mk|F=xQgVGe#QqVMWfy{-mK7hS7cXR=<)jBd?^QK@yxa}>fAcVso z{oMu$@)(@PfFUU{ox_g(f@Z5YrP*RXu*?PatvUgIk$Df|yj9m@&!>62uWt9>92=vk zpdc`lp$fQxY40)(TePZ@lA(!-)1F5CHR(2sDqrdUUbh$+wJ&q8aBy&XeN`NQ5Rhi1 ze-_7J>OPtBzX|KdxgxWXMiHGvr7W*U(X`O_dchrhnVKe+{5(g=adl8jI~74&ZOYA1 z{4ZZCElAOgJ7L?<2`9E}$a0vUh_7YDLr(PU^72_1cZqSn`Y~>_+*d5~zu9gy8%AS- zE09?7>42BS@B~}eOp7aAdA(|SHx;n2)-BKiC^Kcv^vnNoT8vOkR$5jaO&<(Om#ew(PN~XeXN)_z$+&h+j2G( zXb~ZoK}fj44{d% zI0}E!A42rS@oXp?0bsd6;^7s3J#?%9-YbVZzE*6ozl(fYg&jr5&yy(|a&kZ|Q!YLc^ z222Y>x@#9PN!LWc5hgWf*Zc@4fOH2f8NlE3F`1mgFHNWo@075f@D$ zzFUtH!4K1)u9GD@eL|%zL(x!4{YH?_-L(%wTf|9zwG3r0AB8Qw>{bkyxHoGPaQ3Ht z0QE?!O`6Y5^2=vuC}TabAKuFAsczG}h_|F(HSiK{YdU*Ri!P_aDO-x714~~^QjdaI z@`Ju`nBe7hio#=_hW&$=?kD@llYGE`&a9SBJd@~9Ecp*pzKZQ=&4&}DUllK!;Vf?T z*4qh>$e~v2DYD2)%asU^#FAfEnr^P&8}Pgtet<10!;7Zlhe_XObkr|({8U^UtHpVw2(e0A^Zd2xl3J+O2qzcQ3A-dBWMy`?Wfhy`#20I@GxF$M8iMHvV>6*)PWpPOHFvUgsh0q%HfX{9OjicERx5| z?I??v`8&-r^l=d{Vx|0Wa_@&yRxfk0S8c6`Mb~IC7a8h#9(zyZBCz^)ZJMyGOZnvB zZNR~vr@x;$JhPnG#E{a4m^j=EP7}(qJG^)i-y^Y{_=Do@hP0G!WOr zgItaP5s!AiKK#upnWMxK-aMZ>9g(cS+-GVppL@`Wc#z$ETISM{O7dK=l6S7+tQsPA zAy{xG$p`%DA+u?b^GDn*;H#HURaDhgRaK5(@lFp&+kht~Z(n{yYd`yeu8aW* zj3H|8__$)ZDSeTepMRt&O?rF7O4xl`-`d*xBrEq%O-;3)&mOREL|#chegJ?qejJO3 zeDqeV6Yh~z6$SDU<$bm~QkbqEGv=s`1%HW&S%Gx73O2csk!ce5IJrU3VL4L0l9d!BsP}th!es=u^X`FHHPKKOAJh zMFUDa0HjJRM!*5J0{pINV~`tor~JCf?TQvV#H%X%q}^g4@hnVio{lVMDy@Vpb)iO} zPFWoJMk;)Q}72Mzu|!sdPsKa$LZ~!CavgdI9g9NHc+jFss^!Dxv*wh{vEs4W@bs znzQUB&WyY^rwm6c8E8(Vh4a+VQ^7Qb-@(sq@NshZ+qvo!0-z~h=MDJmV6gMFwykul zYiln12%W}Ud;})a?F71wSOKTuouUeR7Is-tL7G6rlVL>+vaxwa?3W^2UD!*P`~s>~ zG&*kI@g)EB=~S=j3q8M~ox6LD3xjKw?pz)PA8_B>xN!uVaihnr3S}gS)g5ze`S~+d zXlwBc*k+@58_m#`DyZd1ZU(ns`9bK{h&dhgBV>FO(4n>QLQJT%F#5x$+@bQ=s0KqE zkNsA?H3rSk4yZuApFA}F>8d0P^DI>ga~W=zX1ExwuugjGS%79>ZVD~O+-(_09OF$e z&Am+5K)e1*_|f{3D!YJ?o7%IF+V*vo_G<$3pJanOKFohAxOSp;2q0P*@-M0FILh6< zGvUL)K3ZsmgkM2Ae}AnqbDH4(_IraUfuy5+-mhwHeS~- zH3Iza^zVl%P&NQS-4vv8@9-sncFCq=%u(p1_u6h80%e#e=4OHZ(mpJLN|%Ls!1%K5 zU$;=w_gs%e_&xp)Rg)@dGLqWXtli)0I$ut7MVl}rBI0yqxfm|bi#$Rp0=WC$Qf53n z3E0c#jpOaPZrBnQrDIbr8ZvsmZvc}OiyJZ4Lsc7zD@*$M0uJ`7vL6Xb6vdD7X?5Cd zfM;y(&Zqz92lVXW@$s@68fT9T5%nQu6Gp4$I3H!)uhyvgxz!C0N`LRCA-lWXTY-wX z>UCEs{L29<#i91PfkC}}8~4;?ZGOJupv4O?JF@}vvZ)J-GAhs&+zKs zA`w~%J+1)(Z0KS^(si( zYl9O2)&#Wx2k+kMX2(T_?cBLJ{e|xd&Mr>TJcopgxp(dyeQ*g+KNybe<_Q`#q-hcoZns9Z-Lp>~=Q zV(coqb#SL~Vs0m!3-dK~>!(f)>^%%F`j}kSu?nS8v)RSPL6mxAZ_$pZkEj{zB|I4x z^zWeEig!|O*opPC1(}+j{yImNih}B-#6k3}X|z}l6Z6BXBEX2I_bs!km%>25&-4atji1u1I$DQKKFH zNyCDXpwLXz5@)>o=Amk8B(^HzA!=o;rv zOB(|)XiIam(9vum5PU1{>L$Yz?4Hz*bq`9`DlLT0?JxFe6BYnm3jKJ5rR7jF_`) zf?JdNzs*l8PUxI5`JA5iTx4`r?1)$nLRD-!N6Ube_m60{xojga_UmdpUa6?1G;xP# zc{GWglKrU4A8QLgg{`UF2EB*VasA(c`DzL}I`z5Bxw&l85(y5F3RqQ-PJ)GVvdixP z2}R(74eRZVt~~b}#&kndj%iM#EI8o9nVPCW1*AvtkxMdmqce96K|S8@i>}-yUFUY{ zK7ewic!j6m@lyEP-7WDB^FuR_1SBg`D+)VV#?<%HmGOm`*gVkAFgxBDbYm=6Q!-5% zv_?XQizgJqZoGDjKWHk>;mKTp+TKJByzd&sLxKeaki!NlL*;?{=|=l!4~i`k&9k4= z?DF1}=l$ZO<_Io&^B~#GU7c5dP;iC!Sj!ek?t=V0+l`4RHKBWg%NZCcBF+94lV;Qc z6Fs2)a6GQh0N$)W>kb}XD{%AAqJi%Z%jiK4PGiy%oNFiY`qZ~4TK*g?+$I3hc^?U` zwww=@eh}{Ov^~K&7L^qQl7vm@zky|TTz9PxVw)DsuA)-1cfEgwb1MMP8sMh)0*yYu{C#|iiCwtn!+=2nalH6_5DLYU!-09ecB^^)L9il?jVsP^b?ZMaIjsv8 zZu|Qe<+tTksKoDjK=)sT6qI0KZTVhfw8EYicVK3FIPnw@FM7=UXh~g8=y z@IF^O>_$fW%m&_y$E?5K_t3*2n}#^oTf4-{uMqbR7vEI^*7vLCC`CLLkg5IIot+L>7j`UrB430@Gxd7<&Gp1`YqOsg{ zQYnp>`q!_*KGSfu6aY_EnEtRvS0>FT@-FTg9Kqjv=#` zyX~-w7kVz^0k_5M+i2J+w-wGGr)@TY1cK`a?VCgJJPVY$v@tRFuRMkOtmFAXw7zc9 zrdb>Ku8B1CT)zI#S6>e^Tn~5odBdWD-?8I-W2Xez9C_~#c>F_R@0yz5`S4|Um z5B=l!csm;-qc!f-qv7t|HccwL(MB4>CaDhkFy(k9rn`pStHh;srKbt+S=skRpYns!6&BYS zoL}+ROt6GiU^F34P(DL}tA^^Re?UpTYLtCSA?;5-sVv4Nbx?H?Ai``Sc87BPy9j3( zW-0Z-SU-;vbzpJ3>VACjmJFP)7?BZn!z`}kIBV|J*p~{1o0rmee?$daxdlH1&18R` zy8YeLr0{UXx;}MbKn#I^gX(Bti$OVCvr=bhUsz0|?1^bFVTzop0iw--AsbJ~lgo%M zlY$Tj2~8cYgROCAf;O)MiQ;hjTp6>1<~ul&KvqKzE!*6-1D}T83+geAYbLwNZS%rQ zF+NVPP<5ORZ^>lG?GVtU{c+y;{)FxR-W?3Efb9@YC)jaAJ4GPHg#|7V9O+&v@Oxq+ zFWfTx0;b9ZYFqyM(r&%&?dyQhS(JT*haDfs-LsR2MUVwz&ATj7Q!eQG7jZVOVf&n$ ztRt!st^3&yJql`3HamB<8AJQ{%*R~%GrfN8+}MAZ@~EHB{7|_ixI$-_@5xn}mFJZO z>{-FV`w@~W5R7P(8fkgo4}R6;--iQ9zN>?UQ;=7};yB8zuwOC6!{ekg(S!M?YbYe4 z!>%S`1UYh21l?O}lyq4|#rI*5qo%@B1=F{)&Qa%($fIVXwTJU29bM}Mm{Lhn%4(BV zFWy2)S{7WIr0iW}LW7slLdQ+cxJr9#Ypsge7TdI7^P!?dv&i;&Ay~WG?$wj48OhlF z_c6f69Zq!!oXqCZ#YhB$FHbUCJVH<2op&4?-gFk|0#^`jlA#Kx8R?eDXnF>re6wj! zpG@`Kis4qwEy!!~oT&-?ZV&JL)V2?O!pG-&(r2_F#lR05YzPg!=>MPSTH&cq_{HxN z85y|$$+iEh)=nh_aWtm-WO;N+4}rGtq|<}!yL9LT?{vJmx_j^w+G^{QJm`NjumfhD zAHPChVsMQ8lC6{lSI8sCLlcM`mpe^kdk`y_N|cH{OC8!Nc*MHt{pNR5^Yt+ z7eEm8=c-<@=7Hl@0|5@_EY3dMg)Rsx-822?@m|(353n3tVo2c4sad;|>(Qa1J&UsY zeJ9_!s2Bp<-(=vJC0zr2<-lrsbTKha(!t(XQS1V=o zN?xgAuL6FtyM9BY?7oZ+u+5)K%SyFixd0Z<_xWB0+P88`W5dkm`*{jdWl1TIw&U1$ zOIaVG)pUA$ETUpY>ZABZT6WLg{MhjZudS6g|E!mT@9@NF0sm8SG-D zU^hkW1J4ibta|2?2J$|_YE7)$;*SK!2iOd&dW35R?2sSyHq9h!h7fc~85bvi5n_ zmYKd#t^HGHut;c_;WTvHZgZTEn4J9aJ-tv!Xk5gXDn6muWx=pVTUC)p@JMJo$|R?M z=@a%~w>CY=w6m`Kc%C*7#j}tCWuN34$fli7%Z&h; z4+K@H&XH9JxRGHoZ7ZGCV=U~#!nmArvQgpY4d>-fI;om}^{svH4jwnF+H-hETx66RWz-8E4>Z0lQbj+eQMgR3y{ zbv~j%14TtgM|}Ny(2|F~d+*+a{lcT|XE2eFJW9sthW*dN!oX56;ES1W@(Q*ak}g7m zxpq&G1Gh$YPnyQkLc3@~4`eXb*V5dp-gS)*Xo1w_>tTvyObO6jo5=qDHId8oTpPp1 zRnS7Ubf`M5e!AcTBdg#Iyf!;aJ&6H_5@mqPS7z4M*BvG&rhR=fk5c5J#)i&EG!7K#hQiqH!N>c;`>Q>QQYw+> zfmHqe$Vsi1c9sH?D{j9JNI(rA8>L>;GH~)4T1)Gdsw>Bl(!yeKoFIPLuEHFt$!V(oqnR z#|~ew4@=iBUuE;8cItAp&5d)aWi5B8j+R60!8PEA`6)N5A*2c^`K&-)e0!i@I(b`Z z*^~TajmZD=tUax}*erXprVr>34KwadW`(1iUgQMZ zIU}l+BY$?KC=JfhXgX%y@_KZXZfAjH{t|VfXjy!(C;*@Ob@lE*&bMBhx_V zlxZ~jt=8MI`{PV2zg8Lix5{OHy6<7)iCw>GUN;EUtD;KfLl56_^BohG&D%=M-7>Sg z0I8$4HYnWk5;1=XFyE2d&Qe+S&aOwdx5wSlfd5xa!2lR;zh*=&Cp0SnY4KsG3Uw1j zvcVi|n>e$*7yt|Vp|a_fl}fuMGA1Ub)G>A`si2vrKtYGq17&U2H&RmE1Qq~&RXXN{ zXDQ)|rXxw|hQ|btrR1@mn|c7SMLs-qAK8oBALk#nQ`4_KC;-jYglpydp7|Uyfk%A5 zC)foA_1dECMSMFb5jT5anrN1vI&CRD`n+@u)SY?`I?O@4)S)duaGr5jclir$$TYk6R=*x}5W6Y1@R zHVP5Qs+XZ<7#M>&biG@**!I?F1*YRG9oL4t}NTJDRT)L^A0{WPxII?#Dl~vcx0XoetZSXl4Qm&+h`etto;QQEnlYa5{7R@dcCY08J0k96z_(mumn z$^Un-1oAwLPI0?;-v;UIHIav!CC7o~c|<^}d2|_bQD45~=a<(Or<}*GdsxTf`NaLW zm){a?eR}NmC*8Qm4J7De2k3s2RRzMS>@pR7YwR~_u0vMx&WU7`VGLl zuI@MTTaTGCko^2VqlL|u9?@u9=D||jI{*lE$&d5cqLF+O1>03^fbm8jdBR@ zyeSB~;iyr3_|Fh`;p)*QLt2|#?_HzbyAwOVn5%Ckr12%N_Y*Q!OZBwdwYc(T3=86k zcNhOnX-?p{iQbo1Xt{h>?663MU59H}g<98NF}Ilm32c35l!&oZe)71PKS|}9Z1x*J zIm1QPw}HRz#K{qcq{~O(9^ckVtB^^j*NtQdO{8D`ik`^~tR9`frx1G?kv`)eeqoKs zyW;GQPd)2zQ% zAyWQg#7hL0XDKbFr8xfRS!h z!UC85agZwjTz5}hedPD=j~zl-W>!H#m{s^akq2@+U;)mZJDqr_8W9`&EjAYU7UROr z&Muud5L3d_=X~i098giL#v0j@W1j6rKCqR0veIYf1moCja0($kjYGC0Mhku)j=%t2 z07&IQvIVvuxg#|fK1OrtH#2Nc{!E%)LA${L^kYT|?h2=hJ&nN!2P@QJGpMiL$fZ{)S90}gr&NSoIVhIb|diHpd!c@K9Wq%(iK=DBI${6>h3 zGF2q}AKn{AM6xYj+ZQWZL5)b$&+RtdEb!MaG|iJ-lh5(GNc{`#iQnY^P6VlCVR3z@V_ZIRIq=!?TIyc!eEO)oPZiw;lJX$nesq8gdES|@*B z64{yJKnbz3Y7#O=4iu%7ZIwRH*;ck%v@!-ATh{{#;kRRy-^9al;yYjO)3~Tmp{9|L z&2r1`dSiwj@w}2&a3l;YP!#gB9X6h$5ffny`(3m^tUM6k}`dGq`~JzBJg8IvG`FD(r9m>m+mSpUPv3 zC{o6filM;3{PXJ*tFO9e^ zt6H4i+IG8zheGCUbAYI4nexT*nkb!*I_oZb!BqF719YN`!#gn8$ONPDg(%1P{gX*c zcMQf!ETe(Z)Axg$SN-sv7_Hj`rkKTtM@whsq*QDig~Q{2c4_b4DxhAv5@D9_p_Qkc zrN~7ic`ua2-01Lti-%{3<2({^r8B*ckWqksg8h2@=}}D7V@`0h8SCqF%h<57-F~O| zJ#i;t;x?Fad=PMNrN$R|ASg&8ZZ)}i(BBV7vwtGLO6XkRF*3q0w&S;GN0lN1bH+cf zGKu&;H~KT@udQv+NkQZ##e2~3{@t_QPAeB@g%{%DW(V@pT5KE%X=esz{7*QVElte1 zXSK(Cve{}k4$phSVl!)&~rQIlg{U<67jva z$*r7RJ!Pz{{^_T_PK|Vq3>Y2#XS91(Wnh5)1)=q^Yk}6O`^`FW;bRrMQxTy+F*i=u zT`Q^nu=~loC2JXS3Olylwe?%-6y7rc$>x(Y_|&1E2n+3Rv$r`^4UB>_c@Z(6Djg;lzS5_Sjjud)-qFCpfSR^#+CQ};srFjqw6 z)3>O-xni1n88yno9DEl-t_^x2hO2kV{O0&v zqwKyD#fmVxJuMVQ{MnKx?UmcS1`JgbZr&DHJ^t&l!03P*mF zU|f+OeJ%N~WfU8G;f#u|iR&uspAT^o0gjGGyG%oK=OP6dJ-mBzHkaB+7yYwImb%En zf7U!3|8P=7qP$&q(PEG0=~pzvLR8scbaX}d-=gNocSmXNy$UK;%lyS5iAWo32eS#PM0TP6UHf zP@Yz0f!;{OC7qe%TXhq!#Sf2KRY&eORRjgKgZqLe|M(?Z1{(TP{pL*lY(Zv@s?4O> z2CC_y_mn`hWc2ZPAE?}Ho!M5t$Ih!}bLL@>s!l3cir-yTbFWFM43soe%A?t9zPj<@ z{RMyI&9yqEv|O$t@t+)?G79>hT^2E^r8W7E?a5M^b!i{=bN82=z9jitg`lQxr-#Ye zlTGj9-?*C`NFf@@X2*NY^}XS?D3kvKBNKneiT#tyJr^FK%!9T?a-`IWdl<^E`HAcFO()<=1<yMdbH7(;mgfs%ou`3yaZ-_L(OiWCe?CE(Z8O(gJUcMZ>Ko)A7-)TPkm_0cDXB%c zsiDo){P5dFVlB0>u*Idntu5#$D^V)E$}^r_`JX+`JFX9MIBmU99(a76NHMFA<`nN< zeTPAzDwGS>*3!yKN;(-k^Yal)J-1DO)(S)-$|mQ&TGw2-)rE3ly|igN^sv9)PlqW> z=|dSf9)-Q7;Hh3RJqLdd+UigLPhsaCmE;+KaagTdma(N4sdW$?o26{&%GAKj$V)44 zr8OfQTg=SC36Vkxmq$5;LQJsKiZxS9L`BS*n8;?{R_0}SOGQMyU-FV^a@mVJ{k`X} z_k7>`edm1VJKy{L@jlP*ff|bUycdJ7C|J!4UwJYQI<pUkD6S6)~d^^SmhIwc9+(W14hs6P=4J8r*ZIk@J#k z<6cr+UTx5QtkHdo$NvI?Qh0-d3o&crb!%&Pf9vV1V(*;R4asZh)B6m;Cy{(#Nvt&X zXDck{$)S#1^1!7lq~o@#YFfK|hLvc^%2zy7VEC1cyJSOqwLK|yW z!F0)1nH=0L|?3rLgZ()Ok$==)AlbqnJ zxJ#)&l*zJ%4~WXCc>T0dF5>G6$KC&VU@iBnERpHY$u|03f=jKZ0XD(>X7YeXy4nt{syul zd-Gk_fX)U4`1kNQX`sUJD0uI0_^e*AoJh-}o)W(lG|5zVhgMfi8kgW+IUlE2HF9(VLg?*sn5kCBqI0*tW?_w zOvhd3^|QN_`#4=&EI(n`iVl9Xs8mzdegxeO&4O>$Uzt|d*PjRyJ567Y^f;%In&Azy zd_WfOh+ULZ6RIDxBxh=7lnZZaIwFl%+kYx8uA?23z)`XTXahTdVmUQT$r<+^;x!*g zV*k~hnHO46I5|(u0oGE1UdER&gVe6eh@ONYhyD1>L1#uZrygK^&-WH4<-?yH} zWaz>H=r=;{tl?ph5L`{t!)5!2AxSO$E66W^pA9&ROK=fV%~<2)%(k8?;(7?-vU%ZZ z&LxqkpSAR041sO%uF+l`vRNDLT25Z|3xms+n3M*tr9YB8_v2o8rcWu8MZ$r@K#9x+ z#=*>EU+X>>PT_2{yM>OP_XuT~?*E;wQ3FuVPBw@}_mf)yGa3|!N4YxkeeGd5of$B6tSX@Fj0BehnhxWPEo_E9 zdB1;d8<%8q^#Uatzv)5)x1wp-x(@VmtO{psA_~=ImQeNqn)JUDm(ea~mtiG4 RUd)+p;dkV?Pmwp_+P_?H4eI~^ diff --git a/frontend/__snapshots__/replay-player-success--recent-recordings--light.png b/frontend/__snapshots__/replay-player-success--recent-recordings--light.png index e46ba42f61155616119cb10163121c1e6e7453d9..ace7d3debd600750417502215cd83c100ad49815 100644 GIT binary patch literal 60270 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 literal 58595 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 diff --git a/frontend/__snapshots__/replay-player-success--second-recording-in-list--dark.png b/frontend/__snapshots__/replay-player-success--second-recording-in-list--dark.png index a8faf2bcdfdb3693c3fad25321e7b4da53162def..03870e07340f4738efeedbfcad141696acc08082 100644 GIT binary patch delta 39347 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

U8V%)?^BIz>sxofz_G3$CcvXfYY02`mC%YqD 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 z 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

D&@FCehlATD*99IW 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 CCxjgU delta 39324 zcmagG2RPR68$PU3Nhy^SN|ca{%xt1zXD1njva>7m(?G*2BOyCGWMxK1gzQyDLdeR_ z$aqin`@O⪼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 z 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 diff --git a/frontend/src/scenes/session-recordings/player/PlayerFrameOverlay.tsx b/frontend/src/scenes/session-recordings/player/PlayerFrameOverlay.tsx index 6337aafc995af..c1c68eac5cbc8 100644 --- a/frontend/src/scenes/session-recordings/player/PlayerFrameOverlay.tsx +++ b/frontend/src/scenes/session-recordings/player/PlayerFrameOverlay.tsx @@ -5,14 +5,11 @@ import clsx from 'clsx' import { useActions, useValues } from 'kea' import { IconErrorOutline, IconSync } from 'lib/lemon-ui/icons' import { LemonButton } from 'lib/lemon-ui/LemonButton' -import { useState } from 'react' import { sessionRecordingPlayerLogic } from 'scenes/session-recordings/player/sessionRecordingPlayerLogic' import { getCurrentExporterData } from '~/exporter/exporterViewLogic' import { SessionPlayerState } from '~/types' -import { PlayerUpNext } from './PlayerUpNext' - const PlayerFrameOverlayContent = (): JSX.Element | null => { const { currentPlayerState, endReached } = useValues(sessionRecordingPlayerLogic) let content = null @@ -80,26 +77,11 @@ const PlayerFrameOverlayContent = (): JSX.Element | null => { } export function PlayerFrameOverlay(): JSX.Element { - const { playlistLogic } = useValues(sessionRecordingPlayerLogic) const { togglePlayPause } = useActions(sessionRecordingPlayerLogic) - const [interrupted, setInterrupted] = useState(false) - return ( -

setInterrupted(true)} - onMouseOut={() => setInterrupted(false)} - > +
- {playlistLogic ? ( - setInterrupted(false)} - /> - ) : undefined}
) } diff --git a/frontend/src/scenes/session-recordings/player/PlayerUpNext.scss b/frontend/src/scenes/session-recordings/player/PlayerUpNext.scss index 1d573607ad8fd..b85d735b176ba 100644 --- a/frontend/src/scenes/session-recordings/player/PlayerUpNext.scss +++ b/frontend/src/scenes/session-recordings/player/PlayerUpNext.scss @@ -1,43 +1,14 @@ .PlayerUpNext { - position: absolute; - right: 1rem; - bottom: 1rem; z-index: 11; transition: 250ms transform ease-out; - - &--enter { - transform: translateY(200%); - } - - &--enter-active, - &--enter-done { - transform: translateY(0%); - } - - &--exit { - transform: translateY(0%); - } - - &--exit-active { - transform: translateY(200%); - } } .PlayerUpNextButton { - position: relative; display: flex; align-items: center; - min-height: 2.5rem; - padding: 0.25rem 0.75rem; overflow: hidden; - font-weight: 600; - line-height: 1.5rem; cursor: pointer; - background-color: rgb(255 255 255 / 75%); backdrop-filter: blur(5px); - border: 1px solid rgb(0 0 0 / 50%); - border-radius: var(--radius); - box-shadow: var(--shadow-elevation-3000); .PlayerUpNextButtonBackground { position: absolute; @@ -46,7 +17,7 @@ left: 0; width: 0; color: var(--primary-alt); - background-color: var(--bg-light); + background-color: var(--border-3000); } &.PlayerUpNextButton--animating { diff --git a/frontend/src/scenes/session-recordings/player/PlayerUpNext.tsx b/frontend/src/scenes/session-recordings/player/PlayerUpNext.tsx index 669dcb5f02b29..b16df4b1722eb 100644 --- a/frontend/src/scenes/session-recordings/player/PlayerUpNext.tsx +++ b/frontend/src/scenes/session-recordings/player/PlayerUpNext.tsx @@ -3,28 +3,39 @@ import './PlayerUpNext.scss' import { IconPlay } from '@posthog/icons' import clsx from 'clsx' import { BuiltLogic, useActions, useValues } from 'kea' +import { useKeyboardHotkeys } from 'lib/hooks/useKeyboardHotkeys' import { Tooltip } from 'lib/lemon-ui/Tooltip' import { useEffect, useRef, useState } from 'react' -import { CSSTransition } from 'react-transition-group' + +import { KeyboardShortcut } from '~/layout/navigation-3000/components/KeyboardShortcut' import { sessionRecordingsPlaylistLogicType } from '../playlist/sessionRecordingsPlaylistLogicType' import { sessionRecordingPlayerLogic } from './sessionRecordingPlayerLogic' export interface PlayerUpNextProps { playlistLogic: BuiltLogic - interrupted?: boolean - clearInterrupted?: () => void } -export function PlayerUpNext({ interrupted, clearInterrupted, playlistLogic }: PlayerUpNextProps): JSX.Element | null { +export function PlayerUpNext({ playlistLogic }: PlayerUpNextProps): JSX.Element | null { const timeoutRef = useRef() - const { endReached } = useValues(sessionRecordingPlayerLogic) - const { reportNextRecordingTriggered } = useActions(sessionRecordingPlayerLogic) + const { endReached, playNextAnimationInterrupted } = useValues(sessionRecordingPlayerLogic) + const { reportNextRecordingTriggered, setPlayNextAnimationInterrupted } = useActions(sessionRecordingPlayerLogic) const [animate, setAnimate] = useState(false) const { nextSessionRecording } = useValues(playlistLogic) const { setSelectedRecordingId } = useActions(playlistLogic) + useKeyboardHotkeys({ + n: { + action: () => { + if (nextSessionRecording?.id) { + reportNextRecordingTriggered(false) + setSelectedRecordingId(nextSessionRecording.id) + } + }, + }, + }) + const goToRecording = (automatic: boolean): void => { if (!nextSessionRecording?.id) { return @@ -38,41 +49,45 @@ export function PlayerUpNext({ interrupted, clearInterrupted, playlistLogic }: P if (endReached && nextSessionRecording?.id) { setAnimate(true) - clearInterrupted?.() + setPlayNextAnimationInterrupted(false) timeoutRef.current = setTimeout(() => { goToRecording(true) - }, 3000) // NOTE: Keep in sync with SCSS + }, 30000) // NOTE: Keep in sync with SCSS } return () => clearTimeout(timeoutRef.current) }, [endReached, !!nextSessionRecording]) useEffect(() => { - if (interrupted) { + if (playNextAnimationInterrupted) { clearTimeout(timeoutRef.current) setAnimate(false) } - }, [interrupted]) + }, [playNextAnimationInterrupted]) if (!nextSessionRecording) { return null } return ( - - -
-
goToRecording(false)} - > -
-
- Next recording -
+ + Play the next recording + + } + > +
+
goToRecording(false)} + > +
+
+ Play next
- - +
+ ) } diff --git a/frontend/src/scenes/session-recordings/player/SessionRecordingPlayer.tsx b/frontend/src/scenes/session-recordings/player/SessionRecordingPlayer.tsx index 5666b718cb5bf..6b28feca120ae 100644 --- a/frontend/src/scenes/session-recordings/player/SessionRecordingPlayer.tsx +++ b/frontend/src/scenes/session-recordings/player/SessionRecordingPlayer.tsx @@ -92,6 +92,7 @@ export function SessionRecordingPlayer(props: SessionRecordingPlayerProps): JSX. const { isFullScreen, explorerMode, isBuffering, messageTooLargeWarnings } = useValues( sessionRecordingPlayerLogic(logicProps) ) + const { setPlayNextAnimationInterrupted } = useActions(sessionRecordingPlayerLogic(logicProps)) const speedHotkeys = useMemo(() => createPlaybackSpeedKey(setSpeed), [setSpeed]) const { isVerticallyStacked, sidebarOpen, playbackMode } = useValues(playerSettingsLogic) @@ -185,6 +186,8 @@ export function SessionRecordingPlayer(props: SessionRecordingPlayerProps): JSX. `SessionRecordingPlayer--${size}` )} onClick={incrementClickCount} + onMouseMove={() => setPlayNextAnimationInterrupted(true)} + onMouseOut={() => setPlayNextAnimationInterrupted(false)} > {explorerMode ? ( diff --git a/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx b/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx index 35b2d1d18651a..9306afef52bbd 100644 --- a/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx +++ b/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx @@ -1,4 +1,4 @@ -import { IconCollapse45, IconExpand45, IconPause, IconPlay, IconSearch } from '@posthog/icons' +import { IconClock, IconCollapse45, IconExpand45, IconPause, IconPlay, IconSearch } from '@posthog/icons' import clsx from 'clsx' import { useActions, useValues } from 'kea' import { useKeyboardHotkeys } from 'lib/hooks/useKeyboardHotkeys' @@ -10,11 +10,13 @@ import { SettingsMenu, SettingsToggle, } from 'scenes/session-recordings/components/PanelSettings' -import { playerSettingsLogic } from 'scenes/session-recordings/player/playerSettingsLogic' +import { playerSettingsLogic, TimestampFormat } from 'scenes/session-recordings/player/playerSettingsLogic' +import { PlayerUpNext } from 'scenes/session-recordings/player/PlayerUpNext' import { PLAYBACK_SPEEDS, sessionRecordingPlayerLogic, } from 'scenes/session-recordings/player/sessionRecordingPlayerLogic' +import { TimestampFormatToLabel } from 'scenes/session-recordings/utils' import { KeyboardShortcut } from '~/layout/navigation-3000/components/KeyboardShortcut' import { SessionPlayerState } from '~/types' @@ -117,12 +119,39 @@ function InspectDOM(): JSX.Element { } function PlayerBottomSettings(): JSX.Element { + const { timestampFormat } = useValues(playerSettingsLogic) + const { setTimestampFormat } = useActions(playerSettingsLogic) + return ( - - - - - + +
+ + + + setTimestampFormat(TimestampFormat.UTC), + active: timestampFormat === TimestampFormat.UTC, + }, + { + label: 'Device', + onClick: () => setTimestampFormat(TimestampFormat.Device), + active: timestampFormat === TimestampFormat.Device, + }, + { + label: 'Relative', + onClick: () => setTimestampFormat(TimestampFormat.Relative), + active: timestampFormat === TimestampFormat.Relative, + }, + ]} + icon={} + label={TimestampFormatToLabel[timestampFormat]} + /> + +
) } @@ -166,31 +195,33 @@ function Maximise(): JSX.Element { size="xsmall" onClick={onChangeMaximise} tooltip={`${isMaximised ? 'Open' : 'Close'} other panels (M)`} - icon={isMaximised ? : } - className="text-2xl" + icon={isMaximised ? : } /> ) } export function PlayerController(): JSX.Element { + const { playlistLogic } = useValues(sessionRecordingPlayerLogic) + return (
-
-
+
+
- -
- - - -
-
+
+ + + +
+
+ {playlistLogic ? : undefined}
+
) diff --git a/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx b/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx index 0c40085388cd4..53ac102c92028 100644 --- a/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx +++ b/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx @@ -4,7 +4,6 @@ import { useActions, useValues } from 'kea' import { useKeyHeld } from 'lib/hooks/useKeyHeld' import { IconSkipBackward } from 'lib/lemon-ui/icons' import { capitalizeFirstLetter, colonDelimitedDuration } from 'lib/utils' -import { useCallback } from 'react' import { SimpleTimeLabel } from 'scenes/session-recordings/components/SimpleTimeLabel' import { ONE_FRAME_MS, sessionRecordingPlayerLogic } from 'scenes/session-recordings/player/sessionRecordingPlayerLogic' @@ -16,39 +15,26 @@ export function Timestamp(): JSX.Element { useValues(sessionRecordingPlayerLogic) const { isScrubbing, scrubbingTime } = useValues(seekbarLogic(logicProps)) const { timestampFormat } = useValues(playerSettingsLogic) - const { setTimestampFormat } = useActions(playerSettingsLogic) const startTimeSeconds = ((isScrubbing ? scrubbingTime : currentPlayerTime) ?? 0) / 1000 const endTimeSeconds = Math.floor(sessionPlayerData.durationMs / 1000) const fixedUnits = endTimeSeconds > 3600 ? 3 : 2 - const rotateTimestampFormat = useCallback(() => { - setTimestampFormat( - timestampFormat === 'relative' - ? TimestampFormat.UTC - : timestampFormat === TimestampFormat.UTC - ? TimestampFormat.Device - : TimestampFormat.Relative - ) - }, [timestampFormat]) - return ( - - - {timestampFormat === TimestampFormat.Relative ? ( -
- {colonDelimitedDuration(startTimeSeconds, fixedUnits)} - / - {colonDelimitedDuration(endTimeSeconds, fixedUnits)} -
- ) : currentTimestamp ? ( - - ) : ( - '--/--/----, 00:00:00' - )} -
-
+
+ {timestampFormat === TimestampFormat.Relative ? ( +
+ {colonDelimitedDuration(startTimeSeconds, fixedUnits)} + / + {colonDelimitedDuration(endTimeSeconds, fixedUnits)} +
+ ) : currentTimestamp ? ( + + ) : ( + '--/--/----, 00:00:00' + )} +
) } diff --git a/frontend/src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts b/frontend/src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts index 56240e7ec1ee0..b9b06bfedc101 100644 --- a/frontend/src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts +++ b/frontend/src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts @@ -192,8 +192,15 @@ export const sessionRecordingPlayerLogic = kea( reportMessageTooLargeWarningSeen: (sessionRecordingId: string) => ({ sessionRecordingId }), setDebugSnapshotTypes: (types: EventType[]) => ({ types }), setDebugSnapshotIncrementalSources: (incrementalSources: IncrementalSource[]) => ({ incrementalSources }), + setPlayNextAnimationInterrupted: (interrupted: boolean) => ({ interrupted }), }), reducers(() => ({ + playNextAnimationInterrupted: [ + false, + { + setPlayNextAnimationInterrupted: (_, { interrupted }) => interrupted, + }, + ], reportedReplayerErrors: [ new Set(), { diff --git a/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistSettings.tsx b/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistSettings.tsx index 93dfc56d83f0c..da10911c8bf55 100644 --- a/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistSettings.tsx +++ b/frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistSettings.tsx @@ -2,6 +2,7 @@ import { IconEllipsis } from '@posthog/icons' import { IconClock, IconSort } from '@posthog/icons' import { useActions, useValues } from 'kea' import { SettingsBar, SettingsMenu, SettingsToggle } from 'scenes/session-recordings/components/PanelSettings' +import { TimestampFormatToLabel } from 'scenes/session-recordings/utils' import { RecordingUniversalFilters } from '~/types' @@ -19,12 +20,6 @@ const SortingKeyToLabel = { mouse_activity_count: 'Mouse activity', } -const TimestampFormatToLabel = { - relative: 'Relative', - utc: 'UTC', - device: 'Device', -} - function SortedBy({ filters, setFilters, @@ -92,7 +87,7 @@ function SortedBy({ ], }, ]} - icon={} + icon={} label={SortingKeyToLabel[filters.order || 'start_time']} /> ) diff --git a/frontend/src/scenes/session-recordings/utils.ts b/frontend/src/scenes/session-recordings/utils.ts index c7e4f61264ed3..f3e29ae3ea52c 100644 --- a/frontend/src/scenes/session-recordings/utils.ts +++ b/frontend/src/scenes/session-recordings/utils.ts @@ -1,5 +1,11 @@ import { LegacyRecordingFilters, RecordingUniversalFilters, UniversalFiltersGroup, UniversalFilterValue } from '~/types' +export const TimestampFormatToLabel = { + relative: 'Relative', + utc: 'UTC', + device: 'Device', +} + export const isUniversalFilters = ( filters: RecordingUniversalFilters | LegacyRecordingFilters ): filters is RecordingUniversalFilters => { From 70f234bc4967d2887de57f15ede5287b0335256c Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Wed, 4 Dec 2024 22:33:07 +0100 Subject: [PATCH 09/13] feat: keyboard shortcut component (#26658) --- .../player/controller/PlayerController.tsx | 12 +++++++-- .../controller/PlayerControllerTime.tsx | 27 ++++++++++--------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx b/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx index 9306afef52bbd..919fa8b6bd042 100644 --- a/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx +++ b/frontend/src/scenes/session-recordings/player/controller/PlayerController.tsx @@ -163,7 +163,11 @@ function FullScreen(): JSX.Element { setIsFullScreen(!isFullScreen)} - tooltip={`${!isFullScreen ? 'Go' : 'Exit'} full screen (F)`} + tooltip={ + <> + {!isFullScreen ? 'Go' : 'Exit'} full screen + + } > @@ -194,7 +198,11 @@ function Maximise(): JSX.Element { + {isMaximised ? 'Open' : 'Close'} other panels + + } icon={isMaximised ? : } /> ) diff --git a/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx b/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx index 53ac102c92028..417dba1109ce4 100644 --- a/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx +++ b/frontend/src/scenes/session-recordings/player/controller/PlayerControllerTime.tsx @@ -7,6 +7,9 @@ import { capitalizeFirstLetter, colonDelimitedDuration } from 'lib/utils' import { SimpleTimeLabel } from 'scenes/session-recordings/components/SimpleTimeLabel' import { ONE_FRAME_MS, sessionRecordingPlayerLogic } from 'scenes/session-recordings/player/sessionRecordingPlayerLogic' +import { KeyboardShortcut } from '~/layout/navigation-3000/components/KeyboardShortcut' +import { HotKeyOrModifier } from '~/types' + import { playerSettingsLogic, TimestampFormat } from '../playerSettingsLogic' import { seekbarLogic } from './seekbarLogic' @@ -44,10 +47,14 @@ export function SeekSkip({ direction }: { direction: 'forward' | 'backward' }): const altKeyHeld = useKeyHeld('Alt') const jumpTimeSeconds = altKeyHeld ? 1 : jumpTimeMs / 1000 - const altKeyName = navigator.platform.includes('Mac') ? '⌥' : 'Alt' - const arrowSymbol = direction === 'forward' ? '→' : '←' - const arrowName = direction === 'forward' ? 'right' : 'left' + const arrowKey: Partial> = {} + if (direction === 'forward') { + arrowKey.arrowright = true + } + if (direction === 'backward') { + arrowKey.arrowleft = true + } return ( {!altKeyHeld ? ( <> - {capitalizeFirstLetter(direction)} {jumpTimeSeconds}s ( - - {arrowSymbol} {arrowName} arrow - - )
+ {capitalizeFirstLetter(direction)} {jumpTimeSeconds}s +
) : null} - {capitalizeFirstLetter(direction)} 1 frame ({ONE_FRAME_MS}ms) ( - - {altKeyName} + {arrowSymbol} - - ) + {capitalizeFirstLetter(direction)} 1 frame ({ONE_FRAME_MS}ms){' '} +
} > From 407947f78bbf1c3b257f16df2562853e0ca78e68 Mon Sep 17 00:00:00 2001 From: Surbhi Date: Wed, 4 Dec 2024 17:48:04 -0400 Subject: [PATCH 10/13] feat: adding capture events for created and deleting org domains under authentication domains and sso (#26654) --- posthog/api/organization_domain.py | 55 ++++++++++++++++++++ posthog/api/test/test_organization_domain.py | 34 ++++++++++-- 2 files changed, 86 insertions(+), 3 deletions(-) diff --git a/posthog/api/organization_domain.py b/posthog/api/organization_domain.py index e39b611c1fb32..d563c5dd3edf3 100644 --- a/posthog/api/organization_domain.py +++ b/posthog/api/organization_domain.py @@ -1,5 +1,6 @@ import re from typing import Any, cast +import posthoganalytics from rest_framework import exceptions, request, response, serializers from posthog.api.utils import action @@ -11,10 +12,29 @@ from posthog.models import OrganizationDomain from posthog.models.organization import Organization from posthog.permissions import OrganizationAdminWritePermissions +from posthog.event_usage import groups DOMAIN_REGEX = r"^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$" +def _capture_domain_event(request, domain: OrganizationDomain, event_type: str, properties: dict | None = None) -> None: + if not properties: + properties = {} + + properties.update( + { + "domain": domain.domain, + } + ) + + posthoganalytics.capture( + request.user.distinct_id, + f"organization domain {event_type}", + properties=properties, + groups=groups(domain.organization), + ) + + class OrganizationDomainSerializer(serializers.ModelSerializer): UPDATE_ONLY_WHEN_VERIFIED = ["jit_provisioning_enabled", "sso_enforcement"] @@ -96,3 +116,38 @@ def verify(self, request: request.Request, **kw) -> response.Response: serializer = self.get_serializer(instance=instance) return response.Response(serializer.data) + + def create(self, request: request.Request, *args: Any, **kwargs: Any) -> response.Response: + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + instance = serializer.save() + + _capture_domain_event( + request, + instance, + "created", + properties={ + "jit_provisioning_enabled": instance.jit_provisioning_enabled, + "sso_enforcement": instance.sso_enforcement or None, + }, + ) + + return response.Response(serializer.data, status=201) + + def destroy(self, request: request.Request, *args: Any, **kwargs: Any) -> response.Response: + instance = self.get_object() + + _capture_domain_event( + request, + instance, + "deleted", + properties={ + "is_verified": instance.is_verified, + "had_saml": instance.has_saml, + "had_jit_provisioning": instance.jit_provisioning_enabled, + "had_sso_enforcement": bool(instance.sso_enforcement), + }, + ) + + instance.delete() + return response.Response(status=204) diff --git a/posthog/api/test/test_organization_domain.py b/posthog/api/test/test_organization_domain.py index 82ded3bc1c7fe..33de9f45facfc 100644 --- a/posthog/api/test/test_organization_domain.py +++ b/posthog/api/test/test_organization_domain.py @@ -1,5 +1,5 @@ import datetime -from unittest.mock import patch +from unittest.mock import ANY, patch from zoneinfo import ZoneInfo import dns.resolver @@ -84,7 +84,8 @@ def test_cannot_list_or_retrieve_domains_for_other_org(self): # Create domains - def test_create_domain(self): + @patch("posthoganalytics.capture") + def test_create_domain(self, mock_capture): self.organization_membership.level = OrganizationMembership.Level.ADMIN self.organization.available_product_features = [ {"key": "automatic_provisioning", "name": "automatic_provisioning"} @@ -116,6 +117,18 @@ def test_create_domain(self): self.assertEqual(instance.last_verification_retry, None) self.assertEqual(instance.sso_enforcement, "") + # Verify the domain creation capture event was called + mock_capture.assert_any_call( + self.user.distinct_id, + "organization domain created", + properties={ + "domain": "the.posthog.com", + "jit_provisioning_enabled": False, + "sso_enforcement": None, + }, + groups={"instance": ANY, "organization": str(self.organization.id)}, + ) + def test_cant_create_domain_without_feature(self): self.organization_membership.level = OrganizationMembership.Level.ADMIN self.organization_membership.save() @@ -439,7 +452,8 @@ def test_cannot_update_domain_for_another_org(self): # Delete domains - def test_admin_can_delete_domain(self): + @patch("posthoganalytics.capture") + def test_admin_can_delete_domain(self, mock_capture): self.organization_membership.level = OrganizationMembership.Level.ADMIN self.organization_membership.save() @@ -449,6 +463,20 @@ def test_admin_can_delete_domain(self): self.assertFalse(OrganizationDomain.objects.filter(id=self.domain.id).exists()) + # Verify the domain deletion capture event was called + mock_capture.assert_any_call( + self.user.distinct_id, + "organization domain deleted", + properties={ + "domain": "myposthog.com", + "is_verified": False, + "had_saml": False, + "had_jit_provisioning": False, + "had_sso_enforcement": False, + }, + groups={"instance": ANY, "organization": str(self.organization.id)}, + ) + def test_only_admin_can_delete_domain(self): response = self.client.delete(f"/api/organizations/@current/domains/{self.domain.id}") self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) From 1181b9597eebba3769c01d8cab5fba869565d9ad Mon Sep 17 00:00:00 2001 From: Robbie Date: Wed, 4 Dec 2024 21:53:22 +0000 Subject: [PATCH 11/13] chore: Add fastpriorityqueue to concurrencyController so it scales better (#26657) --- frontend/src/lib/utils/concurrencyController.ts | 11 ++++++----- package.json | 1 + pnpm-lock.yaml | 7 +++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/frontend/src/lib/utils/concurrencyController.ts b/frontend/src/lib/utils/concurrencyController.ts index 47683b954be86..941af92f33b74 100644 --- a/frontend/src/lib/utils/concurrencyController.ts +++ b/frontend/src/lib/utils/concurrencyController.ts @@ -1,5 +1,5 @@ +import FastPriorityQueue from 'fastpriorityqueue' import { promiseResolveReject } from 'lib/utils' - class ConcurrencyControllerItem { _debugTag?: string _runFn: () => Promise @@ -52,7 +52,9 @@ export class ConcurrencyController { _concurrencyLimit: number _current: ConcurrencyControllerItem[] = [] - private _queue: ConcurrencyControllerItem[] = [] + private _queue: FastPriorityQueue> = new FastPriorityQueue( + (a, b) => a._priority < b._priority + ) constructor(concurrencyLimit: number) { this._concurrencyLimit = concurrencyLimit @@ -79,7 +81,7 @@ export class ConcurrencyController { }): Promise => { const item = new ConcurrencyControllerItem(this, fn, abortController, priority, debugTag) - this._queue.push(item) + this._queue.add(item) this._tryRunNext() @@ -87,8 +89,7 @@ export class ConcurrencyController { } _runNext(): void { - this._queue.sort((a, b) => a._priority - b._priority) - const next = this._queue.shift() + const next = this._queue.poll() if (next) { next._runFn() .catch(() => { diff --git a/package.json b/package.json index fc88d73076ccf..ca06eb6507b3d 100644 --- a/package.json +++ b/package.json @@ -132,6 +132,7 @@ "expr-eval": "^2.0.2", "express": "^4.17.1", "fast-deep-equal": "^3.1.3", + "fastpriorityqueue": "^0.7.5", "fflate": "^0.7.4", "fs-extra": "^10.0.0", "fuse.js": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46b9d8ad2f29c..30cdc4508d7f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -217,6 +217,9 @@ dependencies: fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 + fastpriorityqueue: + specifier: ^0.7.5 + version: 0.7.5 fflate: specifier: ^0.7.4 version: 0.7.4 @@ -12767,6 +12770,10 @@ packages: engines: {node: '>= 4.9.1'} dev: true + /fastpriorityqueue@0.7.5: + resolution: {integrity: sha512-3Pa0n9gwy8yIbEsT3m2j/E9DXgWvvjfiZjjqcJ+AdNKTAlVMIuFYrYG5Y3RHEM8O6cwv9hOpOWY/NaMfywoQVA==} + dev: false + /fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: From ff09d8fc340d7e057766feb0dea73bdf4c8b3ed7 Mon Sep 17 00:00:00 2001 From: Cory Watilo Date: Wed, 4 Dec 2024 18:16:03 -0500 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20update=20icons=20to=20match=20webs?= =?UTF-8?q?ite,=20pipeline=20=E2=86=92=20pipelines=20(#26618)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/layout/navigation-3000/navigationLogic.tsx | 12 ++++++------ .../sidepanel/panels/SidePanelSupport.tsx | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/src/layout/navigation-3000/navigationLogic.tsx b/frontend/src/layout/navigation-3000/navigationLogic.tsx index be44236c6dc9b..8507fe104dade 100644 --- a/frontend/src/layout/navigation-3000/navigationLogic.tsx +++ b/frontend/src/layout/navigation-3000/navigationLogic.tsx @@ -1,17 +1,17 @@ import { - IconChat, IconCursorClick, IconDashboard, IconDatabase, - IconDecisionTree, IconGraph, IconHome, IconLive, IconLogomark, IconMegaphone, + IconMessage, IconNotebook, IconPeople, IconPieChart, + IconPlug, IconPlusSmall, IconRewindPlay, IconRocket, @@ -492,7 +492,7 @@ export const navigation3000Logic = kea([ { identifier: Scene.Surveys, label: 'Surveys', - icon: , + icon: , to: urls.surveys(), }, featureFlags[FEATURE_FLAGS.PRODUCT_INTRO_PAGES] !== 'test' || hasOnboardedFeatureFlags @@ -506,7 +506,7 @@ export const navigation3000Logic = kea([ { identifier: Scene.DataWarehouse, label: 'Data warehouse', - icon: , + icon: , to: isUsingSidebar ? undefined : urls.dataWarehouse(), }, featureFlags[FEATURE_FLAGS.SQL_EDITOR] @@ -529,8 +529,8 @@ export const navigation3000Logic = kea([ hasOnboardedAnyProduct ? { identifier: Scene.Pipeline, - label: 'Data pipeline', - icon: , + label: 'Data pipelines', + icon: , to: urls.pipeline(), } : null, diff --git a/frontend/src/layout/navigation-3000/sidepanel/panels/SidePanelSupport.tsx b/frontend/src/layout/navigation-3000/sidepanel/panels/SidePanelSupport.tsx index 927f6e16916af..d2bbaca004f2a 100644 --- a/frontend/src/layout/navigation-3000/sidepanel/panels/SidePanelSupport.tsx +++ b/frontend/src/layout/navigation-3000/sidepanel/panels/SidePanelSupport.tsx @@ -2,13 +2,13 @@ import { IconAI, IconChevronDown, IconDatabase, - IconDecisionTree, IconFeatures, IconGraph, IconHelmet, IconMap, IconMessage, IconPieChart, + IconPlug, IconRewindPlay, IconStack, IconTestTube, @@ -72,7 +72,7 @@ const PRODUCTS = [ { name: 'Data pipelines', slug: 'cdp', - icon: , + icon: , }, { name: 'Data warehouse', From f9be4fa28668e242d56bab9651cf9c79b40d9249 Mon Sep 17 00:00:00 2001 From: Sandy Spicer Date: Thu, 5 Dec 2024 00:39:02 -0600 Subject: [PATCH 13/13] fix: issue with is identified boolean clickhouse (#26604) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- .../test_person_where_clause_extractor.py | 2 +- posthog/hogql/functions/mapping.py | 1 + posthog/hogql/test/test_printer.py | 12 +- posthog/hogql/transforms/property_types.py | 15 +- .../__snapshots__/test_property_types.ambr | 6 +- .../transforms/test/test_property_types.py | 2 +- .../hogql_queries/insights/funnels/base.py | 2 +- .../test_funnel_correlation_actors_udf.ambr | 12 +- .../test_funnel_correlation_udf.ambr | 172 +++++++++--------- .../test_funnel_persons_udf.ambr | 6 +- .../test_funnel_strict_persons_udf.ambr | 6 +- .../__snapshots__/test_funnel_strict_udf.ambr | 20 +- .../test_funnel_trends_actors_udf.ambr | 6 +- .../__snapshots__/test_funnel_trends_udf.ambr | 6 +- .../test/__snapshots__/test_funnel_udf.ambr | 40 ++-- 15 files changed, 157 insertions(+), 151 deletions(-) diff --git a/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py index 73459b375879e..91ba9dca6094d 100644 --- a/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py @@ -194,6 +194,6 @@ def test_boolean(self): ) actual = self.print_query("SELECT * FROM events WHERE person.properties.person_boolean = false") assert ( - f"ifNull(equals(transform(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties" + f"ifNull(equals(toBool(transform(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties" in actual ) diff --git a/posthog/hogql/functions/mapping.py b/posthog/hogql/functions/mapping.py index d0f4755c67bad..a422e16dc989c 100644 --- a/posthog/hogql/functions/mapping.py +++ b/posthog/hogql/functions/mapping.py @@ -432,6 +432,7 @@ def compare_types(arg_types: list[ConstantType], sig_arg_types: tuple[ConstantTy ((DateTimeType(), StringType()), StringType()), ], ), + "toBool": HogQLFunctionMeta("toBool", 1, 1), "toJSONString": HogQLFunctionMeta("toJSONString", 1, 1), "parseDateTime": HogQLFunctionMeta("parseDateTimeOrNull", 2, 3, tz_aware=True), "parseDateTimeBestEffort": HogQLFunctionMeta("parseDateTime64BestEffortOrNull", 1, 2, tz_aware=True), diff --git a/posthog/hogql/test/test_printer.py b/posthog/hogql/test/test_printer.py index 3d369f5574f4e..8d7dad46040ac 100644 --- a/posthog/hogql/test/test_printer.py +++ b/posthog/hogql/test/test_printer.py @@ -1603,18 +1603,18 @@ def test_field_nullable_boolean(self): ) assert generated_sql_statements1 == ( f"SELECT " - "ifNull(equals(transform(toString(nullIf(nullIf(events.mat_is_boolean, ''), 'null')), %(hogql_val_0)s, %(hogql_val_1)s, NULL), 1), 0), " - "ifNull(equals(transform(toString(nullIf(nullIf(events.mat_is_boolean, ''), 'null')), %(hogql_val_2)s, %(hogql_val_3)s, NULL), 0), 0), " - "isNull(transform(toString(nullIf(nullIf(events.mat_is_boolean, ''), 'null')), %(hogql_val_4)s, %(hogql_val_5)s, NULL)) " + "ifNull(equals(toBool(transform(toString(nullIf(nullIf(events.mat_is_boolean, ''), 'null')), %(hogql_val_0)s, %(hogql_val_1)s, NULL)), 1), 0), " + "ifNull(equals(toBool(transform(toString(nullIf(nullIf(events.mat_is_boolean, ''), 'null')), %(hogql_val_2)s, %(hogql_val_3)s, NULL)), 0), 0), " + "isNull(toBool(transform(toString(nullIf(nullIf(events.mat_is_boolean, ''), 'null')), %(hogql_val_4)s, %(hogql_val_5)s, NULL))) " f"FROM events WHERE equals(events.team_id, {self.team.pk}) LIMIT {MAX_SELECT_RETURNED_ROWS}" ) assert context.values == { "hogql_val_0": ["true", "false"], - "hogql_val_1": [True, False], + "hogql_val_1": [1, 0], "hogql_val_2": ["true", "false"], - "hogql_val_3": [True, False], + "hogql_val_3": [1, 0], "hogql_val_4": ["true", "false"], - "hogql_val_5": [True, False], + "hogql_val_5": [1, 0], } def test_field_nullable_like(self): diff --git a/posthog/hogql/transforms/property_types.py b/posthog/hogql/transforms/property_types.py index da36de8d988ea..6dbac74590da6 100644 --- a/posthog/hogql/transforms/property_types.py +++ b/posthog/hogql/transforms/property_types.py @@ -221,12 +221,17 @@ def _field_type_to_property_call(self, node: ast.Field, field_type: str): return ast.Call(name="toFloat", args=[node]) if field_type == "Boolean": return ast.Call( - name="transform", + name="toBool", args=[ - ast.Call(name="toString", args=[node]), - ast.Constant(value=["true", "false"]), - ast.Constant(value=[True, False]), - ast.Constant(value=None), + ast.Call( + name="transform", + args=[ + ast.Call(name="toString", args=[node]), + ast.Constant(value=["true", "false"]), + ast.Constant(value=[1, 0]), + ast.Constant(value=None), + ], + ) ], ) return node diff --git a/posthog/hogql/transforms/test/__snapshots__/test_property_types.ambr b/posthog/hogql/transforms/test/__snapshots__/test_property_types.ambr index c0c2e1a610370..ee5bbaa8881f4 100644 --- a/posthog/hogql/transforms/test/__snapshots__/test_property_types.ambr +++ b/posthog/hogql/transforms/test/__snapshots__/test_property_types.ambr @@ -2,7 +2,7 @@ # name: TestPropertyTypes.test_data_warehouse_person_property_types ''' - SELECT persons__extended_properties.string_prop AS string_prop, persons__extended_properties.int_prop AS int_prop, transform(toString(persons__extended_properties.bool_prop), %(hogql_val_8)s, %(hogql_val_9)s, NULL) AS bool_prop + SELECT persons__extended_properties.string_prop AS string_prop, persons__extended_properties.int_prop AS int_prop, toBool(transform(toString(persons__extended_properties.bool_prop), %(hogql_val_8)s, %(hogql_val_9)s, NULL)) AS bool_prop FROM ( SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(person.properties, %(hogql_val_0)s), ''), 'null'), '^"|"$', ''), person.version) AS persons___properties___email, person.id AS id FROM person @@ -19,7 +19,7 @@ # name: TestPropertyTypes.test_group_boolean_property_types ''' - SELECT ifNull(equals(transform(toString(events__group_0.properties___group_boolean), %(hogql_val_2)s, %(hogql_val_3)s, NULL), 1), 0), ifNull(equals(transform(toString(events__group_0.properties___group_boolean), %(hogql_val_4)s, %(hogql_val_5)s, NULL), 0), 0), isNull(transform(toString(events__group_0.properties___group_boolean), %(hogql_val_6)s, %(hogql_val_7)s, NULL)) + SELECT ifNull(equals(toBool(transform(toString(events__group_0.properties___group_boolean), %(hogql_val_2)s, %(hogql_val_3)s, NULL)), 1), 0), ifNull(equals(toBool(transform(toString(events__group_0.properties___group_boolean), %(hogql_val_4)s, %(hogql_val_5)s, NULL)), 0), 0), isNull(toBool(transform(toString(events__group_0.properties___group_boolean), %(hogql_val_6)s, %(hogql_val_7)s, NULL))) FROM events LEFT JOIN ( SELECT argMax(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(groups.group_properties, %(hogql_val_0)s), ''), 'null'), '^"|"$', ''), toTimeZone(groups._timestamp, %(hogql_val_1)s)) AS properties___group_boolean, groups.group_type_index AS index, groups.group_key AS key FROM groups @@ -66,7 +66,7 @@ # name: TestPropertyTypes.test_resolve_property_types_event ''' - SELECT multiply(accurateCastOrNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, %(hogql_val_0)s), ''), 'null'), '^"|"$', ''), %(hogql_val_1)s), accurateCastOrNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, %(hogql_val_2)s), ''), 'null'), '^"|"$', ''), %(hogql_val_3)s)), transform(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, %(hogql_val_4)s), ''), 'null'), '^"|"$', '')), %(hogql_val_5)s, %(hogql_val_6)s, NULL) AS bool + SELECT multiply(accurateCastOrNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, %(hogql_val_0)s), ''), 'null'), '^"|"$', ''), %(hogql_val_1)s), accurateCastOrNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, %(hogql_val_2)s), ''), 'null'), '^"|"$', ''), %(hogql_val_3)s)), toBool(transform(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, %(hogql_val_4)s), ''), 'null'), '^"|"$', '')), %(hogql_val_5)s, %(hogql_val_6)s, NULL)) AS bool FROM events WHERE equals(events.team_id, 420) LIMIT 50000 diff --git a/posthog/hogql/transforms/test/test_property_types.py b/posthog/hogql/transforms/test/test_property_types.py index f27a24b8d7b9f..3fefac96b6b9a 100644 --- a/posthog/hogql/transforms/test/test_property_types.py +++ b/posthog/hogql/transforms/test/test_property_types.py @@ -136,7 +136,7 @@ def test_group_boolean_property_types(self): ) assert printed == self.snapshot assert ( - "SELECT ifNull(equals(transform(toString(events__group_0.properties___group_boolean), hogvar, hogvar, NULL), 1), 0), ifNull(equals(transform(toString(events__group_0.properties___group_boolean), hogvar, hogvar, NULL), 0), 0), isNull(transform(toString(events__group_0.properties___group_boolean), hogvar, hogvar, NULL))" + "SELECT ifNull(equals(toBool(transform(toString(events__group_0.properties___group_boolean), hogvar, hogvar, NULL)), 1), 0), ifNull(equals(toBool(transform(toString(events__group_0.properties___group_boolean), hogvar, hogvar, NULL)), 0), 0), isNull(toBool(transform(toString(events__group_0.properties___group_boolean), hogvar, hogvar, NULL)))" in re.sub(r"%\(hogql_val_\d+\)s", "hogvar", printed) ) diff --git a/posthog/hogql_queries/insights/funnels/base.py b/posthog/hogql_queries/insights/funnels/base.py index 1c7fb05d13f69..189bfab8b109a 100644 --- a/posthog/hogql_queries/insights/funnels/base.py +++ b/posthog/hogql_queries/insights/funnels/base.py @@ -37,7 +37,7 @@ ) from posthog.types import EntityNode, ExclusionEntityNode -JOIN_ALGOS = "direct,parallel_hash,hash,full_sorting_merge" +JOIN_ALGOS = "auto" class FunnelBase(ABC): diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_actors_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_actors_udf.ambr index bc580c8b79bd9..dcec437b05683 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_actors_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_actors_udf.ambr @@ -60,7 +60,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC')))), notIn(event.event, ['$pageview', 'insight analyzed']), equals(event.event, 'insight loaded'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -99,7 +99,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC')))), notIn(event.event, ['$pageview', 'insight analyzed']), equals(event.event, 'insight loaded'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source))) @@ -192,7 +192,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC')))), notIn(event.event, ['$pageview', 'insight analyzed', 'insight updated']), equals(event.event, 'insight loaded'), ifNull(notEquals(funnel_actors.steps, 3), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -231,7 +231,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2021-01-08 23:59:59', 6, 'UTC')))), notIn(event.event, ['$pageview', 'insight analyzed', 'insight updated']), equals(event.event, 'insight loaded'), ifNull(notEquals(funnel_actors.steps, 3), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source))) @@ -325,7 +325,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -366,7 +366,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_udf.ambr index 1ef2e20dafbba..0912fa7845d36 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_correlation_udf.ambr @@ -56,7 +56,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(if(not(empty(event__override.distinct_id)), event__override.person_id, event.person_id), funnel_actors.actor_id) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), notIn(event.event, [])) GROUP BY name LIMIT 100 @@ -108,7 +108,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -171,7 +171,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors JOIN (SELECT persons.id AS id, persons.properties AS person_props @@ -236,7 +236,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -309,7 +309,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -350,7 +350,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -444,7 +444,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -485,7 +485,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -579,7 +579,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -620,7 +620,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -714,7 +714,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -755,7 +755,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -839,7 +839,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors JOIN (SELECT persons.id AS id, persons.properties AS person_props @@ -904,7 +904,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -977,7 +977,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -1018,7 +1018,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -1112,7 +1112,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -1153,7 +1153,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -1247,7 +1247,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -1288,7 +1288,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -1382,7 +1382,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -1423,7 +1423,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source))) @@ -1502,7 +1502,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_1`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_1`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), in(event.event, ['positively_related', 'negatively_related']))) GROUP BY name, prop @@ -1549,7 +1549,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1607,7 +1607,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_1`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_1`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), in(event.event, ['positively_related', 'negatively_related']))) GROUP BY name, prop @@ -1654,7 +1654,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1707,7 +1707,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), notIn(event.event, [])) GROUP BY name LIMIT 100 @@ -1752,7 +1752,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1807,7 +1807,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'positively_related'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -1874,7 +1874,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'positively_related'), ifNull(notEquals(funnel_actors.steps, 2), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -1941,7 +1941,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2008,7 +2008,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(notEquals(funnel_actors.steps, 2), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2081,7 +2081,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), notIn(event.event, [])) GROUP BY name LIMIT 100 @@ -2134,7 +2134,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -2189,7 +2189,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2256,7 +2256,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(notEquals(funnel_actors.steps, 2), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2321,7 +2321,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), notIn(event.event, [])) GROUP BY name LIMIT 100 @@ -2366,7 +2366,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -2421,7 +2421,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'positively_related'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2488,7 +2488,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'positively_related'), ifNull(notEquals(funnel_actors.steps, 2), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2555,7 +2555,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2622,7 +2622,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(notEquals(funnel_actors.steps, 2), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2695,7 +2695,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), notIn(event.event, [])) GROUP BY name LIMIT 100 @@ -2748,7 +2748,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -2803,7 +2803,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(equals(funnel_actors.steps, 2), 0)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2870,7 +2870,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors ON equals(funnel_actors.actor_id, event.`$group_0`) WHERE and(equals(event.team_id, 99999), greaterOrEquals(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-01 00:00:00', 6, 'UTC'))), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC'))), equals(event.team_id, 99999), greater(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), funnel_actors.first_timestamp), less(toTimeZone(toDateTime(toTimeZone(event.timestamp, 'UTC'), 'UTC'), 'UTC'), coalesce(funnel_actors.final_timestamp, plus(toTimeZone(funnel_actors.first_timestamp, 'UTC'), toIntervalDay(14)), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-14 23:59:59', 6, 'UTC')))), notIn(event.event, ['paid', 'user signed up']), equals(event.event, 'negatively_related'), ifNull(notEquals(funnel_actors.steps, 2), 1)) GROUP BY actor_id ORDER BY actor_id ASC) AS source @@ -2938,7 +2938,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -2995,7 +2995,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -3057,7 +3057,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3131,7 +3131,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3205,7 +3205,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3279,7 +3279,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3347,7 +3347,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -3404,7 +3404,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -3460,7 +3460,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -3517,7 +3517,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -3579,7 +3579,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3653,7 +3653,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3727,7 +3727,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3801,7 +3801,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -3869,7 +3869,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -3926,7 +3926,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -3982,7 +3982,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -4039,7 +4039,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -4101,7 +4101,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4175,7 +4175,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4249,7 +4249,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4323,7 +4323,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4391,7 +4391,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -4448,7 +4448,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -4504,7 +4504,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -4561,7 +4561,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -4623,7 +4623,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4697,7 +4697,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4771,7 +4771,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4845,7 +4845,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -4913,7 +4913,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -4970,7 +4970,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -5026,7 +5026,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -5083,7 +5083,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -5145,7 +5145,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -5219,7 +5219,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -5293,7 +5293,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(equals(funnel_actors.steps, 2), 0) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -5367,7 +5367,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors WHERE ifNull(notEquals(funnel_actors.steps, 2), 1) GROUP BY funnel_actors.actor_id ORDER BY funnel_actors.actor_id ASC) AS source @@ -5435,7 +5435,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LEFT JOIN (SELECT groups.key AS key, groups.properties AS properties @@ -5492,7 +5492,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS funnel_actors + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS funnel_actors LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_persons_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_persons_udf.ambr index 370ed267d8b65..9fbd6af6c74ed 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_persons_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_persons_udf.ambr @@ -44,7 +44,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -122,7 +122,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 1), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -200,7 +200,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(equals(step_reached, 1), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_persons_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_persons_udf.ambr index 328abd6df2e65..846e534decf6a 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_persons_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_persons_udf.ambr @@ -44,7 +44,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -122,7 +122,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 1), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -200,7 +200,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(equals(step_reached, 1), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_udf.ambr index d869459cb3485..f0bbdae5329d3 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_strict_udf.ambr @@ -62,7 +62,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -143,7 +143,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -217,7 +217,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -299,7 +299,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -381,7 +381,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -470,7 +470,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -545,7 +545,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 0), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('finance'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('finance'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -628,7 +628,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 1), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('finance'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('finance'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -711,7 +711,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 0), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('technology'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('technology'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -794,7 +794,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 1), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('technology'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('technology'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_actors_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_actors_udf.ambr index cb4021c05d56d..6e86eda210324 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_actors_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_actors_udf.ambr @@ -42,7 +42,7 @@ GROUP BY aggregation_target SETTINGS date_time_output_format='iso', date_time_input_format='best_effort') WHERE and(ifNull(equals(success_bool, 1), 0), ifNull(equals(entrance_period_start, toDateTime64('2021-05-01 00:00:00.000000', 6, 'UTC')), 0)) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -118,7 +118,7 @@ GROUP BY aggregation_target SETTINGS date_time_output_format='iso', date_time_input_format='best_effort') WHERE and(ifNull(notEquals(success_bool, 1), 1), ifNull(equals(entrance_period_start, toDateTime64('2021-05-01 00:00:00.000000', 6, 'UTC')), 0)) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -194,7 +194,7 @@ GROUP BY aggregation_target SETTINGS date_time_output_format='iso', date_time_input_format='best_effort') WHERE and(ifNull(equals(success_bool, 1), 0), ifNull(equals(entrance_period_start, toDateTime64('2021-05-01 00:00:00.000000', 6, 'UTC')), 0)) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_udf.ambr index b0b220a50a0bb..91bb45c0d1068 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_trends_udf.ambr @@ -41,7 +41,7 @@ GROUP BY entrance_period_start, data.breakdown ORDER BY entrance_period_start ASC - LIMIT 1000 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 1000 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -94,7 +94,7 @@ GROUP BY entrance_period_start, data.breakdown ORDER BY entrance_period_start ASC - LIMIT 1000 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 1000 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -147,7 +147,7 @@ GROUP BY entrance_period_start, data.breakdown ORDER BY entrance_period_start ASC - LIMIT 1000 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 1000 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, diff --git a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_udf.ambr b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_udf.ambr index ea0939ad56226..cb6d8db14b8ce 100644 --- a/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_udf.ambr +++ b/posthog/hogql_queries/insights/funnels/test/__snapshots__/test_funnel_udf.ambr @@ -53,7 +53,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 100 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 100 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -105,7 +105,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 1), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT argMax(toTimeZone(person.created_at, 'UTC'), person.version) AS created_at, person.id AS id @@ -188,7 +188,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 100 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 100 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -270,7 +270,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 100 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 100 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -346,7 +346,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 100 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 100 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -409,7 +409,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 0), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT argMax(toTimeZone(person.created_at, 'UTC'), person.version) AS created_at, person.id AS id @@ -481,7 +481,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 1), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT argMax(toTimeZone(person.created_at, 'UTC'), person.version) AS created_at, person.id AS id @@ -553,7 +553,7 @@ GROUP BY aggregation_target HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE ifNull(greaterOrEquals(step_reached, 2), 0) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT argMax(toTimeZone(person.created_at, 'UTC'), person.version) AS created_at, person.id AS id @@ -633,7 +633,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 100 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 100 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -692,7 +692,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 100 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 100 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -766,7 +766,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -847,7 +847,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -921,7 +921,7 @@ GROUP BY breakdown ORDER BY step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1003,7 +1003,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1085,7 +1085,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1174,7 +1174,7 @@ GROUP BY breakdown ORDER BY step_3 DESC, step_2 DESC, step_1 DESC) GROUP BY final_prop - LIMIT 26 SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge', + LIMIT 26 SETTINGS join_algorithm='auto', readonly=2, max_execution_time=60, allow_experimental_object_type=1, @@ -1249,7 +1249,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 0), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('finance'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('finance'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -1332,7 +1332,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 1), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('finance'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('finance'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -1415,7 +1415,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 0), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('technology'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('technology'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person @@ -1498,7 +1498,7 @@ HAVING ifNull(greaterOrEquals(step_reached, 0), 0)) WHERE and(ifNull(greaterOrEquals(step_reached, 1), 0), ifNull(equals(arrayFlatten(array(breakdown)), arrayFlatten(array('technology'))), isNull(arrayFlatten(array(breakdown))) and isNull(arrayFlatten(array('technology'))))) - ORDER BY aggregation_target ASC SETTINGS join_algorithm='direct,parallel_hash,hash,full_sorting_merge') AS source + ORDER BY aggregation_target ASC SETTINGS join_algorithm='auto') AS source INNER JOIN (SELECT person.id AS id FROM person