package org.openanzo.glitter.query.rewriter; import java.util.Iterator; import org.openanzo.glitter.query.TreeRewriter; import org.openanzo.glitter.syntax.abstrakt.BGP; import org.openanzo.glitter.syntax.abstrakt.GraphPattern; import org.openanzo.glitter.syntax.abstrakt.Group; import org.openanzo.glitter.syntax.abstrakt.TreeNode; /** * Implements the simplification step in * <a href="http://www.w3.org/TR/rdf-sparql-query/#convertGraphPattern">the SPARQL * specification</a>. Joins with empty groups are the identity. It also removes * empty BGPs. * @author lee <lee@cambridgesemantics.com> * */ public class SingletonGroupRewriter implements TreeRewriter { public TreeNode rewriteTreeNode(TreeNode node) { // don't rewrite the root if (node.getRoot() == node) return node; if (node instanceof BGP) { if (node.getChildren().isEmpty()) return null; } else if (node instanceof Group) { Group g = (Group) node; if ((g.getFilters() == null || g.getFilters().size() == 0) && (g.getAssignments() == null || g.getAssignments().size() == 0)) { Iterator<GraphPattern> it = g.getPatterns().iterator(); // remove empty groups without a filter if (!it.hasNext()) return null; GraphPattern first = it.next(); // if only one element, which is itself a group, replace with that if (first instanceof Group && !it.hasNext()) return first; // otherwise leave the group unchanged return node; } } return node; } }