public ColumnPairElement getColumnPair(DBIdentifier name) {
    ColumnPairElement cpe = (ColumnPairElement) columnPairs.find(name);
    if (cpe == null)
      try {
        String fullName = name.getFullName();
        if (fullName == null) {
          return null;
        }

        int pos = fullName.indexOf(";");
        String firstHalf = fullName.substring(0, pos);
        String secondHalf = fullName.substring(pos + 1);

        ColumnElement lce = getColumn(DBIdentifier.create(firstHalf));

        pos = secondHalf.lastIndexOf(".");
        TableElement te =
            ((TableElement) element)
                .getDeclaringSchema()
                .getTable(DBIdentifier.create(secondHalf.substring(0, pos)));
        if (te == null) return null;

        ColumnElement fce = te.getColumn(DBIdentifier.create(secondHalf));

        if (lce == null || fce == null) return null;

        ColumnPairElementImpl cpei =
            new ColumnPairElementImpl(
                lce.getName().getFullName() + ";" + fce.getName().getFullName()); // NOI18N
        cpe = new ColumnPairElement(cpei, lce, fce, (TableElement) element);
        changeColumnPairs(new ColumnPairElement[] {cpe}, DBElement.Impl.ADD);
      } catch (DBException exc) {
        exc.printStackTrace();
        return null;
      }

    return cpe;
  }
