[Groonga-commit] groonga/groonga at 4addfcf [master] Move setting forward index code to grn_obj_set_value()

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Feb 21 11:43:24 JST 2014


Kouhei Sutou	2014-02-21 11:43:24 +0900 (Fri, 21 Feb 2014)

  New Revision: 4addfcfb46d5121aab5b8820ed6a920c946b1eef
  https://github.com/groonga/groonga/commit/4addfcfb46d5121aab5b8820ed6a920c946b1eef

  Message:
    Move setting forward index code to grn_obj_set_value()
    
    Now, we can set forward index value by grn_obj_set_value().
    
    Supporting inverted index for forward index isn't implemented yet. It
    is the next task.

  Modified files:
    lib/db.c

  Modified: lib/db.c (+121 -35)
===================================================================
--- lib/db.c    2014-02-21 11:40:18 +0900 (b48c10c)
+++ lib/db.c    2014-02-21 11:43:24 +0900 (bec88ff)
@@ -5672,6 +5672,96 @@ grn_obj_set_value_column_fix_size(grn_ctx *ctx, grn_obj *obj, grn_id id,
   return rc;
 }
 
+static grn_rc
+grn_obj_set_value_column_index(grn_ctx *ctx, grn_obj *obj, grn_id id,
+                               grn_obj *value, int flags)
+{
+  grn_id range_id;
+  grn_obj *range;
+
+  if (DB_OBJ(obj)->source_size > 0) {
+    char column_name[GRN_TABLE_MAX_KEY_SIZE];
+    int column_name_size;
+    column_name_size = grn_obj_name(ctx, obj, column_name,
+                                    GRN_TABLE_MAX_KEY_SIZE);
+    ERR(GRN_INVALID_ARGUMENT,
+        "can't set value to not forward index column directly: <%.*s>",
+        column_name_size, column_name);
+    return ctx->rc;
+  }
+
+  if (value->header.type != GRN_VECTOR) {
+    grn_obj inspected;
+    GRN_TEXT_INIT(&inspected, 0);
+    grn_inspect(ctx, value, &inspected);
+    ERR(GRN_INVALID_ARGUMENT,
+        "index value must be a vector: <%.*s>",
+        (int)GRN_TEXT_LEN(&inspected),
+        GRN_TEXT_VALUE(&inspected));
+    GRN_OBJ_FIN(ctx, &inspected);
+    return ctx->rc;
+  }
+
+  range_id = DB_OBJ(obj)->range;
+  range = grn_ctx_at(ctx, range_id);
+  if (!range) {
+    char column_name[GRN_TABLE_MAX_KEY_SIZE];
+    int column_name_size;
+    column_name_size = grn_obj_name(ctx, obj, column_name,
+                                    GRN_TABLE_MAX_KEY_SIZE);
+    ERR(GRN_INVALID_ARGUMENT,
+        "<%.*s>: dangling range reference: <%d>",
+        column_name_size, column_name,
+        range_id);
+    return ctx->rc;
+  }
+
+  {
+    unsigned int i, n;
+    grn_obj key_buffer;
+    grn_obj token_buffer;
+
+    n = grn_vector_size(ctx, value);
+    GRN_VOID_INIT(&key_buffer);
+    GRN_RECORD_INIT(&token_buffer, 0, range_id);
+    for (i = 0; i < n; i++) {
+      grn_rc rc;
+      const char *key;
+      unsigned int key_length;
+      unsigned int weight;
+      grn_id domain_id;
+      grn_ii_updspec *update_spec;
+      grn_id token_id;
+
+      key_length = grn_vector_get_element(ctx, value, i,
+                                          &key, &weight, &domain_id);
+      if (ctx->rc != GRN_SUCCESS) {
+        break;
+      }
+      grn_obj_reinit(ctx, &key_buffer, domain_id, 0);
+      grn_bulk_write(ctx, &key_buffer, key, key_length);
+      GRN_BULK_REWIND(&token_buffer);
+      rc = grn_obj_cast(ctx, &key_buffer, &token_buffer, GRN_TRUE);
+      if (rc != GRN_SUCCESS) {
+        REPORT_CAST_ERROR(obj, range, value);
+        break;
+      }
+      token_id = GRN_RECORD_VALUE(&token_buffer);
+
+      update_spec = grn_ii_updspec_open(ctx, token_id, 1);
+      grn_ii_updspec_add(ctx, update_spec, 0, weight);
+      grn_ii_update_one(ctx, (grn_ii *)obj, id, update_spec, NULL);
+      grn_ii_updspec_close(ctx, update_spec);
+    }
+    GRN_OBJ_FIN(ctx, &key_buffer);
+    GRN_OBJ_FIN(ctx, &token_buffer);
+  }
+
+  grn_obj_unlink(ctx, range);
+
+  return ctx->rc;
+}
+
 grn_rc
 grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id,
                   grn_obj *value, int flags)
