Susumu Yata
null+****@clear*****
Tue Aug 1 14:55:45 JST 2017
Susumu Yata 2017-08-01 14:55:45 +0900 (Tue, 01 Aug 2017) New Revision: 3db6d6a1cb12896d0f1db8299cbf1dfe39c1ce65 https://github.com/groonga/groonga/commit/3db6d6a1cb12896d0f1db8299cbf1dfe39c1ce65 Merged 12a2dad: Merge pull request #750 from groonga/prefix-match-using-multiple-indexes Message: expr: support prefix match search using multiple indexes Modified files: lib/expr.c Modified: lib/expr.c (+26 -21) =================================================================== --- lib/expr.c 2017-08-01 14:55:17 +0900 (83a75a2) +++ lib/expr.c 2017-08-01 14:55:45 +0900 (c04c9ac) @@ -6064,28 +6064,33 @@ grn_table_select_index_prefix(grn_ctx *ctx, } } } else { - grn_obj *domain = grn_ctx_at(ctx, index->header.domain); - if (domain) { - grn_hash *pres; - if ((pres = grn_hash_create(ctx, NULL, sizeof(grn_id), 0, - GRN_OBJ_TABLE_HASH_KEY))) { - grn_id *key; - if (si->op == GRN_OP_SUFFIX) { - grn_table_select_index_report(ctx, "[suffix]", index); - } else { - grn_table_select_index_report(ctx, "[prefix]", index); - } - grn_table_search(ctx, domain, - GRN_BULK_HEAD(si->query), - GRN_BULK_VSIZE(si->query), - si->op, (grn_obj *)pres, GRN_OP_OR); - grn_obj_unlink(ctx, domain); - GRN_HASH_EACH(ctx, pres, id, &key, NULL, NULL, { - grn_ii_at(ctx, (grn_ii *)index, *key, (grn_hash *)res, si->logical_op); - }); - grn_hash_close(ctx, pres); + grn_obj **indexes = &GRN_PTR_VALUE(&si->index); + int i, n_indexes = GRN_BULK_VSIZE(&si->index)/sizeof(grn_obj *); + for (i = 0; i < n_indexes; i++) { + grn_obj *index = indexes[i]; + grn_obj *lexicon = grn_ctx_at(ctx, index->header.domain); + if (lexicon) { + grn_hash *keys; + if ((keys = grn_hash_create(ctx, NULL, sizeof(grn_id), 0, + GRN_OBJ_TABLE_HASH_KEY))) { + grn_id *key; + if (si->op == GRN_OP_SUFFIX) { + grn_table_select_index_report(ctx, "[suffix]", index); + } else { + grn_table_select_index_report(ctx, "[prefix]", index); + } + grn_table_search(ctx, lexicon, + GRN_BULK_HEAD(si->query), + GRN_BULK_VSIZE(si->query), + si->op, (grn_obj *)keys, GRN_OP_OR); + grn_obj_unlink(ctx, lexicon); + GRN_HASH_EACH(ctx, keys, id, &key, NULL, NULL, { + grn_ii_at(ctx, (grn_ii *)index, *key, (grn_hash *)res, si->logical_op); + }); + grn_hash_close(ctx, keys); + } + grn_obj_unlink(ctx, lexicon); } - grn_obj_unlink(ctx, domain); } grn_ii_resolve_sel_and(ctx, (grn_hash *)res, si->logical_op); processed = GRN_TRUE; -------------- next part -------------- HTML����������������������������...下载