将 Logical_and 实现为 CombineFn

问题描述

我正在尝试将 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 (将#修改为@)