[Groonga-commit] groonga/groonga at c0e0921 [master] Extend token filter creation API

Back to archive index
Kouhei Sutou null+****@clear*****
Mon Oct 29 15:42:32 JST 2018


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>


More information about the Groonga-commit mailing list
Back to archive index