package com.bagri.core.query; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * Build expressions of right type from parameters provided. * Contains expressions belonging to the same collection only? * * @author Denis Sukhoroslov * */ public class ExpressionBuilder { private int exIndex = -1; private List<Expression> expressions = new ArrayList<>(); /** * Add expression to internal expression list * * @param exp the expression * @return the index at which expression is stored in internal expression list */ public int addExpression(Expression exp) { expressions.add(exp); exIndex = expressions.size() - 1; return resolveCurrentParent(); } /** * Build expression and add it to internal expression list * * @param clnId the collection identifier * @param compType the comparison type * @param path the expression path * @param param the parameter name * @return the index at which expression is stored in internal expression list */ public int addExpression(int clnId, Comparison compType, PathBuilder path, String param) { Expression ex; switch (compType) { case AND: case OR: ex = new BinaryExpression(clnId, compType, path); break; case NOT: return -1; default: ex = new PathExpression(clnId, compType, path, param); } return addExpression(ex); } /** * * @return the last added expression */ private Expression getCurrentExpression() { return getExpression(exIndex); } /** * * @param exIdx the expression index * @return the expression if it is found by the index provided, null otherwise */ public Expression getExpression(int exIdx) { if (exIdx < 0) { return null; } if (exIdx >= expressions.size()) { return null; } return expressions.get(exIdx); } /** * * @return the list of containing expressions */ public List<Expression> getExpressions() { return Collections.unmodifiableList(expressions); } /** * * @return collectionId associated with this builder */ public int getCollectionId() { if (expressions.size() > 0) { return expressions.get(0).getCollectionId(); } return 0; } /** * * @return root expression */ public Expression getRoot() { if (expressions.size() > 0) { return expressions.get(0); } return null; } private int resolveCurrentParent() { Expression current = getCurrentExpression(); for (int i=exIndex - 1; i >= 0; i--) { Expression ex = expressions.get(i); if (ex instanceof BinaryExpression) { BinaryExpression be = (BinaryExpression) ex; if (be.getLeft() == null) { be.setLeft(current); return i; } else if (be.getRight() == null) { be.setRight(current); return i; } } } return -1; } /** * {@inheritDoc} */ @Override public String toString() { StringBuilder buff = new StringBuilder(); buff.append("ExpressionBuilder; size: ").append(expressions.size()); if (expressions.size() > 0) { buff.append(" ["); buff.append(expressions.get(0)); buff.append("]"); } return buff.toString(); } }