package sushi.esper.queries;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import sushi.esper.SushiCEPListener;
import sushi.esper.SushiStreamProcessingAdapter;
import sushi.event.SushiEvent;
import sushi.event.SushiEventType;
import sushi.event.attribute.SushiAttribute;
import sushi.eventhandling.Broker;
import sushi.excel.importer.ExcelImporter;
import sushi.persistence.Persistor;
import sushi.util.SushiTestHelper;
import com.espertech.esper.client.Configuration;
import com.espertech.esper.client.EPAdministrator;
import com.espertech.esper.client.EPRuntime;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.time.CurrentTimeEvent;
import com.espertech.esper.client.time.TimerControlEvent;
public class StatementTest {
private static String filePathRating = System.getProperty("user.dir")+"/src/test/resources/Kino.xls";
private static String filePathKino = System.getProperty("user.dir")+"/src/test/resources/Kino_Filme.xls";
private ExcelImporter excelNormalizer = new ExcelImporter();
private SushiStreamProcessingAdapter sushiEsper = SushiStreamProcessingAdapter.getInstance();
private List<SushiEvent> createRatingEvents() {
List<String> ratingColumnTitles = excelNormalizer.getColumnTitlesFromFile(filePathRating);
List<SushiAttribute> ratingAttributes = SushiTestHelper.createAttributes(ratingColumnTitles);
return excelNormalizer.importEventsFromFile(filePathRating, ratingAttributes);
}
private List<SushiEvent> createKinoEvents() {
List<String> kinoColumnTitles = excelNormalizer.getColumnTitlesFromFile(filePathKino);
List<SushiAttribute> kinoAttributes = SushiTestHelper.createAttributes(kinoColumnTitles);
return excelNormalizer.importEventsFromFile(filePathKino, kinoAttributes);
}
private SushiEventType createCompositeEventType() {
Set<String> columnTitles = new HashSet<String>();
columnTitles.addAll(excelNormalizer.getColumnTitlesFromFile(filePathRating));
columnTitles.addAll(excelNormalizer.getColumnTitlesFromFile(filePathKino));
columnTitles.remove("Timestamp");
List<SushiAttribute> attributes = SushiTestHelper.createAttributes(new ArrayList<String>(columnTitles));
return new SushiEventType("Event", attributes, "Timestamp");
}
@Before
public void setup() {
Persistor.useTestEnviroment();
}
// TODO: Query und Listener anlegen und dann Events reinladen und Abfragen
// Bewertung pro Film
@Test
public void testNormalQuery() {
// Configuration cepConfig = new Configuration();
// cepConfig.addEventType("Event", SushiEvent.class.getName());
SushiEventType eventType = createCompositeEventType();
Broker.send(eventType);
// cepConfig.getEngineDefaults().getThreading().setInternalTimerEnabled(false);
// EPServiceProvider cep = EPServiceProviderManager.getProvider("myCEPEngine", cepConfig);
// EPRuntime cepRT = cep.getEPRuntime();
EPRuntime cepRT = sushiEsper.getEsperRuntime();
// cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL));
EPAdministrator cepAdm = sushiEsper.getEsperAdministrator();
// cepAdm.createEPL("CREATE WINDOW EventWindow.win:keepall() AS SELECT * FROM Event");
// cepAdm.createEPL("INSERT INTO EventWindow SELECT * FROM Event");
EPStatement transformationStatement = cepAdm.createEPL("" +
"SELECT A.Timestamp.getTime(), B.Timestamp.getTime(), A.values('Location'), A.values('Movie') " +
"FROM EventWindow AS A, EventWindow AS B " +
"WHERE " +
"B.values('Action')='Ende' AND " +
"A.values('Action')='Start' AND " +
"A.values('Location')=B.values('Location') AND " +
"A.values('Movie')=B.values('Movie') AND " +
"(A.Timestamp.getTime()).before(B.Timestamp.getTime(), 0 hours, 3 hours)");
transformationStatement.addListener(new SushiCEPListener());
// create events
List<SushiEvent> ratingEvents = createRatingEvents();
// send events
for (SushiEvent event : ratingEvents) {
cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL));
// cepRT.sendEvent(new CurrentTimeEvent(event.getTimestamp().getTime()));
// cepRT.sendEvent(event);
event.setEventType(eventType);
Broker.send(event);
}
// create events
List<SushiEvent> kinoEvents = createKinoEvents();
// send events
for (SushiEvent event : kinoEvents) {
cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL));
// cepRT.sendEvent(new CurrentTimeEvent(event.getTimestamp().getTime()));
// cepRT.sendEvent(event);
event.setEventType(eventType);
Broker.send(event);
}
cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_INTERNAL));
}
@Test
public void testTimestamp() {
Configuration cepConfig = new Configuration();
cepConfig.addEventType("Event", SushiEvent.class.getName());
EPServiceProvider cep = EPServiceProviderManager.getProvider("myCEPEngine", cepConfig);
EPRuntime cepRT = cep.getEPRuntime();
EPAdministrator cepAdm = cep.getEPAdministrator();
// create statement
EPStatement timeStatement = cepAdm.createEPL("select count(*) from Event.win:time(1 hour)");
timeStatement.addListener(new SushiCEPListener());
// create events
List<SushiEvent> ratingEvents = createRatingEvents();
sortEventListByDate(ratingEvents);
// pass events to Esper engine
for (SushiEvent event : ratingEvents) {
cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL));
System.out.println(new CurrentTimeEvent(event.getTimestamp().getTime()).toString());
cepRT.sendEvent(new CurrentTimeEvent(event.getTimestamp().getTime()));
cepRT.sendEvent(event);
}
}
@Test
public void testContextQuery() {
Configuration cepConfig = new Configuration();
cepConfig.addEventType("Event", SushiEvent.class.getName());
EPServiceProvider cep = EPServiceProviderManager.getProvider("myCEPEngine", cepConfig);
EPRuntime cepRT = cep.getEPRuntime();
EPAdministrator cepAdm = cep.getEPAdministrator();
cepAdm.createEPL("" +
"CREATE CONTEXT NestedContext " +
"CONTEXT SegmentedByLocation PARTITION BY values('Location') FROM Event, " +
"CONTEXT SegmentedByTime INITIATED BY Event(values('Action')='Ende') TERMINATED AFTER 1 hour, " +
"CONTEXT SegmentedByRating PARTITION BY values('Rating') FROM Event");
EPStatement transformationStatement = cepAdm.createEPL("" +
"CONTEXT NestedContext " +
"SELECT ID, values('Location'), values('Rating'), count(*) " +
"FROM Event " +
"GROUP BY values('Location'), values('Rating') " +
"OUTPUT LAST EVERY 30 minute");
transformationStatement.addListener(new SushiCEPListener());
List<SushiEvent> events = new ArrayList<SushiEvent>();
events.addAll(createRatingEvents());
events.addAll(createKinoEvents());
this.sortEventListByDate(events);
for (SushiEvent event : events) {
cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_EXTERNAL));
cepRT.sendEvent(new CurrentTimeEvent(event.getTimestamp().getTime()));
cepRT.sendEvent(event);
}
cepRT.sendEvent(new TimerControlEvent(TimerControlEvent.ClockType.CLOCK_INTERNAL));
}
private void sortEventListByDate(List<SushiEvent> events){
Collections.sort(events, new Comparator<SushiEvent>(){
@Override
public int compare(SushiEvent event1, SushiEvent event2) {
return event1.getTimestamp().compareTo(event2.getTimestamp());
}
});
}
}