From 7148f03130c34a6b460aa2df784c6474ecac4e69 Mon Sep 17 00:00:00 2001 From: Neil Kakkar Date: Tue, 7 Nov 2023 12:07:11 +0000 Subject: [PATCH 1/4] revert: "revert: "fix(flags): Do the expected for numeric comparisons"" (#18415) --- ee/clickhouse/models/test/test_filters.py | 36 ++ posthog/models/feature_flag/flag_matching.py | 64 +- .../test/__snapshots__/test_filter.ambr | 30 + posthog/models/filters/test/test_filter.py | 149 +++-- posthog/queries/base.py | 63 +- posthog/queries/test/test_base.py | 60 +- .../test/__snapshots__/test_feature_flag.ambr | 108 ++++ posthog/test/base.py | 7 +- posthog/test/test_feature_flag.py | 604 ++++++++++++++++++ 9 files changed, 1058 insertions(+), 63 deletions(-) diff --git a/ee/clickhouse/models/test/test_filters.py b/ee/clickhouse/models/test/test_filters.py index 26ff79c565c4e..def3ca4493fe1 100644 --- a/ee/clickhouse/models/test/test_filters.py +++ b/ee/clickhouse/models/test/test_filters.py @@ -610,6 +610,42 @@ def test_numerical(self): events = _filter_events(filter, self.team) self.assertEqual(events[0]["id"], event1_uuid) + def test_numerical_person_properties(self): + _create_person(team_id=self.team.pk, distinct_ids=["p1"], properties={"$a_number": 4}) + _create_person(team_id=self.team.pk, distinct_ids=["p2"], properties={"$a_number": 5}) + _create_person(team_id=self.team.pk, distinct_ids=["p3"], properties={"$a_number": 6}) + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$a_number", + "value": 4, + "operator": "gt", + } + ] + } + ) + self.assertEqual(len(_filter_persons(filter, self.team)), 2) + + filter = Filter(data={"properties": [{"type": "person", "key": "$a_number", "value": 5}]}) + self.assertEqual(len(_filter_persons(filter, self.team)), 1) + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$a_number", + "value": 6, + "operator": "lt", + } + ] + } + ) + self.assertEqual(len(_filter_persons(filter, self.team)), 2) + def test_contains(self): _create_event(team=self.team, distinct_id="test", event="$pageview") event2_uuid = _create_event( diff --git a/posthog/models/feature_flag/flag_matching.py b/posthog/models/feature_flag/flag_matching.py index fe57b171204e8..189e9801ceed8 100644 --- a/posthog/models/feature_flag/flag_matching.py +++ b/posthog/models/feature_flag/flag_matching.py @@ -3,14 +3,14 @@ from enum import Enum import time import structlog -from typing import Dict, List, Optional, Tuple, Union +from typing import Dict, List, Optional, Tuple, Union, cast from prometheus_client import Counter from django.conf import settings from django.db import DatabaseError, IntegrityError, OperationalError from django.db.models.expressions import ExpressionWrapper, RawSQL from django.db.models.fields import BooleanField -from django.db.models import Q +from django.db.models import Q, Func, F, CharField from django.db.models.query import QuerySet from sentry_sdk.api import capture_exception, start_span from posthog.metrics import LABEL_TEAM_ID @@ -396,6 +396,11 @@ def condition_eval(key, condition): annotate_query = True nonlocal person_query + property_list = Filter(data=condition).property_groups.flat + properties_with_math_operators = get_all_properties_with_math_operators( + property_list, self.cohorts_cache + ) + if len(condition.get("properties", {})) > 0: # Feature Flags don't support OR filtering yet target_properties = self.property_value_overrides @@ -404,8 +409,9 @@ def condition_eval(key, condition): self.cache.group_type_index_to_name[feature_flag.aggregation_group_type_index], {}, ) + expr = properties_to_Q( - Filter(data=condition).property_groups.flat, + property_list, override_property_values=target_properties, cohorts_cache=self.cohorts_cache, using_database=DATABASE_FOR_FLAG_MATCHING, @@ -428,13 +434,24 @@ def condition_eval(key, condition): if annotate_query: if feature_flag.aggregation_group_type_index is None: + # :TRICKY: Flag matching depends on type of property when doing >, <, >=, <= comparisons. + # This requires a generated field to query in Q objects, which sadly don't allow inlining fields, + # hence we need to annotate the query here, even though these annotations are used much deeper, + # in properties_to_q, in empty_or_null_with_value_q + # These need to come in before the expr so they're available to use inside the expr. + # Same holds for the group queries below. + type_property_annotations = { + prop_key: Func(F(prop_field), function="JSONB_TYPEOF", output_field=CharField()) + for prop_key, prop_field in properties_with_math_operators + } person_query = person_query.annotate( + **type_property_annotations, **{ key: ExpressionWrapper( expr if expr else RawSQL("true", []), output_field=BooleanField(), - ) - } + ), + }, ) person_fields.append(key) else: @@ -445,13 +462,18 @@ def condition_eval(key, condition): group_query, group_fields, ) = group_query_per_group_type_mapping[feature_flag.aggregation_group_type_index] + type_property_annotations = { + prop_key: Func(F(prop_field), function="JSONB_TYPEOF", output_field=CharField()) + for prop_key, prop_field in properties_with_math_operators + } group_query = group_query.annotate( + **type_property_annotations, **{ key: ExpressionWrapper( expr if expr else RawSQL("true", []), output_field=BooleanField(), ) - } + }, ) group_fields.append(key) group_query_per_group_type_mapping[feature_flag.aggregation_group_type_index] = ( @@ -881,3 +903,33 @@ def parse_exception_for_error_message(err: Exception): reason = "query_wait_timeout" return reason + + +def key_and_field_for_property(property: Property) -> Tuple[str, str]: + column = "group_properties" if property.type == "group" else "properties" + key = property.key + return ( + f"{column}_{key}_type", + f"{column}__{key}", + ) + + +def get_all_properties_with_math_operators( + properties: List[Property], cohorts_cache: Dict[int, Cohort] +) -> List[Tuple[str, str]]: + all_keys_and_fields = [] + + for prop in properties: + if prop.type == "cohort": + cohort_id = int(cast(Union[str, int], prop.value)) + if cohorts_cache.get(cohort_id) is None: + cohorts_cache[cohort_id] = Cohort.objects.using(DATABASE_FOR_FLAG_MATCHING).get(pk=cohort_id) + cohort = cohorts_cache[cohort_id] + if cohort: + all_keys_and_fields.extend( + get_all_properties_with_math_operators(cohort.properties.flat, cohorts_cache) + ) + elif prop.operator in ["gt", "lt", "gte", "lte"] and prop.type in ("person", "group"): + all_keys_and_fields.append(key_and_field_for_property(prop)) + + return all_keys_and_fields diff --git a/posthog/models/filters/test/__snapshots__/test_filter.ambr b/posthog/models/filters/test/__snapshots__/test_filter.ambr index 2b65b1a00ce6f..961af14048237 100644 --- a/posthog/models/filters/test/__snapshots__/test_filter.ambr +++ b/posthog/models/filters/test/__snapshots__/test_filter.ambr @@ -306,6 +306,36 @@ ORDER BY "posthog_persondistinctid"."id" ASC ' --- +# name: TestDjangoPropertiesToQ.test_icontains_with_array_value + ' + SELECT "posthog_person"."uuid" + FROM "posthog_person" + WHERE (UPPER(("posthog_person"."properties" ->> '$key')::text) LIKE UPPER('%[''red'']%') + AND "posthog_person"."properties" ? '$key' + AND NOT (("posthog_person"."properties" -> '$key') = 'null') + AND "posthog_person"."team_id" = 2) + ' +--- +# name: TestDjangoPropertiesToQ.test_icontains_with_array_value.1 + ' + SELECT "posthog_person"."uuid" + FROM "posthog_person" + WHERE (UPPER(("posthog_person"."properties" ->> '$key')::text) LIKE UPPER('%red%') + AND "posthog_person"."properties" ? '$key' + AND NOT (("posthog_person"."properties" -> '$key') = 'null') + AND "posthog_person"."team_id" = 2) + ' +--- +# name: TestDjangoPropertiesToQ.test_icontains_with_array_value.2 + ' + SELECT "posthog_person"."uuid" + FROM "posthog_person" + WHERE (("posthog_person"."properties" -> '$key') > '["2"]' + AND "posthog_person"."properties" ? '$key' + AND NOT (("posthog_person"."properties" -> '$key') = 'null') + AND "posthog_person"."team_id" = 2) + ' +--- # name: TestDjangoPropertyGroupToQ.test_property_group_to_q_with_cohorts ' SELECT "posthog_cohort"."id", diff --git a/posthog/models/filters/test/test_filter.py b/posthog/models/filters/test/test_filter.py index 84b70bbd4d837..b2e209969b28c 100644 --- a/posthog/models/filters/test/test_filter.py +++ b/posthog/models/filters/test/test_filter.py @@ -2,7 +2,7 @@ import json from typing import Any, Callable, Dict, List, Optional, cast -from django.db.models import Q +from django.db.models import Q, Func, F, CharField from posthog.constants import FILTER_TEST_ACCOUNTS from posthog.models import Cohort, Filter, Person, Team @@ -219,42 +219,6 @@ def test_incomplete_data(self): ) self.assertListEqual(filter.property_groups.values, []) - def test_numerical_person_properties(self): - person_factory(team_id=self.team.pk, distinct_ids=["p1"], properties={"$a_number": 4}) - person_factory(team_id=self.team.pk, distinct_ids=["p2"], properties={"$a_number": 5}) - person_factory(team_id=self.team.pk, distinct_ids=["p3"], properties={"$a_number": 6}) - - filter = Filter( - data={ - "properties": [ - { - "type": "person", - "key": "$a_number", - "value": 4, - "operator": "gt", - } - ] - } - ) - self.assertEqual(len(filter_persons(filter, self.team)), 2) - - filter = Filter(data={"properties": [{"type": "person", "key": "$a_number", "value": 5}]}) - self.assertEqual(len(filter_persons(filter, self.team)), 1) - - filter = Filter( - data={ - "properties": [ - { - "type": "person", - "key": "$a_number", - "value": 6, - "operator": "lt", - } - ] - } - ) - self.assertEqual(len(filter_persons(filter, self.team)), 2) - def test_contains_persons(self): person_factory( team_id=self.team.pk, @@ -819,6 +783,117 @@ def _filter_with_date_range( return Filter(data=data) + def test_numerical_person_properties(self): + _create_person(team_id=self.team.pk, distinct_ids=["p1"], properties={"$a_number": 4}) + _create_person(team_id=self.team.pk, distinct_ids=["p2"], properties={"$a_number": 5}) + _create_person(team_id=self.team.pk, distinct_ids=["p3"], properties={"$a_number": 6}) + _create_person(team_id=self.team.pk, distinct_ids=["p4"], properties={"$a_number": 14}) + + flush_persons_and_events() + + def filter_persons_with_annotation(filter: Filter, team: Team): + persons = Person.objects.annotate( + **{ + "properties_$a_number_type": Func( + F("properties__$a_number"), function="JSONB_TYPEOF", output_field=CharField() + ) + } + ).filter(properties_to_Q(filter.property_groups.flat)) + persons = persons.filter(team_id=team.pk) + return [str(uuid) for uuid in persons.values_list("uuid", flat=True)] + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$a_number", + "value": "4", + "operator": "gt", + } + ] + } + ) + self.assertEqual(len(filter_persons_with_annotation(filter, self.team)), 3) + + filter = Filter(data={"properties": [{"type": "person", "key": "$a_number", "value": 5}]}) + self.assertEqual(len(filter_persons_with_annotation(filter, self.team)), 1) + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$a_number", + "value": 6, + "operator": "lt", + } + ] + } + ) + self.assertEqual(len(filter_persons_with_annotation(filter, self.team)), 2) + + @snapshot_postgres_queries + def test_icontains_with_array_value(self): + _create_person(team_id=self.team.pk, distinct_ids=["p1"], properties={"$key": "red-123"}) + _create_person(team_id=self.team.pk, distinct_ids=["p2"], properties={"$key": "blue-123"}) + _create_person(team_id=self.team.pk, distinct_ids=["p3"], properties={"$key": 6}) + + flush_persons_and_events() + + def filter_persons_with_annotation(filter: Filter, team: Team): + persons = Person.objects.annotate( + **{ + "properties_$key_type": Func( + F("properties__$key"), function="JSONB_TYPEOF", output_field=CharField() + ) + } + ).filter(properties_to_Q(filter.property_groups.flat)) + persons = persons.filter(team_id=team.pk) + return [str(uuid) for uuid in persons.values_list("uuid", flat=True)] + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$key", + "value": ["red"], + "operator": "icontains", + } + ] + } + ) + self.assertEqual(len(filter_persons_with_annotation(filter, self.team)), 0) + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$key", + "value": "red", + "operator": "icontains", + } + ] + } + ) + self.assertEqual(len(filter_persons_with_annotation(filter, self.team)), 1) + + filter = Filter( + data={ + "properties": [ + { + "type": "person", + "key": "$key", + "value": ["2"], + "operator": "gt", + } + ] + } + ) + self.assertEqual(len(filter_persons_with_annotation(filter, self.team)), 0) + def filter_persons_with_property_group( filter: Filter, team: Team, property_overrides: Dict[str, Any] = {} diff --git a/posthog/queries/base.py b/posthog/queries/base.py index 65ccd651d2c3c..1279fe088dda7 100644 --- a/posthog/queries/base.py +++ b/posthog/queries/base.py @@ -12,7 +12,7 @@ ) from dateutil import parser -from django.db.models import Exists, OuterRef, Q +from django.db.models import Exists, OuterRef, Q, Value from rest_framework.exceptions import ValidationError from posthog.constants import PropertyOperatorType @@ -20,7 +20,6 @@ from posthog.models.filters.filter import Filter from posthog.models.filters.path_filter import PathFilter from posthog.models.property import ( - CLICKHOUSE_ONLY_PROPERTY_TYPES, Property, PropertyGroup, ) @@ -29,10 +28,10 @@ from posthog.queries.util import convert_to_datetime_aware from posthog.utils import get_compare_period_dates, is_valid_regex -F = TypeVar("F", Filter, PathFilter) +FilterType = TypeVar("FilterType", Filter, PathFilter) -def determine_compared_filter(filter: F) -> F: +def determine_compared_filter(filter: FilterType) -> FilterType: if not filter.date_to or not filter.date_from: raise ValidationError("You need date_from and date_to to compare") date_from, date_to = get_compare_period_dates( @@ -142,17 +141,34 @@ def compute_exact_match(value: ValueT, override_value: Any) -> bool: except re.error: return False - if operator == "gt": - return type(override_value) == type(value) and override_value > value - - if operator == "gte": - return type(override_value) == type(value) and override_value >= value + if operator in ("gt", "gte", "lt", "lte"): + # :TRICKY: We adjust comparison based on the override value passed in, + # to make sure we handle both numeric and string comparisons appropriately. + def compare(lhs, rhs, operator): + if operator == "gt": + return lhs > rhs + elif operator == "gte": + return lhs >= rhs + elif operator == "lt": + return lhs < rhs + elif operator == "lte": + return lhs <= rhs + else: + raise ValueError(f"Invalid operator: {operator}") - if operator == "lt": - return type(override_value) == type(value) and override_value < value + parsed_value = None + try: + parsed_value = float(value) # type: ignore + except Exception: + pass - if operator == "lte": - return type(override_value) == type(value) and override_value <= value + if parsed_value is not None and override_value is not None: + if isinstance(override_value, str): + return compare(override_value, str(value), operator) + else: + return compare(override_value, parsed_value, operator) + else: + return compare(str(override_value), str(value), operator) if operator in ["is_date_before", "is_date_after"]: try: @@ -207,7 +223,23 @@ def empty_or_null_with_value_q( f"{column}__{key}", value_as_coerced_to_number ) else: - target_filter = Q(**{f"{column}__{key}__{operator}": value}) + parsed_value = None + if operator in ("gt", "gte", "lt", "lte"): + try: + # try to parse even if arrays can't be parsed, the catch will handle it + parsed_value = float(value) # type: ignore + except Exception: + pass + + if parsed_value is not None: + # When we can coerce given value to a number, check whether the value in DB is a number + # and do a numeric comparison. Otherwise, do a string comparison. + target_filter = Q( + Q(**{f"{column}__{key}__{operator}": str(value), f"{column}_{key}_type": Value("string")}) + | Q(**{f"{column}__{key}__{operator}": parsed_value, f"{column}_{key}_type": Value("number")}) + ) + else: + target_filter = Q(**{f"{column}__{key}__{operator}": value}) query_filter = Q(target_filter & Q(**{f"{column}__has_key": key}) & ~Q(**{f"{column}__{key}": None})) @@ -229,7 +261,8 @@ def property_to_Q( cohorts_cache: Optional[Dict[int, Cohort]] = None, using_database: str = "default", ) -> Q: - if property.type in CLICKHOUSE_ONLY_PROPERTY_TYPES: + if property.type not in ["person", "group", "cohort", "event"]: + # We need to support event type for backwards compatibility, even though it's treated as a person property type raise ValueError(f"property_to_Q: type is not supported: {repr(property.type)}") value = property._parse_value(property.value) diff --git a/posthog/queries/test/test_base.py b/posthog/queries/test/test_base.py index bccc9ca60a53e..de09d2f1ed3ce 100644 --- a/posthog/queries/test/test_base.py +++ b/posthog/queries/test/test_base.py @@ -154,7 +154,8 @@ def test_match_properties_math_operators(self): self.assertFalse(match_property(property_a, {"key": 0})) self.assertFalse(match_property(property_a, {"key": -1})) - self.assertFalse(match_property(property_a, {"key": "23"})) + # now we handle type mismatches so this should be true + self.assertTrue(match_property(property_a, {"key": "23"})) property_b = Property(key="key", value=1, operator="lt") self.assertTrue(match_property(property_b, {"key": 0})) @@ -171,16 +172,32 @@ def test_match_properties_math_operators(self): self.assertFalse(match_property(property_c, {"key": 0})) self.assertFalse(match_property(property_c, {"key": -1})) - self.assertFalse(match_property(property_c, {"key": "3"})) + # now we handle type mismatches so this should be true + self.assertTrue(match_property(property_c, {"key": "3"})) property_d = Property(key="key", value="43", operator="lt") self.assertTrue(match_property(property_d, {"key": "41"})) self.assertTrue(match_property(property_d, {"key": "42"})) + self.assertTrue(match_property(property_d, {"key": 42})) self.assertFalse(match_property(property_d, {"key": "43"})) self.assertFalse(match_property(property_d, {"key": "44"})) self.assertFalse(match_property(property_d, {"key": 44})) + property_e = Property(key="key", value="30", operator="lt") + self.assertTrue(match_property(property_e, {"key": "29"})) + + # depending on the type of override, we adjust type comparison + self.assertTrue(match_property(property_e, {"key": "100"})) + self.assertFalse(match_property(property_e, {"key": 100})) + + property_f = Property(key="key", value="123aloha", operator="gt") + self.assertFalse(match_property(property_f, {"key": "123"})) + self.assertFalse(match_property(property_f, {"key": 122})) + + # this turns into a string comparison + self.assertTrue(match_property(property_f, {"key": 129})) + def test_match_property_date_operators(self): property_a = Property(key="key", value="2022-05-01", operator="is_date_before") self.assertTrue(match_property(property_a, {"key": "2022-03-01"})) @@ -227,3 +244,42 @@ def test_match_property_date_operators(self): self.assertTrue(match_property(property_d, {"key": "2022-04-05 12:34:11 CET"})) self.assertFalse(match_property(property_d, {"key": "2022-04-05 12:34:13 CET"})) + + def test_none_property_value_with_all_operators(self): + property_a = Property(key="key", value="none", operator="is_not") + self.assertFalse(match_property(property_a, {"key": None})) + self.assertTrue(match_property(property_a, {"key": "non"})) + + property_b = Property(key="key", value=None, operator="is_set") + self.assertTrue(match_property(property_b, {"key": None})) + + property_c = Property(key="key", value="no", operator="icontains") + self.assertTrue(match_property(property_c, {"key": None})) + self.assertFalse(match_property(property_c, {"key": "smh"})) + + property_d = Property(key="key", value="No", operator="regex") + self.assertTrue(match_property(property_d, {"key": None})) + + property_d_lower_case = Property(key="key", value="no", operator="regex") + self.assertFalse(match_property(property_d_lower_case, {"key": None})) + + property_e = Property(key="key", value=1, operator="gt") + self.assertTrue(match_property(property_e, {"key": None})) + + property_f = Property(key="key", value=1, operator="lt") + self.assertFalse(match_property(property_f, {"key": None})) + + property_g = Property(key="key", value="xyz", operator="gte") + self.assertFalse(match_property(property_g, {"key": None})) + + property_h = Property(key="key", value="Oo", operator="lte") + self.assertTrue(match_property(property_h, {"key": None})) + + property_i = Property(key="key", value="2022-05-01", operator="is_date_before") + self.assertFalse(match_property(property_i, {"key": None})) + + property_j = Property(key="key", value="2022-05-01", operator="is_date_after") + self.assertFalse(match_property(property_j, {"key": None})) + + property_k = Property(key="key", value="2022-05-01", operator="is_date_before") + self.assertFalse(match_property(property_k, {"key": "random"})) diff --git a/posthog/test/__snapshots__/test_feature_flag.ambr b/posthog/test/__snapshots__/test_feature_flag.ambr index f7a912fe972b7..d303d7bd80145 100644 --- a/posthog/test/__snapshots__/test_feature_flag.ambr +++ b/posthog/test/__snapshots__/test_feature_flag.ambr @@ -345,6 +345,114 @@ AND "posthog_group"."group_type_index" = 2) ' --- +# name: TestFeatureFlagMatcher.test_numeric_operator_with_cohorts_and_nested_cohorts + ' + SELECT "posthog_cohort"."id", + "posthog_cohort"."name", + "posthog_cohort"."description", + "posthog_cohort"."team_id", + "posthog_cohort"."deleted", + "posthog_cohort"."filters", + "posthog_cohort"."version", + "posthog_cohort"."pending_version", + "posthog_cohort"."count", + "posthog_cohort"."created_by_id", + "posthog_cohort"."created_at", + "posthog_cohort"."is_calculating", + "posthog_cohort"."last_calculation", + "posthog_cohort"."errors_calculating", + "posthog_cohort"."is_static", + "posthog_cohort"."groups" + FROM "posthog_cohort" + WHERE (NOT "posthog_cohort"."deleted" + AND "posthog_cohort"."team_id" = 2) + ' +--- +# name: TestFeatureFlagMatcher.test_numeric_operator_with_cohorts_and_nested_cohorts.1 + ' + SELECT (((("posthog_person"."properties" -> 'number') > '"100"' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'number')) = 'string') + OR (("posthog_person"."properties" -> 'number') > '100.0' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'number')) = 'number')) + AND "posthog_person"."properties" ? 'number' + AND NOT (("posthog_person"."properties" -> 'number') = 'null')) AS "flag_X_condition_0", + (((("posthog_person"."properties" -> 'version') > '"1.05"' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'version')) = 'string') + OR (("posthog_person"."properties" -> 'version') > '1.05' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'version')) = 'number')) + AND "posthog_person"."properties" ? 'version' + AND NOT (("posthog_person"."properties" -> 'version') = 'null')) AS "flag_X_condition_0", + (((("posthog_person"."properties" -> 'number') < '"31"' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'number')) = 'string') + OR (("posthog_person"."properties" -> 'number') < '31.0' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'number')) = 'number')) + AND "posthog_person"."properties" ? 'number' + AND NOT (("posthog_person"."properties" -> 'number') = 'null') + AND ((("posthog_person"."properties" -> 'nested_prop') > '"20"' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'nested_prop')) = 'string') + OR (("posthog_person"."properties" -> 'nested_prop') > '20.0' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'nested_prop')) = 'number')) + AND "posthog_person"."properties" ? 'nested_prop' + AND NOT (("posthog_person"."properties" -> 'nested_prop') = 'null')) AS "flag_X_condition_0" + FROM "posthog_person" + INNER JOIN "posthog_persondistinctid" ON ("posthog_person"."id" = "posthog_persondistinctid"."person_id") + WHERE ("posthog_persondistinctid"."distinct_id" = '307' + AND "posthog_persondistinctid"."team_id" = 2 + AND "posthog_person"."team_id" = 2) + ' +--- +# name: TestFeatureFlagMatcher.test_numeric_operator_with_groups_and_person_flags + ' + SELECT "posthog_grouptypemapping"."id", + "posthog_grouptypemapping"."team_id", + "posthog_grouptypemapping"."group_type", + "posthog_grouptypemapping"."group_type_index", + "posthog_grouptypemapping"."name_singular", + "posthog_grouptypemapping"."name_plural" + FROM "posthog_grouptypemapping" + WHERE "posthog_grouptypemapping"."team_id" = 2 + ' +--- +# name: TestFeatureFlagMatcher.test_numeric_operator_with_groups_and_person_flags.1 + ' + SELECT (((("posthog_person"."properties" -> 'number') >= '"20"' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'number')) = 'string') + OR (("posthog_person"."properties" -> 'number') >= '20.0' + AND JSONB_TYPEOF(("posthog_person"."properties" -> 'number')) = 'number')) + AND "posthog_person"."properties" ? 'number' + AND NOT (("posthog_person"."properties" -> 'number') = 'null')) AS "flag_X_condition_0" + FROM "posthog_person" + INNER JOIN "posthog_persondistinctid" ON ("posthog_person"."id" = "posthog_persondistinctid"."person_id") + WHERE ("posthog_persondistinctid"."distinct_id" = '307' + AND "posthog_persondistinctid"."team_id" = 2 + AND "posthog_person"."team_id" = 2) + ' +--- +# name: TestFeatureFlagMatcher.test_numeric_operator_with_groups_and_person_flags.2 + ' + SELECT (((("posthog_group"."group_properties" -> 'number') > '"100"' + AND JSONB_TYPEOF(("posthog_group"."group_properties" -> 'number')) = 'string') + OR (("posthog_group"."group_properties" -> 'number') > '100.0' + AND JSONB_TYPEOF(("posthog_group"."group_properties" -> 'number')) = 'number')) + AND "posthog_group"."group_properties" ? 'number' + AND NOT (("posthog_group"."group_properties" -> 'number') = 'null')) AS "flag_X_condition_0" + FROM "posthog_group" + WHERE ("posthog_group"."team_id" = 2 + AND "posthog_group"."group_key" = 'foo' + AND "posthog_group"."group_type_index" = 0) + ' +--- +# name: TestFeatureFlagMatcher.test_numeric_operator_with_groups_and_person_flags.3 + ' + SELECT (("posthog_group"."group_properties" -> 'number') > '"100b2c"' + AND "posthog_group"."group_properties" ? 'number' + AND NOT (("posthog_group"."group_properties" -> 'number') = 'null')) AS "flag_X_condition_0" + FROM "posthog_group" + WHERE ("posthog_group"."team_id" = 2 + AND "posthog_group"."group_key" = 'foo-project' + AND "posthog_group"."group_type_index" = 1) + ' +--- # name: TestFeatureFlagMatcher.test_super_condition_matches_string ' SELECT ((("posthog_person"."properties" -> 'is_enabled') = 'true' diff --git a/posthog/test/base.py b/posthog/test/base.py index 105285fa3073e..3cd830a68a49d 100644 --- a/posthog/test/base.py +++ b/posthog/test/base.py @@ -460,13 +460,14 @@ def assertQueryMatchesSnapshot(self, query, params=None, replace_all_numbers=Fal if replace_all_numbers: query = re.sub(r"(\"?) = \d+", r"\1 = 2", query) query = re.sub(r"(\"?) IN \(\d+(, \d+)*\)", r"\1 IN (1, 2, 3, 4, 5 /* ... */)", query) - # feature flag conditions use primary keys as columns in queries, so replace those too - query = re.sub(r"flag_\d+_condition", r"flag_X_condition", query) - query = re.sub(r"flag_\d+_super_condition", r"flag_X_super_condition", query) else: query = re.sub(r"(team|cohort)_id(\"?) = \d+", r"\1_id\2 = 2", query) query = re.sub(r"\d+ as (team|cohort)_id(\"?)", r"2 as \1_id\2", query) + # feature flag conditions use primary keys as columns in queries, so replace those always + query = re.sub(r"flag_\d+_condition", r"flag_X_condition", query) + query = re.sub(r"flag_\d+_super_condition", r"flag_X_super_condition", query) + # hog ql checks team ids differently query = re.sub( r"equals\(([^.]+\.)?team_id?, \d+\)", diff --git a/posthog/test/test_feature_flag.py b/posthog/test/test_feature_flag.py index dbcda391f1f22..c77fabc41744d 100644 --- a/posthog/test/test_feature_flag.py +++ b/posthog/test/test_feature_flag.py @@ -4139,6 +4139,610 @@ def create_groups(self): def create_feature_flag(self, key="beta-feature", **kwargs): return FeatureFlag.objects.create(team=self.team, name="Beta feature", key=key, created_by=self.user, **kwargs) + def test_numeric_operator(self): + Person.objects.create( + team=self.team, + distinct_ids=["307"], + properties={"number": 30, "string_number": "30", "version": "1.24"}, + ) + + feature_flag1 = self.create_feature_flag( + key="random1", + filters={ + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "100", + "operator": "gt", + "type": "person", + }, + ] + } + ] + }, + ) + + feature_flag2 = self.create_feature_flag( + key="random2", + filters={ + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "100b2c", + "operator": "gt", + "type": "person", + }, + ] + } + ] + }, + ) + + feature_flag3 = self.create_feature_flag( + key="random3", + filters={ + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "3.1x00b2c", + "operator": "gt", + "type": "person", + }, + ] + } + ] + }, + ) + + feature_flag4 = self.create_feature_flag( + key="random4", + filters={ + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "20", + "operator": "gt", + "type": "person", + }, + ] + } + ] + }, + ) + + feature_flag5 = self.create_feature_flag( + key="random5", + filters={ + "groups": [ + { + "properties": [ + { + "key": "version", + "value": "1.05", + "operator": "gt", + "type": "person", + }, + ] + }, + { + "properties": [ + { + "key": "version", + "value": "1.15", + "operator": "gt", + "type": "person", + }, + ] + }, + { + "properties": [ + { + "key": "version", + "value": "1.1200", + "operator": "gt", + "type": "person", + }, + ] + }, + ] + }, + ) + + feature_flag6 = self.create_feature_flag( + key="random6", + filters={ + "groups": [ + { + "properties": [ + { + "key": "version", + "value": "1.206.0", + "operator": "lt", + "type": "person", + }, + ] + } + ] + }, + ) + + self.assertEqual( + self.match_flag(feature_flag1, "307"), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag2, "307"), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag3, "307"), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag4, "307"), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + + # even though we can parse as a number, only do string comparison + self.assertEqual( + self.match_flag(feature_flag5, "307"), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag6, "307"), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + + def test_numeric_operator_with_groups_and_person_flags(self): + Person.objects.create( + team=self.team, + distinct_ids=["307"], + properties={"number": 30, "string_number": "30", "version": "1.24"}, + ) + GroupTypeMapping.objects.create(team=self.team, group_type="organization", group_type_index=0) + GroupTypeMapping.objects.create(team=self.team, group_type="project", group_type_index=1) + + Group.objects.create( + team=self.team, + group_type_index=0, + group_key="foo", + group_properties={"name": "foo.inc", "number": 50, "string_number": "50"}, + version=1, + ) + Group.objects.create( + team=self.team, + group_type_index=1, + group_key="foo-project", + group_properties={"name": "foo-project", "number": 20, "string_number": "20"}, + version=1, + ) + + feature_flag1 = self.create_feature_flag( + key="random1", + filters={ + "aggregation_group_type_index": 0, + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "100", + "operator": "gt", + "group_type_index": 0, + "type": "group", + }, + ] + } + ], + }, + ) + + feature_flag2 = self.create_feature_flag( + key="random2", + filters={ + "aggregation_group_type_index": 1, + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "100b2c", + "operator": "gt", + "group_type_index": 1, + "type": "group", + }, + ] + } + ], + }, + ) + + feature_flag3 = self.create_feature_flag( + key="random3", + filters={ + "aggregation_group_type_index": 0, + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "3.1x00b2c", + "operator": "gte", + "type": "person", + "group_type_index": 0, + "type": "group", + }, + ] + } + ], + }, + ) + + feature_flag4 = self.create_feature_flag( + key="random4", + filters={ + "aggregation_group_type_index": 0, + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "20", + "operator": "gt", + "group_type_index": 0, + "type": "group", + }, + ] + } + ], + }, + ) + + feature_flag4_person = self.create_feature_flag( + key="random4_person", + filters={ + "groups": [ + { + "properties": [ + { + "key": "number", + "value": "20", + "operator": "gte", + "type": "person", + }, + ] + } + ] + }, + ) + + feature_flag5 = self.create_feature_flag( + key="random5", + filters={ + "groups": [ + { + "properties": [ + { + "key": "version", + "value": "1.05", + "operator": "gt", + "type": "person", + }, + ] + }, + { + "properties": [ + { + "key": "version", + "value": "1.15", + "operator": "gt", + "type": "person", + }, + ] + }, + { + "properties": [ + { + "key": "version", + "value": "1.1200", + "operator": "gte", + "type": "person", + }, + ] + }, + ] + }, + ) + + feature_flag6 = self.create_feature_flag( + key="random6", + filters={ + "aggregation_group_type_index": 0, + "groups": [ + { + "properties": [ + { + "key": "version", + "value": "1.206.0", + "operator": "lt", + "group_type_index": 0, + "type": "group", + }, + ] + } + ], + }, + ) + + self.assertEqual( + self.match_flag(feature_flag1, "307", groups={"organization": "foo", "project": "foo-project"}), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag2, "307", groups={"organization": "foo", "project": "foo-project"}), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag3, "307", groups={"organization": "foo", "project": "foo-project"}), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag4, "307", groups={"organization": "foo", "project": "foo-project"}), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + + # even though we can parse as a number, only do string comparison + self.assertEqual( + self.match_flag(feature_flag5, "307", groups={"organization": "foo", "project": "foo-project"}), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag(feature_flag6, "307", groups={"organization": "foo", "project": "foo-project"}), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + + # Make sure clashes on property name doesn't affect computation + with snapshot_postgres_queries_context(self, replace_all_numbers=False): + self.assertEqual( + FeatureFlagMatcher( + [feature_flag1, feature_flag2, feature_flag4_person], + "307", + groups={"organization": "foo", "project": "foo-project"}, + ).get_matches()[1], + { + "random1": { + "condition_index": 0, + "reason": FeatureFlagMatchReason.NO_CONDITION_MATCH, + }, + "random2": { + "condition_index": 0, + "reason": FeatureFlagMatchReason.CONDITION_MATCH, + }, + "random4_person": { + "condition_index": 0, + "reason": FeatureFlagMatchReason.CONDITION_MATCH, + }, + }, + ) + + # handle overrides in group properties + self.assertEqual( + self.match_flag( + feature_flag1, + "307", + groups={"organization": "foo", "project": "foo-project"}, + group_property_value_overrides={"organization": {"number": 200}, "project": {"number": 1}}, + ), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + + # string '30' > string '100' (lexicographically) + self.assertEqual( + self.match_flag( + feature_flag1, + "307", + groups={"organization": "foo", "project": "foo-project"}, + group_property_value_overrides={"organization": {"number": "30"}, "project": {"number": 1}}, + ), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag( + feature_flag1, + "307", + groups={"organization": "foo", "project": "foo-project"}, + group_property_value_overrides={"organization": {"number": "01323"}, "project": {"number": 1}}, + ), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag( + feature_flag1, + "307", + groups={"organization": "foo", "project": "foo-project"}, + group_property_value_overrides={"organization": {"number": 0}, "project": {"number": 1}}, + ), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + self.assertEqual( + self.match_flag( + feature_flag2, + "307", + groups={"organization": "foo", "project": "foo-project"}, + group_property_value_overrides={"organization": {"number": "0"}, "project": {"number": 19.999999}}, + ), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + + def test_numeric_operator_with_cohorts_and_nested_cohorts(self): + Person.objects.create( + team=self.team, + distinct_ids=["307"], + properties={"number": 30, "string_number": "30", "version": "1.24", "nested_prop": 21}, + ) + cohort1 = Cohort.objects.create( + team=self.team, + groups=[ + { + "properties": [ + { + "key": "number", + "value": "100", + "type": "person", + "operator": "gt", + } + ] + } + ], + ) + feature_flag1 = self.create_feature_flag( + key="random1", + filters={ + "groups": [ + { + "properties": [ + { + "key": "id", + "value": cohort1.pk, + "type": "cohort", + }, + ] + } + ] + }, + ) + + self.assertEqual( + self.match_flag(feature_flag1, "307"), + FeatureFlagMatch(False, None, FeatureFlagMatchReason.NO_CONDITION_MATCH, 0), + ) + + cohort2 = Cohort.objects.create( + team=self.team, + groups=[ + { + "properties": [ + { + "key": "version", + "value": "1.05", + "operator": "gt", + "type": "person", + }, + ] + } + ], + ) + feature_flag2 = self.create_feature_flag( + key="random2", + filters={ + "groups": [ + { + "properties": [ + { + "key": "id", + "value": cohort2.pk, + "type": "cohort", + }, + ] + } + ] + }, + ) + + self.assertEqual( + self.match_flag(feature_flag2, "307"), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + + cohort_nest = Cohort.objects.create( + team=self.team, + groups=[ + { + "properties": [ + { + "key": "nested_prop", + "value": "20", + "operator": "gt", + "type": "person", + }, + ] + } + ], + ) + + cohort3 = Cohort.objects.create( + team=self.team, + groups=[ + { + "properties": [ + { + "key": "number", + "value": "31", + "operator": "lt", + "type": "person", + }, + { + "key": "id", + "value": str(cohort_nest.pk), + "type": "cohort", + }, + ] + } + ], + ) + feature_flag3 = self.create_feature_flag( + key="random3", + filters={ + "groups": [ + { + "properties": [ + { + "key": "id", + "value": str(cohort3.pk), + "type": "cohort", + }, + ] + } + ] + }, + ) + + self.assertEqual( + self.match_flag(feature_flag3, "307"), + FeatureFlagMatch(True, None, FeatureFlagMatchReason.CONDITION_MATCH, 0), + ) + + # Make sure clashes on property name doesn't affect computation + with snapshot_postgres_queries_context(self, replace_all_numbers=False): + self.assertEqual( + FeatureFlagMatcher( + [feature_flag1, feature_flag2, feature_flag3], + "307", + ).get_matches()[1], + { + "random1": { + "condition_index": 0, + "reason": FeatureFlagMatchReason.NO_CONDITION_MATCH, + }, + "random2": { + "condition_index": 0, + "reason": FeatureFlagMatchReason.CONDITION_MATCH, + }, + "random3": { + "condition_index": 0, + "reason": FeatureFlagMatchReason.CONDITION_MATCH, + }, + }, + ) + class TestFeatureFlagHashKeyOverrides(BaseTest, QueryMatchingTest): person: Person From ab04bddc17213eb3de203de12c633d9bd5c7f893 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 7 Nov 2023 12:09:30 +0000 Subject: [PATCH 2/4] fix: dark mode tweaks (#18428) --- ...nes-app-notebooks--recordings-playlist.png | Bin 83394 -> 84201 bytes .../navigation-3000/sidepanel/SidePanel.scss | 2 +- .../components/PropertyFilterButton.scss | 7 +------ .../SmoothingFilter/SmoothingFilter.tsx | 6 +++--- frontend/src/styles/global.scss | 13 +++++++++++++ 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/frontend/__snapshots__/scenes-app-notebooks--recordings-playlist.png b/frontend/__snapshots__/scenes-app-notebooks--recordings-playlist.png index b03f1fab581cf0d96a2929d4c20df6fcfddf91e6..e0e5eddc30ae170bab1f8d1f3951c1d6cbf4f280 100644 GIT binary patch delta 47505 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 E0q;U4jQ{`u delta 46823 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 Io)g#p1BSnOL;wH) diff --git a/frontend/src/layout/navigation-3000/sidepanel/SidePanel.scss b/frontend/src/layout/navigation-3000/sidepanel/SidePanel.scss index f2744d39ae95b..4f3d08f139753 100644 --- a/frontend/src/layout/navigation-3000/sidepanel/SidePanel.scss +++ b/frontend/src/layout/navigation-3000/sidepanel/SidePanel.scss @@ -20,7 +20,7 @@ box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.2); [theme='dark'] & { - box-shadow: 0px 0px 30px rgba(255, 255, 255, 0.1); + box-shadow: none; } } diff --git a/frontend/src/lib/components/PropertyFilters/components/PropertyFilterButton.scss b/frontend/src/lib/components/PropertyFilters/components/PropertyFilterButton.scss index fa2baa74c9c2c..97aaa8014eee1 100644 --- a/frontend/src/lib/components/PropertyFilters/components/PropertyFilterButton.scss +++ b/frontend/src/lib/components/PropertyFilters/components/PropertyFilterButton.scss @@ -1,6 +1,5 @@ .PropertyFilterButton { overflow: hidden; - color: var(--bg-charcoal); border-color: transparent; background: var(--border); display: inline-flex; @@ -10,7 +9,7 @@ &:focus { border-color: var(--border); background: var(--border); - color: var(--bg-charcoal); + color: var(--text-default); } text-shadow: none; @@ -27,8 +26,4 @@ overflow: hidden; text-overflow: ellipsis; } - - .anticon-close { - color: var(--bg-charcoal); - } } diff --git a/frontend/src/lib/components/SmoothingFilter/SmoothingFilter.tsx b/frontend/src/lib/components/SmoothingFilter/SmoothingFilter.tsx index 961fa82e2ef84..9460168ba9fd4 100644 --- a/frontend/src/lib/components/SmoothingFilter/SmoothingFilter.tsx +++ b/frontend/src/lib/components/SmoothingFilter/SmoothingFilter.tsx @@ -1,10 +1,10 @@ -import { Select } from 'antd' import { FundOutlined } from '@ant-design/icons' import { smoothingOptions } from './smoothings' import { useActions, useValues } from 'kea' import { insightLogic } from 'scenes/insights/insightLogic' import { insightVizDataLogic } from 'scenes/insights/insightVizDataLogic' import { trendsDataLogic } from 'scenes/trends/trendsDataLogic' +import { LemonSelect } from '@posthog/lemon-ui' export function SmoothingFilter(): JSX.Element | null { const { insightProps } = useValues(insightLogic) @@ -31,9 +31,8 @@ export function SmoothingFilter(): JSX.Element | null { })) return options.length ? ( -