package net.ion.craken.node.convert.rows.function;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.ion.craken.node.ReadNode;
import net.ion.craken.node.convert.rows.ColumnParser;
import net.ion.craken.node.convert.rows.IColumn;
import net.ion.framework.util.ListUtil;
import net.ion.framework.util.ObjectUtil;
import org.apache.commons.lang.ArrayUtils;
public class DecodeFunction extends SingleColumn {
private List<IColumn> columns = ListUtil.newList();
private String label;
public DecodeFunction(ColumnParser cparser, String[] cols, String label) {
for (int i = 0; i < cols.length; i++) {
columns.add(cparser.parse(cols[i].trim()));
}
this.label = label;
}
public String getLabel() {
return label;
}
public Object getValue(ReadNode node) {
return recursiveDecode(node, columns.toArray(new IColumn[0])) ;
}
private Object recursiveDecode(ReadNode node, IColumn[] args){
if (args.length < 3) throw new IllegalArgumentException("not permitted") ;
if (args.length == 3) return ObjectUtil.equals(args[0].getValue(node), args[1].getValue(node)) ? args[2].getValue(node) : null ;
if (args.length == 4) return ObjectUtil.equals(args[0].getValue(node), args[1].getValue(node)) ? args[2].getValue(node) : args[3].getValue(node);
else {
if (ObjectUtil.equals(args[0].getValue(node), args[1].getValue(node))) {
return args[2].getValue(node) ;
} else {
List<IColumn> newList = new ArrayList(Arrays.asList(ArrayUtils.subarray(args, 3, args.length)));
newList.add(0, args[0]) ;
return recursiveDecode(node, newList.toArray(new IColumn[0])) ;
}
}
}
}