[Groonga-commit] groonga/groonga [master] support vector in XML output.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 8月 3日 (火) 17:28:33 JST


Kouhei Sutou	2010-08-03 08:28:33 +0000 (Tue, 03 Aug 2010)

  New Revision: afd439c162a9f80b0f7ef6dccd8b74dce7e2d5f6

  Log:
    support vector in XML output.

  Modified files:
    src/groonga.c
    test/unit/http/test-http-select-basic.rb
    test/unit/http/test-http-select-drilldown.rb

  Modified: src/groonga.c (+24 -11)
===================================================================
--- src/groonga.c    2010-08-03 08:11:34 +0000 (d140364)
+++ src/groonga.c    2010-08-03 08:28:33 +0000 (c74ecca)
@@ -232,7 +232,7 @@ transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
   unsigned int len;
   int offset = 0, limit = 0, record_n = 0;
   int column_n, column_text_n, result_set_n = -1;
-  int in_vector = 0;
+  int in_vector = 0, first_vector_element = 0;
 
   s = GRN_TEXT_VALUE(output);
   e = GRN_BULK_CURR(output);
@@ -286,6 +286,7 @@ transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
           }
         } else if (EQUAL_NAME_P("VECTOR")) {
           in_vector = 1;
+          first_vector_element = 1;
         }
         break;
       case XML_END_ELEMENT :
