001    /**
002     * =========================================
003     * LibFormula : a free Java formula library
004     * =========================================
005     *
006     * Project Info:  http://reporting.pentaho.org/libformula/
007     *
008     * (C) Copyright 2006-2007, by Pentaho Corporation and Contributors.
009     *
010     * This library is free software; you can redistribute it and/or modify it under the terms
011     * of the GNU Lesser General Public License as published by the Free Software Foundation;
012     * either version 2.1 of the License, or (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015     * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016     * See the GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public License along with this
019     * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020     * Boston, MA 02111-1307, USA.
021     *
022     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023     * in the United States and other countries.]
024     *
025     *
026     * ------------
027     * $Id: InfixOperator.java 2887 2007-06-06 17:07:52Z taqua $
028     * ------------
029     * (C) Copyright 2006-2007, by Pentaho Corporation.
030     */
031    package org.jfree.formula.operators;
032    
033    import java.io.Serializable;
034    
035    import org.jfree.formula.EvaluationException;
036    import org.jfree.formula.FormulaContext;
037    import org.jfree.formula.lvalues.TypeValuePair;
038    
039    /**
040     * An operator. An operator always takes two arguments. Prefix and postfix
041     * operators are implemented differently.
042     *
043     * @author Thomas Morgner
044     */
045    public interface InfixOperator extends Serializable
046    {
047      /**
048       * Evaluates the comptuation for both parameters. This method must never return null.
049       *
050       * @param context
051       * @param value1
052       * @param value2
053       * @return
054       * @throws EvaluationException
055       */
056      public TypeValuePair evaluate(FormulaContext context,
057                                    TypeValuePair value1, TypeValuePair value2)
058          throws EvaluationException;
059    
060      public int getLevel();
061    
062      /**
063       * Defines the bind-direction of the operator. That direction defines, in
064       * which direction a sequence of equal operators is resolved.
065       *
066       * @return true, if the operation is left-binding, false if right-binding
067       */
068      public boolean isLeftOperation();
069    
070      /**
071       * Defines, whether the operation is associative. For associative operations,
072       * the evaluation order does not matter, if the operation appears more than
073       * once in an expression, and therefore we can optimize them
074       * a lot better than non-associative operations (ie. merge constant parts
075       * and precompute them once).
076       *
077       * @return true, if the operation is associative, false otherwise
078       */
079      public boolean isAssociative();
080    }