Fix #4323. Bug where running a filter could fail if you tried to compare values which had incompatible types.

This commit is contained in:
Dion Moult
2024-03-30 23:07:06 +11:00
parent 77de3820e7
commit c8af51cfd2
@@ -697,31 +697,37 @@ class FacetTransformer(lark.Transformer):
if isinstance(element_value, (list, tuple)): if isinstance(element_value, (list, tuple)):
return any(self.compare(ev, comparison, value) for ev in element_value) return any(self.compare(ev, comparison, value) for ev in element_value)
elif isinstance(value, str): elif isinstance(value, str):
if isinstance(element_value, int): try:
value = int(value) if isinstance(element_value, int):
elif isinstance(element_value, float): value = int(value)
value = float(value) elif isinstance(element_value, float):
value = float(value)
if isinstance(element_value, (int, float)): if isinstance(element_value, (int, float)):
operator = comparison.lstrip("!") operator = comparison.lstrip("!")
if operator == ">=": if operator == ">=":
result = element_value >= value result = element_value >= value
elif operator == "<=": elif operator == "<=":
result = element_value <= value result = element_value <= value
elif operator == ">": elif operator == ">":
result = element_value > value result = element_value > value
elif operator == "<": elif operator == "<":
result = element_value < value result = element_value < value
else: else:
result = element_value == value # Tolerance? result = element_value == value # Tolerance?
elif isinstance(element_value, str): elif isinstance(element_value, str):
operator = comparison.lstrip("!") operator = comparison.lstrip("!")
if operator == "*=": if operator == "*=":
result = value in element_value result = value in element_value
else:
result = element_value == value
else: else:
result = element_value == value result = element_value == value
else: except:
result = element_value == value # Potentially they are trying to compare a value which cannot
# be legally casted to the element_value, or cannot use the
# `in` or more / less than comparison operators.
result = False
elif isinstance(value, re.Pattern): elif isinstance(value, re.Pattern):
result = bool(value.match(element_value)) if element_value is not None else False result = bool(value.match(element_value)) if element_value is not None else False
elif value in (None, True, False): elif value in (None, True, False):