"""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]