1 19 20 package org.apache.cayenne.exp.parser; 21 22 import java.math.BigDecimal ; 23 import java.util.Collection ; 24 import java.util.Iterator ; 25 26 import org.apache.cayenne.exp.Expression; 27 import org.apache.cayenne.util.ConversionUtil; 28 29 35 public class ASTDivide extends SimpleNode { 36 ASTDivide(int id) { 37 super(id); 38 } 39 40 public ASTDivide() { 41 super(ExpressionParserTreeConstants.JJTDIVIDE); 42 } 43 44 public ASTDivide(Object [] nodes) { 45 super(ExpressionParserTreeConstants.JJTDIVIDE); 46 int len = nodes.length; 47 for (int i = 0; i < len; i++) { 48 jjtAddChild(wrapChild(nodes[i]), i); 49 } 50 } 51 52 public ASTDivide(Collection nodes) { 53 super(ExpressionParserTreeConstants.JJTDIVIDE); 54 int len = nodes.size(); 55 Iterator it = nodes.iterator(); 56 for (int i = 0; i < len; i++) { 57 jjtAddChild(wrapChild(it.next()), i); 58 } 59 } 60 61 protected Object evaluateNode(Object o) throws Exception { 62 int len = jjtGetNumChildren(); 63 if (len == 0) { 64 return null; 65 } 66 67 BigDecimal result = null; 68 for (int i = 0; i < len; i++) { 69 BigDecimal value = ConversionUtil.toBigDecimal(evaluateChild(i, o)); 70 71 if (value == null) { 72 return null; 73 } 74 75 result = (i == 0) ? value : result.divide(value, BigDecimal.ROUND_HALF_EVEN); 76 } 77 78 return result; 79 } 80 81 84 public Expression shallowCopy() { 85 return new ASTDivide(id); 86 } 87 88 protected String getExpressionOperator(int index) { 89 return "/"; 90 } 91 92 public int getType() { 93 return Expression.DIVIDE; 94 } 95 96 public void jjtClose() { 97 super.jjtClose(); 98 flattenTree(); 99 } 100 } 101 | Popular Tags |