diff --git a/src/main/java/at/daho/opencypherexperiments/CypherVisitor.java b/src/main/java/at/daho/opencypherexperiments/CypherVisitor.java index baf985d..ef28c91 100644 --- a/src/main/java/at/daho/opencypherexperiments/CypherVisitor.java +++ b/src/main/java/at/daho/opencypherexperiments/CypherVisitor.java @@ -3,44 +3,67 @@ import at.daho.opencypherexperiments.antlr4.CypherBaseVisitor; import at.daho.opencypherexperiments.antlr4.CypherParser; +import java.util.ArrayList; + public class CypherVisitor extends CypherBaseVisitor { + private int clauseNumber = 1; + private int indent = 0; + private ArrayList currentGroup = new ArrayList<>(); @Override - public Object visitOC_Cypher(CypherParser.OC_CypherContext ctx) { - return visit(ctx.oC_Statement()); + public Object visitOC_MultiPartQuery(CypherParser.OC_MultiPartQueryContext ctx) { + println("MultiPart ["); + indent++; + currentGroup.clear(); + Object result = super.visitOC_MultiPartQuery(ctx); + indent--; + println("]"); + + return result; } @Override - public Object visitOC_Statement(CypherParser.OC_StatementContext ctx) { - return visit(ctx.oC_Query()); + public Object visitOC_ReadingClause(CypherParser.OC_ReadingClauseContext ctx) { + currentGroup.add("" + (clauseNumber++) + ": " + ctx.getText()); + return super.visitOC_ReadingClause(ctx); } @Override - public Object visitOC_Query(CypherParser.OC_QueryContext ctx) { - return visit(ctx.oC_RegularQuery()); + public Object visitOC_UpdatingClause(CypherParser.OC_UpdatingClauseContext ctx) { + currentGroup.add("" + (clauseNumber++) + ": " + ctx.getText()); + return super.visitOC_UpdatingClause(ctx); } @Override - public Object visitOC_RegularQuery(CypherParser.OC_RegularQueryContext ctx) { - return visit(ctx.oC_SingleQuery()); + public Object visitOC_With(CypherParser.OC_WithContext ctx) { + println("Group ["); + indent++; + currentGroup.add("" + (clauseNumber++) + ": " + ctx.getText()); + Object result = super.visitOC_With(ctx); + currentGroup.stream().forEachOrdered(this::println); + indent--; + println("]"); + currentGroup.clear(); + return result; } @Override - public Object visitOC_SingleQuery(CypherParser.OC_SingleQueryContext ctx) { - return visit(ctx.oC_MultiPartQuery()); + public Object visitOC_Return(CypherParser.OC_ReturnContext ctx) { + println("Group ["); + indent++; + currentGroup.add("" + (clauseNumber++) + ": " + ctx.getText()); + Object result = super.visitOC_Return(ctx); + currentGroup.stream().forEachOrdered(this::println); + indent--; + println("]"); + return result; } - @Override - public Object visitOC_MultiPartQuery(CypherParser.OC_MultiPartQueryContext ctx) { - System.out.println("Enter visitOC_MultiPartQuery"); - System.out.println("Whole context: " + ctx.getText()); - System.out.println("OC_ReadingClause:"); - ctx.oC_ReadingClause().forEach(c -> System.out.println("\t" + c.getText())); - System.out.println("OC_UpdatingClause:"); - ctx.oC_UpdatingClause().forEach(c -> System.out.println("\t" + c.getText())); - System.out.println("To which OC_ReadingClause does this OC_UpdatingClause belong?"); - System.out.println("Leave visitOC_MultiPartQuery"); - - return null; + private void println(String line) { + System.out.println(getIndent() + line); + } + + private String getIndent() { + return new String(new char[indent]).replace("\0", " "); } }