@@ -312,27 +313,36 @@ transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
                         "</SEGMENTS>\n");
         } else if (EQUAL_NAME_P("VECTOR")) {
           in_vector = 0;
+          first_vector_element = 0;
+          GRN_TEXT_PUTS(ctx, transformed, "</FIELD>\n");
         } else {
           switch (place) {
           case XML_PLACE_HIT :
             {
               int i = column_n;
               char *c = GRN_TEXT_VALUE(&columns);
-              while (i--) {
-                while (*c) {
+              if (!in_vector || first_vector_element) {
+                while (i--) {
+                  while (*c) {
+                    c++;
+                  }
                   c++;
                 }
-                c++;
               }
               if (result_set_n == 0) {
-                GRN_TEXT_PUTS(ctx, transformed, "<FIELD NAME=\"");
-                GRN_TEXT_PUTS(ctx, transformed, c);
-                GRN_TEXT_PUTS(ctx, transformed, "\">");
+                if (!in_vector || first_vector_element) {
+                  GRN_TEXT_PUTS(ctx, transformed, "<FIELD NAME=\"");
+                  GRN_TEXT_PUTS(ctx, transformed, c);
+                  GRN_TEXT_PUTS(ctx, transformed, "\">");
+                }
+                if (in_vector && !first_vector_element) {
+                  GRN_TEXT_PUTS(ctx, transformed, ", ");
+                }
+                GRN_TEXT_PUT(ctx, transformed,
+                             GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
                 if (!in_vector) {
-                  GRN_TEXT_PUT(ctx, transformed,
-                               GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
+                  GRN_TEXT_PUTS(ctx, transformed, "</FIELD>\n");
                 }
-                GRN_TEXT_PUTS(ctx, transformed, "</FIELD>\n");
               } else {
                 GRN_TEXT_PUTS(ctx, transformed, c);
                 GRN_TEXT_PUTS(ctx, transformed, "=\"");
@@ -341,7 +351,10 @@ transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
                 GRN_TEXT_PUTS(ctx, transformed, "\" ");
               }
             }
-            column_n++;
+            if (!in_vector || first_vector_element) {
+              column_n++;
+              first_vector_element = 0;
+            }
             break;
           default :
             if (EQUAL_NAME_P("NHITS")) {

  Modified: test/unit/http/test-http-select-basic.rb (+41 -0)
===================================================================
--- test/unit/http/test-http-select-basic.rb    2010-08-03 08:11:34 +0000 (27bef0f)
+++ test/unit/http/test-http-select-basic.rb    2010-08-03 08:28:33 +0000 (1093246)
@@ -760,6 +760,47 @@ EOF
                        :output_columns => "_id,_key,real_name,hp"})
   end
 
+  def test_xml_vector
+    table_create("Softwares",
+                 :flags => Table::HASH_KEY,
+                 :key_type => "ShortText")
+    column_create("Softwares", "tags", Column::VECTOR, "ShortText")
+    column_create("Softwares", "description", Column::SCALAR, "ShortText")
+    load("Softwares",
+         [[:_key, :tags, :description],
+          ["groonga",
+           ["full-text search", "C"],
+           "full-text search engine"],
+          ["Ruby",
+           ["language", "script", "fun"],
+           "An object oriented script language"]])
+
+    expected = <<EOF
+<?xml version="1.0" encoding="utf-8"?>
+<SEGMENTS>
+<SEGMENT>
+<RESULTPAGE>
+<RESULTSET OFFSET="0" LIMIT="2" NHITS="2">
+<HIT NO="1">
+<FIELD NAME="_key">groonga</FIELD>
+<FIELD NAME="tags">full-text search, C</FIELD>
+<FIELD NAME="description">full-text search engine</FIELD>
+</HIT>
+<HIT NO="2">
+<FIELD NAME="_key">Ruby</FIELD>
+<FIELD NAME="tags">language, script, fun</FIELD>
+<FIELD NAME="description">An object oriented script language</FIELD>
+</HIT>
+</RESULTSET>
+</RESULTPAGE>
+</SEGMENT>
+</SEGMENTS>
+EOF
+    assert_select_xml(expected,
+                      {:table => "Softwares",
+                       :output_columns => "_key tags description"})
+  end
+
   def test_xml_with_offset
     create_users_table
     load_many_users

  Modified: test/unit/http/test-http-select-drilldown.rb (+6 -6)
===================================================================
--- test/unit/http/test-http-select-drilldown.rb    2010-08-03 08:11:34 +0000 (dddfe07)
+++ test/unit/http/test-http-select-drilldown.rb    2010-08-03 08:28:33 +0000 (610e072)
@@ -235,7 +235,7 @@ module HTTPSelectDrilldownTests
 <FIELD NAME="place">razil.jp</FIELD>
 <FIELD NAME="place.name">ブラジル</FIELD>
 <FIELD NAME="title">groongaリリース(前編)</FIELD>
-<FIELD NAME="person"></FIELD>
+<FIELD NAME="person">グニャラくん</FIELD>
 <FIELD NAME="date">20091218.0</FIELD>
 </HIT>
 <HIT NO="2">
@@ -243,7 +243,7 @@ module HTTPSelectDrilldownTests
 <FIELD NAME="place">shinjuku</FIELD>
 <FIELD NAME="place.name">新宿</FIELD>
 <FIELD NAME="title">groongaリリース(後編)</FIELD>
-<FIELD NAME="person"></FIELD>
+<FIELD NAME="person">グニャラくん</FIELD>
 <FIELD NAME="date">20091218.0</FIELD>
 </HIT>
 <HIT NO="3">
@@ -251,7 +251,7 @@ module HTTPSelectDrilldownTests
 <FIELD NAME="place">razil.jp</FIELD>
 <FIELD NAME="place.name">ブラジル</FIELD>
 <FIELD NAME="title">groonga(ぐるんが)解説・パート1</FIELD>
-<FIELD NAME="person"></FIELD>
+<FIELD NAME="person">morita</FIELD>
 <FIELD NAME="date">20091218.0</FIELD>
 </HIT>
 <HIT NO="4">
@@ -259,7 +259,7 @@ module HTTPSelectDrilldownTests
 <FIELD NAME="place">shinjuku</FIELD>
 <FIELD NAME="place.name">新宿</FIELD>
 <FIELD NAME="title">groonga(ぐるんが)解説・パート2</FIELD>
-<FIELD NAME="person"></FIELD>
+<FIELD NAME="person">yu</FIELD>
 <FIELD NAME="date">20091219.0</FIELD>
 </HIT>
 <HIT NO="5">
@@ -267,7 +267,7 @@ module HTTPSelectDrilldownTests
 <FIELD NAME="place">shinjuku</FIELD>
 <FIELD NAME="place.name">新宿</FIELD>
 <FIELD NAME="title">groonga(ぐるんが)解説・パート3</FIELD>
-<FIELD NAME="person"></FIELD>
+<FIELD NAME="person">yu</FIELD>
 <FIELD NAME="date">20091220.0</FIELD>
 </HIT>
 <HIT NO="6">
@@ -275,7 +275,7 @@ module HTTPSelectDrilldownTests
 <FIELD NAME="place">shinjuku</FIELD>
 <FIELD NAME="place.name">新宿</FIELD>
 <FIELD NAME="title">groonga(ぐるんが)解説・パート4</FIELD>
-<FIELD NAME="person"></FIELD>
+<FIELD NAME="person">yu</FIELD>
 <FIELD NAME="date">20091220.0</FIELD>
 </HIT>
 </RESULTSET>




Groonga-commit メーリングリストの案内
Back to archive index