[Groonga-commit] groonga/groonga at 38fb330 [master] grn_obj_set_value: support key value uvector for reference column

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Apr 26 18:02:41 JST 2018


Kouhei Sutou	2018-04-26 18:02:41 +0900 (Thu, 26 Apr 2018)

  New Revision: 38fb330c13e37a8af898072155c7d52da58c49af
  https://github.com/groonga/groonga/commit/38fb330c13e37a8af898072155c7d52da58c49af

  Message:
    grn_obj_set_value: support key value uvector for reference column
    
    ID uvector support isn't broken with this change.

  Modified files:
    lib/db.c

  Modified: lib/db.c (+20 -9)
===================================================================
--- lib/db.c    2018-04-26 11:37:21 +0900 (e84a3da53)
+++ lib/db.c    2018-04-26 18:02:41 +0900 (d2d4fb205)
@@ -7545,22 +7545,33 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column,
     uvector.header.flags |= uvector_flags;
     n = grn_uvector_size(ctx, value);
     if (need_cast) {
-      grn_obj value_record;
+      const char *raw_value;
+      unsigned int element_size;
+      grn_obj element;
       grn_obj casted_record;
 
-      GRN_VALUE_FIX_SIZE_INIT(&value_record, 0, value->header.domain);
+      raw_value = GRN_BULK_HEAD(value);
+      element_size = grn_uvector_element_size(ctx, value);
+      GRN_VALUE_FIX_SIZE_INIT(&element, 0, value->header.domain);
       GRN_VALUE_FIX_SIZE_INIT(&casted_record, 0, column_range_id);
       for (i = 0; i < n; i++) {
-        grn_id id;
         grn_id casted_id;
         unsigned int weight = 0;
 
-        GRN_BULK_REWIND(&value_record);
+        GRN_BULK_REWIND(&element);
         GRN_BULK_REWIND(&casted_record);
 
-        id = grn_uvector_get_element(ctx, value, i, NULL);
-        GRN_RECORD_SET(ctx, &value_record, id);
-        rc = grn_obj_cast(ctx, &value_record, &casted_record, GRN_TRUE);
+        if (IS_WEIGHT_UVECTOR(value)) {
+          grn_id raw_element;
+          raw_element = grn_uvector_get_element(ctx, value, i, NULL);
+          GRN_RECORD_SET(ctx, &element, raw_element);
+        } else {
+          grn_bulk_write(ctx,
+                         &element,
+                         raw_value + (element_size * i),
+                         element_size);
+        }
+        rc = grn_obj_cast(ctx, &element, &casted_record, GRN_TRUE);
         if (rc != GRN_SUCCESS) {
           char column_name[GRN_TABLE_MAX_KEY_SIZE];
           int column_name_size;
@@ -7570,7 +7581,7 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column,
                                           column_name,
                                           GRN_TABLE_MAX_KEY_SIZE);
           GRN_TEXT_INIT(&inspected, 0);
-          grn_inspect(ctx, &inspected, &value_record);
+          grn_inspect(ctx, &inspected, &element);
           ERR(rc,
               "[column][set-value] failed to cast: <%.*s>: <%.*s>",
               column_name_size,
@@ -7584,7 +7595,7 @@ grn_obj_set_value_column_var_size_vector_uvector(grn_ctx *ctx, grn_obj *column,
         grn_uvector_add_element(ctx, &uvector, casted_id, weight);
       }
 
-      GRN_OBJ_FIN(ctx, &value_record);
+      GRN_OBJ_FIN(ctx, &element);
       GRN_OBJ_FIN(ctx, &casted_record);
     } else {
       for (i = 0; i < n; i++) {
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180426/2a722ddf/attachment-0001.htm 



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