docs: public AbstractExpression replaceAVG () {
          if (getExpressionType() == ExpressionType.AGGREGATE_AVG) {
              AbstractExpression child = getLeft();
              AbstractExpression left =
                      new AggregateExpression(ExpressionType.AGGREGATE_SUM);
              left.setLeft(child.clone());
              AbstractExpression right =
                      new AggregateExpression(ExpressionType.AGGREGATE_COUNT);
              right.setLeft(child.clone());
  
              return new OperatorExpression(ExpressionType.OPERATOR_DIVIDE,
                      left, right);
          }
  
          AbstractExpression lnode = null;
          AbstractExpression rnode = null;
          if (m_left != null) {
              lnode = m_left.replaceAVG();
          }
          if (m_right != null) {
              rnode = m_right.replaceAVG();
          }
  
          ArrayList<AbstractExpression> newArgs = null;
          boolean changed = false;
          if (m_args != null) {
              newArgs = new ArrayList<>();
              for (AbstractExpression expr: m_args) {
                  AbstractExpression ex = expr.replaceAVG();
                  newArgs.add(ex);
                  if (ex != expr) {
                      changed = true;
                  }
              }
          }
          if (m_left != lnode || m_right != rnode || changed) {
              AbstractExpression resExpr = clone();
              resExpr.setLeft(lnode);
              resExpr.setRight(rnode);
              resExpr.setArgs(newArgs);
              return resExpr;
          }
  
          return this;
      }