[Groonga-commit] groonga/groonga at 1cd98cc [master] snippet_html: returns null when no snippets is found

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Jan 26 22:29:42 JST 2014


Kouhei Sutou	2014-01-26 22:29:42 +0900 (Sun, 26 Jan 2014)

  New Revision: 1cd98cc3cb3381cb8ef8c73526fdf1450ba74079
  https://github.com/groonga/groonga/commit/1cd98cc3cb3381cb8ef8c73526fdf1450ba74079

  Message:
    snippet_html: returns null when no snippets is found

  Added files:
    test/command/suite/select/function/snippet_html/none.expected
    test/command/suite/select/function/snippet_html/none.test
  Modified files:
    doc/source/reference/functions/snippet_html.txt
    lib/proc.c

  Modified: doc/source/reference/functions/snippet_html.txt (+4 -2)
===================================================================
--- doc/source/reference/functions/snippet_html.txt    2014-01-26 22:13:39 +0900 (0d66bc3)
+++ doc/source/reference/functions/snippet_html.txt    2014-01-26 22:29:42 +0900 (4b02b20)
@@ -92,8 +92,10 @@ You can specify string literal instead of column.
 Return value
 ------------
 
-``snippet_html`` returns an array of string. An element of array is a
-snippet::
+``snippet_html`` returns an array of string or ``null``. If
+``snippet_html`` can't find any snippets, it returns ``null``.
+
+An element of array is a snippet::
 
   [SNIPPET1, SNIPPET2, SNIPPET3]
 

  Modified: lib/proc.c (+43 -23)
===================================================================
--- lib/proc.c    2014-01-26 22:13:39 +0900 (98e5f14)
+++ lib/proc.c    2014-01-26 22:29:42 +0900 (c6f3e9f)
@@ -3622,16 +3622,56 @@ selector_all_records(grn_ctx *ctx, grn_obj *table, grn_obj *index,
 }
 
 static grn_obj *
-func_snippet_html(grn_ctx *ctx, int nargs, grn_obj **args,
-                  grn_user_data *user_data)
+snippet_exec(grn_ctx *ctx, grn_snip *snip, grn_obj *text,
+             grn_user_data *user_data)
 {
+  grn_rc rc;
+  unsigned int i, n_results, max_tagged_length;
+  grn_obj snippet_buffer;
   grn_obj *snippets;
 
+  rc = grn_snip_exec(ctx, snip,
+                     GRN_TEXT_VALUE(text), GRN_TEXT_LEN(text),
+                     &n_results, &max_tagged_length);
+  if (rc != GRN_SUCCESS) {
+    return NULL;
+  }
+
+  if (n_results == 0) {
+    return GRN_PROC_ALLOC(GRN_DB_VOID, 0);
+  }
+
   snippets = GRN_PROC_ALLOC(GRN_DB_SHORT_TEXT, GRN_OBJ_VECTOR);
   if (!snippets) {
     return NULL;
   }
 
+  GRN_TEXT_INIT(&snippet_buffer, 0);
+  grn_bulk_space(ctx, &snippet_buffer, max_tagged_length);
+  for (i = 0; i < n_results; i++) {
+    unsigned int snippet_length;
+
+    GRN_BULK_REWIND(&snippet_buffer);
+    rc = grn_snip_get_result(ctx, snip, i,
+                             GRN_TEXT_VALUE(&snippet_buffer),
+                             &snippet_length);
+    if (rc == GRN_SUCCESS) {
+      grn_vector_add_element(ctx, snippets,
+                             GRN_TEXT_VALUE(&snippet_buffer), snippet_length,
+                             0, GRN_DB_SHORT_TEXT);
+    }
+  }
+  GRN_OBJ_FIN(ctx, &snippet_buffer);
+
+  return snippets;
+}
+
+static grn_obj *
+func_snippet_html(grn_ctx *ctx, int nargs, grn_obj **args,
+                  grn_user_data *user_data)
+{
+  grn_obj *snippets = NULL;
+
   /* TODO: support parameters */
   if (nargs == 1) {
     grn_obj *text = args[0];
@@ -3667,27 +3707,7 @@ func_snippet_html(grn_ctx *ctx, int nargs, grn_obj **args,
     }
 
     if (snip) {
-      grn_rc rc;
-      unsigned int i, n_results, max_tagged_length;
-      grn_obj snippet_buffer;
-
-      rc = grn_snip_exec(ctx, snip,
-                         GRN_TEXT_VALUE(text), GRN_TEXT_LEN(text),
-                         &n_results, &max_tagged_length);
-      GRN_TEXT_INIT(&snippet_buffer, 0);
-      grn_bulk_space(ctx, &snippet_buffer, max_tagged_length);
-      for (i = 0; i < n_results; i++) {
-        unsigned int snippet_length;
-
-        GRN_BULK_REWIND(&snippet_buffer);
-        rc = grn_snip_get_result(ctx, snip, i,
-                                 GRN_TEXT_VALUE(&snippet_buffer),
-                                 &snippet_length);
-        grn_vector_add_element(ctx, snippets,
-                               GRN_TEXT_VALUE(&snippet_buffer), snippet_length,
-                               0, GRN_DB_SHORT_TEXT);
-      }
-      GRN_OBJ_FIN(ctx, &snippet_buffer);
+      snippets = snippet_exec(ctx, snip, text, user_data);
       grn_snip_close(ctx, snip);
     }
   }

  Added: test/command/suite/select/function/snippet_html/none.expected (+43 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/snippet_html/none.expected    2014-01-26 22:29:42 +0900 (df04ae5)
@@ -0,0 +1,43 @@
+table_create Documents TABLE_HASH_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Documents content COLUMN_SCALAR Text
+[[0,0.0,0.0],true]
+table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram
+[[0,0.0,0.0],true]
+column_create Terms document_index COLUMN_INDEX|WITH_POSITION Documents content
+[[0,0.0,0.0],true]
+load --table Documents
+[
+["_key", "content"],
+["Groonga", "Groonga can be used with MySQL."]
+]
+[[0,0.0,0.0],1]
+select Documents   --match_columns content --query 'MySQL'   --output_columns '_key, snippet_html(_key)'   --command_version 2
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "_key",
+          "ShortText"
+        ],
+        [
+          "snippet_html",
+          "null"
+        ]
+      ],
+      [
+        "Groonga",
+        null
+      ]
+    ]
+  ]
+]

  Added: test/command/suite/select/function/snippet_html/none.test (+16 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/snippet_html/none.test    2014-01-26 22:29:42 +0900 (518f431)
@@ -0,0 +1,16 @@
+table_create Documents TABLE_HASH_KEY ShortText
+column_create Documents content COLUMN_SCALAR Text
+
+table_create Terms TABLE_PAT_KEY|KEY_NORMALIZE ShortText --default_tokenizer TokenBigram
+column_create Terms document_index COLUMN_INDEX|WITH_POSITION Documents content
+
+load --table Documents
+[
+["_key", "content"],
+["Groonga", "Groonga can be used with MySQL."]
+]
+
+select Documents \
+  --match_columns content --query 'MySQL' \
+  --output_columns '_key, snippet_html(_key)' \
+  --command_version 2
-------------- next part --------------
HTML����������������������������...
Download 



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