1 19 20 21 package org.apache.cayenne.exp.parser; 22 23 import org.apache.cayenne.exp.Expression; 24 import org.apache.commons.collections.Transformer; 25 26 31 public class ASTNotIn extends ConditionNode { 32 ASTNotIn(int id) { 33 super(id); 34 } 35 36 public ASTNotIn() { 37 super(ExpressionParserTreeConstants.JJTNOTIN); 38 } 39 40 public ASTNotIn(ASTPath path, ASTList list) { 41 super(ExpressionParserTreeConstants.JJTNOTIN); 42 jjtAddChild(path, 0); 43 jjtAddChild(list, 1); 44 } 45 46 protected Object evaluateNode(Object o) throws Exception { 47 int len = jjtGetNumChildren(); 48 if (len != 2) { 49 return Boolean.FALSE; 50 } 51 52 Object o1 = evaluateChild(0, o); 53 if (o1 == null) { 54 return Boolean.FALSE; 55 } 56 57 Object [] objects = (Object []) evaluateChild(1, o); 58 if (objects == null) { 59 return Boolean.FALSE; 60 } 61 62 int size = objects.length; 63 for (int i = 0; i < size; i++) { 64 if (o1.equals(objects[i])) { 65 return Boolean.FALSE; 66 } 67 } 68 69 return Boolean.TRUE; 70 } 71 72 75 public Expression shallowCopy() { 76 return new ASTNotIn(id); 77 } 78 79 protected String getExpressionOperator(int index) { 80 return "not in"; 81 } 82 83 public int getType() { 84 return Expression.NOT_IN; 85 } 86 87 protected Object transformExpression(Transformer transformer) { 88 Object transformed = super.transformExpression(transformer); 89 90 if (transformed instanceof ASTNotIn) { 92 ASTNotIn exp = (ASTNotIn) transformed; 93 if (exp.jjtGetNumChildren() == 2) { 94 ASTList list = (ASTList) exp.jjtGetChild(1); 95 Object [] objects = (Object []) list.evaluate(null); 96 if (objects.length == 0) { 97 transformed = new ASTTrue(); 98 } 99 } 100 } 101 102 return transformed; 103 } 104 105 } 106 | Popular Tags |