package eu.play_project.querydispatcher.epsparql.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.sparql.expr.Expr;
import com.hp.hpl.jena.sparql.syntax.Element;
import com.hp.hpl.jena.sparql.syntax.ElementEventGraph;
import eu.play_platform.platformservices.bdpl.syntax.windows.visitor.ElementWindowVisitor;
import eu.play_project.play_commons.constants.Namespace;
import eu.play_project.play_platformservices.QueryTemplateImpl;
import eu.play_project.play_platformservices.api.BdplQuery;
import eu.play_project.play_platformservices.api.HistoricalQuery;
import eu.play_project.play_platformservices.api.QueryDetails;
import eu.play_project.play_platformservices_querydispatcher.api.EleGenerator;
import eu.play_project.play_platformservices_querydispatcher.bdpl.code_generator.realtime.EleGeneratorForConstructQuery;
import eu.play_project.play_platformservices_querydispatcher.bdpl.visitor.realtime.FilterExpressionCodeGenerator;
import eu.play_project.play_platformservices_querydispatcher.bdpl.visitor.realtime.HavingVisitor;
import eu.play_project.play_platformservices_querydispatcher.bdpl.visitor.realtime.RdfQueryRepresentativeQueryVisitor;
import eu.play_project.play_platformservices_querydispatcher.bdpl.visitor.realtime.UniqueNameManager;
import eu.play_project.play_platformservices_querydispatcher.bdpl.visitor.realtime.WindowVisitor;
import eu.play_project.play_platformservices_querydispatcher.playEleParser.ParseException;
import eu.play_project.play_platformservices_querydispatcher.playEleParser.PlayEleParser;
//import eu.play_project.querydispatcher.epsparql.tests.helpers.FilterExpressionCodeGenerator;
public class BdplEleTest {
@Test
public void manualParserUsage(){
String queryString = getSparqlQuery("queries/HavingAvgExp2.eprq");
Query query = null;
try {
query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
} catch(Exception e){
System.out.println("Exception was thrown: " + e);
}
// HavingVisitor v = new HavingVisitor();
//
// for (Expr el : query.getHavingExprs()) {
// el.visit(v);
// }
// Use custom visitor
EleGenerator visitor1 = new EleGeneratorForConstructQuery();
visitor1.setPatternId("'" + Namespace.PATTERN.getUri() + "123456'");
visitor1.generateQuery(query);
String etalisPattern = visitor1.getEle();
System.out.println(etalisPattern);
}
/**
*
*/
@Test
public void basicEleGeneratorTest(){
String queryString = getSparqlQuery("queries/HavingAvgExp2.eprq");
Query query = null;
System.out.println(queryString);
// Instantiate code generator
EleGenerator visitor1 = new EleGeneratorForConstructQuery();
// Set id.
String patternId = "'" + Namespace.PATTERN.getUri() + Math.random() * 1000000 + "'";
visitor1.setPatternId(patternId);
// Parse query
try {
query = QueryFactory.create(queryString,com.hp.hpl.jena.query.Syntax.syntaxBDPL);
} catch (Exception e) {
System.out.println("Exception was thrown: " + e);
}
UniqueNameManager.getVarNameManager().setWindowTime(query.getWindow().getValue());
visitor1.generateQuery(query);
String etalisPattern = visitor1.getEle();
// Add query details.
QueryDetails details = new QueryDetails(patternId);
// Set properties for windows in QueryDetails
ElementWindowVisitor windowVisitor = new WindowVisitor(details);
query.getWindow().accept(windowVisitor);
details.setRdfDbQueries(visitor1.getRdfDbQueries());
BdplQuery bdplQuery = BdplQuery.builder()
.ele(etalisPattern)
.details(details)
.bdpl("")
.constructTemplate(new QueryTemplateImpl())
.historicalQueries(new LinkedList<HistoricalQuery>())
.build();
System.out.println(etalisPattern);
}
/**
* Generate code for (AVG(t) >= 30).
*/
@Test
public void havingAvgTest(){
String queryString = getSparqlQuery("queries/HavingAvgExp2.eprq");
Query query = null;
System.out.println(queryString);
// Parse query
try {
query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
} catch(Exception e){
System.out.println("Exception was thrown: " + e);
}
UniqueNameManager.getVarNameManager().setWindowTime(query.getWindow().getValue());
// Generate code.
HavingVisitor v = new HavingVisitor();
for (Expr el : query.getHavingExprs()) {
el.visit(v);
}
assertEquals("calcAverage(dbId0, 1800, Result10), greaterOrEqual(Result10,30.0)", v.getCode().toString());
}
@Test
public void startParser() throws InterruptedException {
String queryString = getQuery("EP-SPARQL-Query-Realtime-Historical-multiple-Clouds.eprq")[0];
//queryString = "PREFIX : <http://example.com> CONSTRUCT{:e :type :FacebookCepResult.} {EVENT ?id{?e1 :location [ :lat ?Latitude1; :long ?Longitude1 ]} GRAPH ?id{?s ?p ?o}}";
System.out.println(queryString);
// Parse query
Query query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
System.out.println("Querry \n" +query);
// Use custom visitor
EleGenerator visitor1 = new EleGeneratorForConstructQuery();
visitor1.setPatternId("'" + Namespace.PATTERN.getUri() + "123456'");
visitor1.generateQuery(query);
String etalisPattern = visitor1.getEle();
// try {
// parsEtalisPatter(etalisPattern);
// } catch (ParseException e) {
// e.printStackTrace();
// fail("Pars error: " + e.getMessage());
// }
}
private void parsEtalisPatter(String elePattern) throws ParseException {
PlayEleParser parser = new PlayEleParser(new ByteArrayInputStream(elePattern.getBytes()));
parser.Start();
}
@Test
public void showQdResult(){
String queryString;
// Get query.
queryString = getSparqlQuery("play-epsparql-contextualized-latitude-01-query.eprq");
// Parse query
Query query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
EleGenerator visitor1 = new EleGeneratorForConstructQuery();
visitor1.setPatternId(Namespace.PATTERN.getUri() + Math.random() * 1000000);
visitor1.generateQuery(query);
String etalisPattern = visitor1.getEle();
System.out.println(etalisPattern);
}
@Test
public void showEleResult() {
String queryString;
// Get query.
queryString = getSparqlQuery("play-epsparql-clic2call-plus-tweet.eprq");
System.out.println(queryString);
// Parse query
Query query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
EleGenerator visitor1 = new EleGeneratorForConstructQuery();
visitor1.setPatternId(Namespace.PATTERN.getUri() + Math.random() * 1000000);
visitor1.generateQuery(query);
String etalisPattern = visitor1.getEle();
System.out.println(etalisPattern);
System.out.println(query);
}
@Test
public void evaluateFilterExpression(){
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> CONSTRUCT{ ?x ?nice ?name. ?e rdf:type ?AlertEvent } WHERE {EVENT ?id{?e1 ?location \"abc\". ?e rdf:type ?AlertEvent} FILTER (abs(?Latitude1 - ?Latitude2) < 0.1 && abs(?Longitude1 - ?Longitude2) < 0.5)}";
Query query = null;
try{
query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
}catch(Exception e){
}
FilterExpressionCodeGenerator visitor = new FilterExpressionCodeGenerator();
//Get first EventGraph
ElementEventGraph eventGraph = (ElementEventGraph)query.getEventQuery().get(0);
Element filter = eventGraph.getFilterExp();
visitor.startVisit(filter);
System.out.println(visitor.getEle());
}
// @Test
// public void dispatchQuery(){
// String queryString = "CONSTRUCT{ ?x ?nice ?name } WHERE {EVENT ?id{?e1 ?location \"abc\"} FILTER (abs(?Latitude1 - ?Latitude2) < 0.1 && abs(?Longitude1 - ?Longitude2) < 0.5)}";
// Query query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
//
// VariableTypeVisitor visitor = new VariableTypeVisitor();
//
// Map<String, List<Variable>> variables = visitor.getVariables(query, VariableTypes.historicType);
// System.out.println(variables.values());
// }
@Test
public void agregatedEventTypeTest(){
// AgregatedVariableTypes aTypes = new AgregatedVariableTypes();
//
// // Get query.
// String queryString = getSparqlQuery("play-epsparql-clic2call-plus-tweet.eprq");
//
// // Parse query
// Query query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
//
// // Get types.
// Map<String, AgregatedEventType> eventTypes = aTypes.detectType(query);
//
//
// //Test results.
// assertTrue(eventTypes.get("e3").equals(AgregatedEventType.H));
// assertTrue(eventTypes.get("e1").equals(AgregatedEventType.CR));
// assertTrue(eventTypes.get("bob").equals(AgregatedEventType.CR));
// assertTrue(eventTypes.get("e2").equals(AgregatedEventType.CR));
// assertTrue(eventTypes.get("direction").equals(AgregatedEventType.R));
// assertTrue(eventTypes.get("firstEvent").equals(AgregatedEventType.R)); //FIXME Auch filter anschauen.
// assertTrue(eventTypes.get("alice").equals(AgregatedEventType.CR));
// assertTrue(eventTypes.get("tweetTime").equals(AgregatedEventType.H));
// assertTrue(eventTypes.get("tweetContent").equals(AgregatedEventType.CH));
}
/**
* Return the query from given file. If given it returns the message of the
* expected exception.
*
* @param queryFile
* @return query[0] the query text, query[1] if given in input file the
* expected exception
*/
public String[] getQuery(String queryFile) {
try {
InputStream is = (InputStream) getClass().getClassLoader().getResource(queryFile).getContent();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuffer sb = new StringBuffer();
String line;
String[] exeptionName = null;
while ((line = br.readLine()) != null) {
if (line.startsWith("#")) { // Line with comment
sb.append(line);
sb.append("\n"); // new Line after commentline
// Extract exceptionname
exeptionName = line.split(".*@expectedException<*| *\\\\>*");
} else {
sb.append(line);
}
}
// System.out.println(sb.toString());
br.close();
isr.close();
is.close();
if (exeptionName != null && exeptionName.length > 1) {
return new String[] { sb.toString(), exeptionName[1] };
} else {
return new String[] { sb.toString(), null };
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Test
public void RdfQueryRepresentativeQueryVisitorTest(){
String queryString = getSparqlQuery("queries/HavingAvgExp2.eprq");
Query query = null;
try {
query = QueryFactory.create(queryString, com.hp.hpl.jena.query.Syntax.syntaxBDPL);
} catch(Exception e){
System.out.println("Exception was thrown: " + e);
}
RdfQueryRepresentativeQueryVisitor v = new RdfQueryRepresentativeQueryVisitor();
query.getEventQuery().get(0).visit(v);
// Queries for variable t1,e1,friend1,about1.
String[] expectedResult = {"rdf(Ve1,'http://events.event-processing.org/types/temperature',Vt1)",
"rdf(Ve1,'http://www.w3.org/1999/02/22-rdf-syntax-ns#type','http://events.event-processing.org/types/FacebookStatusFeedEvent')",
"rdf(Ve1,'http://events.event-processing.org/types/name',Vfriend1)",
"rdf(Ve1,'http://events.event-processing.org/types/status',Vabout1)"
};
int i = 0;
for (String key : v.getRdfQueryRepresentativeQuery().keySet()) {
if(!expectedResult[i].equals(v.getRdfQueryRepresentativeQuery().get(key))){
fail();
}
i++;
}
System.out.println(v.getRdfQueryRepresentativeQuery());
//System.out.println(v.getCode());
// Use custom visitor
// EleGenerator visitor1 = new EleGeneratorForConstructQuery();
//
// visitor1.setPatternId("'http://patternId.example.com/123456'");
//
// visitor1.generateQuery(query);
// String etalisPattern = visitor1.getEle();
// System.out.println(etalisPattern);
}
/**
* Returns the filenaes of the testfiles depending on the type of the
* testfile. The filename of a file with contains a broken query (a query
* which the parser do not acceapt) must start with "EP-SPARQL-BrokenQuery".
* The filename of a file with a regular query must start with
* "EP-SPARQL-Query".
*
* @param dir
* Directory of the files.
* @param type
* Type of the fiel.
* @return All filenames with the specified type.
*/
public static List<String> getFilenames(File dir) {
ArrayList<String> filenames = new ArrayList<String>();
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(".ele") && !files[i].isDirectory()) {
filenames.add(files[i].getName());
}
}
}
return filenames;
}
public static String getSparqlQuery(String queryFile) {
try {
InputStream is = BdplEleTest.class.getClassLoader().getResourceAsStream(queryFile);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String line;
while (null != (line = br.readLine())) {
sb.append(line);
sb.append("\n");
}
br.close();
is.close();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}