Я играю с Эспером, учусь использовать более продвинутые концепции. У меня есть программа, которая запускает фиктивные события акций 3 разных акций. В настоящее время у меня есть модуль с шаблоном EPL match_recognize, который выглядит так:
module queries;
import events.*;
import configDemo.*;
import annotations.*;
create schema MyTickEvent as TickEvent;
@Name('compareStocks')
@Description('Compare the difference amount between two stocks')
@Subscriber(className='configDemo.MySubscriber')
select * from TickEvent
match_recognize (
measures A.currentPrice as a_currentPrice, B.currentPrice as b_currentPrice,
A.stockName as a_stockName, B.stockName as b_stockName
pattern (A C* B)
define
A as A.stockName = firstStock,
B as A.currentPrice - B.currentPrice >= difference and B.stockName =
secondStock
);
Как видите, в нем три переменных — firstStock, secondStock, разность. Я принимаю ввод пользователя, а затем устанавливаю переменные в коде Java как таковые:
System.out.println("Please enter 3 char stock name for the first stock: ");
System.out.println("Available stocks: IBM, YAH, MIC");
first = scanner.nextLine();
engineHelper.getAdmin().getConfiguration().addVariable("firstStock", String.class, first);
System.out.println("Please enter 3 char stock name for the second stock: ");
second = scanner.nextLine();
engineHelper.getAdmin().getConfiguration().addVariable("secondStock", String.class, second);
System.out.println("Please enter integer value for stock difference: ");
difference = scanner.nextInt();
engineHelper.getAdmin().getConfiguration().addVariable("difference", Integer.class, difference);
Это прекрасно работает, если я хочу отслеживать только одну пару акций за раз. Я изо всех сил пытаюсь найти способ сделать это для нескольких пар. Я хочу иметь возможность динамически создавать/удалять/запускать/останавливать пары. Например, допустим, у меня есть акции YAH, APP, MIC, GOO. События начинают выполняться, и я решаю, что хочу отслеживать разницу более чем в X сумм между MIC/GOO. Затем я решаю, что хочу отслеживать APP/GOO тоже за другую сумму. Данные будут примерно такими:
[IBM, YAH, 5] [GOO, APP, 3]....
Любые предложения о том, как это сделать? Я предполагаю, что мне нужно будет создать новый экземпляр EPL с новым набором переменных. Я могу легко сделать это в java-коде, но я хочу держаться от этого как можно дальше. Я хочу использовать файлы модулей. Поскольку это, по сути, один и тот же EPL, имело бы смысл использовать его в качестве шаблона с несколькими «экземплярами» для разных пар акций.
В качестве альтернативы, есть ли другие способы добиться этого эффективно?
Я заработал, я заметил, что ошибки возникают из-за текста, которого больше нет в файле, поэтому я удалил его и переписал, и это сработало. Теперь все успешно развернуто, и вот как это выглядит:
module context;
import events.*;
import configDemo.*;
import annotations.*;
import main.*;
import subscribers.*;
create schema InitEvent(firstStock string, secondStock string, bias double);
create context TwoStocksContext
initiated by InitEvent as initEvent;
@Name('compareStocks')
@Description('Compare the difference between two different stocks and make a
decision')
@Subscriber(className='subscribers.MySubscriber')
context TwoStocksContext
select * from TickEvent
match_recognize (
measures A.currentPrice as a_currentPrice, B.currentPrice as b_currentPrice, A.stockCode as a_stockCode, B.stockCode as b_stockCode
pattern (A C* B)
define
A as A.stockCode = context.initEvent.firstStock,
B as A.currentPrice - B.currentPrice >= context.initEvent.bias and
B.stockCode = context.initEvent.secondStock
);