code: def filter(self, **kwargs):
          
          from django.db.models import Q
  
          Statement = self.get_model('statement')
  
          kwargs.pop('page_size', 1000)
          order_by = kwargs.pop('order_by', None)
          tags = kwargs.pop('tags', [])
          exclude_text = kwargs.pop('exclude_text', None)
          exclude_text_words = kwargs.pop('exclude_text_words', [])
          persona_not_startswith = kwargs.pop('persona_not_startswith', None)
          search_text_contains = kwargs.pop('search_text_contains', None)
  
          # Convert a single sting into a list if only one tag is provided
          if type(tags) == str:
              tags = [tags]
  
          if tags:
              kwargs['tags__name__in'] = tags
  
          statements = Statement.objects.filter(**kwargs)
  
          if exclude_text:
              statements = statements.exclude(
                  text__in=exclude_text
              )
  
          if exclude_text_words:
              or_query = [
                  ~Q(text__icontains=word) for word in exclude_text_words
              ]
  
              statements = statements.filter(
                  *or_query
              )
  
          if persona_not_startswith:
              statements = statements.exclude(
                  persona__startswith='bot:'
              )
  
          if search_text_contains:
              or_query = Q()
  
              for word in search_text_contains.split(' '):
                  or_query |= Q(search_text__contains=word)
  
              statements = statements.filter(
                  or_query
              )
  
          if order_by:
              statements = statements.order_by(*order_by)
  
          for statement in statements.iterator():
              yield statement
docs: Returns a list of statements in the database
          that match the parameters specified.