Source code for invenio_search.utils

# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2015-2018 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.

"""Utility functions for search engine."""

import os
import time
import warnings

import six
from elasticsearch import VERSION as ES_VERSION
from flask import current_app

from .proxies import current_search, current_search_client


[docs]def timestamp_suffix(): """Generate a suffix based on the current time.""" return '-' + str(int(time.time()))
[docs]def prefix_index(index, prefix=None, app=None): """Prefixes the given index if needed. :param index: Name of the index to prefix. :param prefix: Force a prefix. :param app: Flask app to get the prefix config from. :returns: A string with the new index name prefixed if needed. """ app = app or current_app index_prefix = (prefix if prefix is not None else (app.config.get('SEARCH_INDEX_PREFIX')) or '') return index_prefix + index
[docs]def suffix_index(index, suffix=None, app=None): """Suffixes the given index. :param index: Name of the index to prefix. :param suffix: The suffix to append to the index name. :param app: Flask app to get the "invenio-search" extension from. :returns: A string with the new index name suffixed. """ search_ext = app.extensions['invenio-search'] if app else current_search suffix = suffix if suffix is not None else search_ext.current_suffix return index + suffix
[docs]def build_index_from_parts(*parts): """Build an index name from parts. :param parts: String values that will be joined by dashes ("-"). """ return '-'.join([part for part in parts if part])
[docs]def build_alias_name(index, prefix=None, app=None): """Build an alias name. :param index: Name of the index. :param prefix: The prefix to prepend to the index name. """ return build_index_name(index, prefix=prefix, suffix='', app=app)
[docs]def build_index_name(index, prefix=None, suffix=None, app=None): """Build an index name. :param index: Name of the index. :param prefix: The prefix to prepend to the index name. :param suffix: The suffix to append to the index name. :param app: Flask app passed to ``prefix_index`` and ``suffix_index``. """ if not isinstance(index, six.string_types): index = build_index_from_parts(*index) index = prefix_index(index, prefix=prefix, app=app) index = suffix_index(index, suffix=suffix, app=app) return index
[docs]def schema_to_index(schema, index_names=None): """Get index/doc_type given a schema URL. :param schema: The schema name :param index_names: A list of index name. :returns: A tuple containing (index, doc_type). """ warnings.warn( '"invenio_search.utils.schema_to_index" will be moved to ' 'invenio-indexer', DeprecationWarning ) parts = schema.split('/') doc_type, ext = os.path.splitext(parts[-1]) parts[-1] = doc_type if ES_VERSION[0] >= 7: doc_type = '_doc' if ext not in {'.json', }: return (None, None) if index_names is None: index = build_index_from_parts(*parts) return index, doc_type for start in range(len(parts)): name = build_index_from_parts(*parts[start:]) if name in index_names: return name, doc_type return (None, None)