Exemple #1
0
  /** 将Avg函数展开为sum/count */
  private void expendAvgFunction(IDataNodeExecutor sub) {
    if (sub instanceof IQuery || sub instanceof IJoin) {
      List<ISelectable> add = new ArrayList();
      List<ISelectable> remove = new ArrayList();
      for (Object sel : ((IQueryTree) sub).getColumns()) {
        ISelectable s = (ISelectable) sel;
        if (s instanceof IFunction) {
          if (s.getColumnName().startsWith("AVG(")) {
            IFunction sum = (IFunction) s.copy();
            sum.setExtraFunction(null);
            sum.setFunctionName("SUM");
            sum.setColumnName(s.getColumnName().replace("AVG(", "SUM("));
            if (sum.getAlias() != null) {
              sum.setAlias(sum.getAlias() + "1"); // 加个后缀1
            }

            IFunction count = (IFunction) s.copy();
            count.setExtraFunction(null);
            count.setFunctionName("COUNT");
            count.setColumnName(s.getColumnName().replace("AVG(", "COUNT("));
            if (count.getAlias() != null) {
              count.setAlias(count.getAlias() + "2"); // 加个后缀2
            }

            add.add(count);
            add.add(sum);

            remove.add(s);
          } else {
            // 删除底下AVG的相关函数,比如 1 + AVG(ID)
            // 目前这个只能上层来进行计算
            // 可能的风险:还未支持的Function计算
            if (FunctionType.Scalar.equals(((IFunction) s).getFunctionType())
                && hasArgsAvgFunction((IFunction) s)) {
              remove.add(s);
            }
          }
        }
      }

      if (!remove.isEmpty()) {
        ((IQueryTree) sub).getColumns().removeAll(remove);
        ((IQueryTree) sub).getColumns().addAll(add);
      }
    }
  }