package io.crate.operation.scalar.arithmetic;
import io.crate.data.Input;
import io.crate.metadata.FunctionIdent;
import io.crate.metadata.FunctionInfo;
import io.crate.metadata.Scalar;
import io.crate.types.DataType;
import java.util.Arrays;
import java.util.Set;
import java.util.function.BinaryOperator;
public final class BinaryScalar<T> extends Scalar<T, T> {
private final BinaryOperator<T> func;
private final FunctionInfo info;
private final DataType<T> type;
public BinaryScalar(BinaryOperator<T> func, String name, DataType<T> type, Set<FunctionInfo.Feature> feature) {
this.func = func;
this.info = new FunctionInfo(new FunctionIdent(name, Arrays.asList(type, type)), type, FunctionInfo.Type.SCALAR, feature);
this.type = type;
}
@Override
public FunctionInfo info() {
return info;
}
@Override
public T evaluate(Input<T>[] args) {
T arg0Value = type.value(args[0].value());
T arg1Value = type.value(args[1].value());
if (arg0Value == null) {
return null;
}
if (arg1Value == null) {
return null;
}
return func.apply(arg0Value, arg1Value);
}
}