[Groonga-commit] groonga/groonga [master] build_index() supports index for _key.

Zurück zum Archiv-Index

null+****@clear***** null+****@clear*****
2010年 8月 18日 (水) 21:17:06 JST


Daijiro MORI	2010-08-18 12:17:06 +0000 (Wed, 18 Aug 2010)

  New Revision: 33f54a0c08b282bd4394aeb80241f3baed57fe77

  Log:
    build_index() supports index for _key.

  Modified files:
    lib/db.c

  Modified: lib/db.c (+17 -16)
===================================================================
--- lib/db.c    2010-08-13 05:34:04 +0000 (b08c5d3)
+++ lib/db.c    2010-08-18 12:17:06 +0000 (6513261)
@@ -4889,40 +4889,41 @@ exit :
 static void
 build_index(grn_ctx *ctx, grn_obj *obj)
 {
-
+  int i, ncol;
+  grn_id id, *s;
   grn_table_cursor  *tc;
-  grn_obj   *src, *src_dom, **cp, **col, rv;
-  grn_id    id, *s;
-  int     i, ncol;
-
+  grn_obj *src, *src_dom, **cp, **col, rv;
   s = DB_OBJ(obj)->source;
   src = grn_ctx_at(ctx, *s);
-  src_dom = grn_ctx_at(ctx, src->header.domain);
+  if (GRN_OBJ_TABLEP(src)) {
+    src_dom = src;
+  } else {
+    src_dom = grn_ctx_at(ctx, src->header.domain);
+  }
   if (!src_dom) { ERR(GRN_INVALID_ARGUMENT, "domain invalid"); }
-
   ncol = DB_OBJ(obj)->source_size / sizeof(grn_id);
   col = GRN_MALLOC(ncol * sizeof(grn_obj));
   cp = col;
-
   for (i=0; i < ncol; i++, s++, col++) {
     *col = grn_ctx_at(ctx, *s);
     if (!*col) { ERR(GRN_INVALID_ARGUMENT, "source invalid, n=%d",i); }
   }
   col = cp;
-
-  tc = grn_table_cursor_open(ctx, src_dom, NULL, 0, NULL, 0,
-                             0, -1, GRN_CURSOR_BY_ID);
-
+  tc = grn_table_cursor_open(ctx, src_dom, NULL, 0, NULL, 0, 0, -1, GRN_CURSOR_BY_ID);
+  GRN_TEXT_INIT(&rv, 0);
   while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) {
     for (i = 0; i < ncol; i++, col++) {
-      GRN_TEXT_INIT(&rv, 0);
-      grn_obj_get_value(ctx, *col, id, &rv);
+      GRN_BULK_REWIND(&rv);
+      if (GRN_OBJ_TABLEP(*col)) {
+        grn_table_get_key2(ctx, *col, id, &rv);
+      } else {
+        grn_obj_get_value(ctx, *col, id, &rv);
+      }
       call_hook_for_build(ctx, *col, id, &rv, 0);
-      GRN_OBJ_FIN(ctx, &rv);
     }
     col = cp;
   }
-
+  GRN_OBJ_FIN(ctx, &rv);
   grn_table_cursor_close(ctx, tc);
 }
 




Groonga-commit メーリングリストの案内
Zurück zum Archiv-Index