/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this software; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF * site: http://www.fsf.org. */ package org.xcmis.search.model.constraint; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * Comparison operator. */ public enum Operator { EQUAL_TO("="), GREATER_THAN(">"), GREATER_THAN_OR_EQUAL_TO(">="), LESS_THAN("<"), LESS_THAN_OR_EQUAL_TO("<="), LIKE("LIKE"), NOT_EQUAL_TO("!="); private static final Map<String, Operator> OPERATORS_BY_SYMBOL; public static final Operator[] ALL = new Operator[]{ EQUAL_TO, GREATER_THAN, GREATER_THAN_OR_EQUAL_TO, LESS_THAN, LESS_THAN_OR_EQUAL_TO, LIKE, NOT_EQUAL_TO}; static { Map<String, Operator> opsBySymbol = new HashMap<String, Operator>(); for (Operator operator : Operator.values()) { opsBySymbol.put(operator.getSymbol().toUpperCase(), operator); } opsBySymbol.put("<>", NOT_EQUAL_TO); OPERATORS_BY_SYMBOL = Collections.unmodifiableMap(opsBySymbol); } private final String symbol; private Operator(String symbol) { this.symbol = symbol; } /** * Get the equivalent operator if the operands are to be reversed. * * @return the reverse operator; never null */ public Operator getReverse() { switch (this) { case GREATER_THAN : return LESS_THAN; case GREATER_THAN_OR_EQUAL_TO : return LESS_THAN_OR_EQUAL_TO; case LESS_THAN : return GREATER_THAN; case LESS_THAN_OR_EQUAL_TO : return GREATER_THAN_OR_EQUAL_TO; case EQUAL_TO : case LIKE : case NOT_EQUAL_TO : default : return this; } } /** * Get the symbol for this operator. * * @return the symbolic representation; never null */ public String getSymbol() { return symbol; } /** * Determine whether this operator is one that is used to define a range of * values: {@link #LESS_THAN <}, {@link #GREATER_THAN >}, * {@link #LESS_THAN_OR_EQUAL_TO <=}, or {@link #GREATER_THAN_OR_EQUAL_TO >=} * . * * @return true if this operator is a range operator, or false otherwise */ public boolean isRangeOperator() { switch (this) { case GREATER_THAN : case GREATER_THAN_OR_EQUAL_TO : case LESS_THAN : case LESS_THAN_OR_EQUAL_TO : return true; case EQUAL_TO : case LIKE : case NOT_EQUAL_TO : default : return false; } } /** * {@inheritDoc} * * @see java.lang.Enum#toString() */ @Override public String toString() { return symbol; } /** * Attempt to find the Operator given a symbol. The matching is done * independent of case. * * @param symbol * the symbol * @return the Operator having the supplied symbol, or null if there is no * Operator with the supplied symbol */ public static Operator forSymbol(String symbol) { return OPERATORS_BY_SYMBOL.get(symbol.toUpperCase()); } }