def SortKey(scored_doc): """Return the sort key for a document based on the request parameters. Arguments: scored_doc: The document to score Returns: The sort key of a document. The sort key is a tuple, where the nth element in the tuple corresponds to the value of the nth sort expression evaluated on the document. Raises: Exception: if no default value is specified. """ expr_vals = [] for sort_spec in search_params.sort_spec_list(): default_text = None default_numeric = None if sort_spec.has_default_value_text(): default_text = sort_spec.default_value_text() if sort_spec.has_default_value_numeric(): default_numeric = sort_spec.default_value_numeric() allow_rank = bool(sort_spec.sort_descending()) try: text_val = expression_evaluator.ExpressionEvaluator( scored_doc, self._inverted_index, True).ValueOf(sort_spec.sort_expression(), default_value=default_text, return_type=search_util. EXPRESSION_RETURN_TYPE_TEXT) num_val = expression_evaluator.ExpressionEvaluator( scored_doc, self._inverted_index, True).ValueOf(sort_spec.sort_expression(), default_value=default_numeric, return_type=search_util. EXPRESSION_RETURN_TYPE_NUMERIC, allow_rank=allow_rank) except expression_evaluator.QueryExpressionEvaluationError as e: raise expression_evaluator.ExpressionEvaluationError( _FAILED_TO_PARSE_SEARCH_REQUEST % (query, e)) if isinstance(num_val, datetime.datetime): num_val = search_util.EpochTime(num_val) elif isinstance(text_val, datetime.datetime): num_val = search_util.EpochTime(text_val) if text_val is None: text_val = '' if num_val is None: num_val = 0 expr_vals.append([text_val, num_val]) return tuple(expr_vals)
def SortKey(scored_doc): """Return the sort key for a document based on the request parameters. Arguments: scored_doc: The document to score Returns: The sort key of a document. The sort key is a tuple, where the nth element in the tuple corresponds to the value of the nth sort expression evaluated on the document. Raises: Exception: if no default value is specified. """ expr_vals = [] for sort_spec in search_params.sort_spec_list(): if not (sort_spec.has_default_value_text() or sort_spec.has_default_value_numeric()): raise Exception('A default value must be specified for sorting.') elif sort_spec.has_default_value_text(): default_value = sort_spec.default_value_text() else: default_value = sort_spec.default_value_numeric() try: val = expression_evaluator.ExpressionEvaluator( scored_doc, self._inverted_index, True).ValueOf( sort_spec.sort_expression(), default_value=default_value) except expression_evaluator.QueryExpressionEvaluationError, e: raise expression_evaluator.ExpressionEvaluationError( _FAILED_TO_PARSE_SEARCH_REQUEST % (query, e)) if isinstance(val, datetime.datetime): val = search_util.EpochTime(val) expr_vals.append(val)
def _AttachExpressions(self, docs, search_params): if search_params.has_field_spec(): for doc in docs: evaluator = expression_evaluator.ExpressionEvaluator( doc, self._inverted_index) for expr in search_params.field_spec().expression_list(): evaluator.Evaluate(expr) return docs
def SortKey(scored_doc): """Return the sort key for a document based on the request parameters.""" return expression_evaluator.ExpressionEvaluator( scored_doc, self._inverted_index).ValueOf(sort_spec.sort_expression(), default_value=default_value)