from dataclasses import dataclass
from typing import List
from deprecated.classic import deprecated
from oaklib.datamodels.search_datamodel import (
SearchBaseConfiguration,
SearchProperty,
SearchTermSyntax,
)
from oaklib.datamodels.vocabulary import (
IDENTIFIER_PREDICATE,
LABEL_PREDICATE,
SYNONYM_PREDICATES,
)
from oaklib.types import PRED_CURIE
DEFAULT_SEARCH_PROPERTIES = [SearchProperty.LABEL, SearchProperty.ALIAS]
[docs]
def create_search_configuration(term: str) -> "SearchConfiguration":
"""
Generates a search configuration based on search syntax
term is either a plaintext search term, or a search term prefixed by
- 1. a property packages, one of t, ., l (for term, anything, label)
- 2. a match type indicator, one of "~","/","=","^","@"
For more documentation, see `Search docs <https://incatools.github.io/ontology-access-kit/interfaces/search.html>`_
:param term:
:return:
"""
if len(term) > 1:
prop = term[0]
code = term[1]
rest = term[2:]
if code == "~":
cfg = SearchBaseConfiguration([rest], is_partial=True)
elif code == "/":
cfg = SearchBaseConfiguration([rest], syntax=SearchTermSyntax.REGULAR_EXPRESSION)
elif code == "@":
cfg = SearchBaseConfiguration([rest], syntax=SearchTermSyntax.SQL)
elif code == "=":
cfg = SearchBaseConfiguration([rest], is_partial=False)
elif code == "^":
cfg = SearchBaseConfiguration([rest], syntax=SearchTermSyntax.STARTS_WITH)
else:
cfg = SearchBaseConfiguration([term], properties=DEFAULT_SEARCH_PROPERTIES)
prop = None
if prop:
if prop == "t":
props = [SearchProperty.LABEL, SearchProperty.ALIAS]
elif prop == ".":
props = [SearchProperty.ANYTHING]
elif prop == "l":
props = [SearchProperty.LABEL]
elif prop == "i":
props = [SearchProperty.IDENTIFIER]
elif prop == "x":
props = [SearchProperty.MAPPED_IDENTIFIER]
else:
raise ValueError(f"Unknown property packages: {prop}")
cfg.properties = [SearchProperty(p) for p in props]
return cfg
else:
return SearchConfiguration([term], properties=DEFAULT_SEARCH_PROPERTIES)
def search_properties_to_predicates(props: List[SearchProperty]) -> List[PRED_CURIE]:
preds = set()
for p in props:
if p == SearchProperty(SearchProperty.LABEL):
preds.add(LABEL_PREDICATE)
elif p == SearchProperty(SearchProperty.IDENTIFIER):
preds.add(IDENTIFIER_PREDICATE)
elif p == SearchProperty(SearchProperty.ALIAS):
preds.update(SYNONYM_PREDICATES + [LABEL_PREDICATE])
elif p == SearchProperty(SearchProperty.ANYTHING):
preds.update(SYNONYM_PREDICATES + [LABEL_PREDICATE])
else:
raise ValueError(p)
return list(preds)
[docs]
@dataclass
class SearchConfiguration(SearchBaseConfiguration):
"""
Parameters for altering behavior of search
Examples:
>>> from oaklib.datamodels.search import SearchConfiguration, SearchTermSyntax
>>> cfg = SearchConfiguration(syntax=SearchTermSyntax.REGULAR_EXPRESSION)
"""