[Groonga-commit] groonga/groonga at 3db6d6a [master] expr: support prefix match search using multiple indexes

Back to archive index

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����������������������������...
下载 



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