@@ -5717,7 +5807,7 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id,
       rc = grn_obj_set_value_column_fix_size(ctx, obj, id, value, flags);
       break;
     case GRN_COLUMN_INDEX :
-      // todo : how??
+      rc = grn_obj_set_value_column_index(ctx, obj, id, value, flags);
       break;
     }
   }
@@ -9580,10 +9670,6 @@ set_vector(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *vector)
 static void
 set_index_value(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *index_value)
 {
-  uint i, n;
-  grn_id range_id;
-  grn_obj *range;
-
   if (column->header.type != GRN_COLUMN_INDEX) {
     char column_name[GRN_TABLE_MAX_KEY_SIZE];
     int column_name_size;
@@ -9595,37 +9681,37 @@ set_index_value(grn_ctx *ctx, grn_obj *column, grn_id id, grn_obj *index_value)
     return;
   }
 
-  n = GRN_UINT32_VALUE(index_value);
-  range_id = grn_obj_get_range(ctx, column);
-  range = grn_ctx_at(ctx, range_id);
-  if (!range) {
-    char column_name[GRN_TABLE_MAX_KEY_SIZE];
-    int column_name_size;
-    column_name_size = grn_obj_name(ctx, column, column_name,
-                                    GRN_TABLE_MAX_KEY_SIZE);
-    ERR(GRN_INVALID_ARGUMENT,
-        "<%.*s>: dangling range reference: <%d>",
-        column_name_size, column_name,
-        range_id);
-    return;
-  }
-
-  for (i = 0; i < n; i += 2) {
-    grn_obj *key, *value;
-    grn_id token_id;
-    grn_ii_updspec *update_spec;
-    key = index_value + 1 + i;
-    value = key + 1;
-    token_id = grn_table_add(ctx, range,
-                             GRN_TEXT_VALUE(key), GRN_TEXT_LEN(key),
-                             NULL);
-    if (token_id == GRN_ID_NIL) {
-      break;
+  {
+    unsigned int i, n;
+    grn_obj vector;
+    grn_obj weight_buffer;
+
+    n = GRN_UINT32_VALUE(index_value);
+    GRN_TEXT_INIT(&vector, GRN_OBJ_VECTOR);
+    GRN_UINT32_INIT(&weight_buffer, 0);
+    for (i = 0; i < n; i += 2) {
+      grn_rc rc;
+      grn_obj *key, *weight;
+
+      key = index_value + 1 + i;
+      weight = key + 1;
+
+      GRN_BULK_REWIND(&weight_buffer);
+      rc = grn_obj_cast(ctx, weight, &weight_buffer, GRN_TRUE);
+      if (rc != GRN_SUCCESS) {
+        grn_obj *range;
+        range = grn_ctx_at(ctx, weight_buffer.header.domain);
+        REPORT_CAST_ERROR(column, range, weight);
+        grn_obj_unlink(ctx, range);
+        break;
+      }
+      grn_vector_add_element(ctx, &vector,
+                             GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key),
+                             GRN_UINT32_VALUE(&weight_buffer),
+                             key->header.domain);
     }
-    update_spec = grn_ii_updspec_open(ctx, token_id, 1);
-    grn_ii_updspec_add(ctx, update_spec, 0, GRN_UINT32_VALUE(value));
-    grn_ii_update_one(ctx, (grn_ii *)column, id, update_spec, NULL);
-    grn_ii_updspec_close(ctx, update_spec);
+    grn_obj_set_value(ctx, column, id, &vector, GRN_OBJ_SET);
+    GRN_OBJ_FIN(ctx, &vector);
   }
 }
 
-------------- next part --------------
HTML����������������������������...
Download 



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