[Groonga-commit] groonga/groonga [master] support empty vector transformation on XML output.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 8月 4日 (水) 09:59:24 JST


Kouhei Sutou	2010-08-04 00:59:24 +0000 (Wed, 04 Aug 2010)

  New Revision: dc4aa009b93f3acd71b5fbb2f580dba759dfc71d

  Log:
    support empty vector transformation on XML output.

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

  Modified: src/groonga.c (+38 -34)
===================================================================
--- src/groonga.c    2010-08-03 08:56:41 +0000 (c74ecca)
+++ src/groonga.c    2010-08-04 00:59:24 +0000 (5cdc2b0)
@@ -222,6 +222,19 @@ typedef enum {
   XML_PLACE_HIT
 } xml_place;
 
+static char *
+transform_xml_next_column(grn_obj *columns, int n)
+{
+  char *column = GRN_TEXT_VALUE(columns);
+  while (n--) {
+    while (*column) {
+      column++;
+    }
+    column++;
+  }
+  return column;
+}
+
 static void
 transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
 {
@@ -285,8 +298,12 @@ transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
             GRN_TEXT_PUTS(ctx, transformed, "<NAVIGATIONENTRY>");
           }
         } else if (EQUAL_NAME_P("VECTOR")) {
+          char *c = transform_xml_next_column(&columns, column_n++);
           in_vector = 1;
           first_vector_element = 1;
+          GRN_TEXT_PUTS(ctx, transformed, "<FIELD NAME=\"");
+          GRN_TEXT_PUTS(ctx, transformed, c);
+          GRN_TEXT_PUTS(ctx, transformed, "\">");
         }
         break;
       case XML_END_ELEMENT :
@@ -318,43 +335,30 @@ transform_xml(grn_ctx *ctx, grn_obj *output, grn_obj *transformed)
         } else {
           switch (place) {
           case XML_PLACE_HIT :
-            {
-              int i = column_n;
-              char *c = GRN_TEXT_VALUE(&columns);
-              if (!in_vector || first_vector_element) {
-                while (i--) {
-                  while (*c) {
-                    c++;
-                  }
-                  c++;
-                }
-              }
-              if (result_set_n == 0) {
-                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_PUTS(ctx, transformed, "</FIELD>\n");
-                }
-              } else {
+            if (result_set_n == 0) {
+              if (!in_vector) {
+                char *c = transform_xml_next_column(&columns, column_n++);
+                GRN_TEXT_PUTS(ctx, transformed, "<FIELD NAME=\"");
                 GRN_TEXT_PUTS(ctx, transformed, c);
-                GRN_TEXT_PUTS(ctx, transformed, "=\"");
-                GRN_TEXT_PUT(ctx, transformed,
-                             GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
-                GRN_TEXT_PUTS(ctx, transformed, "\" ");
+                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_PUTS(ctx, transformed, "</FIELD>\n");
+              }
+            } else {
+              char *c = transform_xml_next_column(&columns, column_n++);
+              GRN_TEXT_PUTS(ctx, transformed, c);
+              GRN_TEXT_PUTS(ctx, transformed, "=\"");
+              GRN_TEXT_PUT(ctx, transformed,
+                           GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf));
+              GRN_TEXT_PUTS(ctx, transformed, "\" ");
             }
-            if (!in_vector || first_vector_element) {
-              column_n++;
-              first_vector_element = 0;
-            }
+            first_vector_element = 0;
             break;
           default :
             if (EQUAL_NAME_P("NHITS")) {

  Modified: test/unit/http/test-http-select-basic.rb (+10 -2)
===================================================================
--- test/unit/http/test-http-select-basic.rb    2010-08-03 08:56:41 +0000 (1093246)
+++ test/unit/http/test-http-select-basic.rb    2010-08-04 00:59:24 +0000 (c2cd202)
@@ -773,14 +773,17 @@ EOF
            "full-text search engine"],
           ["Ruby",
            ["language", "script", "fun"],
-           "An object oriented script language"]])
+           "An object oriented script language"],
+         ["rroonga",
+          [],
+          "The Ruby bindings for groonga"]])
 
     expected = <<EOF
 <?xml version="1.0" encoding="utf-8"?>
 <SEGMENTS>
 <SEGMENT>
 <RESULTPAGE>
-<RESULTSET OFFSET="0" LIMIT="2" NHITS="2">
+<RESULTSET OFFSET="0" LIMIT="3" NHITS="3">
 <HIT NO="1">
 <FIELD NAME="_key">groonga</FIELD>
 <FIELD NAME="tags">full-text search, C</FIELD>
@@ -791,6 +794,11 @@ EOF
 <FIELD NAME="tags">language, script, fun</FIELD>
 <FIELD NAME="description">An object oriented script language</FIELD>
 </HIT>
+<HIT NO="3">
+<FIELD NAME="_key">rroonga</FIELD>
+<FIELD NAME="tags"></FIELD>
+<FIELD NAME="description">The Ruby bindings for groonga</FIELD>
+</HIT>
 </RESULTSET>
 </RESULTPAGE>
 </SEGMENT>




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