def group_fields()

in geneve/kql/optimizer.py [0:0]


    def group_fields(self, tree, value_cls):  # type: (List, type) -> KqlNode
        cls = type(tree)
        field_groups = {}
        ungrouped = []

        for term in tree.items:
            # move a `not` inwards before grouping
            if isinstance(term, NotExpr) and isinstance(term.expr, FieldComparison):
                term = FieldComparison(term.expr.field, NotValue(term.expr.value))

            if isinstance(term, FieldComparison):
                if term.field.name in field_groups:
                    existing_checks = field_groups[term.field.name]
                    existing_checks.append(term)
                    continue
                else:
                    field_groups[term.field.name] = [term]

            ungrouped.append(term)

        for term in ungrouped:
            if isinstance(term, FieldComparison):
                term.value = self.flat_optimize(value_cls([t.value for t in field_groups[term.field.name]]))

        ungrouped = [self.flat_optimize(u) for u in ungrouped]
        return cls(ungrouped) if len(ungrouped) > 1 else ungrouped[0]