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