Package org.openrdf.query.parser.serql

Source Code of org.openrdf.query.parser.serql.AnonymousVarGenerator

/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.parser.serql;

import org.openrdf.query.parser.serql.ast.ASTEdge;
import org.openrdf.query.parser.serql.ast.ASTNode;
import org.openrdf.query.parser.serql.ast.ASTNodeElem;
import org.openrdf.query.parser.serql.ast.ASTReifiedStat;
import org.openrdf.query.parser.serql.ast.ASTVar;
import org.openrdf.query.parser.serql.ast.SyntaxTreeBuilderTreeConstants;
import org.openrdf.query.parser.serql.ast.VisitorException;

/**
* Inserts anonymous variables into the abstract syntax tree at places where
* such variables are already implicitly present.
*/
public class AnonymousVarGenerator extends ASTVisitorBase {

  private int anonymousVarNo = 1;

  @Override
  public Object visit(ASTNode node, Object data)
    throws VisitorException
  {
    if (node.jjtGetNumChildren() == 0) {
      ASTNodeElem nodeElem = createNodeElem();
      nodeElem.jjtSetParent(node);
      node.jjtAppendChild(nodeElem);
    }

    return super.visit(node, data);
  }

  @Override
  public Object visit(ASTReifiedStat node, Object data)
    throws VisitorException
  {
    if (node.jjtGetChild(0) instanceof ASTEdge) {
      // subject node is missing
      ASTNodeElem nodeElem = createNodeElem();
      nodeElem.jjtSetParent(node);
      node.jjtInsertChild(nodeElem, 0);
    }

    if (node.jjtGetNumChildren() <= 2) {
      // object node is missing
      ASTNodeElem nodeElem = createNodeElem();
      nodeElem.jjtSetParent(node);
      node.jjtAppendChild(nodeElem);
    }

    if (node.getID() == null) {
      node.setID(createAnonymousVar());
    }

    return super.visit(node, data);
  }

  private ASTNodeElem createNodeElem() {
    ASTNodeElem nodeElem = new ASTNodeElem(SyntaxTreeBuilderTreeConstants.JJTNODEELEM);

    ASTVar var = createAnonymousVar();
    var.jjtSetParent(nodeElem);
    nodeElem.jjtAppendChild(var);

    return nodeElem;
  }

  private ASTVar createAnonymousVar() {
    ASTVar var = new ASTVar(SyntaxTreeBuilderTreeConstants.JJTVAR);
    var.setName("-anon-" + anonymousVarNo++);
    var.setAnonymous(true);
    return var;
  }
}
TOP

Related Classes of org.openrdf.query.parser.serql.AnonymousVarGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.