[Groonga-commit] groonga/groonga at 72b7ab6 [master] Support term expansion by no _key column

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Aug 23 12:40:39 JST 2017


Kouhei Sutou	2017-08-23 12:40:39 +0900 (Wed, 23 Aug 2017)

  New Revision: 72b7ab66eb0801210b90c40fdb5bc70efa086de4
  https://github.com/groonga/groonga/commit/72b7ab66eb0801210b90c40fdb5bc70efa086de4

  Message:
    Support term expansion by no _key column
    
    It's recommend that the term column is indexed but it works without
    index.
    
    New API:
    
      * grn_expr_syntax_expand_query_by_table()
    
    query_expand has two new parameters:
    
      * term_column
      * expanded_term_column
    
    TODO:
    
      * Update query_expand document
      * Add query_expand_term_column and query_expand_expanded_term_column
        parameters to select

  Added files:
    test/command/suite/query_expand/table/indexed_term_column.expected
    test/command/suite/query_expand/table/indexed_term_column.test
    test/command/suite/query_expand/table/no_indexed_term_column.expected
    test/command/suite/query_expand/table/no_indexed_term_column.test
    test/command/suite/query_expand/table/no_term_column.expected
    test/command/suite/query_expand/table/no_term_column.test
    test/command/suite/query_expand/table/scalar_expanded_term_column.expected
    test/command/suite/query_expand/table/scalar_expanded_term_column.test
    test/command/suite/query_expand/table/vector_expanded_term_column.expected
    test/command/suite/query_expand/table/vector_expanded_term_column.test
  Modified files:
    include/groonga/expr.h
    lib/expr.c
    lib/grn_proc.h
    lib/proc.c
    lib/proc/proc_query.c
    lib/proc/proc_select.c

  Modified: include/groonga/expr.h (+8 -1)
