Обращение к именованным глобальным выражениям внутри фильтра событий с использованием EPStatementObjectModel (Esper)

Я знаю, что вы можете создавать глобальные выражения с помощью объектной модели оператора Эспера, используя CreateExpressionClause и ExpressionDeclaration, но я не совсем уверен, как вы можете ссылаться на их псевдонимы при построении EPStatementObjectModel для шаблона. Например, скажем, у меня есть такой шаблон:

every (a=Event(fizz = 3 and buzz = 5) -> b=Event(fizz = 3 and buzz = 5 and foo = 1 and bar = 2))

Я хотел бы объявить fizz = 3 and buzz = 5 как глобальное выражение как таковое:

create expression fizzbuzz alias for {fizz = 3 and buzz = 5}

Таким образом, с помощью EPL я смог успешно упростить шаблон до следующего:

every (a=Event(fizzbuzz) -> b=Event(fizzbuzz and foo = 1 and bar = 2))

Кажется, я не могу найти метод ни в одном из классов в com.espertech.esper.client.soda, в котором я мог бы ссылаться на псевдоним глобального выражения при построении объекта оператора. Лучшее, что я мог придумать, это дало бы мне правильный шаблон, когда преобразование объекта инструкции в EPL включало бы Expressions.property(alias), но я получаю следующую ошибку, когда добавляю полный объект инструкции в механизм Esper:

Failed to validate filter expression 'fizzbuzz': Property named 'fizzbuzz' is not valid in any stream [every (a=Event(fizzbuzz) -> b=Event(fizzbuzz and foo = 1 and bar = 2))]

Обратите внимание, что а) глобальные выражения уже были объявлены к этому моменту, б) если я добавлю шаблон, содержащий псевдонимы глобальных выражений в форме EPL, в механизм Esper, это сработает.

Есть идеи? Хотя это вариант, я бы предпочел не преобразовывать EPStatementObjectModel в строку EPL каждый раз, когда я добавляю новый шаблон в движок.


person Brady Goldman    schedule 24.09.2015    source источник


Ответы (2)


Вы можете проверить сгенерированную объектную модель в отладчике, чтобы выяснить это. Таким образом, чтобы сгенерировать его, вы можете вызвать «epadmin.compile(«какой-то epl с выражением») и посмотреть, что вернется.

person user650839    schedule 24.09.2015

Следуя совету пользователя 650839, я обнаружил в ходе отладки, что способ включения псевдонима в именованные глобальные выражения заключается в том, чтобы включить DotExpression в дерево объектов оператора как таковое:

DotExpression globalExpression = new DotExpression();
globalExpression.add("fizzbuzz", new ArrayList<Expression>(), true);
person Brady Goldman    schedule 25.09.2015