package sushi.correlation;
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.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
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.persistence.Persistor;
import sushi.process.SushiProcess;
import sushi.process.SushiProcessInstance;
import sushi.util.SushiTestHelper;
public class CorrelationWithRulesTest {
@Before
public void setup(){
Persistor.useTestEnviroment();
}
@Test
public void testCorrelationWithOneRule() {
assertNumberOfDataSets(0, 0, 0, 0);
List<SushiEventType> correlationEventTypes = new ArrayList<SushiEventType>();
SushiAttribute kinoRatingAttribute1 = new SushiAttribute("Location", SushiAttributeTypeEnum.INTEGER);
SushiAttribute kinoRatingAttribute2 = new SushiAttribute("Rating", SushiAttributeTypeEnum.STRING);
List<SushiAttribute> kinoRatingAttributes = Arrays.asList(kinoRatingAttribute1, kinoRatingAttribute2);
SushiEventType kinoRatingEventType = new SushiEventType("KinoRating", kinoRatingAttributes);
correlationEventTypes.add(kinoRatingEventType.save());
SushiAttribute kinoFilmeAttribute1 = new SushiAttribute("Location", SushiAttributeTypeEnum.INTEGER);
SushiAttribute kinoFilmeAttribute2 = new SushiAttribute("Movie", SushiAttributeTypeEnum.STRING);
SushiAttribute kinoFilmeAttribute3 = new SushiAttribute("Action", SushiAttributeTypeEnum.STRING);
List<SushiAttribute> kinoFilmeAttributes = Arrays.asList(kinoFilmeAttribute1, kinoFilmeAttribute2, kinoFilmeAttribute3);
SushiEventType kinoFilmeEventType = new SushiEventType("KinoFilme", kinoFilmeAttributes);
correlationEventTypes.add(kinoFilmeEventType.save());
assertNumberOfDataSets(0, 2, 0, 0);
for (SushiEventType eventType : correlationEventTypes) {
List<SushiEvent> events = SushiTestHelper.createEvents(eventType);
for (SushiEvent event : events) {
event.save();
}
}
assertNumberOfDataSets(6, 2, 0, 0);
SushiProcess process = new SushiProcess("Kino");
process.save();
assertNumberOfDataSets(6, 2, 1, 0);
RuleCorrelator.correlate(new HashSet<CorrelationRule>(Arrays.asList(new CorrelationRule(kinoRatingAttribute1, kinoFilmeAttribute1))), process, null);
//Prüfen, gleiche Anzahl Events, EventTypen, Prozesse und richtige Anzahl Prozessinstanzen
assertNumberOfDataSets(6, 2, 1, 3);
}
@Test
public void testCorrelationWithMultipleRules() {
assertNumberOfDataSets(0, 0, 0, 0);
List<SushiEventType> correlationEventTypes = new ArrayList<SushiEventType>();
SushiAttribute firstEventAttribute1 = new SushiAttribute("FirstEventAttributeOne", SushiAttributeTypeEnum.INTEGER);
SushiAttribute firstEventAttribute2 = new SushiAttribute("FirstEventAttributeTwo", SushiAttributeTypeEnum.STRING);
List<SushiAttribute> firstEventAttributes = Arrays.asList(firstEventAttribute1, firstEventAttribute2);
SushiEventType firstEventType = (new SushiEventType("FirstEvent", firstEventAttributes)).save();
correlationEventTypes.add(firstEventType);
SushiAttribute secondEventAttribute1 = new SushiAttribute("SecondEventAttributeOne", SushiAttributeTypeEnum.STRING);
SushiAttribute secondEventAttribute2 = new SushiAttribute("SecondEventAttributeTwo", SushiAttributeTypeEnum.DATE);
SushiAttribute secondEventAttribute3 = new SushiAttribute("SecondEventAttributeThree");
new SushiAttribute(secondEventAttribute3, "SecondEventAttributeThreeOne", SushiAttributeTypeEnum.INTEGER);
SushiAttribute secondEventAttribute4 = new SushiAttribute("SecondEventAttributeFour", SushiAttributeTypeEnum.INTEGER);
SushiAttributeTree secondEventAttributeTree = new SushiAttributeTree(Arrays.asList(secondEventAttribute1, secondEventAttribute2, secondEventAttribute3, secondEventAttribute4));
SushiEventType secondEventType = (new SushiEventType("SecondEvent", secondEventAttributeTree)).save();
correlationEventTypes.add(secondEventType);
SushiAttribute thirdEventAttribute1 = new SushiAttribute("ThirdEventAttributeOne", SushiAttributeTypeEnum.INTEGER);
List<SushiAttribute> thirdEventAttributes = Arrays.asList(thirdEventAttribute1);
SushiEventType thirdEventType = (new SushiEventType("ThirdEvent", thirdEventAttributes)).save();
correlationEventTypes.add(thirdEventType);
assertNumberOfDataSets(0, 3, 0, 0);
Set<CorrelationRule> correlationRules = new HashSet<CorrelationRule>();
correlationRules.add(new CorrelationRule(firstEventType.getValueTypeTree().getAttributeByExpression("FirstEventAttributeTwo"), secondEventType.getValueTypeTree().getAttributeByExpression("SecondEventAttributeOne")));
correlationRules.add(new CorrelationRule(secondEventType.getValueTypeTree().getAttributeByExpression("SecondEventAttributeThree.SecondEventAttributeThreeOne"), thirdEventType.getValueTypeTree().getAttributeByExpression("ThirdEventAttributeOne")));
SushiProcess process = new SushiProcess("SomeProcess");
process.save();
assertNumberOfDataSets(0, 3, 1, 0);
RuleCorrelator.correlate(correlationRules, process, null);
assertNumberOfDataSets(0, 3, 1, 0);
for (SushiEventType eventType : correlationEventTypes) {
List<SushiEvent> eventsToCorrelate = createEventsForCorrelation(eventType);
Correlator.correlate(SushiEvent.save(eventsToCorrelate));
}
assertNumberOfDataSets(9, 3, 1, 3);
}
@Test(expected = RuntimeException.class)
public void testCorrelationRuleWithAttributesOfDifferentTypes() {
SushiAttribute attribute1 = new SushiAttribute("One", SushiAttributeTypeEnum.INTEGER);
SushiAttribute attribute2 = new SushiAttribute("Two", SushiAttributeTypeEnum.STRING);
new CorrelationRule(attribute1, attribute2);
}
private void assertNumberOfDataSets(int events, int eventTypes, int processes, int processInstances) {
assertTrue("Number of events must be " + events + " but was " + SushiEvent.findAll().size(), SushiEvent.findAll().size() == events);
assertTrue("Number of event types must be " + eventTypes + " but was " + SushiEventType.findAll().size(), SushiEventType.findAll().size() == eventTypes);
assertTrue("Number of processes must be " + processes + " but was " + SushiProcess.findAll().size(), SushiProcess.findAll().size() == processes);
assertTrue("Number of process instances must be " + processInstances + " but was " + SushiProcessInstance.findAll().size(), SushiProcessInstance.findAll().size() == processInstances);
}
private List<SushiEvent> createEventsForCorrelation(SushiEventType eventType) {
List<SushiEvent> events = new ArrayList<SushiEvent>();
for (int i = 1; i < 4; i++) {
SushiMapTree<String, Serializable> mapTree = new SushiMapTree<String, Serializable>();
SushiEvent event = new SushiEvent(eventType, new Date(), mapTree);
for (SushiAttribute valueType : eventType.getValueTypes()) {
String attributeName = valueType.getAttributeExpression();
if (valueType.getType() == SushiAttributeTypeEnum.STRING) {
// values: A, B, C ...
mapTree.put(attributeName, String.valueOf((char)(64 + i)));
} else if (valueType.getType() == SushiAttributeTypeEnum.INTEGER) {
mapTree.put(attributeName, i);
} else if (valueType.getType() == SushiAttributeTypeEnum.DATE) {
mapTree.put(attributeName, new Date());
}
}
events.add(event);
}
return events;
}
}