diff --git a/main/src/com/google/refine/expr/functions/math/Abs.java b/main/src/com/google/refine/expr/functions/math/Abs.java new file mode 100644 index 000000000..c661cf544 --- /dev/null +++ b/main/src/com/google/refine/expr/functions/math/Abs.java @@ -0,0 +1,63 @@ +/* + +Copyright 2010, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +package com.google.refine.expr.functions.math; + +import java.util.Properties; + +import org.json.JSONException; +import org.json.JSONWriter; + +import com.google.refine.expr.EvalError; +import com.google.refine.grel.ControlFunctionRegistry; +import com.google.refine.grel.Function; + +public class Abs implements Function { + + public Object call(Properties bindings, Object[] args) { + if (args.length == 1 && args[0] != null && args[0] instanceof Number) { + return Math.abs(((Number) args[0]).doubleValue()); + } + return new EvalError(ControlFunctionRegistry.getFunctionName(this) + " expects a number"); + } + + public void write(JSONWriter writer, Properties options) + throws JSONException { + + writer.object(); + writer.key("description"); writer.value("Returns the absolute value of a number"); + writer.key("params"); writer.value("number d"); + writer.key("returns"); writer.value("number"); + writer.endObject(); + } +} diff --git a/main/src/com/google/refine/grel/ControlFunctionRegistry.java b/main/src/com/google/refine/grel/ControlFunctionRegistry.java index 3a1945d8e..f137310a1 100644 --- a/main/src/com/google/refine/grel/ControlFunctionRegistry.java +++ b/main/src/com/google/refine/grel/ControlFunctionRegistry.java @@ -59,6 +59,7 @@ import com.google.refine.expr.functions.booleans.Or; import com.google.refine.expr.functions.date.DatePart; import com.google.refine.expr.functions.date.Inc; import com.google.refine.expr.functions.date.Now; +import com.google.refine.expr.functions.math.Abs; import com.google.refine.expr.functions.math.Ceil; import com.google.refine.expr.functions.math.Exp; import com.google.refine.expr.functions.math.Floor; @@ -214,6 +215,7 @@ public class ControlFunctionRegistry { registerFunction("round", new Round()); registerFunction("floor", new Floor()); registerFunction("ceil", new Ceil()); + registerFunction("abs", new Abs()); registerFunction("mod", new Mod()); registerFunction("max", new Max()); registerFunction("min", new Min());