001: /*
002:
003: This software is OSI Certified Open Source Software.
004: OSI Certified is a certification mark of the Open Source Initiative.
005:
006: The license (Mozilla version 1.0) can be read at the MMBase site.
007: See http://www.MMBase.org/license
008:
009: */
010: package org.mmbase.storage.search.implementation;
011:
012: import org.mmbase.bridge.Field;
013: import org.mmbase.storage.search.*;
014:
015: /**
016: * Basic implementation.
017: * The tested operation is equality, unless it is explicitly set.
018: *
019: * @author Rob van Maris
020: * @version $Id: BasicFieldCompareConstraint.java,v 1.12 2006/10/16 12:56:57 pierre Exp $
021: * @since MMBase-1.7
022: */
023: public class BasicFieldCompareConstraint extends BasicFieldConstraint
024: implements FieldCompareConstraint {
025:
026: /** The operator. */
027: private int operator = FieldCompareConstraint.EQUAL;
028:
029: /**
030: * Constructor.
031: * Protected, so only subclasses can be instantiated.
032: *
033: * @param field The associated field.
034: * @throws IllegalArgumentException when an invalid argument is supplied.
035: */
036: protected BasicFieldCompareConstraint(StepField field) {
037: super (field);
038: }
039:
040: /**
041: * Sets operator.
042: *
043: * @param operator the operator value
044: * @return This <code>BasicFieldCompareConstraint</code> instance.
045: * @throws IllegalArgumentException when an invalid argument is supplied.
046: */
047: public BasicFieldCompareConstraint setOperator(int operator) {
048:
049: // Test for defined operator value.
050: if (operator < FieldCompareConstraint.LESS
051: || operator > FieldCompareConstraint.LIKE) {
052: throw new IllegalArgumentException(
053: "Invalid operator value: " + operator);
054: }
055:
056: // Test "LIKE" operator only used with string type field.
057: if (operator == FieldCompareConstraint.LIKE
058: && getField().getType() != Field.TYPE_STRING
059: && getField().getType() != Field.TYPE_XML) {
060: throw new IllegalArgumentException(
061: "LIKE operator not allowed for this field type: "
062: + getField().getType());
063: }
064:
065: this .operator = operator;
066: return this ;
067: }
068:
069: // javadoc is inherited
070: public int getOperator() {
071: return operator;
072: }
073:
074: /**
075: * Returns a description of the operator
076: */
077: public String getOperatorDescription() {
078: try {
079: return FieldCompareConstraint.OPERATOR_DESCRIPTIONS[operator];
080: } catch (IndexOutOfBoundsException ioobe) {
081: return null;
082: }
083: }
084:
085: // javadoc is inherited
086: public boolean equals(Object obj) {
087: // Must be same class (subclasses should override this)!
088: if (obj != null && obj.getClass() == getClass()) {
089: BasicFieldCompareConstraint constraint = (BasicFieldCompareConstraint) obj;
090: return isInverse() == constraint.isInverse()
091: && isCaseSensitive() == constraint
092: .isCaseSensitive()
093: && getField().getFieldName().equals(
094: constraint.getField().getFieldName())
095: && BasicStepField.compareSteps(
096: getField().getStep(), constraint.getField()
097: .getStep())
098: && operator == constraint.operator;
099: } else {
100: return false;
101: }
102: }
103:
104: // javadoc is inherited
105: public int hashCode() {
106: return super .hashCode() + 113 * operator;
107: }
108:
109: // javadoc is inherited
110: public String toString() {
111: StringBuilder sb = new StringBuilder(
112: "BasicFieldCompareConstraint(inverse:").append(
113: isInverse()).append(", field:").append(getFieldName())
114: .append(", casesensitive:").append(isCaseSensitive())
115: .append(", operator:").append(getOperatorDescription())
116: .append(")");
117: return sb.toString();
118: }
119:
120: }
|