package sushi.esper.queries;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.espertech.esper.client.EPOnDemandQueryResult;
import sushi.esper.SushiStreamProcessingAdapter;
import sushi.event.SushiEvent;
import sushi.event.SushiEventType;
import sushi.event.attribute.SushiAttribute;
import sushi.event.attribute.SushiAttributeTree;
import sushi.event.attribute.SushiAttributeTypeEnum;
import sushi.event.collection.SushiMapTree;
import sushi.eventhandling.Broker;
import sushi.excel.importer.ExcelImporter;
import sushi.persistence.Persistor;
import sushi.query.SushiQueryTypeEnum;
import sushi.query.SushiLiveQueryListener;
import sushi.query.SushiQuery;
public class SushiEsperTests {
SushiStreamProcessingAdapter esper;
private static String kinoFileName = "Kino.xls";
private static String kinoFilePath = System.getProperty("user.dir") + "/src/test/resources/" + kinoFileName;
private static List<SushiEvent> events;
private SushiEventType eventType;
@Before
public void setup(){
Persistor.useTestEnviroment();
SushiStreamProcessingAdapter.clearInstance();
assertTrue(SushiStreamProcessingAdapter.instanceIsCleared());
esper = SushiStreamProcessingAdapter.getInstance();
ExcelImporter excelNormalizer = new ExcelImporter();
ArrayList<String> columnTitles = excelNormalizer.getColumnTitlesFromFile(kinoFilePath);
assertTrue("Not the right attributes", columnTitles.equals(new ArrayList<String>(Arrays.asList("Timestamp", "Location", "Rating"))));
columnTitles.remove("Timestamp");
List<SushiAttribute> attributes = new ArrayList<SushiAttribute>();
for (String attributeName : columnTitles) {
if (attributeName.equals("Location")) {
attributes.add(new SushiAttribute(attributeName, SushiAttributeTypeEnum.INTEGER));
} else if (attributeName.equals("Rating")) {
attributes.add(new SushiAttribute(attributeName, SushiAttributeTypeEnum.STRING));
}
}
events = excelNormalizer.importEventsFromFile(kinoFilePath, attributes);
eventType = new SushiEventType("Kino", attributes, "Timestamp");
assertTrue("KinoWindow already exists", !esper.hasWindow("KinoWindow"));
System.out.println("Events imported: " + events.size());
}
@Test
public void testEventTypes() {
//eventTyp erzeugen
SushiAttributeTree attributes = new SushiAttributeTree();
attributes.addRoot(new SushiAttribute("Sorte", SushiAttributeTypeEnum.STRING));
attributes.addRoot(new SushiAttribute("Leckerheitsgrad", SushiAttributeTypeEnum.STRING));
SushiEventType eventType = new SushiEventType("Eiscreme", attributes);
esper.addEventType(eventType);
assertTrue("Event type was not added.", esper.isEventType(eventType));
//Events erzeugen
SushiMapTree<String, Serializable> values1 = new SushiMapTree<String, Serializable>();
values1.addRootElement("Sorte", "Vanille");
values1.addRootElement("Leckerheitsgrad", "awesome");
SushiEvent event1 = new SushiEvent(eventType, new Date(System.currentTimeMillis()), values1);
SushiMapTree<String, Serializable> values2 = new SushiMapTree<String, Serializable>();
values1.addRootElement("Sorte", "Schoko");
values1.addRootElement("Leckerheitsgrad", "super awesome");
SushiEvent event2 = new SushiEvent(eventType, new Date(System.currentTimeMillis()), values2);
ArrayList<SushiEvent> events = new ArrayList<SushiEvent>();
events.add(event1);
events.add(event2);
SushiEvent.setEventType(events, eventType);
esper.addEvents(events);
}
@Test
public void testAddingLiveQuery(){
eventType = Broker.send(eventType);
SushiEventType eventTypeFromDB = SushiEventType.findByTypeName("Kino");
assertTrue("eventType not found", eventTypeFromDB != null);
assertTrue("eventType not the same", eventTypeFromDB == eventType);
String query = "Select * From " + eventType.getTypeName();
SushiQuery liveQuery = new SushiQuery("All", query, SushiQueryTypeEnum.LIVE);
liveQuery.save();
SushiLiveQueryListener listener = liveQuery.addToEsper();
SushiEvent.setEventType(events, eventType);
Broker.send(events);
SushiLiveQueryListener listener2 = esper.getListenerByQuery(query);
assertTrue("should be same Listeners", listener == listener2);
assertTrue(listener.getNumberOfLogEntries() == events.size());
SushiQuery liveQueryFromDB = SushiQuery.findQueryByTitle("All");
assertTrue(liveQueryFromDB.getLog().size() == events.size());
}
@Test
public void testSushiQuery(){
eventType = Broker.send(eventType);
SushiQuery query = new SushiQuery("testquery", "Select * From KinoWindow", SushiQueryTypeEnum.ONDEMAND);
SushiEventType eventType = SushiEventType.findByTypeName("Kino");
assertTrue("Event type not found", eventType != null);
SushiEvent.setEventType(events, eventType);
Broker.send(events);
String log = query.execute();
assertTrue("expected 999, got: " + log.substring(log.length()-4, log.length()), log.endsWith("999")); //999 events, last line has \n too
}
@Test
public void testWindowCreation(){
assertTrue("Window has already been created", ! SushiStreamProcessingAdapter.getInstance().hasWindow(eventType.getTypeName() + "Window"));
SushiStreamProcessingAdapter.getInstance().createWindow(eventType);
assertTrue("Window has not been created", SushiStreamProcessingAdapter.getInstance().hasWindow(eventType.getTypeName() + "Window"));
//Send Events
for (SushiEvent event : events) {
event.setEventType(eventType);
SushiStreamProcessingAdapter.getInstance().addEvent(event);
}
EPOnDemandQueryResult result = SushiStreamProcessingAdapter.getInstance().getEsperRuntime().executeQuery("Select * From KinoWindow");
assertTrue("Number of events should have been 999, instead of " + result.getArray().length, result.getArray().length == 999);
}
}