/*
* SMART FP7 - Search engine for MultimediA enviRonment generated contenT
* Webpage: http://smartfp7.eu
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The Original Code is Copyright (c) 2012-2013 of Atos
* All Rights Reserved
*
* Contributor(s):
* Sinan Yurtsever,
* Nines Sanguino, maria.sanguino at atos dot net
*/
package eu.smartfp7.linkeddatamanager.logic;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import eu.smartfp7.linkeddatamanager.datatypes.Mapping;
public class EclecticQueryBuilder {
Mapping[] mappings;
int i = -1;
String activity = "";
String until = "";
String since ="";
float lat1 = -91;
float lon1 = -181;
float lat2 = -91;
float lon2 = -181;
float radius = -1;
String query = "";
public EclecticQueryBuilder() throws IOException{
mappings = null;
}
public EclecticQueryBuilder(String[] mapNames) throws IOException{
mappings = new MappingManager().getMappings(mapNames);
}
public void setCriteria (String activity, String until,String since, float lat1, float lon1, float lat2, float lon2, float radius){
this.activity = activity;
this.until = until;
this.since = since;
this.lat1 = lat1;
this.lon1 = lon1;
this.lat2 = lat2;
this.lon2 = lon2;
this.radius = radius;
}
public String getActivity() {
return activity;
}
public String getUntil() {
return until;
}
public String getSince() {
return since;
}
public float getLat1() {
return lat1;
}
public float getLon1() {
return lon1;
}
public float getLat2() {
return lat2;
}
public float getLon2() {
return lon2;
}
public float getRadius() {
return radius;
}
public String getQuery() {
return query;
}
public String printQuery(){
query = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"+
"PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>\n"+
"PREFIX owl:<http://www.w3.org/2002/07/owl#>\n";
List<String> prefix = new ArrayList<String>();
boolean inList = false;
for(int j = 0 ; j < i ; j++){
for(int k = 0; k < mappings[j].getPrefixSize(); k++){
inList = false;
for(String pre : prefix)
if(mappings[j].getPrefixName(k).contentEquals(pre)){
inList = true;
break;
}
if(!inList){
query = query +
"PREFIX "+mappings[j].getPrefixName(i)+": <"+mappings[j].getPrefixURI(i)+">\n";
prefix.add(mappings[j].getPrefixName(i));
}
}
}
query = query +"SELECT";
boolean hasLoc = false;
boolean hasTime = false;
boolean hasSpatial = false;
query = query + " ?activity";
for (int j = 0 ; j < i ; j++ ){
if(!activity.contentEquals("") ){
for(int k = 0;i<mappings[j].getAttributeSize();i++)
query = query + " ?attribute"+j+""+k;
if(mappings[j].hasLocation())
hasLoc = true;
if(mappings[j].hasSpatialProperties())
hasSpatial = true;
}
if(mappings[j].hasSpatialProperties())
hasSpatial = true;
if(mappings[j].hasDate())
hasTime = true;
}
if(hasTime) query = query + " ?date";
if(hasLoc) query = query + " ?location";
if(hasSpatial) query = query + " ?lat ?long";
query = query + "\nWHERE{\n";
for(int j = 0 ; j < i ;j++){
query = query +" {\n" +
" OPTIONAL{\n";
if(!activity.contentEquals("") ){
query = query +
" ?activity rdf:type "+mappings[j].getActivityType();
for(int i = 0;i<mappings[j].getAttributeSize();i++)
query = query +
" ?activity "+mappings[j].getAttributePredicate(i)+" "+mappings[j].getAttributeObject(i)+".\n";
if(mappings[j].hasLocation())
query = query +
" ?activity "+mappings[j].getLocationPred()+" ?location.\n";
if(mappings[j].hasDate())
query = query +
" ?activity "+mappings[j].getDatePred()+" ?date";
if(mappings[j].hasDateType())
query = query+"^^"+mappings[j].getDateType()+".\n";
else
query = query +".\n";
if(mappings[j].hasDate()){
if(!until.contentEquals("")) query = query +
" FILTER(?date < "+until+").\n";
if(!since.contentEquals("")) query = query +
" FILTER(?date > "+since+").\n";
}
}
if(mappings[j].hasLocation())
query = query +
" ?location rdf:type "+mappings[j].getLocationType()+".\n";
if(mappings[j].hasSpatialProperties()){
query = query +
" ?location "+mappings[j].getLatpred()+ " ?lat.\n"+
" ?location "+mappings[j].getLongpred()+" ?long.\n";
}
if(radius != -1)
query = query + mappings[j].printCircleExpression(lat1, lon1, radius, "?location");
else if(lat2 !=-91)
query = query + mappings[j].printRectangleExpression(lat1, lon1, lat2, lon2, "?location");
query = query +
" }\n"+
" }\n";
if(j<i-1)
query = query +" UNION\n";
}
query = query +"}";
return query;
}
}