private static <T> boolean checkIntersection(RuleConstraint<T> ruleA, RuleConstraint<T> ruleB) {
		if (ruleA == ruleB) {
			return false;
		}
		
		List<FieldGroup<T>> fieldsA = ruleA.fieldGroups();
		List<FieldGroup<T>> fieldsB = ruleB.fieldGroups();
		List<FieldGroup<T>> fieldsCopy = new ArrayList<FieldGroup<T>>(ruleA.fieldGroups());
		List<FieldGroup<T>> ruleFieldsCopy = new ArrayList<FieldGroup<T>>(ruleB.fieldGroups());
		
		for (FieldGroup<T> groupA : fieldsCopy) {
			for (FieldGroup<T> groupB : ruleFieldsCopy) {
				if (groupA == groupB) {
					continue;
				}
				
				FieldGroupSplit<T> splitResult = FieldGroupSplit.split(groupA, groupB);
				if (splitResult == null) {
					continue; // nothing to split
				}
				
				FieldGroup<T> both = splitResult.getBoth();
				FieldGroup<T> onlyA = splitResult.getOnlyA();
				FieldGroup<T> onlyB = splitResult.getOnlyB();
				
				fieldsA.remove(groupA);
				fieldsA.add(both);
				if (!onlyA.isEmpty()) { 
					fieldsA.add(onlyA);
				}
				
				fieldsB.remove(groupB);
				fieldsB.add(both);
				if (!onlyB.isEmpty()) { 
					fieldsB.add(onlyB);
				}
				return true;
			}
		}
		return false;
	}