[Groonga-commit] groonga/groonga at b63217c [master] grn_obj_get_value: return the first sub record ID for group result table

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Nov 16 19:31:03 JST 2014


Kouhei Sutou	2014-11-16 19:31:03 +0900 (Sun, 16 Nov 2014)

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

  Message:
    grn_obj_get_value: return the first sub record ID for group result table
    
    Because group result table's range is sub record. It's natural that
    _value pseudo column returns sub record ID.
    
    It may be better that we add _subrecs pseudo column.

  Modified files:
    lib/db.c

  Modified: lib/db.c (+24 -10)
===================================================================
--- lib/db.c    2014-11-16 19:28:38 +0900 (cbea236)
+++ lib/db.c    2014-11-16 19:31:03 +0900 (4b4a16b)
@@ -6110,19 +6110,33 @@ grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value)
     break;
   case GRN_TABLE_HASH_KEY :
     {
-      grn_hash *hash = (grn_hash *)obj;
-      uint32_t size = hash->value_size;
+      grn_bool processed = GRN_FALSE;
       grn_obj_ensure_bulk(ctx, value);
-      if (grn_bulk_space(ctx, value, size)) {
-        MERR("grn_bulk_space failed");
-        goto exit;
+      value->header.domain = grn_obj_get_range(ctx, obj);
+      if (GRN_TABLE_IS_GROUPED(obj)) {
+        grn_obj *domain;
+        domain = grn_ctx_at(ctx, value->header.domain);
+        if (GRN_OBJ_TABLEP(domain)) {
+          grn_id subrec_id;
+          if (grn_table_get_subrecs(ctx, obj, id, &subrec_id, NULL, 1) == 1) {
+            GRN_RECORD_SET(ctx, value, subrec_id);
+            processed = GRN_TRUE;
+          }
+        }
+        grn_obj_unlink(ctx, domain);
       }
-      {
-        char *curr = GRN_BULK_CURR(value);
-        grn_hash_get_value(ctx, hash, id, curr - size);
+      if (!processed) {
+        grn_hash *hash = (grn_hash *)obj;
+        uint32_t size = hash->value_size;
+        if (grn_bulk_space(ctx, value, size)) {
+          MERR("grn_bulk_space failed");
+          goto exit;
+        }
+        {
+          char *curr = GRN_BULK_CURR(value);
+          grn_hash_get_value(ctx, hash, id, curr - size);
+        }
       }
-      value->header.type = GRN_BULK;
-      value->header.domain = grn_obj_get_range(ctx, obj);
     }
     break;
   case GRN_TABLE_NO_KEY :
-------------- next part --------------
HTML����������������������������...
Download 



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