package tundra.list;
// -----( IS Java Code Template v1.2
// -----( CREATED: 2017-05-10 11:10:38.647
// -----( ON-HOST: -
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.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import permafrost.tundra.data.IDataHelper;
import permafrost.tundra.data.IDataMap;
import permafrost.tundra.flow.ConditionEvaluator;
import permafrost.tundra.lang.ArraySplitter;
import permafrost.tundra.lang.ArrayHelper;
import permafrost.tundra.lang.BooleanHelper;
import permafrost.tundra.lang.ClassHelper;
import permafrost.tundra.lang.ExceptionHelper;
import permafrost.tundra.lang.Sanitization;
import permafrost.tundra.math.IntegerHelper;
import permafrost.tundra.server.ServiceHelper;
// --- <<IS-END-IMPORTS>> ---
public final class object
{
// ---( internal utility methods )---
final static object _instance = new object();
static object _newInstance() { return new object(); }
static object _cast(Object o) { return (object)o; }
// ---( server methods )---
public static final void append (IData pipeline)
throws ServiceException
{
// --- <<IS-START(append)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [i] field:0:optional $class
// [o] object:1:required $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
append(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void coalesce (IData pipeline)
throws ServiceException
{
// --- <<IS-START(coalesce)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $default
// [i] field:0:optional $mode {"missing","null"}
// [o] object:0:optional $item
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
Object defaultValue = IDataHelper.get(cursor, "$default");
String mode = IDataHelper.get(cursor, "$mode", String.class);
Object result = ArrayHelper.coalesce(list, defaultValue);
if (result != null || (mode != null && mode.equals("null"))) IDataHelper.put(cursor, "$item", result);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void compact (IData pipeline)
throws ServiceException
{
// --- <<IS-START(compact)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null && list.length > 0) IDataHelper.put(cursor, "$list", ArrayHelper.compact(list));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void concatenate (IData pipeline)
throws ServiceException
{
// --- <<IS-START(concatenate)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $class
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
concatenate(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void difference (IData pipeline)
throws ServiceException
{
// --- <<IS-START(difference)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list.x
// [i] object:1:optional $list.y
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] listX = IDataHelper.get(cursor, "$list.x", Object[].class);
Object[] listY = IDataHelper.get(cursor, "$list.y", Object[].class);
if (listX != null) IDataHelper.put(cursor, "$list", ArrayHelper.difference(listX, listY));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void drop (IData pipeline)
throws ServiceException
{
// --- <<IS-START(drop)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:required $index
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
int index = IDataHelper.get(cursor, "$index", Integer.class);
if (list != null && list.length > 0) IDataHelper.put(cursor, "$list", ArrayHelper.drop(list, index));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void each (IData pipeline)
throws ServiceException
{
// --- <<IS-START(each)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $service
// [i] record:0:optional $pipeline
// [i] field:0:optional $item.input
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
String service = IDataHelper.get(cursor, "$service", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
String input = IDataHelper.get(cursor, "$item.input", String.class);
boolean scoped = scope != null;
// invoke the service for each item in the list, passing
// $item and $index variables on each invocation
each(list, service, scoped ? scope : pipeline, input);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void equal (IData pipeline)
throws ServiceException
{
// --- <<IS-START(equal)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $class
// [o] field:0:required $equal?
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
equal(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void filter (IData pipeline)
throws ServiceException
{
// --- <<IS-START(filter)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $condition
// [i] record:0:optional $scope
// [o] object:1:optional $list
// [o] field:0:required $list.length
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
String condition = IDataHelper.get(cursor, "$condition", String.class);
IData scope = IDataHelper.get(cursor, "$scope", IData.class);
Object[] filteredList = filter(list, condition, scope == null? pipeline : scope);
IDataHelper.put(cursor, "$list", filteredList, false);
IDataHelper.put(cursor, "$list.length", filteredList == null ? 0 : filteredList.length, String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void first (IData pipeline)
throws ServiceException
{
// --- <<IS-START(first)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:0:optional $item
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null && list.length > 0) IDataHelper.put(cursor, "$item", ArrayHelper.get(list, 0));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void get (IData pipeline)
throws ServiceException
{
// --- <<IS-START(get)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $index
// [i] field:0:optional $iteration
// [o] object:0:optional $item
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
int index = IDataHelper.getOrDefault(cursor, "$index", Integer.class, IDataHelper.getOrDefault(cursor, "$iteration", Integer.class, 1) - 1);
if (list != null && list.length > 0) IDataHelper.put(cursor, "$item", ArrayHelper.get(list, index));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void grow (IData pipeline)
throws ServiceException
{
// --- <<IS-START(grow)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [i] field:0:required $count
// [i] field:0:optional $class
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
grow(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void include (IData pipeline)
throws ServiceException
{
// --- <<IS-START(include)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [o] field:0:required $include?
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
Object item = IDataHelper.get(cursor, "$item");
IDataHelper.put(cursor, "$include?", ArrayHelper.include(list, item), String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void index (IData pipeline)
throws ServiceException
{
// --- <<IS-START(index)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $index.start
// [i] field:0:optional $index.step
// [o] field:1:optional $indexes
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
int indexStart = IDataHelper.getOrDefault(cursor, "$index.start", Integer.class, 0);
int indexStep = IDataHelper.getOrDefault(cursor, "$index.step", Integer.class, 1);
if (list != null) IDataUtil.put(cursor, "$indexes", ArrayHelper.index(list, indexStart, indexStep));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void insert (IData pipeline)
throws ServiceException
{
// --- <<IS-START(insert)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [i] field:0:required $index
// [i] field:0:optional $class
// [o] object:1:required $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
insert(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void instance (IData pipeline)
throws ServiceException
{
// --- <<IS-START(instance)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $class
// [o] field:0:optional $instance?
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
Class klass = IDataHelper.get(cursor, "$class", Class.class);
IDataHelper.put(cursor, "$instance?", tundra.object.instance(list, klass), String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void intersection (IData pipeline)
throws ServiceException
{
// --- <<IS-START(intersection)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] record:0:optional $operands
// [i] field:0:optional $class
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
intersection(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void join (IData pipeline)
throws ServiceException
{
// --- <<IS-START(join)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $separator
// [i] field:0:optional $default
// [i] field:0:optional $sanitization {"remove nulls","remove nulls and blanks"}
// [o] field:0:optional $result
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
String separatorCharacter = IDataHelper.get(cursor, "$separator", String.class);
String defaultCharacter = IDataHelper.get(cursor, "$default", String.class);
Sanitization sanitization = IDataHelper.get(cursor, "$sanitization", Sanitization.class);
IDataHelper.put(cursor, "$result", ArrayHelper.join(list, separatorCharacter, defaultCharacter, sanitization), false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void last (IData pipeline)
throws ServiceException
{
// --- <<IS-START(last)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:0:optional $item
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null && list.length > 0) IDataHelper.put(cursor, "$item", ArrayHelper.get(list, -1));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void length (IData pipeline)
throws ServiceException
{
// --- <<IS-START(length)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] field:0:required $length
IDataCursor cursor = pipeline.getCursor();
try {
Object[] array = IDataHelper.get(cursor, "$list", Object[].class);
IDataHelper.put(cursor, "$length", ArrayHelper.length(array), String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void map (IData pipeline)
throws ServiceException
{
// --- <<IS-START(map)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $service
// [i] record:0:optional $pipeline
// [i] field:0:optional $item.input
// [i] field:0:optional $item.output
// [o] object:1:optional $list
map(pipeline, Object.class);
// --- <<IS-END>> ---
}
public static final void prepend (IData pipeline)
throws ServiceException
{
// --- <<IS-START(prepend)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [i] field:0:optional $class
// [o] object:1:required $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
prepend(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void put (IData pipeline)
throws ServiceException
{
// --- <<IS-START(put)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [i] field:0:required $index
// [i] field:0:optional $class
// [o] object:1:required $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
put(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void reject (IData pipeline)
throws ServiceException
{
// --- <<IS-START(reject)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $condition
// [i] record:0:optional $scope
// [o] object:1:optional $list
// [o] field:0:required $list.length
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
String condition = IDataHelper.get(cursor, "$condition", String.class);
IData scope = IDataHelper.get(cursor, "$scope", IData.class);
Object[] rejectedList = reject(list, condition, scope == null? pipeline : scope);
IDataHelper.put(cursor, "$list", rejectedList, false);
IDataHelper.put(cursor, "$list.length", rejectedList == null ? 0 : rejectedList.length, String.class);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void resize (IData pipeline)
throws ServiceException
{
// --- <<IS-START(resize)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] object:0:optional $item
// [i] field:0:required $length
// [i] field:0:optional $class
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Class klass = IDataHelper.get(cursor, "$class", Class.class);
resize(pipeline, klass == null ? Object.class : klass);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void reverse (IData pipeline)
throws ServiceException
{
// --- <<IS-START(reverse)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null) IDataHelper.put(cursor, "$list", ArrayHelper.reverse(list));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void shrink (IData pipeline)
throws ServiceException
{
// --- <<IS-START(shrink)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:required $count
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
int count = IDataHelper.get(cursor, "$count", Integer.class);
list = ArrayHelper.shrink(list, count);
IDataHelper.put(cursor, "$list", list, false);
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void slice (IData pipeline)
throws ServiceException
{
// --- <<IS-START(slice)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:optional $index
// [i] field:0:optional $length
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null) {
int index = IDataHelper.getOrDefault(cursor, "$index", Integer.class, 0);
int length = IDataHelper.getOrDefault(cursor, "$length", Integer.class, list.length);
IDataHelper.put(cursor, "$list", ArrayHelper.slice(list, index, length));
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void sort (IData pipeline)
throws ServiceException
{
// --- <<IS-START(sort)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null) IDataHelper.put(cursor, "$list", ArrayHelper.sort(list));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void squeeze (IData pipeline)
throws ServiceException
{
// --- <<IS-START(squeeze)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null) IDataHelper.put(cursor, "$list", ArrayHelper.squeeze(list));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void take (IData pipeline)
throws ServiceException
{
// --- <<IS-START(take)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [i] field:0:required $count
// [o] object:1:optional $head
// [o] object:1:optional $tail
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
int count = IDataHelper.get(cursor, "$count", Integer.class);
if (list != null) {
ArraySplitter splitter = new ArraySplitter(list, count);
IDataHelper.put(cursor, "$head", splitter.getHead());
IDataHelper.put(cursor, "$tail", splitter.getTail());
}
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
public static final void unique (IData pipeline)
throws ServiceException
{
// --- <<IS-START(unique)>> ---
// @subtype unknown
// @sigtype java 3.5
// [i] object:1:optional $list
// [o] object:1:optional $list
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
if (list != null) IDataHelper.put(cursor, "$list", ArrayHelper.unique(list));
} finally {
cursor.destroy();
}
// --- <<IS-END>> ---
}
// --- <<IS-START-SHARED>> ---
/**
* Returns a new array, with the given element inserted at the end.
*
* @param pipeline The pipeline containing the array and item to be inserted.
* @param klass The class of the item being appended.
* @param <T> The class of the item being appended.
*/
public static <T> void append(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
T[] list = (T[])IDataUtil.getObjectArray(cursor, "$list");
T item = (T)IDataUtil.get(cursor, "$item");
list = ArrayHelper.append(list, item, klass, false);
if (list != null) IDataUtil.put(cursor, "$list", list);
} finally {
cursor.destroy();
}
}
/**
* Returns a new array that is the concatenation of the given arrays.
*
* @param pipeline The pipeline containing the arrays to be concatenated.
* @param klass The component class of the arrays.
* @param <T> The component class of the arrays.
*/
public static <T> void concatenate(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataUtil.getIData(cursor, "$operands");
// support $list.x and $list.y inputs for backwards-compatibility
if (operands == null) {
Object[] listX = IDataUtil.getObjectArray(cursor, "$list.x");
Object[] listY = IDataUtil.getObjectArray(cursor, "$list.y");
IDataMap map = new IDataMap();
if (listX != null) map.put("$list.x", listX);
if (listY != null) map.put("$list.y", listY);
operands = map;
}
if (IDataHelper.size(operands) > 0) IDataUtil.put(cursor, "$list", ArrayHelper.concatenate(operands, klass));
} finally {
cursor.destroy();
}
}
/**
* Invokes the given service for each element in the array.
*
* @param array The array to iterate over.
* @param service The service to invoke for each item in the array.
* @param pipeline The input pipeline used when invoking the service.
* @param input The variable name used for the item in the input pipeline.
* @param <T> The array component class.
* @throws ServiceException If an error invoking the service occurs.
*/
public static <T> void each(T[] array, String service, IData pipeline, String input) throws ServiceException {
map(array, service, pipeline, input, null);
}
/**
* Returns whether the given arrays are considered equal.
*
* @param pipeline The pipeline containing the arrays to be compared.
* @param klass The component class of the arrays.
* @param <T> The component class of the arrays.
*/
public static <T> void equal(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataUtil.getIData(cursor, "$operands");
// support $list.x and $list.y inputs for backwards-compatibility
if (operands == null) {
Object[] listX = IDataUtil.getObjectArray(cursor, "$list.x");
Object[] listY = IDataUtil.getObjectArray(cursor, "$list.y");
IDataMap map = new IDataMap();
if (listX != null) map.put("$list.x", listX);
if (listY != null) map.put("$list.y", listY);
operands = map;
}
IDataUtil.put(cursor, "$equal?", BooleanHelper.emit(ArrayHelper.equal(operands, klass)));
} finally {
cursor.destroy();
}
}
/**
* Filters the given list to only include items where the given condition evaluates to true.
*
* @param array The array to be filtered.
* @param condition The filter condition.
* @param pipeline The pipeline against which the condition is evaluated.
* @param <T> The array component class.
* @return A new array containing only the items from the given array where the condition was true.
* @throws ServiceException If an error occurs evaluating the condition.
*/
public static <T> T[] filter(T[] array, String condition, IData pipeline) throws ServiceException {
if (array == null || array.length == 0 || condition == null || condition.equals("")) return array;
if (pipeline == null) pipeline = IDataFactory.create();
List<T> list = new ArrayList<T>(array.length);
for (int i = 0; i < array.length; i++) {
IDataCursor cursor = pipeline.getCursor();
IDataUtil.put(cursor, "$item", array[i]);
if (ConditionEvaluator.evaluate(condition, pipeline)) list.add(array[i]);
IDataUtil.remove(cursor, "$item");
cursor.destroy();
}
return list.toArray(Arrays.copyOf(array, list.size()));
}
/**
* Grows the given array to the desired length, and pads with the given item.
*
* @param pipeline The pipeline containing $list, $count, and $item variables.
* @param klass The array component class.
* @param <T> The array component class.
*/
public static <T> void grow(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
T[] list = (T[])IDataHelper.get(cursor, "$list", Object[].class);
int count = IDataHelper.getOrDefault(cursor, "$count", Integer.class, 0);
T item = IDataHelper.get(cursor, "$item", klass);
list = ArrayHelper.grow(list, count, item, klass);
IDataHelper.put(cursor, "$list", list, false);
} finally {
cursor.destroy();
}
}
/**
* Returns a new array, with the given element inserted at the given index.
*
* @param pipeline The pipeline containing the $list, $item, $index variables.
* @param klass The array component class.
* @param <T> The array component class.
*/
public static <T> void insert(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
T[] list = (T[])IDataHelper.get(cursor, "$list", Object[].class);
T item = IDataHelper.get(cursor, "$item", klass);
int index = IDataHelper.getOrDefault(cursor, "$index", Integer.class, 0);
IDataHelper.put(cursor, "$list", ArrayHelper.insert(list, item, index, klass, false));
} finally {
cursor.destroy();
}
}
/**
* Returns a new array which is the set intersection of the given arrays.
*
* @param pipeline The pipeline containing the arrays to be intersected.
* @param klass The array component class.
* @param <T> The array component class.
*/
public static <T> void intersection(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
IData operands = IDataHelper.get(cursor, "$operands", IData.class);
// support $list.x and $list.y inputs for backwards-compatibility
if (operands == null) {
Object[] listX = IDataHelper.get(cursor, "$list.x", Object[].class);
Object[] listY = IDataHelper.get(cursor, "$list.y", Object[].class);
IDataMap map = new IDataMap();
if (listX != null) map.put("$list.x", listX);
if (listY != null) map.put("$list.y", listY);
operands = map;
}
if (IDataHelper.size(operands) > 0) IDataHelper.put(cursor, "$list", ArrayHelper.intersect(operands, klass));
} finally {
cursor.destroy();
}
}
/**
* Maps the given array to a new array by invoking a service for each element and collecting the output.
*
* @param pipeline The pipeline containing the $list, $service, $pipeline, $item.input, and $item.output variables.
* @param klass The array component class.
* @param <T> The array component class.
* @throws ServiceException If an error occurs invoking the service.
*/
public static <T> void map(IData pipeline, Class<T> klass) throws ServiceException {
IDataCursor cursor = pipeline.getCursor();
try {
Object[] list = IDataHelper.get(cursor, "$list", Object[].class);
String service = IDataHelper.get(cursor, "$service", String.class);
IData scope = IDataHelper.get(cursor, "$pipeline", IData.class);
String input = IDataHelper.get(cursor, "$item.input", String.class);
String output = IDataHelper.get(cursor, "$item.output", String.class);
boolean scoped = scope != null;
// invoke the service for each item in the list, passing $item and $index variables on each invocation
// and collect the returned $item's into a new list
list = map(list == null ? null : Arrays.copyOf(list, list.length, (Class<T[]>)Array.newInstance(klass, 0).getClass()), service, scoped ? scope : pipeline, input, output);
IDataHelper.put(cursor, "$list", list, false);
} finally {
cursor.destroy();
}
}
/**
* Maps the given array to a new array by invoking a service for each element and collecting the output.
*
* @param array The array to be iterated over.
* @param service The service to be invoked for each item in the array.
* @param pipeline The input pipeline used when invoking the array.
* @param input The variable name used when passing the array item in the input pipeline.
* @param output The variable name of the mapped item returned by the invoked service.
* @param <T> The array component class.
* @return A new array containing each item from the given array after being transformed by the given service.
* @throws ServiceException If an error occurs invoking the service.
*/
public static <T> T[] map(T[] array, String service, IData pipeline, String input, String output) throws ServiceException {
if (array == null || array.length == 0 || service == null) return array;
if (pipeline == null) pipeline = IDataFactory.create();
if (input == null) input = "$item";
if (output == null) output = input;
List<T> list = new ArrayList<T>(array.length);
IDataCursor cursor = null;
for (int i = 0; i < array.length; i++) {
// add $item, $index, $iteration and $length variables to the input pipeline
cursor = pipeline.getCursor();
IDataHelper.put(cursor, input, array[i]);
IDataHelper.put(cursor, "$index", i, String.class);
IDataHelper.put(cursor, "$iteration", i + 1, String.class);
IDataHelper.put(cursor, "$length", array.length, String.class);
cursor.destroy();
// invoke the iterator service
pipeline = ServiceHelper.invoke(service, pipeline);
// clean up the input pipeline
cursor = pipeline.getCursor();
T item = (T)IDataHelper.get(cursor, output);
IDataHelper.remove(cursor, input);
IDataHelper.remove(cursor, output);
IDataHelper.remove(cursor, "$index");
IDataHelper.remove(cursor, "$iteration");
IDataHelper.remove(cursor, "$length");
cursor.destroy();
// collect the mapped items
list.add(item);
}
return list.toArray(Arrays.copyOf(array, list.size()));
}
/**
* Returns a new array, with the given element inserted at the beginning.
*
* @param pipeline The pipeline containing the $list and $item variables.
* @param klass The array component class.
* @param <T> The array component class.
*/
public static <T> void prepend(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
T[] list = (T[])IDataHelper.get(cursor, "$list", Object[].class);
T item = IDataHelper.get(cursor, "$item", klass);
list = ArrayHelper.prepend(list, item, klass, false);
IDataHelper.put(cursor, "$list", list, false);
} finally {
cursor.destroy();
}
}
/**
* Sets the element from the given array at the given index (supports ruby-style reverse indexing).
*
* @param pipeline The pipeline containing the $list, $item, and $index variables.
* @param klass The array component class.
* @param <T> The array component class.
*/
public static <T> void put(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
T[] list = (T[])IDataHelper.get(cursor, "$list", Object[].class);
T item = IDataHelper.get(cursor, "$item", klass);
int index = IDataHelper.getOrDefault(cursor, "$index", Integer.class, 1);
IDataHelper.put(cursor, "$list", ArrayHelper.put(list == null ? null : Arrays.copyOf(list, list.length, (Class<T[]>)Array.newInstance(klass, 0).getClass()), item, index, klass));
} finally {
cursor.destroy();
}
}
/**
* Filters the given list to not include items where the given condition evaluates to true.
*
* @param array The array to be filtered.
* @param condition The filter condition.
* @param pipeline The pipeline against which the condition is evaluated.
* @param <T> The array component class.
* @return A new array containing only the items from the given array where the condition was false.
* @throws ServiceException If an error occurs evaluating the condition.
*/
public static <T> T[] reject(T[] array, String condition, IData pipeline) throws ServiceException {
if (array == null || array.length == 0 || condition == null || condition.equals("")) return array;
if (pipeline == null) pipeline = IDataFactory.create();
List<T> list = new ArrayList<T>(array.length);
for (int i = 0; i < array.length; i++) {
IDataCursor cursor = pipeline.getCursor();
IDataHelper.put(cursor, "$item", array[i]);
if (!ConditionEvaluator.evaluate(condition, pipeline)) list.add(array[i]);
IDataHelper.remove(cursor, "$item");
cursor.destroy();
}
return list.toArray(Arrays.copyOf(array, list.size()));
}
/**
* Resizes the given array to the desired length, and pads with the given item.
*
* @param pipeline The pipeline containing $list, $length, and $item variables.
* @param klass The array component class.
* @param <T> The array component class.
*/
public static <T> void resize(IData pipeline, Class<T> klass) {
IDataCursor cursor = pipeline.getCursor();
try {
T[] list = (T[])IDataHelper.get(cursor, "$list", Object[].class);
int length = IDataHelper.getOrDefault(cursor, "$length", Integer.class, 0);
T item = IDataHelper.get(cursor, "$item", klass);
list = ArrayHelper.resize(list, length, item, klass);
IDataHelper.put(cursor, "$list", list, false);
} finally {
cursor.destroy();
}
}
// --- <<IS-END-SHARED>> ---
}