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