[Groonga-commit] groonga/groonga [master] support vector value in select. 325

Back to archive index

null+****@clear***** null+****@clear*****
2010年 6月 30日 (水) 10:34:55 JST


Nobuyoshi Nakada	2010-06-30 01:34:55 +0000 (Wed, 30 Jun 2010)

  New Revision: 58b4b093443aca84acb03bac354b3f0605a8cfa9

  Log:
    support vector value in select. 325

  Modified files:
    lib/output.c
    lib/str.c
    test/unit/core/test-command-select.c

  Modified: lib/output.c (+31 -16)
===================================================================
--- lib/output.c    2010-06-30 08:17:10 +0000 (23b6a2c)
+++ lib/output.c    2010-06-30 01:34:55 +0000 (d51ae66)
@@ -443,9 +443,9 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
 {
   int vs;
   grn_obj buf;
-  GRN_TEXT_INIT(&buf, 0);
   if (obj->header.type == GRN_ACCESSOR) {
     grn_accessor *a = (grn_accessor *)obj;
+    GRN_TEXT_INIT(&buf, 0);
     for (;;) {
       GRN_BULK_REWIND(&buf);
       switch (a->action) {
@@ -477,11 +477,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
         buf.header.domain = GRN_DB_INT32;
         break;
       case GRN_ACCESSOR_GET_COLUMN_VALUE :
-        /* todo : support vector */
-        grn_obj_get_value(ctx, a->obj, id, &buf);
         if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
-          grn_id *idp = (grn_id *)GRN_BULK_HEAD(&buf);
           if (a->next) {
+            grn_id *idp;
+            grn_obj_get_value(ctx, a->obj, id, &buf);
+            idp = (grn_id *)GRN_BULK_HEAD(&buf);
             vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id);
             grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs);
             for (; vs--; idp++) {
@@ -489,19 +489,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
             }
             grn_output_array_close(ctx, outbuf, output_type);
           } else {
-            grn_obj b;
-            GRN_RECORD_INIT(&b, 0, DB_OBJ(a->obj)->range);
-            vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id);
-            grn_output_array_open(ctx, outbuf, output_type, "COLUMN", vs);
-            /* todo: support other fixe sized data types */
-            for (; vs--; idp++) {
-              GRN_RECORD_SET(ctx, &b, *idp);
-              grn_output_obj(ctx, outbuf, output_type, &b, NULL);
-            }
-            grn_output_array_close(ctx, outbuf, output_type);
-            GRN_OBJ_FIN(ctx, &b);
+            grn_text_atoj(ctx, outbuf, output_type, a->obj, id);
           }
           goto exit;
+        } else {
+          grn_obj_get_value(ctx, a->obj, id, &buf);
         }
         break;
       case GRN_ACCESSOR_GET_DB_OBJ :
@@ -522,6 +514,29 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
       }
     }
   } else {
+    switch (obj->header.type) {
+    case GRN_COLUMN_FIX_SIZE :
+      GRN_VALUE_FIX_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+      break;
+    case GRN_COLUMN_VAR_SIZE :
+      if ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
+        grn_obj *range = grn_ctx_at(ctx, DB_OBJ(obj)->range);
+        if (range->header.flags & GRN_OBJ_KEY_VAR_SIZE) {
+          GRN_VALUE_VAR_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+        } else {
+          GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+        }
+      } else {
+        GRN_VALUE_VAR_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+      }
+      break;
+    case GRN_COLUMN_INDEX :
+      GRN_UINT32_INIT(&buf, 0);
+      break;
+    default:
+      GRN_TEXT_INIT(&buf, 0);
+      break;
+    }
     grn_obj_get_value(ctx, obj, id, &buf);
   }
   grn_output_obj(ctx, outbuf, output_type, &buf, NULL);
