def _Dynamic_Search()

in src/google/appengine/api/search/simple_search_stub.py [0:0]


  def _Dynamic_Search(self, request, response):
    """A local implementation of SearchService.Search RPC.

    Args:
      request: A search_service_pb2.SearchRequest.
      response: An search_service_pb2.SearchResponse.
    """
    if request.HasField('app_id'):
      self._RandomSearchResponse(request, response)
      return

    index = self._GetIndex(request.params.index_spec)
    if index is None:
      self._UnknownIndex(response.status, request.params.index_spec)
      response.matched_count = 0
      return

    params = request.params
    try:
      results = index.Search(params)
    except query_parser.QueryException as e:
      self._InvalidRequest(response.status, e)
      response.matched_count = 0
      return
    except expression_evaluator.ExpressionEvaluationError as e:
      self._InvalidRequest(response.status, e)
      response.matched_count = 0
      return
    except document_matcher.ExpressionTreeException as e:
      self._InvalidRequest(response.status, e)
      response.matched_count = 0
      return

    facet_analyzer = simple_facet.SimpleFacet(params)
    try:
      results = facet_analyzer.RefineResults(results)
    except ValueError as e:

      self._InvalidRequest(response.status, e)
      response.matched_count = 0
      response.ClearField('result')
      return

    response.matched_count = len(results)
    offset = 0
    if params.HasField('cursor'):
      try:
        doc_id = self._DecodeCursor(
            six.ensure_binary(params.cursor), params.query)
      except _InvalidCursorException as e:
        self._InvalidRequest(response.status, e)
        response.matched_count = 0
        return
      for i, result in enumerate(results):
        if result.document.id == doc_id:
          offset = i + 1
          break
    elif params.HasField('offset'):
      offset = params.offset



    if offset < len(results):


      limit = offset + params.limit
      if limit >= len(results):


        range_end = len(results)
      else:



        range_end = limit
        if params.cursor_type == search_service_pb2.SearchParams.SINGLE:
          document = results[range_end - 1].document
          response.cursor = self._EncodeCursor(document, params.query)
      result_range = list(six.moves.range(offset, range_end))
    else:
      result_range = list(six.moves.range(0))
    field_names = params.field_spec.name
    self._FillSearchResponse(results, result_range, params.cursor_type,
                             _ScoreRequested(params), params.query, response,
                             field_names, params.keys_only)
    try:
      facet_analyzer.FillFacetResponse(results, response)
      response.status.code = search_service_pb2.SearchServiceError.OK

    except ValueError as e:

      self._InvalidRequest(response.status, e)
      response.matched_count = 0
      response.ClearField('result')