package org.aksw.sparqlify.core;
/**
* Replaces constants with variables and filter conditions.
*
* Example:
* {?s a ?t .}
*
* becomes:
*
* {
* ?s ?var ?t .
* Filter(?var = rdf:type) .
* }
*
*
* @author raven
*
*/
//public class ReplaceConstants {
// private static Generator generator = Gensym.create("var", 0);
//
//
//
// public static Triple listToTriple(List<Node> nodes) {
// return new Triple(nodes.get(0), nodes.get(1), nodes.get(2));
// }
//
// public static Quad listToQuad(List<Node> nodes) {
// return new Quad(nodes.get(0), nodes.get(1), nodes.get(2), nodes.get(3));
// }
//
// public static List<Node> tripleToList(Triple triple)
// {
// List<Node> result = new ArrayList<Node>();
// result.add(triple.getSubject());
// result.add(triple.getPredicate());
// result.add(triple.getObject());
//
// return result;
// }
//
//
//
// public static Op replace(Op op)
// {
// return MultiMethod.invokeStatic(ReplaceConstants.class, "_replace", op);
// }
//
// public static Node transform(Node node, Generator generator, ExprList filters) {
// if(node.isConcrete()) {
// Var var = Var.alloc(generator.next());
//
// // Use of the constant Quad.defaultGraphNodeGenerated in the graph position results in a free variable.
// //if(!(isGraphNode && node.equals(Quad.defaultGraphNodeGenerated))) {
// Expr condition = new E_Equals(new ExprVar(var), NodeValue.makeNode(node));
// filters.add(condition);
// //}
//
// return var;
// }
//
// return node;
// }
//
// public static Op _replace(OpGroup op) {
// return new OpGroup(replace(op.getSubOp()), op.getGroupVars(), op.getAggregators());
// }
//
// public static Op _replace(OpTable op) {
// return null;
// }
//
// public static Op _replace(OpExtend op) {
// return OpExtend.extend(replace(op.getSubOp()), op.getVarExprList());
// }
//
// public static Op _replace(OpAssign op) {
// Op newSubOp = replace(op.getSubOp());
// Op result = OpExtend.extend(newSubOp, op.getVarExprList());
// return result;
// }
//
//
// public static Op _replace(OpSlice op)
// {
// return new OpSlice(replace(op.getSubOp()), op.getStart(), op.getLength());
// }
//
// public static Op _replace(OpOrder op) {
// return new OpOrder(replace(op.getSubOp()), op.getConditions());
// }
//
//
// public static Op _replace(OpProject op) {
// return new OpProject(replace(op.getSubOp()), op.getVars());
// }
//
// public static Op _replace(OpTopN op) {
// return new OpTopN(replace(op.getSubOp()), op.getLimit(), op.getConditions());
// }
//
// public static Op _replace(OpDistinct op) {
// return new OpDistinct(replace(op.getSubOp()));
// }
//
// public static Op _replace(OpLeftJoin op) {
// return OpLeftJoin.create(replace(op.getLeft()), replace(op.getRight()), op.getExprs());
// }
//
// public static Op _replace(OpSequence op) {
// List<Op> members = op.getElements();
//
// List<Op> newMembers = new ArrayList<Op>(members.size());
// for(Op member : members) {
// Op newMember = replace(member);
// newMembers.add(newMember);
// }
//
// Op result = OpSequence.create().copy(newMembers);
// return result;
// }
//
//
// public static Op _replace(OpConditional op) {
// Op newLeft = replace(op.getLeft());
// Op newRight = replace(op.getRight());
//
// Op result = new OpConditional(newLeft, newRight);
// return result;
// }
//
//
// public static Op _replace(OpJoin op) {
// return OpJoin.create(replace(op.getLeft()), replace(op.getRight()));
// }
//
// public static Op _replace(OpUnion op) {
// return OpUnion.create(replace(op.getLeft()), replace(op.getRight()));
// }
//
// public static Op _replace(OpDisjunction op) {
// OpDisjunction result = OpDisjunction.create();
// for(Op member : op.getElements()) {
// Op newMember = replace(member);
//
// result.add(newMember);
// }
//
// return result;
// }
//
// public static Op _replace(OpFilter op) {
// return OpFilter.filter(op.getExprs(), replace(op.getSubOp()));
// }
//
// public static Op _replace(OpQuadPattern op) {
//
// ExprList filters = new ExprList();
//
// //BasicPattern triples = new BasicPattern();
// QuadPattern quadPattern = new QuadPattern();
//
// Node rawGraphNode = op.getGraphNode();
//
// Node commonGraphNode = null;
// if(rawGraphNode.isConcrete()) {
// // If the graph node is a concrete value - except for the default graph,
// // replace it with a variable that is constrained to that value
// if(!rawGraphNode.equals(Quad.defaultGraphNodeGenerated)) {
// commonGraphNode = transform(rawGraphNode, generator, filters);
// }
// }
// else {
// // If the graph node is a variable, use it.
// commonGraphNode = rawGraphNode;
// }
//
//
// List<Node> nodes = new ArrayList<Node>(4);
// for(Triple triple : op.getBasicPattern().getList()) {
//
// Node graphNode;
// if(commonGraphNode != null) {
// graphNode = commonGraphNode;
// } else {
// graphNode = Var.alloc(generator.next());
// }
// nodes.add(graphNode);
//
//
// for(Node node : tripleToList(triple)) {
//
// Node n = transform(node, generator, filters);
// nodes.add(n);
// }
//
// //Triple t = listToTriple(nodes);
//
// //triples.add(t);
// Quad q = listToQuad(nodes);
// quadPattern.add(q);
// nodes.clear();
// }
//
// Op result = new OpQuadPattern2(quadPattern);
//
// if(!filters.isEmpty()) {
// result = OpFilter.filter(filters, result);
// }
//
// return result;
// }
//
//}