[Groonga-commit] groonga/groonga at b46a16b [master] ii: support vector and uvector combination of update

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Mar 7 15:23:38 JST 2018


Kouhei Sutou	2018-03-07 15:23:38 +0900 (Wed, 07 Mar 2018)

  New Revision: b46a16be44572ac3e2366f6dd0f82c96f2c5d861
  https://github.com/groonga/groonga/commit/b46a16be44572ac3e2366f6dd0f82c96f2c5d861

  Message:
    ii: support vector and uvector combination of update

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+33 -8)
===================================================================
--- lib/ii.c    2018-03-04 01:23:26 +0900 (ab154dbf0)
+++ lib/ii.c    2018-03-07 15:23:38 +0900 (a82342560)
@@ -6343,6 +6343,27 @@ grn_uvector2updspecs(grn_ctx *ctx, grn_ii *ii, grn_id rid,
   }
 }
 
+static void
+grn_ii_column_update_get_element_value(grn_ctx *ctx,
+                                       grn_obj *vector,
+                                       unsigned int i,
+                                       grn_obj *element_buffer)
+{
+  if (vector->header.type == GRN_UVECTOR) {
+    const unsigned int size = grn_uvector_element_size(ctx, vector);
+    grn_bulk_write_from(ctx,
+                        element_buffer,
+                        GRN_BULK_HEAD(vector) + (size * i),
+                        0,
+                        size);
+  } else {
+    const char *value;
+    unsigned int size;
+    size = grn_vector_get_element(ctx, vector, i, &value, NULL, NULL);
+    GRN_TEXT_SET(ctx, element_buffer, value, size);
+  }
+}
+
 grn_rc
 grn_ii_column_update(grn_ctx *ctx, grn_ii *ii, grn_id rid, unsigned int section,
                      grn_obj *oldvalue, grn_obj *newvalue, grn_obj *posting)
@@ -6385,27 +6406,31 @@ grn_ii_column_update(grn_ctx *ctx, grn_ii *ii, grn_id rid, unsigned int section,
         unsigned int i, max_n;
         unsigned int old_n = 0, new_n = 0;
         if (old) {
+          grn_obj_flags flags = 0;
           old_n = grn_vector_size(ctx, old);
-          GRN_OBJ_INIT(&old_elem, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY, old->header.domain);
+          if (old->header.type == GRN_VECTOR) {
+            flags |= GRN_OBJ_DO_SHALLOW_COPY;
+          }
+          GRN_OBJ_INIT(&old_elem, GRN_BULK, flags, old->header.domain);
         }
         if (new) {
+          grn_obj_flags flags = 0;
           new_n = grn_vector_size(ctx, new);
-          GRN_OBJ_INIT(&new_elem, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY, new->header.domain);
+          if (old->header.type == GRN_VECTOR) {
+            flags |= GRN_OBJ_DO_SHALLOW_COPY;
+          }
+          GRN_OBJ_INIT(&new_elem, GRN_BULK, flags, new->header.domain);
         }
         max_n = (old_n > new_n) ? old_n : new_n;
         for (i = 0; i < max_n; i++) {
           grn_rc rc;
           grn_obj *old_p = NULL, *new_p = NULL;
           if (i < old_n) {
-            const char *str;
-            unsigned int size = grn_vector_get_element(ctx, old, i, &str, NULL, NULL);
-            GRN_TEXT_SET_REF(&old_elem, str, size);
+            grn_ii_column_update_get_element_value(ctx, old, i, &old_elem);
             old_p = &old_elem;
           }
           if (i < new_n) {
-            const char *str;
-            unsigned int size = grn_vector_get_element(ctx, new, i, &str, NULL, NULL);
-            GRN_TEXT_SET_REF(&new_elem, str, size);
+            grn_ii_column_update_get_element_value(ctx, new, i, &new_elem);
             new_p = &new_elem;
           }
           rc = grn_ii_column_update(ctx, ii, rid, section + i, old_p, new_p, posting);
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180307/6c8a594e/attachment-0001.htm 



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