问题描述
我正在尝试将 LOGICAL_AND 操作实现为 CombineFn。
/**
* Logical_And function implementation
*
* <p>Returns the logical AND of all non-NULL expressions. Returns NULL if there are zero input
* rows or expression evaluates to NULL for all rows.
*/
public static class LogicalAnd extends CombineFn<Boolean,LogicalAnd.Accum,Boolean> {
static class Accum {
/** Initially,input is empty */
boolean isEmpty = true;
/** true if any null value is seen in the input,null values are to be ignored */
boolean isNull = false;
/** logical_and operation result */
boolean logicalAnd = Boolean.parseBoolean(null);
}
@Override
public Accum createAccumulator() {
return new Accum();
}
@Override
public Accum addInput(Accum accum,Boolean input) {
if (input == null) {
accum.isNull = true;
//accum.isEmpty = false;
return accum;
}
accum.isEmpty = false;
accum.isNull = false;
accum.logicalAnd = accum.logicalAnd && input;
return accum;
}
@Override
public Accum mergeAccumulators(Iterable<Accum> accums) {
LogicalAnd.Accum merged = createAccumulator();
for (LogicalAnd.Accum accum : accums) {
//merged accum has isNull=true when all accums have isNull=true
if (StreamSupport.stream(accums.spliterator(),false).allMatch(a -> a.isNull)) {
merged.isNull = true;
return merged;
}
if (accum.isEmpty) {
continue;
}
merged.isEmpty = false;
merged.isNull = false;
merged.logicalAnd = merged.logicalAnd && accum.logicalAnd;
}
return merged;
}
@Override
public Boolean extractOutput(Accum accum) {
if (accum.isEmpty || accum.isNull) {
return null;
}
return accum.logicalAnd;
}
}
在我目前的实现中, [true,false] -> 有效
[true,true] -> 有效
[false,false] -> 有效
[null,null] -> 有效
[null,non-null(true or false)] -> 不起作用。
谁能帮我解决 [null,true] 或 [null,false] 的情况。
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)