Ejemplo n.º 2
0
 public List<TableElement> getParameters(JobFilter jobFilter, Object[]... inputs) {
   List<TableElement> tableElements = new ArrayList<TableElement>();
   UnittypeParameter[] params = getUnittypeParams(inputs);
   UnitParameter[] uParams = getUnitParams(inputs);
   UnitParameter[] uSessionParams = getUnitSessionParams(inputs);
   ProfileParameter[] pParams = getProfileParams(inputs);
   GroupParameter[] gParams = getGroupParams(inputs);
   JobParameter[] jParams = getJobParams(inputs);
   for (int i = 0; i < params.length; i++) {
     if (parameterShouldNotBeListed(jobFilter, params, i)) continue;
     String param = params[i].getName();
     String[] names = param.split("\\.");
     String id = "";
     Integer tab = WebConstants.PARAMETERS_START_INDENTATION;
     for (int j = 0; j < names.length; j++) {
       UnittypeParameter utp = (j == (names.length - 1) ? params[i] : null);
       String name = names[j];
       if (id.length() > 0) id += ".";
       id += name;
       if (tableElements.size() > 0) {
         List<TableElement> copy = new ArrayList<TableElement>();
         copy.addAll(tableElements);
         boolean isThere = false;
         for (TableElement element : copy) {
           if (element.getName().equals(id)) {
             isThere = true;
             break;
           }
         }
         if (!isThere) tableElements.add(new TableElement(id, tab, utp));
       } else tableElements.add(new TableElement(id, tab, utp));
       tab += WebConstants.PARAMETERS_NEXT_INDENTATION;
     }
   }
   Collections.sort(tableElements, new TableElementComparator());
   if (pParams != null) {
     for (ProfileParameter pParam : pParams) {
       for (TableElement te : tableElements) {
         if (te.getUnittypeParameter() == pParam.getUnittypeParameter()) {
           te.setProfileParameter(pParam);
           break;
         }
       }
     }
   }
   if (uParams != null) {
     for (UnitParameter uParam : uParams) {
       for (TableElement te : tableElements) {
         if (te.getUnittypeParameter() == uParam.getParameter().getUnittypeParameter()) {
           te.setUnitParameter(uParam);
           break;
         }
       }
     }
   }
   if (uSessionParams != null) {
     for (UnitParameter uSessionParam : uSessionParams) {
       for (TableElement te : tableElements) {
         if (te.getUnittypeParameter() == uSessionParam.getParameter().getUnittypeParameter()) {
           te.setUnitSessionParameter(uSessionParam);
           break;
         }
       }
     }
   }
   if (gParams != null) {
     for (GroupParameter gParam : gParams) {
       for (TableElement te : tableElements) {
         if (te.getUnittypeParameter() != null
             && te.getUnittypeParameter().equals(gParam.getParameter().getUnittypeParameter())
             && gParam.getId() != null) te.addGroupParameter(gParam);
       }
     }
   }
   if (jParams != null) {
     for (JobParameter jParam : jParams) {
       for (TableElement te : tableElements) {
         if (te.getUnittypeParameter() != null
             && te.getUnittypeParameter().equals(jParam.getParameter().getUnittypeParameter())) {
           te.setJobParameter(jParam);
           break;
         }
       }
     }
   }
   return tableElements;
 }
  /** Map the source element to the target element and update the DTW table */
  public void warpSourceToTarget() {

    // Find the cost of warping the source to the first element in the target.
    TableElement currentTableElement = null, previousElement = null;
    double alignmentCost = 0.0;
    for (int sourceElementIndex = 0;
        sourceElementIndex < this.source.length;
        ++sourceElementIndex) {
      currentTableElement = getElement(0, sourceElementIndex);
      assert currentTableElement != null;
      if (this.source[sourceElementIndex] == this.target[0]) {
        if (previousElement == null) {
          currentTableElement.setAlignmentCost(0);
        } else {
          currentTableElement.setAlignmentCost(previousElement.getAlignmentCost());
        }
      } else {
        alignmentCost = Math.abs(this.source[sourceElementIndex] - this.target[0]);
        if (previousElement == null) {
          currentTableElement.setAlignmentCost(alignmentCost);
        } else {
          currentTableElement.setAlignmentCost(previousElement.getAlignmentCost() + alignmentCost);
        }
      }
      currentTableElement.setMinimumDistanceFromSameSource(previousElement);
      previousElement = currentTableElement;
      setElement(0, sourceElementIndex, currentTableElement);
    }

    // Find the cost of warping the first character in the source to the target.
    previousElement = null;
    for (int targetElementIndex = 0;
        targetElementIndex < this.target.length;
        ++targetElementIndex) {
      currentTableElement = getElement(targetElementIndex, 0);
      assert currentTableElement != null;
      if (this.target[targetElementIndex] == this.source[0]) {
        if (previousElement == null) {
          currentTableElement.setAlignmentCost(0);
        } else {
          currentTableElement.setAlignmentCost(previousElement.getAlignmentCost());
        }
      } else {
        alignmentCost = Math.abs(this.target[targetElementIndex] - this.source[0]);
        if (previousElement == null) {
          currentTableElement.setAlignmentCost(alignmentCost);
        } else {
          currentTableElement.setAlignmentCost(previousElement.getAlignmentCost() + alignmentCost);
        }
      }
      currentTableElement.setMinimumDistanceFromSameTarget(previousElement);
      previousElement = currentTableElement;
      setElement(targetElementIndex, 0, currentTableElement);
    }

    double distanceFromPreviousInSource = 0,
        distanceFromPreviousInTarget = 0,
        distanceFromPreviousInSourceAndTarget = 0;
    TableElement previousInSourceElement = null,
        previousInTargetElement = null,
        previousInSourceAndTargetElement = null;

    // Loop through the elements in the table
    for (int sourceElementIndex = 1;
        sourceElementIndex < this.source.length;
        ++sourceElementIndex) {
      for (int targetElementIndex = 1;
          targetElementIndex < this.target.length;
          ++targetElementIndex) {

        currentTableElement = getElement(targetElementIndex, sourceElementIndex);
        assert currentTableElement != null;

        // Get distance from previous element in source string
        previousInSourceElement =
            getNeighborAboveOnPreviousRow(targetElementIndex, sourceElementIndex);
        assert previousInSourceElement != null;
        if (this.source[sourceElementIndex] == this.target[targetElementIndex]) {
          distanceFromPreviousInSource = previousInSourceElement.getAlignmentCost();
        } else {
          alignmentCost =
              Math.abs(this.source[sourceElementIndex] - this.target[targetElementIndex]);
          distanceFromPreviousInSource = previousInSourceElement.getAlignmentCost() + alignmentCost;
        }

        // Get distance from previous element in target string
        previousInTargetElement =
            getPreviousNeighborOnSameRow(targetElementIndex, sourceElementIndex);
        assert previousInTargetElement != null;
        if (this.source[sourceElementIndex] == this.target[targetElementIndex]) {
          distanceFromPreviousInTarget = previousInTargetElement.getAlignmentCost();
        } else {
          alignmentCost =
              Math.abs(this.source[sourceElementIndex] - this.target[targetElementIndex]);
          distanceFromPreviousInTarget = previousInTargetElement.getAlignmentCost() + alignmentCost;
        }
        // Get distance from previous elements in source and target strings
        previousInSourceAndTargetElement =
            getDiagonalNeighborOnPreviousRow(targetElementIndex, sourceElementIndex);
        assert previousInSourceAndTargetElement != null;
        if (this.source[sourceElementIndex] == this.target[targetElementIndex]) {
          distanceFromPreviousInSourceAndTarget =
              previousInSourceAndTargetElement.getAlignmentCost();
        } else {
          alignmentCost =
              Math.abs(this.source[sourceElementIndex] - this.target[targetElementIndex]);
          distanceFromPreviousInSourceAndTarget =
              previousInSourceAndTargetElement.getAlignmentCost() + 1;
        }

        currentTableElement.setAlignmentCost(
            Math.min(
                Math.min(distanceFromPreviousInTarget, distanceFromPreviousInSource),
                distanceFromPreviousInSourceAndTarget));
        currentTableElement.setMinimumDistanceFromSameSource(previousInSourceElement);
        currentTableElement.setMinimumDistanceFromSameTarget(previousInTargetElement);
        currentTableElement.setMinimumDistanceFromDiagonal(previousInSourceAndTargetElement);
      }
    }
  }
  /**
   * @param expectRelatedTables specifies whether all related tables are expected to be provided.
   */
  private void initFKs(ConnectionProvider cp, String shortTableName, boolean expectRelatedTables)
      throws SQLException, DBException {
    ResultSet rs;

    rs =
        cp.getDatabaseMetaData()
            .getImportedKeys(cp.getConnection().getCatalog(), cp.getSchema(), shortTableName);

    String name, fkColName, pkTableName, pkColName, c1, c2, s1, s2;
    if (rs != null) {
      HashMap rset = new HashMap();
      while (rs.next()) {
        // test references between two schemas
        c1 = rs.getString("PKTABLE_CAT"); // NOI18N
        s1 = rs.getString("PKTABLE_SCHEM"); // NOI18N
        c2 = rs.getString("FKTABLE_CAT"); // NOI18N
        s2 = rs.getString("FKTABLE_SCHEM"); // NOI18N

        name = rs.getString("FK_NAME"); // NOI18N
        fkColName = rs.getString("FKCOLUMN_NAME").trim(); // NOI18N
        pkTableName = rs.getString("PKTABLE_NAME").trim(); // NOI18N
        pkColName = rs.getString("PKCOLUMN_NAME").trim(); // NOI18N

        if (comp(c1, c2)) {
          if (!comp(s1, s2)) continue;
        } else continue;

        ColumnPairElement cpe;

        if (name == null || name.trim().equals("")) name = "GENERATED_FK_" + pkTableName;
        else name = name.trim();

        ColumnElement lce = getColumn(DBIdentifier.create(fkColName)); // NOI18N
        if (lce == null) // should be null only in same cases when FK is computed for view
        continue;

        SchemaElement se = ((TableElement) element).getDeclaringSchema();
        TableElement fte = se.getTable(DBIdentifier.create(pkTableName));
        // table could not be found since all related tables were not necessarily provided
        if (fte == null && !expectRelatedTables) {
          continue;
        }
        ColumnElement fce = fte.getColumn(DBIdentifier.create(pkColName));
        ColumnPairElementImpl cpei =
            new ColumnPairElementImpl(
                lce.getName().getFullName() + ";" + fce.getName().getFullName()); // NOI18N
        cpe = new ColumnPairElement(cpei, lce, fce, (TableElement) element);
        changeColumnPairs(new ColumnPairElement[] {cpe}, DBElement.Impl.ADD);

        ForeignKeyElement fk = (ForeignKeyElement) keys.find(DBIdentifier.create(name));
        if (fk != null) fk.addColumnPair(cpe); // add pair
        else {
          ForeignKeyElementImpl fkei = new ForeignKeyElementImpl(this, name);
          ForeignKeyElement fke = new ForeignKeyElement(fkei, (TableElement) element);
          fke.addColumnPair(cpe);
          changeKeys(new ForeignKeyElement[] {fke}, DBElement.Impl.ADD);
        }
      }
      rs.close();
    }
  }