/* * Licensed to the Apache Software Foundation (ASF) Under one or more * contributor license agreements. See the NOTICE file distributed with * this work for Additional information regarding copyright ownership. * The ASF licenses this file to You Under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed Under the License is distributed on an "AS Is" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations Under the License. */ /* * Created on May 10, 2005 * */ namespace HH.WMS.Utils.NPOI.SS.Formula.Eval { using System; using HH.WMS.Utils.NPOI.SS.Formula.Functions; using HH.WMS.Utils.NPOI.SS.Util; //public class RelationalValues //{ // public double[] ds = new Double[2]; // public bool[] bs = new bool[2]; // public string[] ss = new String[3]; // public ErrorEval ee = null; //} /** * @author Amol S. Deshmukh < amolweb at ya hoo Dot com > * */ public abstract class RelationalOperationEval : Fixed2ArgFunction { private static int DoCompare(ValueEval va, ValueEval vb) { // special cases when one operand is blank if (va == BlankEval.instance) { return CompareBlank(vb); } if (vb == BlankEval.instance) { return -CompareBlank(va); } if (va is BoolEval) { if (vb is BoolEval) { BoolEval bA = (BoolEval)va; BoolEval bB = (BoolEval)vb; if (bA.BooleanValue == bB.BooleanValue) { return 0; } return bA.BooleanValue ? 1 : -1; } return 1; } if (vb is BoolEval) { return -1; } if (va is StringEval) { if (vb is StringEval) { StringEval sA = (StringEval)va; StringEval sB = (StringEval)vb; return string.Compare(sA.StringValue, sB.StringValue, StringComparison.OrdinalIgnoreCase); } return 1; } if (vb is StringEval) { return -1; } if (va is NumberEval) { if (vb is NumberEval) { NumberEval nA = (NumberEval)va; NumberEval nB = (NumberEval)vb; if (nA.NumberValue == nB.NumberValue) { // Excel considers -0.0 == 0.0 which is different to Double.compare() return 0; } return NumberComparer.Compare(nA.NumberValue, nB.NumberValue); } } throw new ArgumentException("Bad operand types (" + va.GetType().Name + "), (" + vb.GetType().Name + ")"); } private static int CompareBlank(ValueEval v) { if (v == BlankEval.instance) { return 0; } if (v is BoolEval) { BoolEval boolEval = (BoolEval) v; return boolEval.BooleanValue ? -1 : 0; } if (v is NumberEval) { NumberEval ne = (NumberEval) v; //return ne.NumberValue.CompareTo(0.0); return NumberComparer.Compare(0.0, ne.NumberValue); } if (v is StringEval) { StringEval se = (StringEval) v; return se.StringValue.Length < 1 ? 0 : -1; } throw new ArgumentException("bad value class (" + v.GetType().Name + ")"); } public override ValueEval Evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) { ValueEval vA; ValueEval vB; try { vA = OperandResolver.GetSingleValue(arg0, srcRowIndex, srcColumnIndex); vB = OperandResolver.GetSingleValue(arg1, srcRowIndex, srcColumnIndex); } catch (EvaluationException e) { return e.GetErrorEval(); } int cmpResult = DoCompare(vA, vB); bool result = ConvertComparisonResult(cmpResult); return BoolEval.ValueOf(result); } public abstract bool ConvertComparisonResult(int cmpResult); public static Function EqualEval = new EqualEval(); public static Function NotEqualEval = new NotEqualEval(); public static Function LessEqualEval = new LessEqualEval(); public static Function LessThanEval = new LessThanEval(); public static Function GreaterEqualEval = new GreaterEqualEval(); public static Function GreaterThanEval = new GreaterThanEval(); } }