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; }
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(); } }