if (!metadata.getUniqueKeysInGroup(ufc.getGroup().getMetadataID()).isEmpty()) {
keyPreservingGroups.add(ufc.getGroup());
}
}
if (clause instanceof JoinPredicate) {
JoinPredicate jp = (JoinPredicate)clause;
if (jp.getJoinType() == JoinType.JOIN_CROSS || jp.getJoinType() == JoinType.JOIN_FULL_OUTER) {
return;
}
HashSet<GroupSymbol> leftPk = new HashSet<GroupSymbol>();
findKeyPreserved(jp.getLeftClause(), leftPk, metadata);
HashSet<GroupSymbol> rightPk = new HashSet<GroupSymbol>();
findKeyPreserved(jp.getRightClause(), rightPk, metadata);
if (leftPk.isEmpty() && rightPk.isEmpty()) {
return;
}
HashSet<GroupSymbol> leftGroups = new HashSet<GroupSymbol>();
HashSet<GroupSymbol> rightGroups = new HashSet<GroupSymbol>();
jp.getLeftClause().collectGroups(leftGroups);
jp.getRightClause().collectGroups(rightGroups);
LinkedList<Expression> leftExpressions = new LinkedList<Expression>();
LinkedList<Expression> rightExpressions = new LinkedList<Expression>();
RuleChooseJoinStrategy.separateCriteria(leftGroups, rightGroups, leftExpressions, rightExpressions, jp.getJoinCriteria(), new LinkedList<Criteria>());
HashMap<List<GroupSymbol>, List<HashSet<Object>>> crits = createGroupMap(leftExpressions, rightExpressions);
if (!leftPk.isEmpty() && (jp.getJoinType() == JoinType.JOIN_INNER || jp.getJoinType() == JoinType.JOIN_LEFT_OUTER)) {
findKeyPreserved(keyPreservingGroups, leftPk, crits, true, metadata, rightPk);
}
if (!rightPk.isEmpty() && (jp.getJoinType() == JoinType.JOIN_INNER || jp.getJoinType() == JoinType.JOIN_RIGHT_OUTER)) {
findKeyPreserved(keyPreservingGroups, rightPk, crits, false, metadata, leftPk);
}
}
}