code: public static List<TableModel> extract(final Catalog catalog, final TableExtractor tableExtractor) {
          LOG.info("Extracting model data from {}", catalog.getFullName());
  
          List<Table> tables = catalog.getTables().stream()
                  .filter(table -> !(table instanceof View))
                  .collect(Collectors.toList());
  
          final List<TableModel> result = new LinkedList<>();
          Map<String, Map<Table, List<String>>> joinTableMetadata = new HashMap<>();
          for (Table table : tables) {
              if (TableExtractor.isJoinTable(table)) {
                  // Add to the tables that will be post-processed
                  LOG.debug("Found join table: {}", table.getFullName());
                  joinTableMetadata = MetadataExtractor.mergeJoinTableMetadata(joinTableMetadata, TableExtractor.analyzeJoinTable(table));
              }
              LOG.debug("Extracting model for table {}", table.getFullName());
              result.add(tableExtractor.extractTableModel(table));
          }
          LOG.debug("Post-processing the join tables...");
          processJoinTables(result, joinTableMetadata);
          LOG.debug("Post-processing done.");
          LOG.info("Done extracting the model");
          return result;
      }
docs: Extracts a list of {@link TableModel}s from a {@link Catalog} using the specified {@link TableExtractor}.
  In a post-processing step data for helper methods for dealing with m:n relations/join tables will be added to the models.
  
  @param catalog        The catalog containing all the tables that should be processed
  @param tableExtractor The extractor to use
  @return A list of table models with exactly one model per table