81 lines
3.5 KiB
Python
81 lines
3.5 KiB
Python
"""Fail closed for recognized query operators without an implemented meaning."""
|
||
|
||
import re
|
||
|
||
|
||
def requested_years(question: str) -> list[int]:
|
||
"""An unquoted four-digit year remains a condition without 'v roku'."""
|
||
from .work_selector import selector_years
|
||
|
||
return selector_years(question)
|
||
|
||
|
||
def unsupported_constraint(question: str) -> str | None:
|
||
from .work_selector import parse_work_selector
|
||
|
||
selection = parse_work_selector(question)
|
||
if selection.unsupported_negation:
|
||
return "exclusion"
|
||
text = selection.positive_text
|
||
# Do not treat words inside quoted academic titles as query operators.
|
||
text = re.sub(r'[„“"«][^„“”"»]+[“”"»]', " ", text)
|
||
academic = re.search(r"\b(?:prac\w*|projekt\w*)\b", text)
|
||
completion = re.search(r"\b(?:ukonc\w*|dokonc\w*|obhaj\w*|odovzd\w*|stihn\w*)\b", text)
|
||
if (
|
||
academic
|
||
and completion
|
||
and (
|
||
re.search(r"\b(?:tymto tempom|predpoved\w*|predik\w*|stihne|stihnu)\b", text)
|
||
or re.search(r"\b(?:ukonci|ukoncia|dokonci|dokoncia|obhaji|obhaja)\b", text)
|
||
or (
|
||
re.search(r"\bodhad\w*\b", text)
|
||
and re.search(r"\b(?:ukonc\w*|dokonc\w*|obhaj\w*)\b", text)
|
||
)
|
||
)
|
||
):
|
||
return "completion_prediction"
|
||
if (
|
||
re.search(r"\b(?:rok\w*|datum\w*|kedy)\b", text)
|
||
and re.search(r"\b(?:obhajob\w*|obhajil\w*|dokonc\w*|ukonc\w*|zacal\w* pracovat)\b", text)
|
||
and academic
|
||
):
|
||
return "work_event_date"
|
||
if re.search(
|
||
r"\b(?:od|do|pred|po|medzi)\s+(?:rok(?:om|mi|u)?\s+)?\d{4}\b|\b\d{4}\s*[-–]\s*\d{4}\b", text
|
||
):
|
||
return "year_range"
|
||
number = (
|
||
r"(?:\d+|jeden|jedna|jedno|jednu|jednej|jedneho|dva|dve|dvoch|dvom|dvoma|"
|
||
r"tri|troch|trom|troma|styri|styroch|styrom|pat\w*|piat\w*|sest\w*|siest\w*|"
|
||
r"sedem\w*|siedm\w*|osem\w*|osm\w*|devat\w*|deviat\w*|desat\w*|desiat\w*|"
|
||
r"jedenast\w*|dvanast\w*|trinast\w*|strnast\w*|dvadsat\w*)"
|
||
)
|
||
if re.search(
|
||
r"\b(?:aspon|najmenej|najviac|viac ako|menej ako|minimalne|maximalne)\s+" + number + r"\b",
|
||
text,
|
||
):
|
||
return "quantity_condition"
|
||
if re.search(
|
||
r"\b(?:okrem|s vynimkou)\b|\b(?:nema|nemaju)\s+(?:tag|klucov|kategori|prac|projekt)|"
|
||
r"\bbez\s+(?:tagu|klucoveho slova|kategorie)\b",
|
||
text,
|
||
):
|
||
return "exclusion"
|
||
if re.search(r"\b(?:tag\w*|klucov\w*\s+slov\w*)\s+\w+\s+alebo\s+\w+", text):
|
||
return "alternative_tags"
|
||
return None
|
||
|
||
|
||
def constraint_message(code: str) -> str:
|
||
return {
|
||
"completion_prediction": "Z dostupných poznámok neviem spoľahlivo predpovedať, kto a kedy dokončí prácu. "
|
||
"Môžem vyhľadať práce evidované v konkrétnom roku; to nie je odhad ich dokončenia.",
|
||
"work_event_date": "Rok uvedený pri práci nepreukazuje dátum jej začatia, dokončenia alebo obhajoby. "
|
||
"Chceš zistiť rok evidovaný pri práci?",
|
||
"year_range": "Časovú podmienku neviem spoľahlivo vyhodnotiť ako interval. Uveď konkrétny rok práce.",
|
||
"quantity_condition": "Podmienku na minimálny alebo maximálny počet neviem spoľahlivo vyhodnotiť. "
|
||
"Požiadaj najprv o konkrétny zoznam alebo počet.",
|
||
"exclusion": "Vylučovaciu podmienku neviem spoľahlivo vyhodnotiť. Uveď, ktoré vlastnosti majú výsledky spĺňať.",
|
||
"alternative_tags": "Uveď, či požaduješ oba tagy zároveň, alebo vyhľadávanie pre každý tag samostatne.",
|
||
}[code]
|