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)