public static BooleanExpression createInExpression()

in qpid-jms-client/src/main/java/org/apache/qpid/jms/selector/filter/UnaryExpression.java [58:122]


    public static BooleanExpression createInExpression(PropertyExpression right, List<Object> elements, final boolean not) {

        // Use a HashSet if there are many elements.
        Collection<Object> t;
        if (elements.size() == 0) {
            t = null;
        } else if (elements.size() < 5) {
            t = elements;
        } else {
            t = new HashSet<Object>(elements);
        }

        final Collection<Object> inList = t;

        return new BooleanUnaryExpression(right) {
            @Override
            public Object evaluate(Filterable message) throws FilterException {

                Object rvalue = right.evaluate(message);
                if (rvalue == null) {
                    return null;
                }
                if (rvalue.getClass() != String.class) {
                    return null;
                }

                if ((inList != null && inList.contains(rvalue)) ^ not) {
                    return Boolean.TRUE;
                } else {
                    return Boolean.FALSE;
                }
            }

            @Override
            public String toString() {
                StringBuffer answer = new StringBuffer();
                answer.append(right);
                answer.append(" ");
                answer.append(getExpressionSymbol());
                answer.append(" ( ");

                int count = 0;
                for (Iterator<Object> i = inList.iterator(); i.hasNext();) {
                    Object o = i.next();
                    if (count != 0) {
                        answer.append(", ");
                    }
                    answer.append(o);
                    count++;
                }

                answer.append(" )");
                return answer.toString();
            }

            @Override
            public String getExpressionSymbol() {
                if (not) {
                    return "NOT IN";
                } else {
                    return "IN";
                }
            }
        };
    }