package org.aksw.jena_sparql_api.concept.builder.impl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.aksw.jena_sparql_api.concept.builder.api.NodeBuilder;
import org.aksw.jena_sparql_api.concept.builder.api.TreeBuilder;
import org.apache.jena.graph.Node;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.expr.Expr;
//class Graph {
// Map<Node, TreeBuilder> sToTs;
// Map<Node, TreeBuilder> oToTs;
//
//}
public class NodeBuilderImpl
implements NodeBuilder
{
protected Node alias;
protected Map<Node, TreeBuilder> out = new HashMap<>();
protected Map<Node, TreeBuilder> in = new HashMap<>();
protected Set<Expr> exprs = new HashSet<>();
public NodeBuilderImpl() {
super();
}
public NodeBuilderImpl(Node alias) {
super();
this.alias = alias;
}
@Override
public List<NodeBuilder> getOverlaps() {
throw new UnsupportedOperationException("not implemented yet");
}
// @Override
// public TreeBuilder out(Path path) {
// throw new UnsupportedOperationException("not implemented yet");
// }
// @Override
// public TreeBuilder in(Path path) {
// throw new UnsupportedOperationException("not implemented yet");
// }
/**
* Gets or creates a tree builder for the given variable
* relative to this node builder.
*
*/
@Override
public TreeBuilder out(Node node) {
TreeBuilder result = either(this, out, node, false);
return result;
}
@Override
public TreeBuilder in(Node node) {
TreeBuilder result = either(this, out, node, false);
return result;
}
public static TreeBuilder either(NodeBuilder self, Map<Node, TreeBuilder> map, Node node, boolean reverse) {
TreeBuilder result = map.computeIfAbsent(node, key -> {
NodeBuilder predicateNodeBuilder = new NodeBuilderImpl();
NodeBuilder targetNodeBuilder = new NodeBuilderImpl();
TreeBuilderImpl r = reverse
? new TreeBuilderImpl(targetNodeBuilder, predicateNodeBuilder, self, true)
: new TreeBuilderImpl(self, predicateNodeBuilder, targetNodeBuilder, true)
;
return r;
});
return result;
}
@Override
public Set<Expr> getExprs() {
return exprs;
}
@Override
public NodeBuilder addExpr(Expr expr) {
exprs.add(expr);
return this;
}
@Override
public NodeBuilder as(Var var) {
this.alias = var;
return this;
}
@Override
public NodeBuilder getParent() {
// TODO Auto-generated method stub
return null;
}
}