"""Fail closed for recognized query operators without an implemented meaning.""" import re import unicodedata def requested_years(question: str) -> list[int]: """An unquoted four-digit year remains a condition without 'v roku'.""" text=re.sub(r'[„“"«][^„“”"»]+[“”"»]', ' ', question) return list(dict.fromkeys(int(value) for value in re.findall(r'\b\d{4}\b',text))) def unsupported_constraint(question: str) -> str | None: text = ''.join(c for c in unicodedata.normalize('NFKD', question).casefold() if not unicodedata.combining(c)) # Do not treat words inside quoted academic titles as query operators. text = re.sub(r'[„“"«][^„“”"»]+[“”"»]', ' ', text) if (re.search(r'\b(?:rok\w*|datum\w*|kedy)\b',text) and re.search(r'\b(?:obhajob\w*|obhajil\w*|dokonc\w*|ukoncil\w*|zacal\w* pracovat)\b',text) and re.search(r'\b(?:prac\w*|projekt\w*)\b',text)): 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' if re.search(r'\b(?:aspon|najviac|viac ako|menej ako|minimalne|maximalne)\s+\d+', 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 { '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]