def _Dynamic_ListIndexes()

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


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

    Args:
      request: A search_service_pb2.ListIndexesRequest.
      response: An search_service_pb2.ListIndexesResponse.

    Raises:
      ResponseTooLargeError: raised for testing admin console.
    """



    if request.HasField('app_id'):
      if random.choice([True] + [False] * 9):
        raise apiproxy_errors.ResponseTooLargeError()

      for _ in six.moves.range(random.randint(0, 2) * random.randint(5, 15)):
        new_index_spec = response.index_metadata.add().index_spec
        new_index_spec.name = random.choice(
            list(_VISIBLE_PRINTABLE_ASCII - set('!'))) + ''.join(
                random.choice(list(_VISIBLE_PRINTABLE_ASCII))
                for _ in six.moves.range(
                    random.randint(0, search.MAXIMUM_INDEX_NAME_LENGTH)))
      response.status.code = random.choice(
          [search_service_pb2.SearchServiceError.OK] * 10 +
          [search_service_pb2.SearchServiceError.TRANSIENT_ERROR] +
          [search_service_pb2.SearchServiceError.INTERNAL_ERROR])
      return

    response.status.code = search_service_pb2.SearchServiceError.OK

    params = request.params
    namespace = self._GetNamespace(params.namespace)

    indexes_by_namespace_and_name = {}
    if params.all_namespaces:
      for namespace, indexes_by_name in six.iteritems(self.__indexes):
        for index_name, index in six.iteritems(indexes_by_name):
          indexes_by_namespace_and_name[(namespace, index_name)] = index
    else:
      if namespace not in self.__indexes or not self.__indexes[namespace]:
        return
      for index_name, index in six.iteritems(self.__indexes[namespace]):
        indexes_by_namespace_and_name[(namespace, index_name)] = index

    keys, indexes = list(
        six.moves.zip(*sorted(
            six.iteritems(indexes_by_namespace_and_name),
            key=lambda v: v[0])))
    position = 0
    if params.HasField('start_index_name'):
      position = bisect.bisect_left(keys,
                                    (params.namespace, params.start_index_name))
      if (not params.include_start_index and position < len(keys) and
          keys[position] == (params.namespace, params.start_index_name)):
        position += 1
    elif params.HasField('index_name_prefix'):
      position = bisect.bisect_left(
          keys, (params.namespace, params.index_name_prefix))
    if params.HasField('offset'):
      position += params.offset
    end_position = position + params.limit
    prefix = params.index_name_prefix
    for index in indexes[min(position, len(keys)):min(end_position, len(keys))]:
      index_spec = index.index_spec
      if prefix and not index_spec.name.startswith(prefix):
        break
      metadata = response.index_metadata.add()
      new_index_spec = metadata.index_spec
      new_index_spec.name = index_spec.name
      new_index_spec.namespace = index_spec.namespace
      if params.fetch_schema:
        self._AddSchemaInformation(index, metadata)
      self._AddStorageInformation(index, metadata)