转载请注明出处https://blog.csdn.net/qq_41657315/article/details/82312790
枚举:
fts_ast_type_t {
FTS_AST_OPER, FTS_AST_NUMB, FTS_AST_TERM, FTS_AST_TEXT,
FTS_AST_PARSER_PHRASE_LIST, FTS_AST_LIST, FTS_AST_SUBEXP_LIST
}
fts_ast_oper_t {
FTS_NONE, FTS_IGNORE, FTS_EXIST, FTS_NEGATE,
FTS_INCR_RATING, FTS_DECR_RATING, FTS_DISTANCE, FTS_IGNORE_SKIP,
FTS_EXIST_SKIP
}
意图:
枚举fts_ast_oper_t |
枚举 | |
---|---|
FTS_NONE | 没有操作员。 |
FTS_IGNORE | 忽略包含此单词的行。 |
FTS_EXIST | 包括包含此单词的行。 |
FTS_NEGATE | 包含包含此单词但排名较低的行。 |
FTS_INCR_RATING | 提高这个词的排名。 |
FTS_DECR_RATING | 降低这个词的排名。 |
FTS_DISTANCE | 接近距离。 |
FTS_IGNORE_SKIP | 瞬态节点运算符表示这是一个FTS_IGNORE节点,并在fts_ast_visit()的第一次传递中被忽略 |
FTS_EXIST_SKIP | 瞬态节点运算符表示这是一个FTS_EXIST节点,并在fts_ast_visit()的第一遍中被忽略 |
枚举fts_ast_type_t |
枚举 | |
---|---|
FTS_AST_OPER | 操作员。 |
FTS_AST_NUMB | 数。 |
FTS_AST_TERM | 术语(或单词) |
FTS_AST_TEXT | 文字字符串。 |
FTS_AST_PARSER_PHRASE_LIST | 插件解析器的阶段与文本类型的不同之处在于我们将文本标记为术语列表。 |
FTS_AST_LIST | 表达列表。 |
FTS_AST_SUBEXP_LIST | 子表达式列表。 |
此文解析fts0ast.cc
enum fts_ast_visit_pass_t {
FTS_PASS_FIRST,
FTS_PASS_EXIST,
FTS_PASS_IGNORE
};
标记节点访问情况,第一遍忽略+或者 - 号的单词(在布尔模式下),第二遍搜寻+号后面单词,第三遍搜寻 - 号后面的单词。
static fts_ast_node_t *fts_ast_node_create(void)
使用类似molloc函数分配节点空间。并且将该节点作为返回值返回。
static void fts_ast_state_add_node(
fts_ast_state_t *state, /*!< in: AST实例 */
fts_ast_node_t *node) /*!< in: 加入AST节点 */
类似于单链表,只不过有头和尾两个指针控制,将新节点连接在链表末尾。
fts_ast_node_t *fts_ast_create_node_oper(
void *arg, /*!< in: ast state 实例 */
fts_ast_oper_t oper) /*!< in: ast 操作 */
合并前两个操作,fst_ast_node_create和fts_ast_state_add_node。
fts_ast_node_t *fts_ast_create_node_term(
void *arg, /*!< in: ast state 实例 */
const fts_ast_string_t *ptr) /*!< in: ast 字符串 */
此函数将PTR每个单词剥离出来,但是在默认情况下单词长度必须在3-84范围内,通过而循环以及字符串遍历位置操作,并且用链表将其连接起来。每个节点具有属性FTS_AST_TERM。
fts_ast_node_t *fts_ast_create_node_term_for_parser(
void *arg, /*!< in: ast state */
const char *ptr, /*!< in: term string */
const ulint len) /*!< in: term string length */
如果查询的ptr想要使用FTS那么PTR必须严格按照%不可以在最前面,但是任然可以在最后面。将查询的PTR打包成节点节点以供查询。
fts_ast_node_t *fts_ast_create_node_text(
void *arg, /*!< in: ast state instance */
const fts_ast_string_t *ptr) /*!< in: ast text string */
字符串(text)必须至少有2个引号“”查询字符串周围,可能是空的。即便查询string中可能包含0x00,我们不会将其视为以null结尾
将PTR转化为字符串(去掉“”),并将其加入节点中。
fts_ast_node_t *fts_ast_create_node_phrase_list(void *arg) /*!< in: ast state */
创建一个链式的头节点替解释器。并将该节点返回,并标记为FTS_AST_PARSER_PHRASE_LIST。
fts_ast_node_t *fts_ast_create_node_subexp_list(
void *arg, /*!< in: ast state instance */
fts_ast_node_t *expr) /*!< in: ast expr instance */
创建子表达式的头节点,并标记为FTS_AST_SUBEXP_LIST;
fts_ast_node_t *fts_ast_create_node_list(
void *arg, /*!< in: ast state instance */
fts_ast_node_t *expr) /*!< in: ast expr instance */
创建链表的节点,并标记该节点为FTS_AST_LIST。
static void fts_ast_free_list(fts_ast_node_t *node) /*!< in: ast node to free */
如果节点是FTS_AST_LIST,FTS_AST_SUBEXP_LIST,FTS_AST_PARSER_PHRASE_LIST,那么就进行自由操作。调用对节点的自由程序解决。
fts_ast_node_t *fts_ast_free_node(
fts_ast_node_t *node) /*!< in: the node to free */
如果仅仅是单节点,一次free node即可解决问题。但是如果是链表通过递归调用即可解决问题(可能和自由列表交叉调用);
fts_ast_node_t *fts_ast_add_node(
fts_ast_node_t *node, /*!< in: list instance */
fts_ast_node_t *elem) /*!< in: node to add to list */
node一定要是链表头,将elem加入节点中。
void fts_ast_term_set_wildcard(
fts_ast_node_t *node) /*!< in/out: set attribute of
a term node */
如果节点是FTS_AST_LIST类型那么就将其定位到链表末尾,作为通配符,并且将通配符标志旗点亮。
void fts_ast_text_set_distance(fts_ast_node_t *node, /*!< in/out: text node */
ulint distance) /*!< in: the text proximity
distance */
如果节点是FTS_AST_TEXT且距离未定义,那么就定义距离。
void fts_ast_state_free(fts_ast_state_t *state) /*!< in: ast state to free */
分解解析期创建的链表。和正常链表删除差不多但是要分析链表的类型。
static void fts_ast_string_print(const fts_ast_string_t *ast_str)
打印字符串(遍历字符串)。
static void fts_ast_node_print_recursive(
fts_ast_node_t *node, /*!< in: ast node to print */
ulint level) /*!< in: recursive level */
链表类型就会递归到下层处理,非链表类型直接处理。
bool fts_ast_node_check_union(fts_ast_node_t *node)
如果节点类型是FTS_AST_LIST,FTS_AST_SUBEXP_LIST,FTS_AST_PARSER_PHRASE_LIST,那么就要考察递归的考察下个节点。
如果节点类型是FTS_AST_OPER,FTS_IGNORE,FTS_EXIST,FTS_AST_TEXT那么返回false。
此处考察复合查询。
dberr_t fts_ast_visit(fts_ast_oper_t oper, /*!< in: current operator */
fts_ast_node_t *node, /*!< in: current root node */
fts_ast_callback visitor, /*!< in: callback function */
void *arg, /*!< in: arg for callback */
bool *has_ignore) /*!< out: true, if the operator
was ignored during processing,
currently we ignore FTS_EXIST
and FTS_IGNORE operators */
处理(在布尔模式下)模式下的,如文首处枚举类型!