code: def search(query, parent, options):
          
          # Extend the default max number of tickets to be fetched
          query = "{0}&max={1}".format(query, MAX_TICKETS)
          log.debug("Search query: {0}".format(query))
          try:
              result = parent.proxy.ticket.query(query)
          except xmlrpclib.Fault as error:
              log.error("An error encountered, while searching for tickets.")
              raise ReportError(error)
          except xmlrpclib.ProtocolError as error:
              log.debug(error)
              log.error("Trac url: {0}".format(parent.url))
              raise ReportError(
                  "Unable to contact Trac server. Is the url above correct?")
          log.debug("Search result: {0}".format(result))
          # Fetch tickets and their history using multicall
          multicall = xmlrpclib.MultiCall(parent.proxy)
          for ticket_id in sorted(result):
              multicall.ticket.get(ticket_id)
              multicall.ticket.changeLog(ticket_id)
          log.debug(u"Fetching trac tickets and their history")
          result = list(multicall())
          tickets = result[::2]
          changelogs = result[1::2]
          # Print debugging info
          for ticket, changelog in zip(tickets, changelogs):
              log.debug("Fetched ticket #{0}".format(ticket[0]))
              log.debug(pretty(ticket))
              log.debug("Changelog:")
              log.debug(pretty(changelog))
          # Return the list of ticket objects
          return [
              Trac(ticket, changelg, parent=parent, options=options)
              for ticket, changelg in zip(tickets, changelogs)]
docs: Perform Trac search