===================================================================
--- include/groonga/expr.h    2017-08-23 09:21:14 +0900 (a0c4a2fd8)
+++ include/groonga/expr.h    2017-08-23 12:40:39 +0900 (0665f7f59)
@@ -1,5 +1,5 @@
 /*
-  Copyright(C) 2009-2016 Brazil
+  Copyright(C) 2009-2017 Brazil
 
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -71,6 +71,13 @@ GRN_API grn_rc grn_expr_syntax_expand_query(grn_ctx *ctx,
                                             grn_expr_flags flags,
                                             grn_obj *expander,
                                             grn_obj *expanded_query);
+GRN_API grn_rc grn_expr_syntax_expand_query_by_table(grn_ctx *ctx,
+                                                     const char *query,
+                                                     int query_size,
+                                                     grn_expr_flags flags,
+                                                     grn_obj *term_column,
+                                                     grn_obj *expanded_term_column,
+                                                     grn_obj *expanded_query);
 
 GRN_API grn_rc grn_expr_compile(grn_ctx *ctx, grn_obj *expr);
 GRN_API grn_obj *grn_expr_rewrite(grn_ctx *ctx, grn_obj *expr);

  Modified: lib/expr.c (+226 -7)
===================================================================
--- lib/expr.c    2017-08-23 09:21:14 +0900 (0671d9f63)
+++ lib/expr.c    2017-08-23 12:40:39 +0900 (27ab8e8ed)
@@ -8403,11 +8403,6 @@ typedef grn_rc (*grn_expr_syntax_expand_term_func)(grn_ctx *ctx,
                                                    unsigned int term_len,
                                                    grn_obj *substituted_term,
                                                    grn_user_data *user_data);
-typedef struct {
-  grn_obj *table;
-  grn_obj *column;
-} grn_expr_syntax_expand_term_by_column_data;
-
 static grn_rc
 grn_expr_syntax_expand_term_by_func(grn_ctx *ctx,
                                     const char *term, unsigned int term_len,
@@ -8438,6 +8433,11 @@ grn_expr_syntax_expand_term_by_func(grn_ctx *ctx,
   return rc;
 }
 
+typedef struct {
+  grn_obj *table;
+  grn_obj *column;
+} grn_expr_syntax_expand_term_by_column_data;
+
 static grn_rc
 grn_expr_syntax_expand_term_by_column(grn_ctx *ctx,
                                       const char *term, unsigned int term_len,
@@ -8481,6 +8481,123 @@ grn_expr_syntax_expand_term_by_column(grn_ctx *ctx,
   return rc;
 }
 
+typedef struct {
+  grn_obj *table;
+  grn_obj *term_column;
+  grn_obj *expanded_term_column;
+} grn_expr_syntax_expand_term_by_table_data;
+
+static grn_rc
+grn_expr_syntax_expand_term_by_table(grn_ctx *ctx,
+                                     const char *term, unsigned int term_len,
+                                     grn_obj *expanded_term,
+                                     grn_user_data *user_data)
+{
+  grn_rc rc = GRN_END_OF_DATA;
+  grn_expr_syntax_expand_term_by_table_data *data = user_data->ptr;
+  grn_obj *table;
+  grn_obj *term_column;
+  grn_obj *expanded_term_column;
+  grn_obj *expression;
+  grn_obj *variable;
+  grn_obj *found_terms;
+  int n_terms;
+
+  table = data->table;
+  term_column = data->term_column;
+  expanded_term_column = data->expanded_term_column;
+
+  GRN_EXPR_CREATE_FOR_QUERY(ctx, table, expression, variable);
+  if (ctx->rc != GRN_SUCCESS) {
+    ERR(ctx->rc,
+        "[query][expand][table] "
+        "failed to create expression: <%s>",
+        ctx->errbuf);
+    return ctx->rc;
+  }
+  grn_expr_append_const(ctx, expression, term_column, GRN_OP_GET_VALUE, 1);
+  grn_expr_append_const_str(ctx, expression, term, term_len, GRN_OP_PUSH, 1);
+  grn_expr_append_op(ctx, expression, GRN_OP_EQUAL, 2);
+  if (ctx->rc != GRN_SUCCESS) {
+    grn_obj_close(ctx, expression);
+    ERR(ctx->rc,
+        "[query][expand][table] "
+        "failed to build expression: <%s>",
+        ctx->errbuf);
+    return ctx->rc;
+  }
+
+  found_terms = grn_table_select(ctx, table, expression, NULL, GRN_OP_OR);
+  grn_obj_close(ctx, expression);
+  if (!found_terms) {
+    ERR(ctx->rc,
+        "[query][expand][table] "
+        "failed to find term: <%.*s>: <%s>",
+        (int)term_len,
+        term,
+        ctx->errbuf);
+    return ctx->rc;
+  }
+
+  n_terms = grn_table_size(ctx, found_terms);
+  if (n_terms == 0) {
+    grn_obj_close(ctx, found_terms);
+    return rc;
+  }
+
+  {
+    int nth_term;
+
+    GRN_TEXT_PUTC(ctx, expanded_term, '(');
+    nth_term = 0;
+    GRN_TABLE_EACH_BEGIN(ctx, found_terms, cursor, id) {
+      void *key;
+      grn_id record_id;
+
+      grn_table_cursor_get_key(ctx, cursor, &key);
+      record_id = *((grn_id *)key);
+      if (grn_obj_is_vector_column(ctx, expanded_term_column)) {
+        unsigned int j, n_values;
+        grn_obj values;
+        GRN_TEXT_INIT(&values, GRN_OBJ_VECTOR);
+        grn_obj_get_value(ctx, expanded_term_column, record_id, &values);
+        n_values = grn_vector_size(ctx, &values);
+        n_terms += n_values - 1;
+        for (j = 0; j < n_values; j++) {
+          const char *value;
+          unsigned int length;
+          if (nth_term > 0) {
+            GRN_TEXT_PUTS(ctx, expanded_term, " OR ");
+          }
+          if (n_terms > 1) {
+            GRN_TEXT_PUTC(ctx, expanded_term, '(');
+          }
+          length = grn_vector_get_element(ctx, &values, j, &value, NULL, NULL);
+          GRN_TEXT_PUT(ctx, expanded_term, value, length);
+          if (n_terms > 1) {
+            GRN_TEXT_PUTC(ctx, expanded_term, ')');
+          }
+          nth_term++;
+        }
+        GRN_OBJ_FIN(ctx, &values);
+      } else {
+        if (nth_term > 0) {
+          GRN_TEXT_PUTS(ctx, expanded_term, " OR ");
+        }
+        if (n_terms > 1) { GRN_TEXT_PUTC(ctx, expanded_term, '('); }
+        grn_obj_get_value(ctx, expanded_term_column, record_id, expanded_term);
+        if (n_terms > 1) { GRN_TEXT_PUTC(ctx, expanded_term, ')'); }
+        nth_term++;
+      }
+    } GRN_TABLE_EACH_END(ctx, cursor);
+    GRN_TEXT_PUTC(ctx, expanded_term, ')');
+  }
+  rc = GRN_SUCCESS;
+  grn_obj_close(ctx, found_terms);
+
+  return rc;
+}
+
 static grn_rc
 grn_expr_syntax_expand_query_terms(grn_ctx *ctx,
                                    const char *query, unsigned int query_size,
@@ -8627,7 +8744,7 @@ grn_expr_syntax_expand_query(grn_ctx *ctx,
       int name_size;
       name_size = grn_obj_name(ctx, expander, name, GRN_TABLE_MAX_KEY_SIZE);
       ERR(GRN_INVALID_ARGUMENT,
-          "[query][expand] "
+          "[query][expand][proc] "
           "proc query expander must be a function proc: <%.*s>",
           name_size, name);
     }
@@ -8654,7 +8771,7 @@ grn_expr_syntax_expand_query(grn_ctx *ctx,
         int name_size;
         name_size = grn_obj_name(ctx, expander, name, GRN_TABLE_MAX_KEY_SIZE);
         ERR(GRN_INVALID_ARGUMENT,
-            "[query][expand] "
+            "[query][expand][column] "
             "failed to get table of query expansion column: <%.*s>",
             name_size, name);
       }
@@ -8683,6 +8800,108 @@ grn_expr_syntax_expand_query(grn_ctx *ctx,
 }
 
 grn_rc
+grn_expr_syntax_expand_query_by_table(grn_ctx *ctx,
+                                      const char *query, int query_size,
+                                      grn_expr_flags flags,
+                                      grn_obj *term_column,
+                                      grn_obj *expanded_term_column,
+                                      grn_obj *expanded_query)
+{
+  grn_obj *table;
+  grn_bool term_column_is_key;
+
+  GRN_API_ENTER;
+
+  if (query_size < 0) {
+    query_size = strlen(query);
+  }
+
+  if (!grn_obj_is_data_column(ctx, expanded_term_column)) {
+    grn_obj inspected;
+    GRN_TEXT_INIT(&inspected, 0);
+    grn_inspect(ctx, &inspected, expanded_term_column);
+    ERR(GRN_INVALID_ARGUMENT,
+        "[query][expand][table] "
+        "expanded term column must be a data column: <%.*s>",
+        (int)GRN_TEXT_LEN(&inspected),
+        GRN_TEXT_VALUE(&inspected));
+    GRN_OBJ_FIN(ctx, &inspected);
+    GRN_API_RETURN(ctx->rc);
+  }
+  table = grn_column_table(ctx, expanded_term_column);
+
+  if (!term_column) {
+    term_column_is_key = GRN_TRUE;
+  } else {
+    if (grn_obj_is_key_accessor(ctx, term_column)) {
+      term_column_is_key = GRN_TRUE;
+    } else if (grn_obj_is_data_column(ctx, term_column)) {
+      term_column_is_key = GRN_FALSE;
+    } else {
+      grn_obj inspected;
+      GRN_TEXT_INIT(&inspected, 0);
+      grn_inspect(ctx, &inspected, term_column);
+      ERR(GRN_INVALID_ARGUMENT,
+          "[query][expand][table] "
+          "term column must be NULL, _key or a data column: <%.*s>",
+          (int)GRN_TEXT_LEN(&inspected),
+          GRN_TEXT_VALUE(&inspected));
+      GRN_OBJ_FIN(ctx, &inspected);
+      GRN_API_RETURN(ctx->rc);
+    }
+    if (term_column->header.domain != expanded_term_column->header.domain) {
+      grn_obj inspected_term_column;
+      grn_obj inspected_expanded_term_column;
+      GRN_TEXT_INIT(&inspected_term_column, 0);
+      GRN_TEXT_INIT(&inspected_expanded_term_column, 0);
+      grn_inspect(ctx, &inspected_term_column, term_column);
+      grn_inspect(ctx, &inspected_expanded_term_column, expanded_term_column);
+      ERR(GRN_INVALID_ARGUMENT,
+          "[query][expand][table] "
+          "term column and expanded term column must belong to the same table: "
+          "term column: <%.*s>, "
+          "expanded term column: <%*.s>",
+          (int)GRN_TEXT_LEN(&inspected_term_column),
+          GRN_TEXT_VALUE(&inspected_term_column),
+          (int)GRN_TEXT_LEN(&inspected_expanded_term_column),
+          GRN_TEXT_VALUE(&inspected_expanded_term_column));
+      GRN_OBJ_FIN(ctx, &inspected_term_column);
+      GRN_OBJ_FIN(ctx, &inspected_expanded_term_column);
+      GRN_API_RETURN(ctx->rc);
+    }
+  }
+
+  if (term_column_is_key) {
+    grn_user_data user_data;
+    grn_expr_syntax_expand_term_by_column_data data;
+    user_data.ptr = &data;
+    data.table = table;
+    data.column = expanded_term_column;
+    grn_expr_syntax_expand_query_terms(ctx,
+                                       query, query_size,
+                                       flags,
+                                       expanded_query,
+                                       grn_expr_syntax_expand_term_by_column,
+                                       &user_data);
+  } else {
+    grn_user_data user_data;
+    grn_expr_syntax_expand_term_by_table_data data;
+    user_data.ptr = &data;
+    data.table = table;
+    data.term_column = term_column;
+    data.expanded_term_column = expanded_term_column;
+    grn_expr_syntax_expand_query_terms(ctx,
+                                       query, query_size,
+                                       flags,
+                                       expanded_query,
+                                       grn_expr_syntax_expand_term_by_table,
+                                       &user_data);
+  }
+
+  GRN_API_RETURN(ctx->rc);
+}
+
+grn_rc
 grn_expr_get_keywords(grn_ctx *ctx, grn_obj *expr, grn_obj *keywords)
 {
   int i, n;

  Modified: lib/grn_proc.h (+4 -0)
===================================================================
--- lib/grn_proc.h    2017-08-23 09:21:14 +0900 (7c63f15b6)
+++ lib/grn_proc.h    2017-08-23 12:40:39 +0900 (961ce3e46)
@@ -135,6 +135,10 @@ grn_rc grn_proc_syntax_expand_query(grn_ctx *ctx,
                                     grn_expr_flags flags,
                                     const char *query_expander_name,
                                     unsigned int query_expander_name_len,
+                                    const char *term_column_name,
+                                    unsigned int term_column_name_len,
+                                    const char *expanded_term_column_name,
+                                    unsigned int expanded_term_column_name_len,
                                     grn_obj *expanded_query,
                                     const char *error_message_tag);
 

  Modified: lib/proc.c (+2 -0)
===================================================================
--- lib/proc.c    2017-08-23 09:21:14 +0900 (aa9befdd4)
+++ lib/proc.c    2017-08-23 12:40:39 +0900 (3fa42c171)
@@ -2136,6 +2136,8 @@ run_query(grn_ctx *ctx, grn_obj *table,
                                         flags,
                                         GRN_TEXT_VALUE(query_expander_name),
                                         GRN_TEXT_LEN(query_expander_name),
+                                        NULL, 0,
+                                        NULL, 0,
                                         &expanded_query,
                                         "[query]");
       if (rc != GRN_SUCCESS) {

  Modified: lib/proc/proc_query.c (+23 -2)
===================================================================
--- lib/proc/proc_query.c    2017-08-23 09:21:14 +0900 (cdbe6527d)
+++ lib/proc/proc_query.c    2017-08-23 12:40:39 +0900 (981da834b)
@@ -31,6 +31,10 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args,
   const char *flags_raw;
   size_t flags_raw_size;
   grn_expr_flags flags = GRN_EXPR_SYNTAX_QUERY;
+  const char *term_column;
+  size_t term_column_size;
+  const char *expanded_term_column;
+  size_t expanded_term_column_size;
   grn_obj expanded_query;
 
   expander = grn_plugin_proc_get_var_string(ctx,
@@ -48,6 +52,17 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args,
                                              "flags",
                                              -1,
                                              &flags_raw_size);
+  term_column = grn_plugin_proc_get_var_string(ctx,
+                                            user_data,
+                                            "term_column",
+                                            -1,
+                                            &term_column_size);
+  expanded_term_column =
+    grn_plugin_proc_get_var_string(ctx,
+                                   user_data,
+                                   "expanded_term_column",
+                                   -1,
+                                   &expanded_term_column_size);
 
   if (flags_raw_size > 0) {
     flags |= grn_proc_expr_query_flags_parse(ctx,
@@ -69,6 +84,10 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args,
                                flags,
                                expander,
                                expander_size,
+                               term_column,
+                               term_column_size,
+                               expanded_term_column,
+                               expanded_term_column_size,
                                &expanded_query,
                                "[query][expand]");
   if (ctx->rc == GRN_SUCCESS) {
@@ -84,14 +103,16 @@ command_query_expand(grn_ctx *ctx, int nargs, grn_obj **args,
 void
 grn_proc_init_query_expand(grn_ctx *ctx)
 {
-  grn_expr_var vars[3];
+  grn_expr_var vars[5];
 
   grn_plugin_expr_var_init(ctx, &(vars[0]), "expander", -1);
   grn_plugin_expr_var_init(ctx, &(vars[1]), "query", -1);
   grn_plugin_expr_var_init(ctx, &(vars[2]), "flags", -1);
+  grn_plugin_expr_var_init(ctx, &(vars[3]), "term_column", -1);
+  grn_plugin_expr_var_init(ctx, &(vars[4]), "expanded_term_column", -1);
   grn_plugin_command_create(ctx,
                             "query_expand", -1,
                             command_query_expand,
-                            3,
+                            5,
                             vars);
 }

  Modified: lib/proc/proc_select.c (+93 -3)
===================================================================
--- lib/proc/proc_select.c    2017-08-23 09:21:14 +0900 (c0d988b77)
+++ lib/proc/proc_select.c    2017-08-23 12:40:39 +0900 (f902f160d)
@@ -173,6 +173,10 @@ grn_proc_syntax_expand_query(grn_ctx *ctx,
                              grn_expr_flags flags,
                              const char *query_expander_name,
                              unsigned int query_expander_name_len,
+                             const char *term_column_name,
+                             unsigned int term_column_name_len,
+                             const char *expanded_term_column_name,
+                             unsigned int expanded_term_column_name_len,
                              grn_obj *expanded_query,
                              const char *error_message_tag)
 {
@@ -186,12 +190,96 @@ grn_proc_syntax_expand_query(grn_ctx *ctx,
                      GRN_INVALID_ARGUMENT,
                      "%s nonexistent query expander: <%.*s>",
                      error_message_tag,
-                     query_expander_name_len, query_expander_name);
+                     (int)query_expander_name_len,
+                     query_expander_name);
     return ctx->rc;
   }
 
-  return grn_expr_syntax_expand_query(ctx, query, query_len, flags,
-                                      query_expander, expanded_query);
+  if (expanded_term_column_name_len == 0) {
+    return grn_expr_syntax_expand_query(ctx, query, query_len, flags,
+                                        query_expander, expanded_query);
+  }
+
+  if (!grn_obj_is_table(ctx, query_expander)) {
+    grn_obj inspected;
+    GRN_TEXT_INIT(&inspected, 0);
+    grn_inspect(ctx, &inspected, query_expander);
+    GRN_PLUGIN_ERROR(ctx,
+                     GRN_INVALID_ARGUMENT,
+                     "%s query expander with expanded term column "
+                     "must be table: <%.*s>",
+                     error_message_tag,
+                     (int)GRN_TEXT_LEN(&inspected),
+                     GRN_TEXT_VALUE(&inspected));
+    GRN_OBJ_FIN(ctx, &inspected);
+    return ctx->rc;
+  }
+
+  {
+    grn_obj *term_column = NULL;
+    grn_obj *expanded_term_column;
+
+    expanded_term_column = grn_obj_column(ctx,
+                                          query_expander,
+                                          expanded_term_column_name,
+                                          expanded_term_column_name_len);
+    if (!expanded_term_column) {
+      grn_obj inspected;
+      GRN_TEXT_INIT(&inspected, 0);
+      grn_inspect(ctx, &inspected, query_expander);
+      GRN_PLUGIN_ERROR(ctx,
+                       GRN_INVALID_ARGUMENT,
+                       "%s nonexistent expanded term column: <%.*s>: "
+                       "query expander: <%.*s>",
+                       error_message_tag,
+                       (int)expanded_term_column_name_len,
+                       expanded_term_column_name,
+                       (int)GRN_TEXT_LEN(&inspected),
+                       GRN_TEXT_VALUE(&inspected));
+      GRN_OBJ_FIN(ctx, &inspected);
+      return ctx->rc;
+    }
+
+    if (term_column_name_len > 0) {
+      term_column = grn_obj_column(ctx,
+                                   query_expander,
+                                   term_column_name,
+                                   term_column_name_len);
+      if (!term_column) {
+        grn_obj inspected;
+        GRN_TEXT_INIT(&inspected, 0);
+        grn_inspect(ctx, &inspected, query_expander);
+        GRN_PLUGIN_ERROR(ctx,
+                         GRN_INVALID_ARGUMENT,
+                         "%s nonexistent term column: <%.*s>: "
+                         "query expander: <%.*s>",
+                         error_message_tag,
+                         (int)term_column_name_len,
+                         term_column_name,
+                         (int)GRN_TEXT_LEN(&inspected),
+                         GRN_TEXT_VALUE(&inspected));
+        GRN_OBJ_FIN(ctx, &inspected);
+        if (grn_obj_is_accessor(ctx, expanded_term_column)) {
+          grn_obj_unlink(ctx, expanded_term_column);
+        }
+        return ctx->rc;
+      }
+    }
+
+    grn_expr_syntax_expand_query_by_table(ctx,
+                                          query, query_len,
+                                          flags,
+                                          term_column,
+                                          expanded_term_column,
+                                          expanded_query);
+    if (grn_obj_is_accessor(ctx, term_column)) {
+      grn_obj_unlink(ctx, term_column);
+    }
+    if (grn_obj_is_accessor(ctx, expanded_term_column)) {
+      grn_obj_unlink(ctx, expanded_term_column);
+    }
+    return ctx->rc;
+  }
 }
 
 static grn_table_group_flags
@@ -737,6 +825,8 @@ grn_filter_data_execute(grn_ctx *ctx,
                                           flags,
                                           data->query_expander.value,
                                           data->query_expander.length,
+                                          NULL, 0,
+                                          NULL, 0,
                                           &query_expander_buf,
                                           tag);
         if (rc == GRN_SUCCESS) {

  Added: test/command/suite/query_expand/table/indexed_term_column.expected (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/indexed_term_column.expected    2017-08-23 12:40:39 +0900 (2cc995834)
@@ -0,0 +1,17 @@
+table_create TermExpansions TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create TermExpansions term COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+[[0,0.0,0.0],true]
+table_create Terms TABLE_PAT_KEY ShortText   --normalizer NormalizerAuto
+[[0,0.0,0.0],true]
+column_create Terms expansion_term COLUMN_INDEX TermExpansions term
+[[0,0.0,0.0],true]
+load --table TermExpansions
+[
+{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}
+]
+[[0,0.0,0.0],1]
+query_expand TermExpansions "Groonga rroonga Mroonga"   --term_column term   --expanded_term_column expansions
+[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"]

  Added: test/command/suite/query_expand/table/indexed_term_column.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/indexed_term_column.test    2017-08-23 12:40:39 +0900 (e087a16e7)
@@ -0,0 +1,16 @@
+table_create TermExpansions TABLE_NO_KEY
+column_create TermExpansions term COLUMN_SCALAR ShortText
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+
+table_create Terms TABLE_PAT_KEY ShortText \
+  --normalizer NormalizerAuto
+column_create Terms expansion_term COLUMN_INDEX TermExpansions term
+
+load --table TermExpansions
+[
+{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}
+]
+
+query_expand TermExpansions "Groonga rroonga Mroonga" \
+  --term_column term \
+  --expanded_term_column expansions

  Added: test/command/suite/query_expand/table/no_indexed_term_column.expected (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/no_indexed_term_column.expected    2017-08-23 12:40:39 +0900 (5c7effbdf)
@@ -0,0 +1,13 @@
+table_create TermExpansions TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create TermExpansions term COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+[[0,0.0,0.0],true]
+load --table TermExpansions
+[
+{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}
+]
+[[0,0.0,0.0],1]
+query_expand TermExpansions "Groonga Rroonga Mroonga"   --term_column term   --expanded_term_column expansions
+[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"]

  Added: test/command/suite/query_expand/table/no_indexed_term_column.test (+12 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/no_indexed_term_column.test    2017-08-23 12:40:39 +0900 (1c79f1d40)
@@ -0,0 +1,12 @@
+table_create TermExpansions TABLE_NO_KEY
+column_create TermExpansions term COLUMN_SCALAR ShortText
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+
+load --table TermExpansions
+[
+{"term": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}
+]
+
+query_expand TermExpansions "Groonga Rroonga Mroonga" \
+  --term_column term \
+  --expanded_term_column expansions

  Added: test/command/suite/query_expand/table/no_term_column.expected (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/no_term_column.expected    2017-08-23 12:40:39 +0900 (5903bebed)
@@ -0,0 +1,11 @@
+table_create TermExpansions TABLE_HASH_KEY ShortText   --normalizer NormalizerAuto
+[[0,0.0,0.0],true]
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+[[0,0.0,0.0],true]
+load --table TermExpansions
+[
+{"_key": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}
+]
+[[0,0.0,0.0],1]
+query_expand TermExpansions "Groonga Rroonga Mroonga"   --expanded_term_column expansions
+[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"]

  Added: test/command/suite/query_expand/table/no_term_column.test (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/no_term_column.test    2017-08-23 12:40:39 +0900 (c468ac9f2)
@@ -0,0 +1,11 @@
+table_create TermExpansions TABLE_HASH_KEY ShortText \
+  --normalizer NormalizerAuto
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+
+load --table TermExpansions
+[
+{"_key": "Rroonga", "expansions": ["Rroonga", "Ruby Groonga"]}
+]
+
+query_expand TermExpansions "Groonga Rroonga Mroonga" \
+  --expanded_term_column expansions

  Added: test/command/suite/query_expand/table/scalar_expanded_term_column.expected (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/scalar_expanded_term_column.expected    2017-08-23 12:40:39 +0900 (ac295a871)
@@ -0,0 +1,16 @@
+table_create TermExpansions TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create TermExpansions term COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+column_create TermExpansions expansion COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+load --table TermExpansions
+[
+{"term": "PGroonga", "expansion": "PGroonga"},
+{"term": "PGroonga", "expansion": "Groogna PostgreSQL"},
+{"term": "Rroonga", "expansion": "Rroonga"},
+{"term": "Rroonga", "expansion": "Ruby Groonga"}
+]
+[[0,0.0,0.0],4]
+query_expand TermExpansions "Groonga Rroonga Mroonga"   --term_column term   --expanded_term_column expansion
+[[0,0.0,0.0],"Groonga ((Rroonga) OR (Ruby Groonga)) Mroonga"]

  Added: test/command/suite/query_expand/table/scalar_expanded_term_column.test (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/scalar_expanded_term_column.test    2017-08-23 12:40:39 +0900 (e40d69454)
@@ -0,0 +1,15 @@
+table_create TermExpansions TABLE_NO_KEY
+column_create TermExpansions term COLUMN_SCALAR ShortText
+column_create TermExpansions expansion COLUMN_SCALAR ShortText
+
+load --table TermExpansions
+[
+{"term": "PGroonga", "expansion": "PGroonga"},
+{"term": "PGroonga", "expansion": "Groogna PostgreSQL"},
+{"term": "Rroonga", "expansion": "Rroonga"},
+{"term": "Rroonga", "expansion": "Ruby Groonga"}
+]
+
+query_expand TermExpansions "Groonga Rroonga Mroonga" \
+  --term_column term \
+  --expanded_term_column expansion

  Added: test/command/suite/query_expand/table/vector_expanded_term_column.expected (+23 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/vector_expanded_term_column.expected    2017-08-23 12:40:39 +0900 (be95e554c)
@@ -0,0 +1,23 @@
+table_create TermExpansions TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create TermExpansions term COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+[[0,0.0,0.0],true]
+load --table TermExpansions
+[
+{"term": "PGroonga", "expansions": ["PGroonga", "Groogna PostgreSQL"]},
+{"term": "Rroonga",  "expansions": []},
+{"term": "Rroonga",  "expansions": ["Rroonga", "Ruby Groonga"]},
+{"term": "Rroonga",  "expansions": ["Ruby \"full text search\""]}
+]
+[[0,0.0,0.0],4]
+query_expand TermExpansions "Groonga Rroonga Mroonga"   --term_column term   --expanded_term_column expansions
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  "Groonga ((Rroonga) OR (Ruby Groonga) OR (Ruby \"full text search\")) Mroonga"
+]

  Added: test/command/suite/query_expand/table/vector_expanded_term_column.test (+15 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/query_expand/table/vector_expanded_term_column.test    2017-08-23 12:40:39 +0900 (93c767eb3)
@@ -0,0 +1,15 @@
+table_create TermExpansions TABLE_NO_KEY
+column_create TermExpansions term COLUMN_SCALAR ShortText
+column_create TermExpansions expansions COLUMN_VECTOR ShortText
+
+load --table TermExpansions
+[
+{"term": "PGroonga", "expansions": ["PGroonga", "Groogna PostgreSQL"]},
+{"term": "Rroonga",  "expansions": []},
+{"term": "Rroonga",  "expansions": ["Rroonga", "Ruby Groonga"]},
+{"term": "Rroonga",  "expansions": ["Ruby \"full text search\""]}
+]
+
+query_expand TermExpansions "Groonga Rroonga Mroonga" \
+  --term_column term \
+  --expanded_term_column expansions
-------------- next part --------------
HTML����������������������������...
Download 



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