Kouhei Sutou 2018-10-29 15:42:32 +0900 (Mon, 29 Oct 2018) Revision: c0e0921158b8b8a0976d3f40136e5b680d071c46 https://github.com/groonga/groonga/commit/c0e0921158b8b8a0976d3f40136e5b680d071c46 Message: Extend token filter creation API grn_token_filter_init_func is deprecated. Use grn_token_filter_init_query_func instead. grn_token_filter_register() is deprecated. Use the followings instead: * grn_token_filter_create() * grn_token_filter_set_init_func() * grn_token_filter_set_filter_func() * grn_token_filter_set_fin_func() Modified files: include/groonga/token_filter.h lib/grn_db.h lib/token_cursor.c lib/token_filter.c Modified: include/groonga/token_filter.h (+24 -0) =================================================================== --- include/groonga/token_filter.h 2018-10-29 15:40:03 +0900 (6b09add12) +++ include/groonga/token_filter.h 2018-10-29 15:42:32 +0900 (907ac0edd) @@ -1,6 +1,7 @@ /* -*- c-basic-offset: 2 -*- */ /* Copyright(C) 2014-2016 Brazil + Copyright(C) 2018 Kouhei Sutou <kou****@clear*****> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,10 +25,14 @@ extern "C" { #endif /* __cplusplus */ +/* Deprecated since 8.0.9. Use grn_token_filter_init_query_func instead. */ typedef void *grn_token_filter_init_func(grn_ctx *ctx, grn_obj *table, grn_tokenize_mode mode); +typedef void *grn_token_filter_init_query_func(grn_ctx *ctx, + grn_tokenizer_query *query); + typedef void grn_token_filter_filter_func(grn_ctx *ctx, grn_token *current_token, grn_token *next_token, @@ -54,6 +59,9 @@ typedef void grn_token_filter_fin_func(grn_ctx *ctx, grn_token_filter_register() returns GRN_SUCCESS on success, an error code on failure. + + Deprecated since 8.0.9. Use grn_token_filter_create() and + grn_token_filter_set_XXX_func() instead. */ GRN_PLUGIN_EXPORT grn_rc grn_token_filter_register(grn_ctx *ctx, const char *plugin_name_ptr, @@ -62,6 +70,22 @@ GRN_PLUGIN_EXPORT grn_rc grn_token_filter_register(grn_ctx *ctx, grn_token_filter_filter_func *filter, grn_token_filter_fin_func *fin); +GRN_PLUGIN_EXPORT grn_obj * +grn_token_filter_create(grn_ctx *ctx, const char *name, int name_length); + +GRN_PLUGIN_EXPORT grn_rc +grn_token_filter_set_init_func(grn_ctx *ctx, + grn_obj *token_filter, + grn_token_filter_init_query_func *init); +GRN_PLUGIN_EXPORT grn_rc +grn_token_filter_set_filter_func(grn_ctx *ctx, + grn_obj *token_filter, + grn_token_filter_filter_func *filter); +GRN_PLUGIN_EXPORT grn_rc +grn_token_filter_set_fin_func(grn_ctx *ctx, + grn_obj *token_filter, + grn_token_filter_fin_func *fin); + #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ Modified: lib/grn_db.h (+2 -0) =================================================================== --- lib/grn_db.h 2018-10-29 15:40:03 +0900 (02acd9267) +++ lib/grn_db.h 2018-10-29 15:42:32 +0900 (e2734f425) @@ -1,6 +1,7 @@ /* -*- c-basic-offset: 2 -*- */ /* Copyright(C) 2009-2018 Brazil + Copyright(C) 2018 Kouhei Sutou <kou****@clear*****> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -277,6 +278,7 @@ struct _grn_proc { } tokenizer; struct { grn_token_filter_init_func *init; + grn_token_filter_init_query_func *init_query; grn_token_filter_filter_func *filter; grn_token_filter_fin_func *fin; } token_filter; Modified: lib/token_cursor.c (+17 -4) =================================================================== --- lib/token_cursor.c 2018-10-29 15:40:03 +0900 (f882c3f2f) +++ lib/token_cursor.c 2018-10-29 15:42:32 +0900 (10d5f008a) @@ -1,6 +1,7 @@ /* -*- c-basic-offset: 2 -*- */ /* Copyright(C) 2009-2018 Brazil + Copyright(C) 2018 Kouhei Sutou <kou****@clear*****> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,6 +29,7 @@ grn_token_cursor_open_initialize_token_filters(grn_ctx *ctx, { grn_obj *token_filters = token_cursor->token_filter.objects; unsigned int i, n_token_filters; + grn_tokenizer_query *query = &(token_cursor->tokenizer.query); token_cursor->token_filter.data = NULL; @@ -50,10 +52,16 @@ grn_token_cursor_open_initialize_token_filters(grn_ctx *ctx, grn_obj *token_filter_object = GRN_PTR_VALUE_AT(token_filters, i); grn_proc *token_filter = (grn_proc *)token_filter_object; - token_cursor->token_filter.data[i] = - token_filter->callbacks.token_filter.init(ctx, - token_cursor->table, - token_cursor->mode); + if (token_filter->callbacks.token_filter.init_query) { + grn_tokenizer_query_set_token_filter_index(ctx, query, i); + token_cursor->token_filter.data[i] = + token_filter->callbacks.token_filter.init_query(ctx, query); + } else { + token_cursor->token_filter.data[i] = + token_filter->callbacks.token_filter.init(ctx, + token_cursor->table, + token_cursor->mode); + } } } @@ -164,6 +172,7 @@ grn_token_cursor_next_apply_token_filters(grn_ctx *ctx, unsigned int i, n_token_filters; grn_token *current_token = &(token_cursor->tokenizer.current_token); grn_token *next_token = &(token_cursor->tokenizer.next_token); + grn_tokenizer_query *query = &(token_cursor->tokenizer.query); if (token_filters) { n_token_filters = GRN_BULK_VSIZE(token_filters) / sizeof(grn_obj *); @@ -178,6 +187,8 @@ grn_token_cursor_next_apply_token_filters(grn_ctx *ctx, grn_proc *token_filter = (grn_proc *)token_filter_object; void *data = token_cursor->token_filter.data[i]; + grn_tokenizer_query_set_token_filter_index(ctx, query, i); + #define SKIP_FLAGS \ (GRN_TOKEN_SKIP | \ GRN_TOKEN_SKIP_WITH_POSITION) @@ -371,6 +382,7 @@ grn_token_cursor_close_token_filters(grn_ctx *ctx, { grn_obj *token_filters = token_cursor->token_filter.objects; unsigned int i, n_token_filters; + grn_tokenizer_query *query = &(token_cursor->tokenizer.query); if (!token_cursor->token_filter.data) { return; @@ -391,6 +403,7 @@ grn_token_cursor_close_token_filters(grn_ctx *ctx, grn_proc *token_filter = (grn_proc *)token_filter_object; void *data = token_cursor->token_filter.data[i]; + grn_tokenizer_query_set_token_filter_index(ctx, query, i); token_filter->callbacks.token_filter.fin(ctx, data); } GRN_FREE(token_cursor->token_filter.data); Modified: lib/token_filter.c (+76 -0) =================================================================== --- lib/token_filter.c 2018-10-29 15:40:03 +0900 (a564bdfb8) +++ lib/token_filter.c 2018-10-29 15:42:32 +0900 (54b761452) @@ -57,3 +57,79 @@ grn_token_filter_register(grn_ctx *ctx, return GRN_SUCCESS; } + +grn_obj * +grn_token_filter_create(grn_ctx *ctx, const char *name, int length) +{ + grn_obj *token_filter; + + GRN_API_ENTER; + token_filter = grn_proc_create(ctx, + name, + length, + GRN_PROC_TOKEN_FILTER, + NULL, + NULL, + NULL, + 0, + NULL); + if (!token_filter) { + if (length < 0) { + length = strlen(name); + } + GRN_PLUGIN_ERROR(ctx, + GRN_TOKEN_FILTER_ERROR, + "[token-filter][create] failed to create: <%.*s>", + length, name); + } + + GRN_API_RETURN(token_filter); +} + +grn_rc +grn_token_filter_set_init_func(grn_ctx *ctx, + grn_obj *token_filter, + grn_token_filter_init_query_func *init) +{ + GRN_API_ENTER; + if (token_filter) { + ((grn_proc *)token_filter)->callbacks.token_filter.init_query = init; + } else { + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "[token-filter][init][set] token filter is NULL"); + } + GRN_API_RETURN(ctx->rc); +} + +grn_rc +grn_token_filter_set_filter_func(grn_ctx *ctx, + grn_obj *token_filter, + grn_token_filter_filter_func *filter) +{ + GRN_API_ENTER; + if (token_filter) { + ((grn_proc *)token_filter)->callbacks.token_filter.filter = filter; + } else { + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "[token-filter][filter][set] token filter is NULL"); + } + GRN_API_RETURN(ctx->rc); +} + +grn_rc +grn_token_filter_set_fin_func(grn_ctx *ctx, + grn_obj *token_filter, + grn_token_filter_fin_func *fin) +{ + GRN_API_ENTER; + if (token_filter) { + ((grn_proc *)token_filter)->callbacks.token_filter.fin = fin; + } else { + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "[token-filter][fin][set] token filter is NULL"); + } + GRN_API_RETURN(ctx->rc); +} -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20181029/b0033b44/attachment-0001.html>