@@ -906,7 +921,7 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type,
       GRN_TEXT_INIT(&id, 0);
       if (tc) {
         for (i = 0; !grn_table_cursor_next_o(ctx, tc, &id); i++) {
-          grn_output_array_open(ctx, outbuf, output_type, "HIT", -1);
+          grn_output_array_open(ctx, outbuf, output_type, "HIT", ncolumns);
           for (j = 0; j < ncolumns; j++) {
             grn_text_atoj_o(ctx, outbuf, output_type, columns[j], &id);
           }

  Modified: lib/str.c (+30 -15)
===================================================================
--- lib/str.c    2010-06-30 08:17:10 +0000 (badcb0f)
+++ lib/str.c    2010-06-30 01:34:55 +0000 (7dcc4be)
@@ -2418,9 +2418,9 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
 {
   int vs;
   grn_obj buf;
-  GRN_TEXT_INIT(&buf, 0);
   if (obj->header.type == GRN_ACCESSOR) {
     grn_accessor *a = (grn_accessor *)obj;
+    GRN_TEXT_INIT(&buf, 0);
     for (;;) {
       GRN_BULK_REWIND(&buf);
       switch (a->action) {
@@ -2452,11 +2452,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
         buf.header.domain = GRN_DB_INT32;
         break;
       case GRN_ACCESSOR_GET_COLUMN_VALUE :
-        /* todo : support vector */
-        grn_obj_get_value(ctx, a->obj, id, &buf);
         if ((a->obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
-          grn_id *idp = (grn_id *)GRN_BULK_HEAD(&buf);
           if (a->next) {
+            grn_id *idp;
+            grn_obj_get_value(ctx, a->obj, id, &buf);
+            idp = (grn_id *)GRN_BULK_HEAD(&buf);
             GRN_TEXT_PUTC(ctx, bulk, '[');
             for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) {
               grn_text_atoj(ctx, bulk, (grn_obj *)a->next, *idp);
@@ -2464,19 +2464,11 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
             }
             GRN_TEXT_PUTC(ctx, bulk, ']');
           } else {
-            grn_obj b;
-            GRN_RECORD_INIT(&b, 0, DB_OBJ(a->obj)->range);
-            GRN_TEXT_PUTC(ctx, bulk, '[');
-            /* todo: support other fixe sized data types */
-            for (vs = GRN_BULK_VSIZE(&buf) / sizeof(grn_id); vs--; idp++) {
-              GRN_RECORD_SET(ctx, &b, *idp);
-              grn_text_otoj(ctx, bulk, &b, NULL);
-              if (vs) { GRN_TEXT_PUTC(ctx, bulk, ','); }
-            }
-            GRN_TEXT_PUTC(ctx, bulk, ']');
-            GRN_OBJ_FIN(ctx, &b);
+            grn_text_atoj(ctx, bulk, a->obj, id);
           }
           goto exit;
+        } else {
+          grn_obj_get_value(ctx, a->obj, id, &buf);
         }
         break;
       case GRN_ACCESSOR_GET_DB_OBJ :
@@ -2497,6 +2489,29 @@ grn_text_atoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_id id)
       }
     }
   } else {
+    switch (obj->header.type) {
+    case GRN_COLUMN_FIX_SIZE :
+      GRN_VALUE_FIX_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+      break;
+    case GRN_COLUMN_VAR_SIZE :
+      if ((obj->header.flags & GRN_OBJ_COLUMN_TYPE_MASK) == GRN_OBJ_COLUMN_VECTOR) {
+        grn_obj *range = grn_ctx_at(ctx, DB_OBJ(obj)->range);
+        if (range->header.flags & GRN_OBJ_KEY_VAR_SIZE) {
+          GRN_VALUE_VAR_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+        } else {
+          GRN_VALUE_FIX_SIZE_INIT(&buf, GRN_OBJ_VECTOR, DB_OBJ(obj)->range);
+        }
+      } else {
+        GRN_VALUE_VAR_SIZE_INIT(&buf, 0, DB_OBJ(obj)->range);
+      }
+      break;
+    case GRN_COLUMN_INDEX :
+      GRN_UINT32_INIT(&buf, 0);
+      break;
+    default:
+      GRN_TEXT_INIT(&buf, 0);
+      break;
+    }
     grn_obj_get_value(ctx, obj, id, &buf);
   }
   grn_text_otoj(ctx, bulk, &buf, NULL);

  Modified: test/unit/core/test-command-select.c (+52 -0)
===================================================================
--- test/unit/core/test-command-select.c    2010-06-30 08:17:10 +0000 (d12c2d2)
+++ test/unit/core/test-command-select.c    2010-06-30 01:34:55 +0000 (01e9ea4)
@@ -24,6 +24,8 @@
 
 void test_nil_column_reference_value(void);
 void test_output_columns_with_space(void);
+void test_vector_geo_point(void);
+void test_vector_geo_point_with_query(void);
 
 static gchar *tmp_directory;
 
@@ -120,3 +122,53 @@ test_output_columns_with_space(void)
                           send_command("select Sites "
                                        "--output_columns '_key, uri'"));
 }
+
+void
+test_vector_geo_point(void)
+{
+  assert_send_command("table_create Shops TABLE_HASH_KEY ShortText");
+  assert_send_command("column_create Shops places COLUMN_VECTOR WGS84GeoPoint");
+  assert_send_command("load "
+                      "'["
+                      "[\"_key\",\"places\"],"
+                      "[\"daruma\","
+                      "[\"130094061x505025099\",\"130185500x505009000\"]]"
+                      "]' "
+                      "Shops");
+  cut_assert_equal_string("[["
+                          "[1],"
+                          "["
+                          "[\"_id\",\"UInt32\"],"
+                          "[\"_key\",\"ShortText\"],"
+                          "[\"places\",\"WGS84GeoPoint\"]"
+                          "],"
+                          "[1,\"daruma\","
+                          "[\"130094061x505025099\",\"130185500x505009000\"]]"
+                          "]]",
+                          send_command("select Shops"));
+}
+
+void
+test_vector_geo_point_with_query(void)
+{
+  assert_send_command("table_create Shops TABLE_HASH_KEY ShortText");
+  assert_send_command("column_create Shops places COLUMN_VECTOR WGS84GeoPoint");
+  assert_send_command("load "
+                      "'["
+                      "[\"_key\",\"places\"],"
+                      "[\"daruma\","
+                      "[\"130094061x505025099\",\"130185500x505009000\"]]"
+                      "]' "
+                      "Shops");
+  cut_assert_equal_string("[["
+                          "[1],"
+                          "["
+                          "[\"_id\",\"UInt32\"],"
+                          "[\"_key\",\"ShortText\"],"
+                          "[\"places\",\"WGS84GeoPoint\"]"
+                          "],"
+                          "[1,\"daruma\","
+                          "[\"130094061x505025099\",\"130185500x505009000\"]]"
+                          "]]",
+                          send_command("select Shops --query _key:daruma"));
+}




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