private IResultMetaData getRuntimeMetaData(DataSetHandle dataSetHandle) throws BirtException {
    Map dataSetBindingMap = new HashMap();
    Map dataSourceBindingMap = new HashMap();
    DataSetHandle handle = null;
    if (sessionContext.getModuleHandle() != null
        && sessionContext.getModuleHandle().getAllDataSets() != null) {
      for (Object o : sessionContext.getModuleHandle().getAllDataSets()) {
        DataSetHandle dsh = (DataSetHandle) o;
        if (dsh.getQualifiedName().equals(dataSetHandle.getQualifiedName())) {
          handle = dsh;
          break;
        }
      }
    }

    // First clear all property bindings so that the data set can be executed against design time
    // properties
    clearPropertyBindingMap(handle, dataSetBindingMap, dataSourceBindingMap);
    try {
      QueryDefinition query = new QueryDefinition();
      query.setDataSetName(dataSetHandle.getQualifiedName());
      query.setMaxRows(1);
      query.setAutoBinding(true);

      IResultMetaData metaData =
          new QueryExecutionHelper(dataEngine, modelAdaptor, sessionContext, false, this.session)
              .executeQuery(query)
              .getResultMetaData();
      addResultSetColumn(dataSetHandle, metaData);

      if (MetaDataPopulator.needsUseResultHint(dataSetHandle, metaData)) {
        metaData =
            new QueryExecutionHelper(dataEngine, modelAdaptor, sessionContext, true, this.session)
                .executeQuery(query)
                .getResultMetaData();
      }
      return metaData;
    } finally {
      // restore property bindings
      resetPropertyBinding(handle, dataSetBindingMap, dataSourceBindingMap);
    }
  }