[Groonga-commit] groonga/groonga at 65ec5e8 [master] Support setting weight vector to reference type weight vector

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Jul 14 00:07:33 JST 2014


Kouhei Sutou	2014-07-14 00:07:33 +0900 (Mon, 14 Jul 2014)

  New Revision: 65ec5e80ccb4af12c8693e89f69e75df73f6fa9f
  https://github.com/groonga/groonga/commit/65ec5e80ccb4af12c8693e89f69e75df73f6fa9f

  Message:
    Support setting weight vector to reference type weight vector

  Modified files:
    lib/db.c
    lib/db.h

  Modified: lib/db.c (+52 -42)
===================================================================
--- lib/db.c    2014-07-13 23:14:51 +0900 (93b32af)
+++ lib/db.c    2014-07-14 00:07:33 +0900 (e8d708c)
@@ -486,8 +486,6 @@ grn_db_check_name(grn_ctx *ctx, const char *name, unsigned int name_size)
   return GRN_SUCCESS;
 }
 
-#define GRN_TYPE_SIZE(type) ((type)->range)
-
 grn_obj *
 grn_type_create(grn_ctx *ctx, const char *name, unsigned int name_size,
                 grn_obj_flags flags, unsigned int size)
@@ -5671,8 +5669,11 @@ grn_obj_set_value_column_var_size_vector(grn_ctx *ctx, grn_obj *obj, grn_id id,
   }
 
   if (GRN_OBJ_TABLEP(lexicon)) {
-    grn_obj buf;
-    GRN_TEXT_INIT(&buf, 0);
+    grn_obj uvector;
+    GRN_RECORD_INIT(&uvector, GRN_OBJ_VECTOR, range);
+    if (obj->header.flags & GRN_OBJ_WITH_WEIGHT) {
+      uvector.header.flags |= GRN_OBJ_WITH_WEIGHT;
+    }
     switch (value->header.type) {
     case GRN_BULK :
       {
@@ -5683,62 +5684,71 @@ grn_obj_set_value_column_var_size_vector(grn_ctx *ctx, grn_obj *obj, grn_id id,
                                     GRN_TOKEN_ADD, token_flags))) {
           while (!token->status) {
             grn_id tid = grn_token_next(ctx, token);
-            grn_bulk_write(ctx, &buf, (char *)&tid, sizeof(grn_id));
+            grn_uvector_add_element(ctx, &uvector, tid, 0);
           }
           grn_token_close(ctx, token);
         }
         rc = grn_ja_put(ctx, (grn_ja *)obj, id,
-                        GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf), flags, NULL);
+                        GRN_BULK_HEAD(&uvector), GRN_BULK_VSIZE(&uvector),
+                        flags, NULL);
       }
       break;
     case GRN_VECTOR :
-      if (value->u.v.body) {
-        int j;
-        grn_section *v;
-        grn_obj value_buf, cast_buf;
-        const char *head = GRN_BULK_HEAD(value->u.v.body);
-        GRN_OBJ_INIT(&value_buf, GRN_BULK, 0, GRN_DB_VOID);
-        GRN_OBJ_INIT(&cast_buf, GRN_BULK, 0, lexicon->header.domain);
-        for (j = value->u.v.n_sections, v = value->u.v.sections; j; j--, v++) {
-          const char *value_ptr = head + v->offset;
-          int value_length = v->length;
-          grn_id tid;
-          if (v->domain != lexicon->header.domain) {
-            GRN_BULK_REWIND(&cast_buf);
-            GRN_BULK_REWIND(&value_buf);
-            grn_bulk_write(ctx, &value_buf, value_ptr, value_length);
-            value_buf.header.domain = v->domain;
-            rc = grn_obj_cast(ctx, &value_buf, &cast_buf, GRN_TRUE);
-            if (rc) {
-              grn_obj *range_obj;
-              range_obj = grn_ctx_at(ctx, range);
-              ERR_CAST(obj, range_obj, &value_buf);
-              grn_obj_unlink(ctx, range_obj);
+      {
+        unsigned int n;
+        n = grn_vector_size(ctx, value);
+        if (n > 0) {
+          unsigned int i;
+          grn_obj value_buf, cast_buf;
+          GRN_OBJ_INIT(&value_buf, GRN_BULK, 0, GRN_DB_VOID);
+          GRN_OBJ_INIT(&cast_buf, GRN_BULK, 0, lexicon->header.domain);
+          for (i = 0; i < n; i++) {
+            grn_id tid;
+            const char *element;
+            unsigned int element_length;
+            unsigned int weight;
+            grn_id element_domain;
+
+            element_length = grn_vector_get_element(ctx, value, i,
+                                                    &element, &weight,
+                                                    &element_domain);
+            if (element_domain != lexicon->header.domain) {
+              GRN_BULK_REWIND(&cast_buf);
+              GRN_BULK_REWIND(&value_buf);
+              grn_bulk_write(ctx, &value_buf, element, element_length);
+              value_buf.header.domain = element_domain;
+              rc = grn_obj_cast(ctx, &value_buf, &cast_buf, GRN_TRUE);
+              if (rc) {
+                grn_obj *range_obj;
+                range_obj = grn_ctx_at(ctx, range);
+                ERR_CAST(obj, range_obj, &value_buf);
+                grn_obj_unlink(ctx, range_obj);
+              } else {
+                element = GRN_BULK_HEAD(&cast_buf);
+                element_length = GRN_BULK_VSIZE(&cast_buf);
+              }
             } else {
-              value_ptr = GRN_BULK_HEAD(&cast_buf);
-              value_length = GRN_BULK_VSIZE(&cast_buf);
+              rc = GRN_SUCCESS;
             }
-          } else {
-            rc = GRN_SUCCESS;
-          }
-          if (rc) {
-            continue;
+            if (rc) {
+              continue;
+            }
+            tid = grn_table_add(ctx, lexicon, element, element_length, NULL);
+            grn_uvector_add_element(ctx, &uvector, tid, weight);
           }
-          tid = grn_table_add(ctx, lexicon,
-                              value_ptr, value_length, NULL);
-          grn_bulk_write(ctx, &buf, (char *)&tid, sizeof(grn_id));
+          GRN_OBJ_FIN(ctx, &value_buf);
+          GRN_OBJ_FIN(ctx, &cast_buf);
         }
-        GRN_OBJ_FIN(ctx, &value_buf);
-        GRN_OBJ_FIN(ctx, &cast_buf);
       }
       rc = grn_ja_put(ctx, (grn_ja *)obj, id,
-                      GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf), flags, NULL);
+                      GRN_BULK_HEAD(&uvector), GRN_BULK_VSIZE(&uvector),
+                      flags, NULL);
       break;
     default :
       ERR(GRN_INVALID_ARGUMENT, "vector, uvector or bulk required");
       break;
     }
-    grn_obj_close(ctx, &buf);
+    grn_obj_close(ctx, &uvector);
   } else {
     switch (value->header.type) {
     case GRN_BULK :

  Modified: lib/db.h (+2 -0)
===================================================================
--- lib/db.h    2014-07-13 23:14:51 +0900 (1fb7ee5)
+++ lib/db.h    2014-07-14 00:07:33 +0900 (3a6863e)
@@ -128,6 +128,8 @@ struct _grn_type {
   grn_db_obj obj;
 };
 
+#define GRN_TYPE_SIZE(type) ((type)->range)
+
 #define GRN_TABLE_SORT_GEO            (0x02<<0)
 
 #define GRN_OBJ_TMP_OBJECT 0x80000000
-------------- next part --------------
HTML����������������������������...
Download 



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