package tundra;
// -----( IS Java Code Template v1.2
// -----( CREATED: 2017-05-08 17:34:21 EST
// -----( ON-HOST: 192.168.66.129
import com.wm.data.*;
import com.wm.util.Values;
import com.wm.app.b2b.server.Service;
import com.wm.app.b2b.server.ServiceException;
// --- <<IS-START-IMPORTS>> ---
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import permafrost.tundra.data.IDataHelper;
import permafrost.tundra.data.IDataMap;
import permafrost.tundra.lang.BooleanHelper;
import permafrost.tundra.lang.ExceptionHelper;
import permafrost.tundra.math.BigDecimalHelper;
import permafrost.tundra.math.BigIntegerHelper;
import permafrost.tundra.math.PrecisionHelper;
// --- <<IS-END-IMPORTS>> ---
public final class decimal
{
// ---( internal utility methods )---
final static decimal _instance = new decimal();
static decimal _newInstance() { return new decimal(); }
static decimal _cast(Object o) { return (decimal)o; }
// ---( server methods )---
public static final void absolute (IData pipeline)
throws ServiceException
{
// --- <<IS-START(absolute)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $decimal
// [o] field:0:optional $decimal
IDataCursor cursor = pipeline.getCursor();
try {
BigDecimal decimal = IDataHelper.get(cursor, "$decimal", BigDecimal.class);
BigDecimal result = BigDecimalHelper.absolute(decimal);
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void add (IData pipeline)
throws ServiceException
{
// --- <<IS-START(add)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $result
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataHelper.get(cursor, "$operands", IData.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimals and $decimal inputs for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (operands == null) {
String[] list = IDataHelper.get(cursor, "$decimals", String[].class);
String decimal = IDataHelper.get(cursor, "$decimal", String.class);
IDataMap map = new IDataMap();
if (list != null) map.put("$decimals", list);
if (decimal != null) map.put("$decimal", decimal);
operands = map;
backwardsCompatiblityRequired = true;
}
BigDecimal[] decimals = BigDecimalHelper.normalize(IDataHelper.getLeafValues(operands));
BigDecimal result = BigDecimalHelper.round(BigDecimalHelper.add(decimals), precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$result", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void average (IData pipeline)
throws ServiceException
{
// --- <<IS-START(average)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $average
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataHelper.get(cursor, "$operands", IData.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimals input for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (operands == null) {
String[] list = IDataHelper.get(cursor, "$decimals", String[].class);
IDataMap map = new IDataMap();
if (list != null) map.put("$decimals", list);
operands = map;
backwardsCompatiblityRequired = true;
}
BigDecimal result = BigDecimalHelper.average(precision, rounding, BigDecimalHelper.normalize(IDataHelper.getLeafValues(operands)));
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$average", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void divide (IData pipeline)
throws ServiceException
{
// --- <<IS-START(divide)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $dividend
// [i] field:0:optional $divisor
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $result
IDataCursor cursor = pipeline.getCursor();
try {
BigDecimal dividend = IDataHelper.get(cursor, "$dividend", BigDecimal.class);
BigDecimal divisor = IDataHelper.get(cursor, "$divisor", BigDecimal.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimal.x and $decimal.y inputs for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (dividend == null && divisor == null) {
dividend = IDataHelper.get(cursor, "$decimal.x", BigDecimal.class);
divisor = IDataHelper.get(cursor, "$decimal.y", BigDecimal.class);
backwardsCompatiblityRequired = true;
}
BigDecimal result = BigDecimalHelper.divide(dividend, divisor, precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$result", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void emit (IData pipeline)
throws ServiceException
{
// --- <<IS-START(emit)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:0:optional $object
// [i] field:0:optional $pattern
// [o] field:0:optional $string
IDataCursor cursor = pipeline.getCursor();
try {
Object object = IDataHelper.get(cursor, "$object");
String pattern = IDataHelper.get(cursor, "$pattern", String.class);
IDataHelper.put(cursor, "$string", BigDecimalHelper.emit(BigDecimalHelper.normalize(object), pattern), false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void format (IData pipeline)
throws ServiceException
{
// --- <<IS-START(format)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $decimal
// [i] field:0:optional $pattern.input
// [i] field:1:optional $patterns.input
// [i] field:0:optional $pattern.output
// [o] field:0:optional $decimal
IDataCursor cursor = pipeline.getCursor();
try {
String string = IDataHelper.get(cursor, "$decimal", String.class);
String inPattern = IDataHelper.get(cursor, "$pattern.input", String.class);
String[] inPatterns = IDataHelper.get(cursor, "$patterns.input", String[].class);
String outPattern = IDataHelper.get(cursor, "$pattern.output", String.class);
String result;
if (inPatterns == null) {
result = BigDecimalHelper.format(string, inPattern, outPattern);
} else {
result = BigDecimalHelper.format(string, inPatterns, outPattern);
}
IDataHelper.put(cursor, "$decimal", result, false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void maximum (IData pipeline)
throws ServiceException
{
// --- <<IS-START(maximum)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $maximum
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataHelper.get(cursor, "$operands", IData.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimals input for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (operands == null) {
String[] list = IDataHelper.get(cursor, "$decimals", String[].class);
IDataMap map = new IDataMap();
if (list != null) map.put("$decimals", list);
operands = map;
backwardsCompatiblityRequired = true;
}
BigDecimal[] decimals = BigDecimalHelper.normalize(IDataHelper.getLeafValues(operands));
BigDecimal result = BigDecimalHelper.round(BigDecimalHelper.maximum(decimals), precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$maximum", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void minimum (IData pipeline)
throws ServiceException
{
// --- <<IS-START(minimum)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $minimum
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataHelper.get(cursor, "$operands", IData.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimals input for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (operands == null) {
String[] list = IDataHelper.get(cursor, "$decimals", String[].class);
IDataMap map = new IDataMap();
if (list != null) map.put("$decimals", list);
operands = map;
backwardsCompatiblityRequired = true;
}
BigDecimal[] decimals = BigDecimalHelper.normalize(IDataHelper.getLeafValues(operands));
BigDecimal result = BigDecimalHelper.round(BigDecimalHelper.minimum(decimals), precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$minimum", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void multiply (IData pipeline)
throws ServiceException
{
// --- <<IS-START(multiply)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $result
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataHelper.get(cursor, "$operands", IData.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimals and $decimal input for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (operands == null) {
String[] list = IDataHelper.get(cursor, "$decimals", String[].class);
String decimal = IDataHelper.get(cursor, "$decimal", String.class);
IDataMap map = new IDataMap();
if (list != null) map.put("$decimals", list);
if (decimal != null) map.put("$decimal", decimal);
operands = map;
backwardsCompatiblityRequired = true;
}
BigDecimal[] decimals = BigDecimalHelper.normalize(IDataHelper.getLeafValues(operands));
BigDecimal result = BigDecimalHelper.round(BigDecimalHelper.multiply(decimals), precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$result", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void negate (IData pipeline)
throws ServiceException
{
// --- <<IS-START(negate)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $decimal
// [o] field:0:optional $decimal
IDataCursor cursor = pipeline.getCursor();
try {
BigDecimal decimal = IDataHelper.get(cursor, "$decimal", BigDecimal.class);
BigDecimal result = BigDecimalHelper.negate(decimal);
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void parse (IData pipeline)
throws ServiceException
{
// --- <<IS-START(parse)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $string
// [i] field:0:optional $pattern
// [i] field:1:optional $patterns
// [i] field:0:optional $class {"java.math.BigDecimal","java.math.BigInteger","java.lang.Double","java.lang.Float","java.lang.Long","java.lang.Integer","java.lang.Short","java.lang.Byte"}
// [o] object:0:optional $object
IDataCursor cursor = pipeline.getCursor();
try {
String string = IDataHelper.get(cursor, "$string", String.class);
String pattern = IDataHelper.get(cursor, "$pattern", String.class);
String[] patterns = IDataHelper.get(cursor, "$patterns", String[].class);
Class klass = IDataHelper.get(cursor, "$class", Class.class);
BigDecimal decimal = null;
if (patterns == null) {
decimal = BigDecimalHelper.parse(string, pattern);
} else {
decimal = BigDecimalHelper.parse(string, patterns);
}
if (decimal != null) {
Object object = null;
if (klass == null || klass.equals(BigDecimal.class)) {
object = decimal;
} else if (klass.equals(BigInteger.class)) {
object = decimal.toBigInteger();
} else if (klass.equals(Double.class)) {
object = decimal.doubleValue();
} else if (klass.equals(Float.class)) {
object = decimal.floatValue();
} else if (klass.equals(Long.class)) {
object = decimal.longValue();
} else if (klass.equals(Integer.class)) {
object = decimal.intValue();
} else if (klass.equals(Short.class)) {
object = decimal.shortValue();
} else if (klass.equals(Byte.class)) {
object = decimal.byteValue();
}
IDataHelper.put(cursor, "$object", object, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void power (IData pipeline)
throws ServiceException
{
// --- <<IS-START(power)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $base
// [i] field:0:optional $exponent
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $result
IDataCursor cursor = pipeline.getCursor();
try {
BigDecimal base = IDataHelper.get(cursor, "$base", BigDecimal.class);
int exponent = IDataHelper.getOrDefault(cursor, "$exponent", Integer.class, 1);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimal input for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (base == null) {
base = IDataHelper.get(cursor, "$decimal", BigDecimal.class);
backwardsCompatiblityRequired = true;
}
BigDecimal result = BigDecimalHelper.round(BigDecimalHelper.power(base, exponent), precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$result", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void round (IData pipeline)
throws ServiceException
{
// --- <<IS-START(round)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $decimal
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $decimal
IDataCursor cursor = pipeline.getCursor();
try {
BigDecimal decimal = IDataHelper.get(cursor, "$decimal", BigDecimal.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
BigDecimal result = BigDecimalHelper.round(decimal, precision, rounding);
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void subtract (IData pipeline)
throws ServiceException
{
// --- <<IS-START(subtract)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $minuend
// [i] field:0:optional $subtrahend
// [i] field:0:optional $precision
// [i] field:0:optional $rounding {"HALF_UP","CEILING","DOWN","FLOOR","HALF_DOWN","HALF_EVEN","UNNECESSARY","UP"}
// [o] field:0:optional $result
IDataCursor cursor = pipeline.getCursor();
try {
BigDecimal minuend = IDataHelper.get(cursor, "$minuend", BigDecimal.class);
BigDecimal subtrahend = IDataHelper.get(cursor, "$subtrahend", BigDecimal.class);
int precision = IDataHelper.getOrDefault(cursor, "$precision", Integer.class, -1);
RoundingMode rounding = IDataHelper.get(cursor, "$rounding", RoundingMode.class);
// support $decimal.x and $decimal.y inputs for backwards-compatibility
boolean backwardsCompatiblityRequired = false;
if (minuend == null && subtrahend == null) {
minuend = IDataHelper.get(cursor, "$decimal.x", BigDecimal.class);
subtrahend = IDataHelper.get(cursor, "$decimal.y", BigDecimal.class);
backwardsCompatiblityRequired = true;
}
BigDecimal result = BigDecimalHelper.round(BigDecimalHelper.subtract(minuend, subtrahend), precision, rounding);
if (backwardsCompatiblityRequired) {
IDataHelper.put(cursor, "$decimal", result, String.class, false);
} else {
IDataHelper.put(cursor, "$result", result, String.class, false);
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void validate (IData pipeline)
throws ServiceException
{
// --- <<IS-START(validate)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] field:0:optional $decimal
// [i] field:0:optional $raise? {"false","true"}
// [o] field:0:required $valid?
IDataCursor cursor = pipeline.getCursor();
try {
String decimal = IDataHelper.get(cursor, "$decimal", String.class);
boolean raise = IDataHelper.getOrDefault(cursor, "$raise?", Boolean.class, false);
IDataHelper.put(cursor, "$valid?", BigDecimalHelper.validate(decimal, raise), String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
}