code: def add(self, data, conn_type, squash=True):
          
          if data in self.children:
              return data
          if not squash:
              self.children.append(data)
              return data
          if self.connector == conn_type:
              # We can reuse self.children to append or squash the node other.
              if (isinstance(data, QBase) and not data.negated and
                      (data.connector == conn_type or len(data) == 1)):
                  # We can squash the other node's children directly into this
                  # node. We are just doing (AB)(CD) == (ABCD) here, with the
                  # addition that if the length of the other node is 1 the
                  # connector doesn't matter. However, for the len(self) == 1
                  # case we don't want to do the squashing, as it would alter
                  # self.connector.
                  self.children.extend(data.children)
                  return self
              else:
                  # We could use perhaps additional logic here to see if some
                  # children could be used for pushdown here.
                  self.children.append(data)
                  return data
          else:
              obj = self._new_instance(self.children, self.connector,
                                       self.negated)
              self.connector = conn_type
              self.children = [obj, data]
              return data
docs: Combine this tree and the data represented by data using the
          connector conn_type. The combine is done by squashing the node other
          away if possible.
  
          This tree (self) will never be pushed to a child node of the
          combined tree, nor will the connector or negated properties change.
  
          Return a node which can be used in place of data regardless if the
          node other got squashed or not.
  
          If `squash` is False the data is prepared and added as a child to
          this tree without further logic.
  
          Args:
              conn_type (str, optional ["AND", "OR"]): connection method