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')