/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit.emulation.hibernate3.ast.whereClause; import java.util.*; import mockit.emulation.hibernate3.ast.*; final class ConcatenationExpr extends Expr { final Expr[] additiveExprs; ConcatenationExpr(List<Expr> additiveExprs) { this.additiveExprs = additiveExprs.toArray(new Expr[additiveExprs.size()]); } public static Expr parse(Tokens tokens) { int pos = tokens.getPosition(); Expr firstExpr = AdditiveExpr.parse(tokens); if (firstExpr == null) { tokens.setPosition(pos); return null; } List<Expr> additiveExprs = new LinkedList<Expr>(); additiveExprs.add(firstExpr); while (tokens.hasNext()) { if ("||".equals(tokens.next())) { Expr nextExpr = AdditiveExpr.parse(tokens); if (nextExpr == null) { throw new QuerySyntaxException(tokens); } additiveExprs.add(nextExpr); } else { tokens.pushback(); break; } } return additiveExprs.size() == 1 ? firstExpr : new ConcatenationExpr(additiveExprs); } @Override public String evaluate(QueryEval eval) { StringBuilder result = new StringBuilder(); for (Expr expr : additiveExprs) { result.append(expr.evaluate(eval)); } return result.toString(); } }