package org.aksw.jena_sparql_api.lookup;
import java.util.Set;
import org.aksw.jena_sparql_api.concepts.Concept;
import org.aksw.jena_sparql_api.concepts.ConceptUtils;
import org.aksw.jena_sparql_api.core.QueryExecutionFactory;
import org.aksw.jena_sparql_api.mapper.Agg;
import org.aksw.jena_sparql_api.mapper.FunctionResultSetAggregate;
import org.aksw.jena_sparql_api.mapper.MappedConcept;
import org.aksw.jena_sparql_api.mapper.MappedQuery;
import org.aksw.jena_sparql_api.mapper.PartitionedQuery1;
import org.aksw.jena_sparql_api.utils.ResultSetPart;
import org.apache.jena.graph.Node;
import org.apache.jena.query.Query;
import org.apache.jena.sparql.core.Var;
public class ListServiceUtils {
public static <T> ListService<Concept, Node, T> createListServiceMappedQuery(QueryExecutionFactory qef, MappedQuery<T> mappedQuery, boolean isLeftJoin) {
ListService<Concept, Node, T> result = createListServiceAcc(qef, mappedQuery, isLeftJoin);
return result;
}
public static <T> ListService<Concept, Node, T> createListServiceAcc(QueryExecutionFactory qef, MappedQuery<T> mappedQuery, boolean isLeftJoin) {
PartitionedQuery1 partQuery = mappedQuery.getPartQuery();
Query query = partQuery.getQuery();
Var partVar = partQuery.getPartitionVar();
// System.out.println(query);
// if(true) { throw new RuntimeException("foo"); }
Agg<T> agg = mappedQuery.getAgg();
//System.out.println("Vars: " + agg.getDeclaredVars());
//Var rowId = Var.alloc("rowId");
// TODO Set up a projection using the grouping variable and the variables referenced by the aggregator
if(query.isSelectType()) {
Set<Var> vars = agg.getDeclaredVars();
if(vars == null) {
query.setQueryResultStar(true);
} else {
for(Var var : vars) {
if(!query.getProject().contains(var)) {
query.getProject().add(var);
}
}
}
}
//query.setQueryResultStar(true);
ListServiceSparqlQuery ls = new ListServiceSparqlQuery(qef, query, partVar, isLeftJoin);
FunctionResultSetAggregate<T> fn = new FunctionResultSetAggregate<T>(agg);
ListServiceTransformItem<Concept, Node, ResultSetPart, T> result = ListServiceTransformItem.create(ls, fn);
return result;
}
public static <T> ListService<Concept, Node, T> createListServiceAcc(QueryExecutionFactory qef, MappedConcept<T> mappedConcept, boolean isLeftJoin) {
Concept concept = mappedConcept.getConcept();
Query query = ConceptUtils.createQueryList(concept);
// System.out.println(query);
// if(true) { throw new RuntimeException("foo"); }
Agg<T> agg = mappedConcept.getAggregator();
//System.out.println("Vars: " + agg.getDeclaredVars());
//Var rowId = Var.alloc("rowId");
// TODO Set up a projection using the grouping variable and the variables referenced by the aggregator
Set<Var> vars = agg.getDeclaredVars();
for(Var var : vars) {
query.getProject().add(var);
}
//query.setQueryResultStar(true);
ListServiceSparqlQuery ls = new ListServiceSparqlQuery(qef, query, concept.getVar(), isLeftJoin);
FunctionResultSetAggregate<T> fn = new FunctionResultSetAggregate<T>(agg);
ListServiceTransformItem<Concept, Node, ResultSetPart, T> result = ListServiceTransformItem.create(ls, fn);
return result;
}
public static <T> ListService<Concept, Node, T> createListServiceMappedConcept(QueryExecutionFactory qef, MappedConcept<T> mappedConcept, boolean isLeftJoin) {
ListService<Concept, Node, T> result = createListServiceAcc(qef, mappedConcept, isLeftJoin);
// Add a transformer that actually retrieves the value from the acc structure
// ListService<Concept, Node, T> result = new ListServiceTransformItem(ls, function(accEntries) {
// var r = accEntries.map(function(accEntry) {
// var s = accEntry.val.getValue();
// return s;
// });
//
// return r;
// });
return result;
}
}