/**
  * @param emfTables the list of emf tables in this jdbc source physical relational model
  * @param tableInfos the map of value objects containing the newly-computed column statistics
  * @since 4.3
  */
 void populateEmfColumnStatistics(List emfTables, Map tableInfos) {
   for (Iterator itTable = emfTables.iterator(); itTable.hasNext(); ) {
     Table emfTable = (Table) itTable.next();
     if (emfTable.getNameInSource() != null) {
       TableStatistics tableInfo =
           (TableStatistics) tableInfos.get(unQualifyName(emfTable.getNameInSource()));
       if (tableInfo != null) {
         emfTable.setCardinality(tableInfo.getCardinality());
         Map columnInfos = tableInfo.getColumnStats();
         for (Iterator itColumn = emfTable.getColumns().iterator(); itColumn.hasNext(); ) {
           Column emfColumn = (Column) itColumn.next();
           if (emfColumn.getNameInSource() != null) {
             ColumnStatistics columnInfo =
                 (ColumnStatistics) columnInfos.get(unQualifyName(emfColumn.getNameInSource()));
             if (columnInfo != null) {
               emfColumn.setMinimumValue(columnInfo.getMin());
               emfColumn.setMaximumValue(columnInfo.getMax());
               emfColumn.setNullValueCount(columnInfo.getNumNullValues());
               emfColumn.setDistinctValueCount(columnInfo.getNumDistinctValues());
             }
           }
         }
       }
     }
   }
 }
 /**
  * Takes a list of emf table objects and breaks them down into the CostAnalyzer's TableInfo and
  * ColumnInfo objects. NOTE: The keys used to populate the table and column info maps are the
  * "name in source" field values, not the emf object names of the perspective objects.
  *
  * @param emfTables
  * @since 4.3
  */
 private Map createTableInfos(List emfTables) {
   if (emfTables != null) {
     Map tableInfos = new HashMap();
     for (Iterator tblIt = emfTables.iterator(); tblIt.hasNext(); ) {
       Table emfTable = (Table) tblIt.next();
       if (emfTable.getNameInSource() != null) {
         Catalog catalog = emfTable.getCatalog();
         String catalogName =
             catalog == null || catalog.getNameInSource() == null
                 ? null
                 : unQualifyName(catalog.getNameInSource());
         Schema schema = emfTable.getSchema();
         String schemaName =
             schema == null || schema.getNameInSource() == null
                 ? null
                 : unQualifyName(schema.getNameInSource());
         String tblName = emfTable.getNameInSource();
         TableStatistics tableInfo = new TableStatistics(catalogName, schemaName, tblName);
         Map columnInfos = tableInfo.getColumnStats();
         for (Iterator colIt = emfTable.getColumns().iterator(); colIt.hasNext(); ) {
           Column emfColumn = (Column) colIt.next();
           if (emfColumn.getNameInSource() != null) {
             String colName = unQualifyName(emfColumn.getNameInSource());
             ColumnStatistics columnInfo = new ColumnStatistics(colName);
             columnInfos.put(colName, columnInfo);
           }
         }
         tableInfos.put(unQualifyName(tblName), tableInfo);
       }
     }
     return tableInfos;
   }
   return null;
 }
 // calculate the number of work units for the progress monitoring
 // of this cost analysis task
 int calculateNumberOfWorkIncrements(Collection tblStats) {
   // first, add twice the number of columns for two table operations
   // (table cardinality and column attribute population)
   int numWorkInc = tblStats.size() * 2;
   for (Iterator it = tblStats.iterator(); it.hasNext(); ) {
     TableStatistics tblStat = (TableStatistics) it.next();
     // add the number of columns from each table,
     // as each requires 1-2 database operations
     numWorkInc += tblStat.getColumnStats().size();
   }
   return numWorkInc;
 }