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>