[Groonga-commit] groonga/groonga [master] Support query expander in query() function

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Mar 18 13:54:40 JST 2013


Kouhei Sutou	2013-03-18 13:54:40 +0900 (Mon, 18 Mar 2013)

  New Revision: 57e7affa1c18a0026875ccdbd65e0495f5edc20c
  https://github.com/groonga/groonga/commit/57e7affa1c18a0026875ccdbd65e0495f5edc20c

  Message:
    Support query expander in query() function
    
    I wanted to use the following API:
    
      query("MATCH_COLUMNS", "QUERY", {"query_expander": "QueryExpanderTSV"})
    
    But this change uses the following API:
    
      query("MATCH_COLUMNS", "QUERY", "QueryExpanderTSV")
    
    Because object literal (`{"XXX": "YYY"}`) syntax isn't supported yet. :<
    
    TODO: document

  Added files:
    test/command/suite/select/filter/query/query_expander.expected
    test/command/suite/select/filter/query/query_expander.test
  Modified files:
    lib/proc.c

  Modified: lib/proc.c (+44 -11)
===================================================================
--- lib/proc.c    2013-03-18 12:50:13 +0900 (dda990c)
+++ lib/proc.c    2013-03-18 13:54:40 +0900 (8eb3eab)
@@ -3471,26 +3471,33 @@ run_query(grn_ctx *ctx, grn_obj *table,
           int nargs, grn_obj **args,
           grn_obj *res, grn_operator op)
 {
+  grn_rc rc = GRN_SUCCESS;
   grn_obj *match_columns_string;
-  grn_obj *query_string;
+  grn_obj *query;
+  grn_obj *query_expander_name = NULL;
   grn_obj *match_columns = NULL;
   grn_obj *condition = NULL;
   grn_obj *dummy_variable;
 
-  /* TODO: support expansion and flags by parameters */
-  if (nargs != 2) {
+  /* TODO: support flags by parameters */
+  if (!(2 <= nargs && nargs <= 3)) {
     ERR(GRN_INVALID_ARGUMENT,
-        "wrong number of arguments (%d for 2)", nargs);
+        "wrong number of arguments (%d for 2..3)", nargs);
+    rc = ctx->rc;
     goto exit;
   }
 
   match_columns_string = args[0];
-  query_string = args[1];
+  query = args[1];
+  if (nargs > 2) {
+    query_expander_name = args[2];
+  }
 
   if (match_columns_string->header.domain == GRN_DB_TEXT &&
       GRN_TEXT_LEN(match_columns_string) > 0) {
     GRN_EXPR_CREATE_FOR_QUERY(ctx, table, match_columns, dummy_variable);
     if (!match_columns) {
+      rc = ctx->rc;
       goto exit;
     }
 
@@ -3500,27 +3507,53 @@ run_query(grn_ctx *ctx, grn_obj *table,
                    NULL, GRN_OP_MATCH, GRN_OP_AND,
                    GRN_EXPR_SYNTAX_SCRIPT);
     if (ctx->rc != GRN_SUCCESS) {
+      rc = ctx->rc;
       goto exit;
     }
   }
 
-  if (query_string->header.domain == GRN_DB_TEXT &&
-      GRN_TEXT_LEN(query_string) > 0) {
+  if (query->header.domain == GRN_DB_TEXT && GRN_TEXT_LEN(query) > 0) {
+    const char *query_string;
+    unsigned int query_string_len;
+    grn_obj expanded_query;
     grn_expr_flags flags =
       GRN_EXPR_SYNTAX_QUERY|GRN_EXPR_ALLOW_PRAGMA|GRN_EXPR_ALLOW_COLUMN;
 
     GRN_EXPR_CREATE_FOR_QUERY(ctx, table, condition, dummy_variable);
     if (!condition) {
+      rc = ctx->rc;
       goto exit;
     }
+
+    query_string = GRN_TEXT_VALUE(query);
+    query_string_len = GRN_TEXT_LEN(query);
+
+    GRN_TEXT_INIT(&expanded_query, 0);
+    if (query_expander_name &&
+        query_expander_name->header.domain == GRN_DB_TEXT &&
+        GRN_TEXT_LEN(query_expander_name) > 0) {
+      rc = expand_query(ctx, query_string, query_string_len, flags,
+                        GRN_TEXT_VALUE(query_expander_name),
+                        GRN_TEXT_LEN(query_expander_name),
+                        &expanded_query);
+      if (rc != GRN_SUCCESS) {
+        GRN_OBJ_FIN(ctx, &expanded_query);
+        goto exit;
+      }
+      query_string = GRN_TEXT_VALUE(&expanded_query);
+      query_string_len = GRN_TEXT_LEN(&expanded_query);
+    }
     grn_expr_parse(ctx, condition,
-                   GRN_TEXT_VALUE(query_string),
-                   GRN_TEXT_LEN(query_string),
+                   query_string,
+                   query_string_len,
                    match_columns, GRN_OP_MATCH, GRN_OP_AND, flags);
-    if (ctx->rc != GRN_SUCCESS) {
+    rc = ctx->rc;
+    GRN_OBJ_FIN(ctx, &expanded_query);
+    if (rc != GRN_SUCCESS) {
       goto exit;
     }
     grn_table_select(ctx, table, condition, res, op);
+    rc = ctx->rc;
   }
 
 exit:
@@ -3531,7 +3564,7 @@ exit:
     grn_obj_unlink(ctx, condition);
   }
 
-  return ctx->rc;
+  return rc;
 }
 
 static grn_obj *

  Added: test/command/suite/select/filter/query/query_expander.expected (+53 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/query/query_expander.expected    2013-03-18 13:54:40 +0900 (cd69f2a)
@@ -0,0 +1,53 @@
+register "query_expanders/tsv"
+[[0,0.0,0.0],true]
+table_create Memos TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Memos content COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram
+[[0,0.0,0.0],true]
+column_create Lexicon diary_content COLUMN_INDEX|WITH_POSITION Memos content
+[[0,0.0,0.0],true]
+load --table Memos
+[
+["content"],
+["Start groonga!"],
+["Start mroonga!"],
+["Start rroonga!"],
+["Start Ruby!"],
+["Learning Ruby and groonga..."]
+]
+[[0,0.0,0.0],5]
+select --table Memos --filter 'query("content", "rroonga", "QueryExpanderTSV")'
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        2
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ],
+        [
+          "content",
+          "ShortText"
+        ]
+      ],
+      [
+        3,
+        "Start rroonga!"
+      ],
+      [
+        5,
+        "Learning Ruby and groonga..."
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/filter/query/query_expander.test (+20 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/filter/query/query_expander.test    2013-03-18 13:54:40 +0900 (a1a692f)
@@ -0,0 +1,20 @@
+#@copy-path fixture/query_expander/tsv/expand.tsv tmp/synonyms.tsv
+register "query_expanders/tsv"
+
+table_create Memos TABLE_NO_KEY
+column_create Memos content COLUMN_SCALAR ShortText
+
+table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram
+column_create Lexicon diary_content COLUMN_INDEX|WITH_POSITION Memos content
+
+load --table Memos
+[
+["content"],
+["Start groonga!"],
+["Start mroonga!"],
+["Start rroonga!"],
+["Start Ruby!"],
+["Learning Ruby and groonga..."]
+]
+
+select --table Memos --filter 'query("content", "rroonga", "QueryExpanderTSV")'
-------------- next part --------------
HTML����������������������������...
Download 



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