40 lines
900 B
Python
40 lines
900 B
Python
import re
|
|
|
|
|
|
_NON_DIGIT_RE = re.compile(r"\D+")
|
|
_NON_ALNUM_RE = re.compile(r"[^0-9A-Za-z]+")
|
|
|
|
|
|
def normalize_phone(value: str | None) -> str | None:
|
|
if not value:
|
|
return None
|
|
normalized = _NON_DIGIT_RE.sub("", str(value))
|
|
return normalized or None
|
|
|
|
|
|
def normalize_tracking(value: str | None) -> str | None:
|
|
if not value:
|
|
return None
|
|
normalized = _NON_ALNUM_RE.sub("", str(value)).upper()
|
|
return normalized or None
|
|
|
|
|
|
def fts_phrase(value: str) -> str:
|
|
escaped = str(value).strip().replace('"', '""')
|
|
return f'"{escaped}"'
|
|
|
|
|
|
def can_use_trigram_fts(value: str | None) -> bool:
|
|
if not value:
|
|
return False
|
|
return len(str(value).strip()) >= 3
|
|
|
|
|
|
def prefix_upper_bound(value: str) -> str | None:
|
|
if not value:
|
|
return None
|
|
last = value[-1]
|
|
if last == "\uffff":
|
|
return None
|
|
return value[:-1] + chr(ord(last) + 1)
|