docs: private void extractIndirectionTables(DescriptorRepository model, Database schema)
      {
          HashMap indirectionTables = new HashMap();
  
          // first we gather all participants for each m:n relationship
          for (Iterator classDescIt = model.getDescriptorTable().values().iterator(); classDescIt.hasNext();)
          {
              ClassDescriptor classDesc = (ClassDescriptor)classDescIt.next();
  
              for (Iterator collDescIt = classDesc.getCollectionDescriptors().iterator(); collDescIt.hasNext();)
              {
                  CollectionDescriptor collDesc   = (CollectionDescriptor)collDescIt.next();
                  String               indirTable = collDesc.getIndirectionTable();
  
                  if ((indirTable != null) && (indirTable.length() > 0))
                  {
                      Set columns = (Set)indirectionTables.get(indirTable);
  
                      if (columns == null)
                      {
                          columns = new HashSet();
                          indirectionTables.put(indirTable, columns);
                      }
                      columns.addAll(Arrays.asList(collDesc.getFksToThisClass()));
                      columns.addAll(Arrays.asList(collDesc.getFksToItemClass()));
                  }
              }
          }
          if (indirectionTables.isEmpty())
          {
              // nothing to do
              return;
          }
  
          for (Iterator it = indirectionTables.keySet().iterator(); it.hasNext();)
          {
              String tableName   = (String)it.next();
              Set    columns     = (Set)indirectionTables.get(tableName);
              String elementName = tableName;
  
              for (Iterator classDescIt = model.getDescriptorTable().values().iterator(); classDescIt.hasNext();)
              {
                  ClassDescriptor classDesc = (ClassDescriptor)classDescIt.next();
  
                  if (tableName.equals(classDesc.getFullTableName()))
                  {
                      elementName = getElementName(classDesc);
  
                      FieldDescriptor[] fieldDescs = classDesc.getFieldDescriptions();
  
                      if (fieldDescs != null)
                      {
                          for (int idx = 0; idx < fieldDescs.length; idx++)
                          {
                              columns.remove(fieldDescs[idx].getColumnName());
                          }
                      }
                  }
              }
  
              Table mappedTable        = getTableFor(elementName);
              Map   columnsMap         = getColumnsFor(elementName);
              Map   requiredAttributes = getRequiredAttributes(elementName);
      
              if (mappedTable == null)
              {
                  mappedTable = schema.findTable(elementName);
                  if (mappedTable == null)
                  {
                      continue;
                  }
                  columnsMap         = new TreeMap();
                  requiredAttributes = new HashMap();
                  _elementToTable.put(elementName, mappedTable);
                  _elementToColumnMap.put(elementName, columnsMap);
                  _elementToRequiredAttributesMap.put(elementName, requiredAttributes);
              }
              for (Iterator columnIt = columns.iterator(); columnIt.hasNext();)
              {
                  String columnName = (String)columnIt.next();
                  Column column     = mappedTable.findColumn(columnName);
  
                  if (column != null)
                  {
                      columnsMap.put(columnName, column);
                      requiredAttributes.put(columnName, Boolean.TRUE);
                  }
              }
          }
      }