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)
Beispiel #3
0
    def SortKey(scored_doc):
      """Return the sort key for a document based on the request parameters."""
      field = search_util.GetFieldInDocument(
          scored_doc.document, sort_spec.sort_expression())
      if not field:
        return default_value

      string_val = field.value().string_value()
      if field.value().type() in search_util.NUMBER_DOCUMENT_FIELD_TYPES:
        return float(string_val)
      if field.value().type() is document_pb.FieldValue.DATE:
        return search_util.EpochTime(search_util.DeserializeDate(string_val))
      return string_val
def _DateStrToDays(date_str):

  date = search_util.DeserializeDate(date_str)
  return search_util.EpochTime(date) / MSEC_PER_DAY