private ArrayList<Key> searchCandidateKeys(RelationSchema schema,
	  ArrayList<Attribute> m, ArrayList<Key> candidateKeys,
	  ArrayList<ArrayList<Attribute>> level) {
	ArrayList<ArrayList<Attribute>> nextLevel = new ArrayList<>();
	ArrayList<Attribute> tempList;

	for (ArrayList<Attribute> attrList : level) {
	  if (isKeyDeterminingEverything(schema.getAttributes(),
		  schema.getFunctionalDependencies(), new Key(attrList))) {
		if (!isSuperKey(attrList, candidateKeys)) {
		  candidateKeys.add(new Key(attrList));
		}
	  }
	}

	for (ArrayList<Attribute> attrLst : level) {
	  if (!isCandidateKey(attrLst, candidateKeys)
		  && !isSuperKey(attrLst, candidateKeys)) {
		for (Attribute attr : m) {
		  if (!attrLst.contains(attr)) {
			tempList = new ArrayList<>();
			tempList.addAll(attrLst);
			tempList.add(attr);
			nextLevel.add(tempList);
		  }
		}
	  }
	}

	if (!nextLevel.isEmpty()) {
	  searchCandidateKeys(schema, m, candidateKeys, nextLevel);
	}

	return candidateKeys;
  }