code: @Override
    public DDF fillNA(String value, FillMethod method, long limit, AggregateFunction function,
        Map<String, String> columnsToValues,
        List<String> columns) throws DDFException {
  
      DDF newddf = null;
      if (columns == null) {
        columns = this.getDDF().getColumnNames();
      }
  
      if (method == null) {
        String sqlCmd = fillNAWithValueSQL(value, function, columnsToValues, columns);
        mLog.info("FillNA sql command: " + sqlCmd);
        newddf = this.getManager().sql2ddf(String.format(sqlCmd, this.getDDF().getTableName()), false);
  
      } else { // interpolation methods 'ffill' or 'bfill'
        // TODO:
      }
  
      newddf.getMetaDataHandler().copyFactor(this.getDDF());
      return newddf;
    }
docs: This function fills NA with given values. Default using a scalar value fillNA(value,null, 0, null, null, null,
  false)
  
  @param value           a scalar value to fill all NAs
  @param method          = 'ffill' for forward fill or 'bfill' for backward fill
  @param limit           = maximum size gap for forward or backward fill
  @param function        aggregate function to generate the filled value for a column
  @param columnsToValues = a map to provide different values to fill for different columns
  @param columns         = only consider NA filling on the given columns, set to null for all columns of the DDF
  @return a DDF with NAs filled