@Override public XpathForClause visitOrExpr(OrExprContext ctx) { if (isSimpleXpath) { return super.visitOrExpr(ctx); } if (ctx.andExpr().size() > 1) { Where<Coverage> orWhere = query.expressionFactory(); stack.pushWhereStack(orWhere); int i = 0; for (AndExprContext andExprContext : ctx.andExpr()) { visit(andExprContext); if (i + 1 < ctx.andExpr().size()) { stack.popWhereStack(); stack.pushWhereStack(stack.popWhereBuilderStack().or()); } ++i; } stack.popWhereStack(); stack.pushWhereBuilderStack(stack.peekWhereStack().expression(stack.popWhereBuilderStack())); return null; } else { return super.visitOrExpr(ctx); } }
@Override public XpathForClause visitMain(MainContext ctx) { Where<Coverage> whereRoot = query.whereBuilder(); stack.pushWhereStack(whereRoot); XpathForClause visitMain = super.visitMain(ctx); stack.popWhereStack(); return visitMain.aggregate(executeQuery()); }
@Override public XpathForClause visitStep(StepContext ctx) { if (isSimpleXpath) { return super.visitStep(ctx); } boolean foundCoverage = false; String axisSpecifier = ctx.axisSpecifier().getText(); String nodeName = ctx.nodeTest().getText(); if (axisSpecifier.isEmpty()) { // is node switch (nodeName) { case XWCPSReservedWords.COVERAGE: foundCoverage = true; for (PredicateContext predicate : ctx.predicate()) { visit(predicate); } break; case XWCPSReservedWords.SERVER: Where<Coverage> serverWhere = query.expressionFactory(); stack.pushWhereStack(serverWhere); for (PredicateContext predicate : ctx.predicate()) { visit(predicate); } stack.popWhereStack(); WhereBuilder<Coverage> serverWhereBuilder = stack.peekWhereStack().isChildOf(stack.popWhereBuilderStack()); stack.popWhereStack(); stack.pushWhereStack(serverWhereBuilder.and()); break; default: throw new ParseCancellationException( "Expecting an xpath with '" + XWCPSReservedWords.COVERAGE + "' element"); } } if (foundCoverage) { isSimpleXpath = true; } // FIXME return null; }