/** * Checks if the given <code>InsertRow</code>s contain cyclic fk constraints. * * @param rows * @return steps of the cycle, or null if there is none */ private static Collection<InsertRow> findCycle(Collection<InsertRow> rows) { Iterator<InsertRow> rowsIter = rows.iterator(); while (rowsIter.hasNext()) { InsertRow begin = rowsIter.next(); Iterator<InsertRow> refIter = begin.getReferencedRows().iterator(); while (refIter.hasNext()) { InsertRow referencedRow = refIter.next(); List<InsertRow> cycle = findCycleRecursion(referencedRow, begin, new ArrayList<InsertRow>()); if (cycle != null) { return cycle; } } } return null; }
private static List<InsertRow> findCycleRecursion( InsertRow next, InsertRow begin, List<InsertRow> steps) { if (steps.contains(next)) { steps.add(next); return steps; } steps.add(next); Iterator<InsertRow> refIter = next.getReferencedRows().iterator(); while (refIter.hasNext()) { InsertRow referencedRow = refIter.next(); List<InsertRow> cycle = findCycleRecursion(referencedRow, begin, steps); if (cycle != null) { return cycle; } } steps.remove(steps.size() - 1); return null; }