in mysqlx-connector-python/lib/mysqlx/expr.py [0:0]
def ilri_expr(self) -> MessageType:
params = []
lhs = self.comp_expr()
is_not = False
if self.cur_token_type_is(TokenType.NOT):
is_not = True
self.consume_token(TokenType.NOT)
if self.pos < len(self.tokens):
params.append(lhs.get_message())
op_name = self.tokens[self.pos].value
if self.cur_token_type_is(TokenType.IS):
self.consume_token(TokenType.IS)
# for IS, NOT comes AFTER
if self.cur_token_type_is(TokenType.NOT):
is_not = True
self.consume_token(TokenType.NOT)
params.append(self.comp_expr().get_message())
elif self.cur_token_type_is(TokenType.IN):
self.consume_token(TokenType.IN)
if self.cur_token_type_is(TokenType.LPAREN):
params.extend(self.paren_expr_list())
else:
op_name = "cont_in"
params.append(self.comp_expr().get_message())
elif self.cur_token_type_is(TokenType.OVERLAPS):
self.consume_token(TokenType.OVERLAPS)
params.append(self.comp_expr().get_message())
elif self.cur_token_type_is(TokenType.LIKE):
self.consume_token(TokenType.LIKE)
params.append(self.comp_expr().get_message())
if self.cur_token_type_is(TokenType.ESCAPE):
self.consume_token(TokenType.ESCAPE)
params.append(self.comp_expr().get_message())
elif self.cur_token_type_is(TokenType.BETWEEN):
self.consume_token(TokenType.BETWEEN)
params.append(self.comp_expr().get_message())
self.consume_token(TokenType.AND)
params.append(self.comp_expr().get_message())
elif self.cur_token_type_is(TokenType.REGEXP):
self.consume_token(TokenType.REGEXP)
params.append(self.comp_expr().get_message())
else:
if is_not:
raise ValueError(f"Unknown token after NOT as pos {self.pos}")
op_name = None # not an operator we're interested in
if op_name:
operator = Message("Mysqlx.Expr.Operator")
operator["name"] = _NEGATION[op_name] if is_not else op_name
operator["param"] = params
msg_expr = Message("Mysqlx.Expr.Expr")
msg_expr["type"] = mysqlxpb_enum("Mysqlx.Expr.Expr.Type.OPERATOR")
msg_expr["operator"] = operator.get_message()
lhs = msg_expr
return lhs