package de.unikiel.inf.comsys.neo4j.inference.debug; /* * #%L * neo4j-sparql-extension * %% * Copyright (C) 2014 Niclas Hoyer * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import java.util.IdentityHashMap; import java.util.Set; import org.openrdf.query.algebra.Add; import org.openrdf.query.algebra.And; import org.openrdf.query.algebra.ArbitraryLengthPath; import org.openrdf.query.algebra.Avg; import org.openrdf.query.algebra.BNodeGenerator; import org.openrdf.query.algebra.BindingSetAssignment; import org.openrdf.query.algebra.Bound; import org.openrdf.query.algebra.Clear; import org.openrdf.query.algebra.Coalesce; import org.openrdf.query.algebra.Compare; import org.openrdf.query.algebra.CompareAll; import org.openrdf.query.algebra.CompareAny; import org.openrdf.query.algebra.Copy; import org.openrdf.query.algebra.Count; import org.openrdf.query.algebra.Create; import org.openrdf.query.algebra.Datatype; import org.openrdf.query.algebra.DeleteData; import org.openrdf.query.algebra.DescribeOperator; import org.openrdf.query.algebra.Difference; import org.openrdf.query.algebra.Distinct; import org.openrdf.query.algebra.EmptySet; import org.openrdf.query.algebra.Exists; import org.openrdf.query.algebra.Extension; import org.openrdf.query.algebra.ExtensionElem; import org.openrdf.query.algebra.Filter; import org.openrdf.query.algebra.FunctionCall; import org.openrdf.query.algebra.Group; import org.openrdf.query.algebra.GroupConcat; import org.openrdf.query.algebra.GroupElem; import org.openrdf.query.algebra.IRIFunction; import org.openrdf.query.algebra.If; import org.openrdf.query.algebra.In; import org.openrdf.query.algebra.InsertData; import org.openrdf.query.algebra.Intersection; import org.openrdf.query.algebra.IsBNode; import org.openrdf.query.algebra.IsLiteral; import org.openrdf.query.algebra.IsNumeric; import org.openrdf.query.algebra.IsResource; import org.openrdf.query.algebra.IsURI; import org.openrdf.query.algebra.Join; import org.openrdf.query.algebra.Label; import org.openrdf.query.algebra.Lang; import org.openrdf.query.algebra.LangMatches; import org.openrdf.query.algebra.LeftJoin; import org.openrdf.query.algebra.Like; import org.openrdf.query.algebra.ListMemberOperator; import org.openrdf.query.algebra.Load; import org.openrdf.query.algebra.LocalName; import org.openrdf.query.algebra.MathExpr; import org.openrdf.query.algebra.Max; import org.openrdf.query.algebra.Min; import org.openrdf.query.algebra.Modify; import org.openrdf.query.algebra.Move; import org.openrdf.query.algebra.MultiProjection; import org.openrdf.query.algebra.Namespace; import org.openrdf.query.algebra.Not; import org.openrdf.query.algebra.Or; import org.openrdf.query.algebra.Order; import org.openrdf.query.algebra.OrderElem; import org.openrdf.query.algebra.Projection; import org.openrdf.query.algebra.ProjectionElem; import org.openrdf.query.algebra.ProjectionElemList; import org.openrdf.query.algebra.QueryModelNode; import org.openrdf.query.algebra.QueryModelVisitor; import org.openrdf.query.algebra.QueryRoot; import org.openrdf.query.algebra.Reduced; import org.openrdf.query.algebra.Regex; import org.openrdf.query.algebra.SameTerm; import org.openrdf.query.algebra.Sample; import org.openrdf.query.algebra.Service; import org.openrdf.query.algebra.SingletonSet; import org.openrdf.query.algebra.Slice; import org.openrdf.query.algebra.StatementPattern; import org.openrdf.query.algebra.Str; import org.openrdf.query.algebra.Sum; import org.openrdf.query.algebra.Union; import org.openrdf.query.algebra.ValueConstant; import org.openrdf.query.algebra.Var; import org.openrdf.query.algebra.ZeroLengthPath; import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; /** * A {@link QueryModelVisitor} implementation that records all seen nodes * in a map. * * This is useful to count all or certain nodes in a tree. It is also useful * to test if a specific node is present in the tree. */ public class SeenVisitor extends QueryModelVisitorBase<RuntimeException> { private final IdentityHashMap<QueryModelNode, Void> seen; public SeenVisitor() { super(); this.seen = new IdentityHashMap<>(); } private void setSeen(QueryModelNode node) { seen.put(node, null); } public Set<QueryModelNode> getSeen() { return seen.keySet(); } @Override public void meet(QueryRoot node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Add node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(And node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ArbitraryLengthPath node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Avg node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(BindingSetAssignment node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(BNodeGenerator node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Bound node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Clear node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Coalesce node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Compare node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(CompareAll node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(CompareAny node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(DescribeOperator node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Copy node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Count node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Create node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Datatype node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(DeleteData node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Difference node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Distinct node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(EmptySet node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Exists node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Extension node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ExtensionElem node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Filter node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(FunctionCall node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Group node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(GroupConcat node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(GroupElem node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(If node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(In node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(InsertData node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Intersection node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(IRIFunction node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(IsBNode node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(IsLiteral node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(IsNumeric node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(IsResource node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(IsURI node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Join node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Label node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Lang node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(LangMatches node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(LeftJoin node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Like node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Load node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(LocalName node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(MathExpr node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Max node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Min node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Modify node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Move node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(MultiProjection node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Namespace node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Not node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Or node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Order node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(OrderElem node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Projection node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ProjectionElem node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ProjectionElemList node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Reduced node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Regex node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(SameTerm node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Sample node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Service node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(SingletonSet node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Slice node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(StatementPattern node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Str node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Sum node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Union node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ValueConstant node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ListMemberOperator node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(Var node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meet(ZeroLengthPath node) throws RuntimeException { setSeen(node); super.meet(node); } @Override public void meetOther(QueryModelNode node) throws RuntimeException { setSeen(node); super.meetOther(node); } }