private static void addFeatureConjunctionOperand(List<Map<String, Predicate>> featureConjunctionOperandsList, Predicate operand) {
        String key = getFeatureSetKey(operand);
        for (Map<String, Predicate> featureConjunctionOperands : featureConjunctionOperandsList) {
            if (!featureConjunctionOperands.containsKey(key)) {
                featureConjunctionOperands.put(key, operand);
                return;
            }
        }
        Map<String, Predicate> conjunctionOperands = new TreeMap<>();
        conjunctionOperands.put(key, operand);
        featureConjunctionOperandsList.add(conjunctionOperands);
    }
Conversion rules:
 1) A {@link FeatureConjunction} may only consist of FeatureSets having unique keys.
    If multiple {@link FeatureSet} share the same key, they have to be placed into separate FeatureConjunctions.
 2) A FeatureConjunction must have at least 2 operands.
 3) Any operand that is not a FeatureSet, negated or not,
    (e.g {@link FeatureRange}) cannot be placed into a FeatureConjunction.
 4) All FeatureSets may only have a single value.

 See the tests in FeatureConjunctionTransformerTest for conversion examples.
predicate-search/src/main/java/com/yahoo/search/predicate/optimization/FeatureConjunctionTransformer.java