def parse(self, query_text: str) -> SearchQuery: query = SearchQuery() for chunk in re.split(r"\s+", (query_text or "").lower()): if not chunk: continue negated = False if chunk[0] == "-": chunk = chunk[1:] negated = True if not chunk: raise errors.SearchError("Empty negated token.") match = re.match(r"^(.*?)(?<!\\):(.*)$", chunk) if match: key, value = list(match.groups()) key = util.unescape(key) if key == "sort": query.sort_tokens.append(_parse_sort(value, negated)) elif key == "special": query.special_tokens.append(_parse_special(value, negated)) else: query.named_tokens.append(_parse_named( key, value, negated)) else: query.anonymous_tokens.append(_parse_anonymous(chunk, negated)) return query
def parse(self, query_text: str) -> SearchQuery: query = SearchQuery() for chunk in re.split(r'\s+', (query_text or '').lower()): if not chunk: continue negated = False if chunk[0] == '-': chunk = chunk[1:] negated = True if not chunk: raise errors.SearchError('비어있는 부정 토큰.') match = re.match(r'^(.*?)(?<!\\):(.*)$', chunk) if match: key, value = list(match.groups()) key = util.unescape(key) if key == 'sort': query.sort_tokens.append(_parse_sort(value, negated)) elif key == 'special': query.special_tokens.append(_parse_special(value, negated)) else: query.named_tokens.append(_parse_named( key, value, negated)) else: query.anonymous_tokens.append(_parse_anonymous(chunk, negated)) return query
def on_search_query_parsed(self, search_query: SearchQuery) -> SaQuery: new_special_tokens = [] for token in search_query.special_tokens: if token.value in ('fav', 'liked', 'disliked'): assert self.user if self.user.rank == 'anonymous': raise errors.SearchError('이 기능을 사용하기 위해서는 로그인해야 합니다.') criterion = criteria.PlainCriterion( original_text=self.user.name, value=self.user.name) setattr(criterion, 'internal', True) search_query.named_tokens.append( tokens.NamedToken(name=token.value, criterion=criterion, negated=token.negated)) else: new_special_tokens.append(token) search_query.special_tokens = new_special_tokens
def on_search_query_parsed(self, search_query: SearchQuery) -> SaQuery: new_special_tokens = [] for token in search_query.special_tokens: if token.value in ("fav", "liked", "disliked"): assert self.user if self.user.rank == "anonymous": raise errors.SearchError( "Must be logged in to use this feature.") criterion = criteria.PlainCriterion( original_text=self.user.name, value=self.user.name) setattr(criterion, "internal", True) search_query.named_tokens.append( tokens.NamedToken( name=token.value, criterion=criterion, negated=token.negated, )) else: new_special_tokens.append(token) search_query.special_tokens = new_special_tokens
def on_search_query_parsed(self, search_query: SearchQuery) -> SaQuery: new_special_tokens = [] for token in search_query.special_tokens: if token.value in ('fav', 'liked', 'disliked'): assert self.user if self.user.rank == 'anonymous': raise errors.SearchError( 'Must be logged in to use this feature.') criterion = criteria.PlainCriterion( original_text=self.user.name, value=self.user.name) setattr(criterion, 'internal', True) search_query.named_tokens.append( tokens.NamedToken( name=token.value, criterion=criterion, negated=token.negated)) else: new_special_tokens.append(token) search_query.special_tokens = new_special_tokens
def parse(self, query_text: str) -> SearchQuery: query = SearchQuery() for chunk in re.split(r'\s+', (query_text or '').lower()): if not chunk: continue negated = False while chunk[0] == '-': chunk = chunk[1:] negated = not negated match = re.match('([a-z_-]+):(.*)', chunk) if match: key, value = list(match.groups()) if key == 'sort': query.sort_tokens.append(_parse_sort(value, negated)) elif key == 'special': query.special_tokens.append(_parse_special(value, negated)) else: query.named_tokens.append(_parse_named( key, value, negated)) else: query.anonymous_tokens.append(_parse_anonymous(chunk, negated)) return query