001    /**
002     * Equal.java
003     * jCOLIBRI2 framework. 
004     * @author Juan A. Recio-García.
005     * GAIA - Group for Artificial Intelligence Applications
006     * http://gaia.fdi.ucm.es
007     * 28/10/2007
008     */
009    package jcolibri.method.retrieve.FilterBasedRetrieval.predicates;
010    
011    import jcolibri.exception.NoApplicableFilterPredicateException;
012    
013    /**
014     * Predicate that compares if the query object is less than the case object.
015     * Only applicable to enums and numbers.
016     * @author Juan A. Recio-Garcia
017     * @author Developed at University College Cork (Ireland) in collaboration with Derek Bridge.
018     * @version 1.0
019     * @see jcolibri.method.retrieve.FilterBasedRetrieval.FilterBasedRetrievalMethod
020     * @see jcolibri.method.retrieve.FilterBasedRetrieval.FilterConfig
021     */
022    public class Threshold implements FilterPredicate
023    {
024        private double threshold;
025        
026        public Threshold(Number threshold)
027        {
028            this.threshold = threshold.doubleValue();
029        }
030        
031        public boolean compute(Object caseObject, Object queryObject) throws NoApplicableFilterPredicateException
032        {
033            if((caseObject == null)&&(queryObject==null))
034                return true;
035            else if(caseObject == null)
036                return false;
037            else if(queryObject == null)
038                return true;
039            else if (! ((caseObject instanceof java.lang.Number)||(caseObject instanceof Enum)))
040                    throw new jcolibri.exception.NoApplicableFilterPredicateException(this.getClass(), caseObject.getClass());
041            else if (! ((queryObject instanceof java.lang.Number)||(queryObject instanceof Enum)))
042                    throw new jcolibri.exception.NoApplicableFilterPredicateException(this.getClass(), queryObject.getClass());
043            else 
044            {
045                double caseValue;
046                double queryValue;
047                if((caseObject instanceof Number)&&(queryObject instanceof Number))
048                {
049                    Number n1  = (Number) caseObject;
050                    caseValue  = n1.doubleValue();
051                    Number n2  = (Number) queryObject;
052                    queryValue = n2.doubleValue();
053                }
054                else
055                {
056                    Enum enum1 = (Enum)caseObject;
057                    caseValue  = enum1.ordinal();
058                    Enum enum2 = (Enum)queryObject;
059                    queryValue = enum2.ordinal();
060                }
061                return Math.abs(queryValue-caseValue) < threshold;
062            }
063        }
064    
065    }