package eu.play_project.dcep.distributedetalis.test;
import static eu.play_project.play_commons.constants.Event.EVENT_ID_PLACEHOLDER;
import static eu.play_project.play_commons.constants.Event.EVENT_ID_SUFFIX;
import static eu.play_project.play_commons.constants.Namespace.EVENTS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.regex.Pattern;
import jpl.Query;
import jpl.Term;
import org.event_processing.events.types.AvgTempEvent;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.ontoware.rdf2go.model.node.impl.URIImpl;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.NodeFactory;
import com.jtalis.core.JtalisContext;
import com.jtalis.core.JtalisContextImpl;
import com.jtalis.core.event.AbstractJtalisEventProvider;
import com.jtalis.core.event.EtalisEvent;
import com.jtalis.core.plengine.JPLEngineWrapper;
import com.jtalis.core.plengine.PrologEngineWrapper;
import eu.play_project.dcep.api.measurement.MeasurementResult;
import eu.play_project.dcep.api.measurement.NodeMeasurementResult;
import eu.play_project.dcep.distributedetalis.PlayJplEngineWrapper;
import eu.play_project.dcep.distributedetalis.PrologSemWebLib;
import eu.play_project.dcep.distributedetalis.RetractEventException;
import eu.play_project.dcep.distributedetalis.api.DistributedEtalisException;
import eu.play_project.dcep.distributedetalis.api.UsePrologSemWebLib;
import eu.play_project.dcep.distributedetalis.configurations.helpers.LoadPrologCode;
import eu.play_project.dcep.distributedetalis.measurement.MeasurementThread;
import eu.play_project.dcep.distributedetalis.utils.EventCloudHelpers;
import eu.play_project.play_commons.constants.Stream;
import eu.play_project.play_commons.eventtypes.EventHelpers;
import fr.inria.eventcloud.api.CompoundEvent;
import fr.inria.eventcloud.api.Quadruple;
public class PrologJtalisTest {
private JtalisContextImpl ctx;
public static UsePrologSemWebLib prologSemWebLib;
public static EtalisEvent result;
/**
* Instantiate ETALIS
* @throws InterruptedException
*/
@Ignore
@Test
public void instantiateJtalis() throws InterruptedException{
PrologEngineWrapper<?> engine = PlayJplEngineWrapper.getPlayJplEngineWrapper();
this.ctx = new JtalisContextImpl(engine);
// ctx.getEngineWrapper().executeGoal("reset_ETALIS");
Thread.sleep(1000);
}
/**
* Instantiate ETALIS and register eventpatterns.
*/
@Ignore
@Test
public void registerEventpatterns(){
//Result should be overwritten by an complex event from etalis.
result = new EtalisEvent("complex", 42);
ctx.registerOutputProvider(new AbstractJtalisEventProvider() {
@Override
public void outputEvent(EtalisEvent event) {
result = event;
}
});
//ctx.addEventTrigger("complex"); // Which events are printed (_ means all)
ctx.addDynamicRule("complex(X,'id') <- a(X) seq b(X)");
//ctx.pushEvent(new EtalisEvent("a", 1));
//ctx.pushEvent(new EtalisEvent("b", 1));
delay();
System.out.println(new EtalisEvent("complexExample", 1,"'id'"));
assertTrue(result.equals(new EtalisEvent("complexExample", 1,"id")));
}
/**
* No event will be generated because b appears to late.
*/
@Ignore
@Test
public void registerEventpatternsWithWindow(){
//Result should not be overwritten by an complex event from etalis.
result = new EtalisEvent("complex", 42);
ctx.registerOutputProvider(new AbstractJtalisEventProvider() {
@Override
public void outputEvent(EtalisEvent event) {
result = event;
}
});
ctx.addEventTrigger("_"); // Which events are printed (_ means all)
ctx.addDynamicRuleWithId("r2([property(event_rule_window,1)])", "complex2(X) <- a(X) seq b(X)");
ctx.pushEvent(new EtalisEvent("a", 1));
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ctx.pushEvent(new EtalisEvent("b", 1));
delay();
System.out.println(result);
assertFalse(result.equals(new EtalisEvent("complex2", 1)));
}
// @Test
// public void loadSemWebLibTest(){
// try{
// // Load SWI-Prolog Semantic Web Library
// ctx.getEngineWrapper().executeGoal("[library(semweb/rdf_db)]");
// }catch (Exception e) {
// e.printStackTrace();
// fail("It was not possible to load the semweb/rdf_db library ");
// }
//
//
// delay();
// }
@Ignore
@Test
public void instantiatePrologSemWebLib() throws DistributedEtalisException{
prologSemWebLib = new PrologSemWebLib();
prologSemWebLib.init(ctx);
delay();
}
@Ignore
@Test
public void addEventsInTriplestore(){
// Create an event ID used in RDF context and RDF subject
String eventId = EventHelpers.createRandomEventId();
AvgTempEvent event = new AvgTempEvent(
// set the RDF context part
EventHelpers.createEmptyModel(eventId),
// set the RDF subject
eventId + EVENT_ID_SUFFIX,
// automatically write the rdf:type statement
true);
// Run some setters of the event
// Create a Calendar for the current date and time
event.setEndTime(Calendar.getInstance());
// Set a dummy stream
event.setStream(new URIImpl(Stream.FacebookStatusFeed.getUri()));
// New event.
CompoundEvent event1 = EventCloudHelpers.toCompoundEvent(event);
try {
prologSemWebLib.addEvent(event1);
} catch (Exception e) {
e.printStackTrace();
}
delay();
}
/**
* Read data from prolog triplestore. (directly not using PrologSemWebLib class).
*/
@Ignore
@Test
public void getEventsFromTriplestore(){
/*
* Insert data in triplesore
*/
// Create an event ID used in RDF context and RDF subject
String eventId = EventHelpers.createRandomEventId();
AvgTempEvent event = new AvgTempEvent(
// set the RDF context part
EventHelpers.createEmptyModel(eventId),
// set the RDF subject
eventId + EVENT_ID_SUFFIX,
// automatically write the rdf:type statement
true);
// Run some setters of the event
// Create a Calendar for the current date and time
event.setEndTime(Calendar.getInstance());
// Set a dummy stream
event.setStream(new URIImpl(Stream.FacebookStatusFeed.getUri()));
try {
prologSemWebLib.addEvent(EventCloudHelpers.toCompoundEvent(event));
} catch (Exception e) {
e.printStackTrace();
}
/*
* Get data back from triplestore
*/
Query q = new Query(String.format("rdf(S,P,O,'\"%s\"')", eventId));
// assertTrue("The return answer from triplestore should be non-empty.", q.hasMoreElements());
if( q.hasMoreElements() ) {
Hashtable binding = (Hashtable) q.nextElement();
Term t = (Term) binding.get("S");
System.out.println(t);
assertTrue(t.toString().equals("'" + eventId + EVENT_ID_SUFFIX + "'"));
q.close(); // To avoid transaction problems with rdf db.
}
}
// @Test FIXME find problem for AssertinError.
public void generateCartesinProductOfTriples() throws IOException, RetractEventException, InterruptedException, DistributedEtalisException{
LoadPrologCode lpc = new LoadPrologCode();
lpc.loadCode("ComplexEventData.pl", PlayJplEngineWrapper.getPlayJplEngineWrapper());
PlayJplEngineWrapper.getPlayJplEngineWrapper().executeGoal("generateConstructResult(['s1','s2'],['p1'],['o1','o2'],testDb2)");
CompoundEvent result = new CompoundEvent(getEventData(PlayJplEngineWrapper.getPlayJplEngineWrapper(), "testDb2"));
// Event to compare with result
List<Quadruple> quadruple = new ArrayList<Quadruple>();
Quadruple q1 = new Quadruple(
NodeFactory.createURI("'testDb2'"),
NodeFactory.createURI("'s1'"),
NodeFactory.createURI("'p1'"),
NodeFactory.createURI("'o1'"));
quadruple.add(q1);
q1 = new Quadruple(
NodeFactory.createURI("'testDb2'"),
NodeFactory.createURI("'s1'"),
NodeFactory.createURI("'p1'"),
NodeFactory.createURI("'o2'"));
quadruple.add(q1);
q1 = new Quadruple(
NodeFactory.createURI("'testDb2'"),
NodeFactory.createURI("'s2'"),
NodeFactory.createURI("'p1'"),
NodeFactory.createURI("'o1'"));
quadruple.add(q1);
q1 = new Quadruple(
NodeFactory.createURI("'testDb2'"),
NodeFactory.createURI("'s2'"),
NodeFactory.createURI("'p1'"),
NodeFactory.createURI("'o1'"));
quadruple.add(q1);
q1 = new Quadruple(
NodeFactory.createURI("'testDb2'"),
NodeFactory.createURI("false"),
NodeFactory.createURI("false"),
NodeFactory.createURI("false"));
quadruple.add(q1);
CompoundEvent original = new CompoundEvent(quadruple);
//System.out.println(result);
System.out.println((result.get(3) + "\t" + original.get(0)));
assertTrue(result.get(3).equals(original.get(0)));
assertTrue(result.get(4).equals(original.get(1)));
assertTrue(result.get(5).equals(original.get(2)));
assertTrue(result.get(6).equals(original.get(3)));
assertFalse(result.get(4).equals(original.get(4)));
delay();
}
/**
* Load methods from file and add it to prolog.
* @throws InterruptedException
*/
@Ignore
@Test
public void loadPrologMethods() throws InterruptedException{
if(ctx == null) instantiateJtalis();
String[] methods = getPrologMethods("ComplexEventData.pl");
for (int i = 0; i < methods.length; i++) {
System.out.println( methods[i]);
ctx.getEngineWrapper().executeGoal(("assert(" + methods[i] + ")"));
}
methods = getPrologMethods("ReferenceCounting.pl");
for (int i = 0; i < methods.length; i++) {
System.out.println( methods[i]);
ctx.getEngineWrapper().executeGoal(("assert(" + methods[i] + ")"));
}
methods = getPrologMethods("Measurement.pl");
for (int i = 0; i < methods.length; i++) {
System.out.println( methods[i]);
ctx.getEngineWrapper().executeGoal(("assert(" + methods[i] + ")"));
}
methods = getPrologMethods("Math.pl");
for (int i = 0; i < methods.length; i++) {
System.out.println( methods[i]);
ctx.getEngineWrapper().executeGoal(("assert(" + methods[i] + ")"));
}
methods = getPrologMethods("Aggregatfunktions.pl");
for (int i = 0; i < methods.length; i++) {
System.out.println( methods[i]);
ctx.getEngineWrapper().executeGoal(("assert(" + methods[i] + ")"));
}
}
/**
* Abstract example how conditions are checked now. (internal)
*/
@Test
public void externalConditionCeck() {
final List<EtalisEvent> list = new LinkedList<EtalisEvent>();
PrologEngineWrapper<?> engine = new JPLEngineWrapper();
JtalisContext context = new JtalisContextImpl(engine);
context.addEventTrigger("c/1");
context.registerOutputProvider(new AbstractJtalisEventProvider() {
@Override
public void outputEvent(EtalisEvent event) {
System.out.println("\n\n\n");
System.out.println(event);
System.out.println("\n\n\n");
list.add(event);
}
});
engine.executeGoal("assert(a(id1, a1))");
engine.executeGoal("assert(a(id1, a2))");
engine.executeGoal("assert(a(id1, a3))");
engine.executeGoal("assert(b(id2, b1))");
engine.executeGoal("assert(b(id2, b2))");
engine.executeGoal("assert(b(id2, b3))");
engine.executeGoal("assert(newCid(cid1))");
engine.executeGoal("assert(checkConditions(Eid) :- true)");
engine.executeGoal("assert(storeEdata(CID, D):- (write(CID), write(': '), write(D), nl))");
context.addDynamicRule(""
+ "c(CID) "
+ " do forall((a(Eid1, Da), b(Eid2, Db)), (storeEdata(CID, Da), storeEdata(CID, Db))) "
+ "<- " +
"(a(Eid) 'WHERE' (checkConditions(Eid))) " +
"seq " +
"(b(Eid2) 'WHERE' (checkConditions(Eid2), newCid(CID)))");
context.pushEvent(new EtalisEvent("a", "id1"));
context.pushEvent(new EtalisEvent("b", "id2"));
}
// @Test
// public void instantiateDistributedEtalis(){
// DistributedEtalis dE = new DistributedEtalis("de1");
//
// delay();
// }
// @Test
// public void TestMathOperationsWithTriplestoreData(){
// ((PlayJplEngineWrapper)etalis.getEngineWrapper()).execute("rdf_assert('1', '1', '1', '1')", true);
// ((PlayJplEngineWrapper)etalis.getEngineWrapper()).execute("rdf_assert('2', '2', '2', '2')", true);
//
// //Query q = new Query("rdf_assert('1', '1', A, '1'), rdf('2', '2', B, '2'), minus(Result, A, B)");
// Query q = new Query(" minus(Result, '1', '2')");
// if( q.hasMoreElements() ) {
// Hashtable binding = (Hashtable) q.nextElement();
// Term t = (Term) binding.get("Result");
// System.out.println(t);
// assertTrue(t.toString().equals("-1"));
//
// q.close();
// }
// }
// /**
// * Read data from prolog triplestore. (Using PrologSemWebLib class).
// */
// @Test
// public void getEventsFromTriplestorePrologSemWebLibClass(){
//
// // Test event
// EtalisEvent event = new EtalisEvent("a", "testDb2");
// event.setRuleID("498929293");
//
// CompoundEvent result = new CompoundEvent(JtalisOutputProvider.getEventData(PlayJplEngineWrapper.getPlayJplEngineWrapper(), event));
//
// assertTrue((result.getQuadruples().get(3).getSubject().toString().equals("s1")));
// delay();
// }
@Test
public void getVariableValues() throws DistributedEtalisException{
if(ctx==null){
this.init();
}
String[] expectedResult = {"'A'","aa1", "aa2", "aa3", "'B'", "bb1", "bb2"};
//Save variables and values in Prolog
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("assert(variableValues('http://patterId.example.com/1234', 'A', 'aa1'))");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("assert(variableValues('http://patterId.example.com/1234', 'A', 'aa2'))");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("assert(variableValues('http://patterId.example.com/1234', 'A', 'aa3'))");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("assert(variableValues('http://patterId.example.com/1234', 'B', 'bb1'))");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("assert(variableValues('http://patterId.example.com/1234', 'B', 'bb2'))");
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("variableValues('http://patterId.example.com/1234', VarName, VarValue)");
//HashMap with values of variables.
Map<String, List<String>> variabelValues = new HashMap<String, List<String>>();
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
if(!variabelValues.containsKey(hashtable.get("VarName").toString())){
variabelValues.put(hashtable.get("VarName").toString(), new ArrayList<String>());
}
// Add new value to list.
variabelValues.get(hashtable.get("VarName").toString()).add(hashtable.get("VarValue").toString());
}
int indexOfExpectedResult = 0;
for (String hashKey : variabelValues.keySet()) {
assertTrue(expectedResult[indexOfExpectedResult].equals(hashKey));
indexOfExpectedResult++;
for (String variableValue : variabelValues.get(hashKey)) {
assertTrue(expectedResult[indexOfExpectedResult].equals(variableValue));
indexOfExpectedResult++;
}
}
}
@Test
public void AverageTest1secondFromNow() throws InterruptedException, DistributedEtalisException{
if(ctx==null){
this.init();
}
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 1, 1.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 2, 2.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 3, 3.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 4, 4.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 5, 5.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 6, 6.0)");
// Wait. Value 1-6 will be out of window.
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 7, 7.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 8, 8.0)");
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("calcAverage(id_1, 1, 8, Avg)");
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
System.out.println(hashtable.get("Avg"));
assertTrue(hashtable.get("Avg").toString().equals("7.5"));
}
//Check if all temp values are deleted.
Thread.sleep(400);
Hashtable<String, Object>[] values = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("aggregatDb(A, B)");
assertTrue(values.length == 0);
}
@Test
public void AverageTestOneValueFormPast() throws InterruptedException, DistributedEtalisException{
if(ctx==null){
this.init();
}
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 1, 1.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 2, 2.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 3, 3.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 4, 4.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 5, 5.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 6, 6.0)");
// Wait. Value 1-6 will be out of window.
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 7, 7.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 8, 8.0)");
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("calcAverage(id_1, 1, 9, Avg)");
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
System.out.println(hashtable.get("Avg"));
System.out.println(result.length);
assertTrue(hashtable.get("Avg").toString().equals("8.0"));
}
//Check if all temp values are deleted.
Thread.sleep(400);
Hashtable<String, Object>[] values = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("aggregatDb(A, B)");
assertTrue(values.length == 0);
}
@Test
public void AverageTest3Values() throws InterruptedException, DistributedEtalisException{
if(ctx==null){
this.init();
}
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 1, 1.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 2, 2.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 3, 3.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 4, 4.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 5, 5.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 6, 6.0)");
//Value 1-6 will be out of window.
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 7, 7.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 8, 8.0)");
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("calcAverage(id_1, 4, 10, Avg)");
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
System.out.println(hashtable.get("Avg"));
System.out.println(result.length);
assertTrue(hashtable.get("Avg").toString().equals("7.0"));
}
//Check if all temp values are deleted.
Thread.sleep(400);
Hashtable<String, Object>[] values = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("aggregatDb(A, B)");
assertTrue(values.length == 0);
}
@Test
public void AverageTestOutOfWindow() throws InterruptedException, DistributedEtalisException{
if(ctx==null){
this.init();
}
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 1, 1.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 2, 2.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 3, 3.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 4, 4.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 5, 5.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 6, 6.0)");
// Wait. Value 1-6 will be out of window.
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 7, 7.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 8, 8.0)");
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute(("calcAverage(id_1, 1, 200, Avg)"));
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
assertTrue(hashtable.get("Avg").toString().startsWith("_"));
}
//Check if all temp values are deleted.
Thread.sleep(400);
Hashtable<String, Object>[] values = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("aggregatDb(A, B)");
assertTrue(values.length == 0);
}
@Test
public void AverageTestSystemTime() throws InterruptedException, DistributedEtalisException{
if(ctx==null){
this.init();
}
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 1.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 2.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 3.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 4.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 5.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 6.0)");
Thread.sleep(3000);
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 7.0)");
((PlayJplEngineWrapper)ctx.getEngineWrapper()).executeGoal("addAgregatValue(id_1, 8.0)");
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute(("calcAverage(id_1, 2, Avg)"));
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
System.out.println(hashtable.get("Avg").toString());
assertTrue(hashtable.get("Avg").toString().startsWith("7.5"));
}
//Check if all temp values are deleted.
Thread.sleep(400);
Hashtable<String, Object>[] values = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("aggregatDb(A, B)");
assertTrue(values.length == 0);
}
@Test
public void useAgregateFunctionsWithEleTest() throws IOException, InterruptedException, DistributedEtalisException {
long delay = 500;
final List<EtalisEvent> list = new LinkedList<EtalisEvent>();
PrologEngineWrapper<?> engine = PlayJplEngineWrapper.getPlayJplEngineWrapper();
JtalisContext context = new JtalisContextImpl(engine);
context.addEventTrigger("complex/_");
context.registerOutputProvider(new AbstractJtalisEventProvider() {
@Override
public void outputEvent(EtalisEvent event) {
System.out.println(event);
list.add(event);
}
});
LoadPrologCode prologCodeLoader = new LoadPrologCode();
prologCodeLoader.loadCode("Aggregatfunktions.pl", ((PlayJplEngineWrapper)context.getEngineWrapper()));
prologCodeLoader.loadCode("Helpers.pl", ((PlayJplEngineWrapper)context.getEngineWrapper()));
// The complex event contains average value of Va, Vb, Vc and the max value of this variables.
String ruleId = context.addDynamicRule("" +
"complex(Avg, Max) do (calcAverage(patternId1, 9000, Avg), " +
" maxValue(patternId1, Max), " +
" resetMaxT(patternId1)" +
" ) " +
" <-" +
" (a(Va) 'WHERE'(addAgregatValue(patternId1, Va), storeMaxT(patternId1, Va)))" +
" 'SEQ'" +
" (b(Vb) 'WHERE'(addAgregatValue(patternId1, Vb), storeMaxT(patternId1, Vb)))" +
" 'SEQ'" +
" (c(Vc) 'WHERE'(addAgregatValue(patternId1, Vc), storeMaxT(patternId1, Vc)))"
);
context.pushEvent(new EtalisEvent("a", 2));
context.pushEvent(new EtalisEvent("b", 4));
context.pushEvent(new EtalisEvent("c", 8));
Thread.sleep(delay); // wait a little bit for the events to be processed
// Check if result is OK.
Assert.assertTrue(list.size() == 1);
Assert.assertTrue(list.get(0).equals(new EtalisEvent("complex", 4.666666666666667, 8)));
context.removeDynamicRule(ruleId);
}
@Test
public void AverageTestNoValues() throws InterruptedException, DistributedEtalisException{
if(ctx==null){
this.init();
}
//Get variables and values
Hashtable<String, Object>[] result = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute(("calcAverage(id_1, 1, 200, Avg)"));
// Get all values of a variable
for (Hashtable<String, Object> hashtable : result) {
assertTrue(hashtable.get("Avg").toString().startsWith("_"));
}
//Check if all temp values are deleted.
Thread.sleep(400);
Hashtable<String, Object>[] values = ((PlayJplEngineWrapper)ctx.getEngineWrapper()).execute("aggregatDb(A, B)");
assertTrue(values.length == 0);
}
@Test
public void deleteUnusedTripleStoresTest() throws DistributedEtalisException{
if(ctx==null){
this.init();
}
PlayJplEngineWrapper e = ((PlayJplEngineWrapper)ctx.getEngineWrapper());
// Add reference counters.
// referenceCounter(EventId, CountEventId, RefCounter).
// Counter is 0. Data relates to events which was not consumed or related event is still waiting to be fired.
e.execute("assert(referenceCounter(a,1,0))");
e.execute("assert(referenceCounter(b,2,0))");
e.execute("assert(referenceCounter(c,3,0))");
e.execute("assert(referenceCounter(d,4,0))");
e.execute("assert(referenceCounter(e,5,0))");
e.execute("assert(referenceCounter(f,6,0))");
e.execute("assert(referenceCounter(g,7,0))");
e.execute("assert(referenceCounter(h,8,0))");
e.execute("assert(referenceCounter(i,9,0))");
// Counter is > 0. Related event was consumed.
e.execute("assert(referenceCounter(j,-1,5))");
e.execute("assert(referenceCounter(k,-2,9))");
e.execute("assert(referenceCounter(l,-3,2))");
e.execute("assert(referenceCounter(m,-4,1))");
// Last inserted event by event execution worker.
e.execute("setLastInsertedEvent(4)");
// Delete all event with are older than 4 and counter is 0.
// Is triggered by garbage collection event.
e.execute("collectGarbage");
//Get variables and values
Hashtable<String, Object>[] result = e.execute("referenceCounter(EventId, CountEventId, RefCounter)");
// All events older than 4 were deleted.
assertEquals(result[0].get("EventId").toString() , "e");
assertEquals(result[0].get("CountEventId").toString(), "5");
assertEquals(result[0].get("RefCounter").toString(), "0");
assertEquals(result[1].get("EventId").toString() , "f");
assertEquals(result[1].get("CountEventId").toString(), "6");
assertEquals(result[1].get("RefCounter").toString(), "0");
assertEquals(result[2].get("EventId").toString() , "g");
assertEquals(result[2].get("CountEventId").toString(), "7");
assertEquals(result[2].get("RefCounter").toString(), "0");
assertEquals(result[3].get("EventId").toString() , "h");
assertEquals(result[3].get("CountEventId").toString(), "8");
assertEquals(result[3].get("RefCounter").toString(), "0");
assertEquals(result[4].get("EventId").toString() , "i");
assertEquals(result[4].get("CountEventId").toString(), "9");
assertEquals(result[4].get("RefCounter").toString(), "0");
// Referenced triple store still exist.
assertEquals(result[5].get("EventId").toString() , "j");
assertEquals(result[5].get("CountEventId").toString(), "-1");
assertEquals(result[5].get("RefCounter").toString(), "5");
assertEquals(result[6].get("EventId").toString() , "k");
assertEquals(result[6].get("CountEventId").toString(), "-2");
assertEquals(result[6].get("RefCounter").toString(), "9");
assertEquals(result[7].get("EventId").toString() , "l");
assertEquals(result[7].get("CountEventId").toString(), "-3");
assertEquals(result[7].get("RefCounter").toString(), "2");
assertEquals(result[8].get("EventId").toString() , "m");
assertEquals(result[8].get("CountEventId").toString(), "-4");
assertEquals(result[8].get("RefCounter").toString(), "1");
}
/**
* Simulate performance measurement and test results.
*/
@Test
public void MeasurementTrheadTest(){
//New prolog engine
PlayJplEngineWrapper engine = PlayJplEngineWrapper.getPlayJplEngineWrapper();
engine.consult(System.getProperty("user.dir") + "/src/main/pl/Measurement.pl");
ExecutorService measureExecutor = Executors.newCachedThreadPool();
// New task. Measure 5s.
MeasurementThread task = new MeasurementThread(5000, engine, null); //TODO change
// Execute task.
Future<MeasurementResult> future = measureExecutor.submit(task);
// Simulate events.
for(int i=0; i<10; i++){
engine.executeGoal("measure('http://example.com/patternID1')");
if(i%2==0){
engine.executeGoal("measure('http://example.com/patternID2')");
}
if(i%3==0){
engine.executeGoal("measure('http://example.com/patternID3')");
}
delay();
}
NodeMeasurementResult measuredValues = null;
try {
measuredValues = (NodeMeasurementResult) future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
assertTrue(measuredValues.getMeasuredValues().get(1).getProcessedEvents()==4);
assertTrue(measuredValues.getMeasuredValues().get(2).getProcessedEvents()==2);
assertTrue(measuredValues.getMeasuredValues().get(3).getProcessedEvents()==1);
}
public static void delay(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void init() throws DistributedEtalisException{
PlayJplEngineWrapper engine = PlayJplEngineWrapper.getPlayJplEngineWrapper();
this.ctx = new JtalisContextImpl(engine);
//Load prolog methods.
for (String method : getPrologMethods("ComplexEventData.pl")) {
engine.execute("assert((" + method + "))");
}
for (String method : getPrologMethods("ReferenceCounting.pl")) {
engine.execute("assert((" + method + "))");
}
for (String method : getPrologMethods("Measurement.pl")) {
engine.execute("assert((" + method + "))");
}
for (String method : getPrologMethods("Aggregatfunktions.pl")) {
engine.execute("assert((" + method + "))");
}
}
private String[] getPrologMethods(String methodFile){
try {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(methodFile);
BufferedReader br =new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String line;
while (null != (line = br.readLine())) {
if (!(line.equals(" "))) {
if (!line.startsWith("%")) { // Ignore comments
sb.append(line.split("%")[0]); //Ignore rest of the line if comment starts.
}
}
}
//System.out.println(sb.toString());
br.close();
is.close();
String[] methods = sb.toString().split(Pattern.quote( "." ) );
return methods;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Get event data from Prolog.
*/
public List<Quadruple> getEventData(PlayJplEngineWrapper engine, String patternId) throws RetractEventException {
List<Quadruple> quadruples = new ArrayList<Quadruple>();
String eventId = EVENTS.getUri() + patternId;
final Node GRAPHNAME = NodeFactory.createURI(eventId);
final Node EVENTID = NodeFactory.createURI(eventId + EVENT_ID_SUFFIX);
/*
* Add payload data to event:
*/
Hashtable<String, Object>[] triples = engine.getTriplestoreData(patternId);
for(Hashtable<String, Object> item : triples) {
// Remove single quotes around Prolog strings
String subject = item.get("S").toString();
subject = subject.substring(1, subject.length() - 1);
String predicate = item.get("P").toString();
predicate = predicate.substring(1, predicate.length() - 1);
String object = item.get("O").toString();
if (object.startsWith("'") && object.endsWith("'")) {
object = object.substring(1, object.length() - 1);
}
Node objectNode = EventHelpers.toJenaNode(object);
quadruples.add(new Quadruple(
GRAPHNAME,
// Replace dummy event id placeholder with actual unique id for complex event:
(subject.equals(EVENT_ID_PLACEHOLDER) ? EVENTID : NodeFactory.createURI(subject)),
NodeFactory.createURI(predicate),
objectNode));
}
return quadruples;
}
}