Skip to content

Commit b3d2242

Browse files
Completed filter expression tests
1 parent bd28598 commit b3d2242

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

src/sttp/data/filterexpressionparser.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ def exitIdentifierStatement(self, ctx: ExpressionParser.IdentifierStatementConte
462462
signalid = Empty.GUID
463463

464464
if ctx.GUID_LITERAL() is not None:
465-
signalid = UUID(ctx.GUID_LITERAL().getText())
465+
signalid = FilterExpressionParser._parse_guidliteral(ctx.GUID_LITERAL().getText())
466466

467467
if not self.track_filteredrows and not self.track_filteredsignalids:
468468
# Handle edge case of encountering standalone Guid when not tracking rows or table identifiers.
@@ -930,13 +930,13 @@ def exitLiteralValue(self, ctx: ExpressionParser.LiteralValueContext):
930930

931931
if value > Limits.MAXINT32:
932932
if value > Limits.MAXINT64:
933-
result = self._parse_numericliteral(literal)
933+
result = FilterExpressionParser._parse_numericliteral(literal)
934934
else:
935935
result = ValueExpression(ExpressionValueType.INT64, value)
936936
else:
937937
result = ValueExpression(ExpressionValueType.INT32, value)
938938
except Exception:
939-
result = self._parse_numericliteral(literal)
939+
result = FilterExpressionParser._parse_numericliteral(literal)
940940
elif ctx.NUMERIC_LITERAL() is not None:
941941
literal: str = ctx.NUMERIC_LITERAL().getText()
942942

@@ -945,15 +945,15 @@ def exitLiteralValue(self, ctx: ExpressionParser.LiteralValueContext):
945945
if "E" in literal.upper():
946946
result = ValueExpression(ExpressionValueType.DOUBLE, float(literal))
947947
else:
948-
result = self._parse_numericliteral(literal)
948+
result = FilterExpressionParser._parse_numericliteral(literal)
949949
except Exception:
950-
result = self._parse_numericliteral(literal)
950+
result = FilterExpressionParser._parse_numericliteral(literal)
951951
elif ctx.STRING_LITERAL() is not None:
952-
result = ValueExpression(ExpressionValueType.STRING, self._parse_stringliteral(ctx.STRING_LITERAL().getText()))
952+
result = ValueExpression(ExpressionValueType.STRING, FilterExpressionParser._parse_stringliteral(ctx.STRING_LITERAL().getText()))
953953
elif ctx.DATETIME_LITERAL() is not None:
954-
result = ValueExpression(ExpressionValueType.DATETIME, self._parse_datetimeliteral(ctx.DATETIME_LITERAL().getText()))
954+
result = ValueExpression(ExpressionValueType.DATETIME, FilterExpressionParser._parse_datetimeliteral(ctx.DATETIME_LITERAL().getText()))
955955
elif ctx.GUID_LITERAL() is not None:
956-
result = ValueExpression(ExpressionValueType.GUID, self._parse_guidliteral(ctx.GUID_LITERAL().getText()))
956+
result = ValueExpression(ExpressionValueType.GUID, FilterExpressionParser._parse_guidliteral(ctx.GUID_LITERAL().getText()))
957957
elif ctx.BOOLEAN_LITERAL() is not None:
958958
literal: str = ctx.BOOLEAN_LITERAL().getText()
959959
result = TRUEVALUE if literal.upper() == "TRUE" else FALSEVALUE
@@ -963,7 +963,8 @@ def exitLiteralValue(self, ctx: ExpressionParser.LiteralValueContext):
963963
if result is not None:
964964
self._add_expr(ctx, result)
965965

966-
def _parse_numericliteral(self, literal: str) -> ValueExpression:
966+
@staticmethod
967+
def _parse_numericliteral(literal: str) -> ValueExpression:
967968
try:
968969
value = Decimal(literal)
969970
return ValueExpression(ExpressionValueType.DECIMAL, value)
@@ -974,17 +975,20 @@ def _parse_numericliteral(self, literal: str) -> ValueExpression:
974975
except Exception:
975976
return ValueExpression(ExpressionValueType.STRING, literal)
976977

977-
def _parse_stringliteral(self, literal: str) -> str:
978+
@staticmethod
979+
def _parse_stringliteral(literal: str) -> str:
978980
# Remove any surrounding quotes from string, ANTLR grammar already
979981
# ensures strings starting with quote also ends with one
980982
return literal[1:-1] if literal[0] == "'" else literal
981983

982-
def _parse_guidliteral(self, literal: str) -> UUID:
984+
@staticmethod
985+
def _parse_guidliteral(literal: str) -> UUID:
983986
# Remove any quotes from GUID (boost currently only handles optional braces),
984987
# ANTLR grammar already ensures GUID starting with quote also ends with one
985988
return UUID(literal[1:-1] if literal[0] in ["{", "'"] else literal)
986989

987-
def _parse_datetimeliteral(self, literal: str) -> datetime:
990+
@staticmethod
991+
def _parse_datetimeliteral(literal: str) -> datetime:
988992
# Remove any surrounding '#' symbols from date/time, ANTLR grammar already
989993
# ensures date/time starting with '#' symbol will also end with one
990994
literal = literal[1:-1] if literal[0] == "#" else literal

test/sttp/data/test_expressiontree.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2074,3 +2074,30 @@ def test_misc_expressions(self):
20742074

20752075
if result != 32:
20762076
self.fail(f"test_misc_expressions: unexpected value expression result, expected 32, received {result}")
2077+
2078+
def test_filterexpression_statement_count(self):
2079+
dataset, _, _, statid, freqid = TestDataSet._create_dataset()
2080+
2081+
parser, err = FilterExpressionParser.from_dataset(dataset, f"{statid}; {{{freqid}}};'{statid}';Filter ActiveMeasurements Where True", "ActiveMeasurements")
2082+
2083+
if err is not None:
2084+
self.fail(f"test_filterexpression_statement_count: error executing FilterExpressionParser.from_dataset: {err}")
2085+
2086+
parser.track_filteredrows = False
2087+
parser.track_filteredsignalids = True
2088+
2089+
err = parser.evaluate(True, False)
2090+
2091+
if err is not None:
2092+
self.fail(f"test_filterexpression_statement_count: error executing parser.evaluate: {err}")
2093+
2094+
idset = parser.filtered_signalidset
2095+
2096+
if len(idset) != 2:
2097+
self.fail(f"test_filterexpression_statement_count: expected 2 signal IDs, received {len(idset)}")
2098+
2099+
if statid not in idset or freqid not in idset:
2100+
self.fail(f"test_filterexpression_statement_count: expected signal IDs {statid} and {freqid}, received {idset}")
2101+
2102+
if parser.filterexpression_statementcount != 4:
2103+
self.fail(f"test_filterexpression_statement_count: expected 4 statements, received {parser.filterexpression_statementcount}")

0 commit comments

Comments
 (0)