package org.aksw.sparqlify.core;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.aksw.jena_sparql_api.utils.QuadPatternUtils;
import org.aksw.jena_sparql_api.utils.QuadUtils;
import org.aksw.jena_sparql_api.views.SparqlSubstitute;
import org.aksw.sparqlify.config.syntax.ViewTemplateDefinition;
import org.apache.jena.graph.Node;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.sparql.core.QuadPattern;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.engine.binding.BindingHashMap;
import org.apache.jena.sparql.engine.binding.BindingMap;
import org.apache.jena.sparql.expr.E_Equals;
import org.apache.jena.sparql.expr.Expr;
/**
* A view template consists of the construct pattern
* and the binding expressions.
*
* @author raven
*
*/
public class RdfViewTemplate {
private QuadPattern quadPattern;
private Map<Node, Expr> binding;
public RdfViewTemplate(QuadPattern quadPattern, Map<Node, Expr> binding)
{
this.quadPattern = quadPattern;
this.binding = binding;
}
public QuadPattern getQuadPattern() {
return quadPattern;
}
public Map<Node, Expr> getBinding() {
return binding;
}
public RdfViewTemplate create(ViewTemplateDefinition definition) {
return RdfViewTemplate.create(definition.getConstructTemplate(), definition.getVarBindings());
}
public static RdfViewTemplate create(QuadPattern quadPattern, List<Expr> bindings)
{
// NOTE Macro expansion should occur before the creation of a view template...
// ... I think.
// QuadPattern quadPattern = new QuadPattern();
//
// for(Triple triple : template.getTriples()) {
// quadPattern.add(new Quad(Quad.defaultGraphNodeGenerated, triple));
// }
//
Map<Node, Expr> bindingMap = new HashMap<Node, Expr>();
for(Expr expr : bindings) {
if(!(expr instanceof E_Equals)) {
throw new RuntimeException("Binding expr must have form ?var = ... --- instead got: " + expr);
}
Expr definition = expr.getFunction().getArg(2);
definition = SparqlSubstitute.substituteExpr(definition);
Var var = expr.getFunction().getArg(1).asVar();
bindingMap.put(var, definition);
}
return new RdfViewTemplate(quadPattern, bindingMap);
}
public Set<Var> getVarsMentioned()
{
return QuadPatternUtils.getVarsMentioned(quadPattern);
}
public RdfViewTemplate copySubstitute(Map<Node, Node> map)
{
BindingMap tmp = new BindingHashMap();
for(Entry<Node, Node> entry : map.entrySet()) {
tmp.add((Var)entry.getKey(), entry.getValue());
}
RdfViewTemplate result = new RdfViewTemplate(
QuadUtils.copySubstitute(quadPattern, map),
QuadUtils.copySubstitute(binding, map));
return result;
}
public Model instanciate(Model result, Map<Var, Object> assignment) {
return null;
}
}