Ark Server API (ASA) - Wiki
Loading...
Searching...
No Matches
TextFilterExpressionEvaluator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Containers/Array.h"
5#include "Containers/Map.h"
6#include "Containers/UnrealString.h"
7#include "CoreTypes.h"
8#include "Delegates/Delegate.h"
9#include "Internationalization/Text.h"
10#include "Misc/ExpressionParser.h"
11#include "Misc/ExpressionParserTypes.h"
12#include "Misc/Optional.h"
13#include "Misc/TextFilterUtils.h"
14#include "Templates/UnrealTemplate.h"
15#include "UObject/NameTypes.h"
16
17class FTextToken;
18
19/** Defines the complexity of the current filter terms. Complex in this case means that the expression will perform key->value comparisons */
21{
22 Invalid,
23 Empty,
25 Complex,
26};
27
28/** Defines whether or not the expression parser can evaluate complex expressions */
30{
32 Complex,
33};
34
35/** Interface to implement to allow FTextFilterExpressionEvaluator to perform its comparison tests in TestTextFilter */
37{
38public:
39 /** Test the given value against the strings extracted from the current item */
40 virtual bool TestBasicStringExpression(const FTextFilterString& InValue, const ETextFilterTextComparisonMode InTextComparisonMode) const = 0;
41
42 /** Perform a complex expression test for the current item */
43 virtual bool TestComplexExpression(const FName& InKey, const FTextFilterString& InValue, const ETextFilterComparisonOperation InComparisonOperation, const ETextFilterTextComparisonMode InTextComparisonMode) const = 0;
44
45protected:
47};
48
49// A simple basic string expression context for FString
51{
52public:
55 {
56 }
57 explicit FBasicStringFilterExpressionContext(const FString& InTestString)
59 {
60 }
61
62 virtual bool TestBasicStringExpression(const FTextFilterString& InValue, const ETextFilterTextComparisonMode InTextComparisonMode) const override
63 {
64 return TextFilterUtils::TestBasicStringExpression(TestString, InValue, InTextComparisonMode);
65 }
66
67 virtual bool TestComplexExpression(const FName& InKey, const FTextFilterString& InValue, const ETextFilterComparisonOperation InComparisonOperation, const ETextFilterTextComparisonMode InTextComparisonMode) const override
68 {
69 return false;
70 }
71
72private:
74};
75
77{
79 {
80 public:
81 enum class EInvertResult : uint8
82 {
83 No,
84 Yes,
85 };
86
87 FTextToken(FTextFilterString InString, ETextFilterTextComparisonMode InTextComparisonMode, const EInvertResult InInvertResult)
89 , TextComparisonMode(MoveTemp(InTextComparisonMode))
90 , InvertResult(InInvertResult)
91 {
92 }
93
94 FTextToken(const FTextToken& Other)
98 {
99 }
100
105 {
106 }
107
109 {
110 String = Other.String;
113 return *this;
114 }
115
117 {
118 String = MoveTemp(Other.String);
121 return *this;
122 }
123
125 {
126 return String;
127 }
128
130 {
131 if (String.IsEmpty())
132 {
133 // An empty string is always considered to be true
134 return true;
135 }
136
137 const bool bMatched = InContext->TestBasicStringExpression(String, TextComparisonMode);
138 return (InvertResult == EInvertResult::No) ? bMatched : !bMatched;
139 }
140
141 bool EvaluateAsComplexExpression(const ITextFilterExpressionContext* InContext, const FTextFilterString& InKey, const ETextFilterComparisonOperation InComparisonOperation) const
142 {
143 const bool bMatched = InContext->TestComplexExpression(InKey.AsName(), String, InComparisonOperation, TextComparisonMode);
144 return (InvertResult == EInvertResult::No) ? bMatched : !bMatched;
145 }
146
148 {
149 return TextComparisonMode;
150 }
151
152 private:
156 };
157
159 {
160
161 };
162} // namespace TextFilterExpressionParser
163
164#define DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(TYPE, MONIKER_COUNT, ...)
165 namespace TextFilterExpressionParser
166 {
167 struct TYPE
168 {
169 static constexpr int32 MonikerCount = MONIKER_COUNT;
170 static const TCHAR* Monikers[MonikerCount];
171 };
172 } DEFINE_EXPRESSION_NODE_TYPE
173 (TextFilterExpressionParser::TYPE, __VA_ARGS__)
174
175DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FSubExpressionStart, 1, 0x0E7E1BC9, 0xF0B94D5D, 0x80F44D45, 0x85A082AA)
176DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FSubExpressionEnd, 1, 0x5E10956D, 0x2E17411F, 0xB6469E22, 0xB5E56E6C)
177
178DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FEqual, 3, 0x32457EFC, 0x4928406F, 0xBD78D943, 0x633797D1)
179DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FNotEqual, 2, 0x8F445A19, 0xF33443D9, 0x90D6DC85, 0xB0C5D071)
180DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FLess, 1, 0xB85E222B, 0x47E24E1F, 0xBC5A384D, 0x2FF471E1)
181DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FLessOrEqual, 2, 0x8C0A46B0, 0x8DAA4E2B, 0xA7FE4A23, 0xEF215918)
182DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FGreater, 1, 0x6A6247F4, 0xFD78467F, 0xA6AC1244, 0x0A31E0A5)
183DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FGreaterOrEqual, 2, 0x09D75C5E, 0xA29A4194, 0x8E8E5278, 0xC84365FD)
184
185DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FOr, 3, 0xF4778B51, 0xF535414D, 0x9C0EB5F2, 0x2F2B0FD4)
186DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FAnd, 3, 0x7511397A, 0x02D24DC2, 0x86729800, 0xF454C320)
187DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(FNot, 2, 0x03D78990, 0x41D04E26, 0x8E98AD2F, 0x74667868)
188
189DEFINE_EXPRESSION_NODE_TYPE(TextFilterExpressionParser::FTextToken, 0x09E49538, 0x633545E3, 0x84B5644F, 0x1F11628F);
190DEFINE_EXPRESSION_NODE_TYPE(TextFilterExpressionParser::FFunction, 0x084E6214, 0x032FFA48, 0x9245ABF1, 0x9E248F1A);
191
192#undef DEFINE_TEXT_EXPRESSION_OPERATOR_NODE
193
194DECLARE_DELEGATE_RetVal_OneParam(bool, FTokenFunctionHandler, const FTextFilterString&);
195
196/** Defines an expression evaluator that can be used to perform complex text filter queries */
198{
199public:
200 /** Construction and assignment */
205
206 /** Get the complexity of the current filter terms */
208
209 /** Get the filter terms that we're currently using */
211
212 /** Set the filter terms to be compiled for evaluation later. Returns true if the filter was actually changed */
213 bool SetFilterText(const FText& InFilterText);
214
215 /** Get the last error returned from lexing or compiling the current filter text */
217
218 /** Get the filter expression tokens created from the current filter text */
220
221 /** Test our compiled filter using the given context */
222 bool TestTextFilter(const ITextFilterExpressionContext& InContext) const;
223
224 /** Helper function to add callbacks for function tokens */
225 void AddFunctionTokenCallback(FString InFunctionName, FTokenFunctionHandler InCallback);
226
227protected:
228 /** Sets up grammar used for evaluation */
230
231 /** Common function to construct the expression parser */
233
234 /** Evaluate the given compiled result, and optionally populate OutErrorText with any error information */
235 virtual bool EvaluateCompiledExpression(const ExpressionParser::CompileResultType& InCompiledResult, const ITextFilterExpressionContext& InContext, FText* OutErrorText) const;
236
237 /** Defines whether or not the expression parser can evaluate complex expressions */
239
240 /** The cached complexity of the current filter terms */
242
243 /** The the filter terms that we're currently using (compiled into CompiledFilter) */
245
246 /** The last error returned from lexing or compiling the current filter text */
248
249 /** The filter expression tokens created from the current filter text (lexed from FilterText) */
251
252 /** The compiled filter created from the current filter text (compiled from FilterText) */
254
255 /** If there is only one token that is basic string it will be stored here to avoid recompile per item compared. */
257
258 /** Mapping of function names to their callbacks */
260
261 /** Expression parser */
265};
#define DECLARE_DELEGATE_RetVal_OneParam(ReturnValueType, DelegateName, Param1Type)
ETextFilterExpressionEvaluatorMode
Definition Enums.h:34170
ETextFilterExpressionType
Definition Enums.h:34162
#define DEFINE_EXPRESSION_NODE_TYPE(TYPE,...)
#define DEFINE_TEXT_EXPRESSION_OPERATOR_NODE(TYPE, MONIKER_COUNT,...)
ETextFilterTextComparisonMode
ETextFilterComparisonOperation
FBasicStringFilterExpressionContext(const FString &InTestString)
virtual bool TestComplexExpression(const FName &InKey, const FTextFilterString &InValue, const ETextFilterComparisonOperation InComparisonOperation, const ETextFilterTextComparisonMode InTextComparisonMode) const override
virtual bool TestBasicStringExpression(const FTextFilterString &InValue, const ETextFilterTextComparisonMode InTextComparisonMode) const override
FTextFilterExpressionEvaluator(const ETextFilterExpressionEvaluatorMode InMode)
FTextFilterExpressionEvaluator & operator=(const FTextFilterExpressionEvaluator &Other)
const TArray< FExpressionToken > & GetFilterExpressionTokens() const
virtual bool EvaluateCompiledExpression(const ExpressionParser::CompileResultType &InCompiledResult, const ITextFilterExpressionContext &InContext, FText *OutErrorText) const
bool SetFilterText(const FText &InFilterText)
TMap< FString, FTokenFunctionHandler > TokenFunctionHandlers
ETextFilterExpressionEvaluatorMode ExpressionEvaluatorMode
TOptional< ExpressionParser::CompileResultType > CompiledFilter
virtual void ConstructExpressionParser()
ETextFilterExpressionType GetFilterType() const
TOptional< TextFilterExpressionParser::FTextToken > CompiledFilterSingleBasicStringTextToken
TOperatorJumpTable< ITextFilterExpressionContext > JumpTable
void AddFunctionTokenCallback(FString InFunctionName, FTokenFunctionHandler InCallback)
bool TestTextFilter(const ITextFilterExpressionContext &InContext) const
FTextFilterExpressionEvaluator(const FTextFilterExpressionEvaluator &Other)
Definition Text.h:357
virtual bool TestBasicStringExpression(const FTextFilterString &InValue, const ETextFilterTextComparisonMode InTextComparisonMode) const =0
virtual bool TestComplexExpression(const FName &InKey, const FTextFilterString &InValue, const ETextFilterComparisonOperation InComparisonOperation, const ETextFilterTextComparisonMode InTextComparisonMode) const =0
bool EvaluateAsComplexExpression(const ITextFilterExpressionContext *InContext, const FTextFilterString &InKey, const ETextFilterComparisonOperation InComparisonOperation) const
ETextFilterTextComparisonMode GetTextComparisonMode() const
bool EvaluateAsBasicStringExpression(const ITextFilterExpressionContext *InContext) const
FTextToken(FTextFilterString InString, ETextFilterTextComparisonMode InTextComparisonMode, const EInvertResult InInvertResult)
FTextToken & operator=(const FTextToken &Other)
TValueOrError< TArray< FCompiledToken >, FExpressionError > CompileResultType
FGuid(uint32 InA, uint32 InB, uint32 InC, uint32 InD)
Definition Guid.h:127