[Groonga-commit] groonga/groonga at 9b5460b [master] sub_filter: support pre filter optimization with scalar scope

Zurück zum Archiv-Index

Kouhei Sutou null+****@clear*****
Tue May 15 15:47:20 JST 2018


Kouhei Sutou	2018-05-15 15:47:20 +0900 (Tue, 15 May 2018)

  New Revision: 9b5460b191f1ab591dc1852a5ed21310f9dea331
  https://github.com/groonga/groonga/commit/9b5460b191f1ab591dc1852a5ed21310f9dea331

  Message:
    sub_filter: support pre filter optimization with scalar scope

  Added files:
    test/command/suite/select/function/sub_filter/column/scalar/filtered.expected
    test/command/suite/select/function/sub_filter/column/scalar/filtered.test
  Modified files:
    lib/proc.c
    test/command/suite/select/function/sub_filter/column/vector/filtered.expected

  Modified: lib/proc.c (+51 -28)
===================================================================
--- lib/proc.c    2018-05-15 15:36:38 +0900 (6f0d98abc)
+++ lib/proc.c    2018-05-15 15:47:20 +0900 (3a4d21f7e)
@@ -2112,42 +2112,65 @@ sub_filter_pre_filter(grn_ctx *ctx,
                       grn_obj *base_res)
 {
   grn_posting posting;
-  grn_obj values;
 
   if (grn_table_size(ctx, res) > grn_sub_filter_pre_filter_threshold) {
     return GRN_FALSE;
   }
 
-  if (!grn_obj_is_vector_column(ctx, scope)) {
-    return GRN_FALSE;
-  }
+  if (grn_obj_is_vector_column(ctx, scope)) {
+    grn_obj values;
 
-  memset(&posting, 0, sizeof(grn_posting));
-  GRN_VOID_INIT(&values);
-  GRN_TABLE_EACH_BEGIN(ctx, res, cursor, id) {
-    grn_id *matched_id;
-    unsigned int i, n;
-
-    grn_table_cursor_get_key(ctx, cursor, (void **)&matched_id);
-    GRN_BULK_REWIND(&values);
-    grn_obj_get_value(ctx, scope, *matched_id, &values);
-    n = grn_vector_size(ctx, &values);
-    for (i = 0; i < n; i++) {
-      posting.rid = grn_uvector_get_element(ctx,
-                                            &values,
-                                            i,
-                                            &(posting.weight));
-      grn_ii_posting_add(ctx, &posting, (grn_hash *)base_res, GRN_OP_OR);
-    }
-  } GRN_TABLE_EACH_END(ctx, cursor);
-  GRN_OBJ_FIN(ctx, &values);
+    memset(&posting, 0, sizeof(grn_posting));
+    GRN_RECORD_INIT(&values, GRN_OBJ_VECTOR, grn_obj_get_range(ctx, scope));
+    GRN_TABLE_EACH_BEGIN(ctx, res, cursor, id) {
+      grn_id *matched_id;
+      unsigned int i, n;
+
+      grn_table_cursor_get_key(ctx, cursor, (void **)&matched_id);
+      GRN_BULK_REWIND(&values);
+      grn_obj_get_value(ctx, scope, *matched_id, &values);
+      n = grn_vector_size(ctx, &values);
+      for (i = 0; i < n; i++) {
+        posting.rid = grn_uvector_get_element(ctx,
+                                              &values,
+                                              i,
+                                              &(posting.weight));
+        grn_ii_posting_add(ctx, &posting, (grn_hash *)base_res, GRN_OP_OR);
+      }
+    } GRN_TABLE_EACH_END(ctx, cursor);
+    GRN_OBJ_FIN(ctx, &values);
 
-  grn_report_column(ctx,
-                    "[sub_filter][pre-filter]",
-                    "",
-                    scope);
+    grn_report_column(ctx,
+                      "[sub_filter][pre-filter]",
+                      "[vector]",
+                      scope);
+    return GRN_TRUE;
+  } else if (grn_obj_is_scalar_column(ctx, scope)) {
+    grn_obj value;
 
-  return GRN_TRUE;
+    memset(&posting, 0, sizeof(grn_posting));
+    GRN_RECORD_INIT(&value, 0, grn_obj_get_range(ctx, scope));
+    GRN_TABLE_EACH_BEGIN(ctx, res, cursor, id) {
+      grn_id *matched_id;
+
+      grn_table_cursor_get_key(ctx, cursor, (void **)&matched_id);
+      GRN_BULK_REWIND(&value);
+      grn_obj_get_value(ctx, scope, *matched_id, &value);
+      if (GRN_BULK_VSIZE(&value) > 0) {
+        posting.rid = GRN_RECORD_VALUE(&value);
+        grn_ii_posting_add(ctx, &posting, (grn_hash *)base_res, GRN_OP_OR);
+      }
+    } GRN_TABLE_EACH_END(ctx, cursor);
+    GRN_OBJ_FIN(ctx, &value);
+
+    grn_report_column(ctx,
+                      "[sub_filter][pre-filter]",
+                      "[scalar]",
+                      scope);
+    return GRN_TRUE;
+  } else {
+    return GRN_FALSE;
+  }
 }
 
 static grn_rc

  Added: test/command/suite/select/function/sub_filter/column/scalar/filtered.expected (+40 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/sub_filter/column/scalar/filtered.expected    2018-05-15 15:47:20 +0900 (a61746e05)
@@ -0,0 +1,40 @@
+table_create Files TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Files revision COLUMN_SCALAR UInt32
+[[0,0.0,0.0],true]
+table_create Packages TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Packages file COLUMN_SCALAR Files
+[[0,0.0,0.0],true]
+column_create Files packages_files_index COLUMN_INDEX Packages file
+[[0,0.0,0.0],true]
+table_create Revisions TABLE_PAT_KEY UInt32
+[[0,0.0,0.0],true]
+column_create Revisions files_revision COLUMN_INDEX Files revision
+[[0,0.0,0.0],true]
+load --table Files
+[
+{"_key": "include/groonga.h", "revision": 30},
+{"_key": "lib/groonga.rb",    "revision": 12},
+{"_key": "ha_mroonga.cc",     "revision": 40}
+]
+[[0,0.0,0.0],3]
+load --table Packages
+[
+{"_key": "groonga", "file": "include/groonga.h"},
+{"_key": "rroonga", "file": "lib/groonga.rb"},
+{"_key": "mroonga", "file": "ha_mroonga.cc"}
+]
+[[0,0.0,0.0],3]
+log_level --level info
+[[0,0.0,0.0],true]
+select Packages   --filter '_key == "rroonga" &&             sub_filter(file, "revision >= 10 && revision < 40")'   --output_columns '_key, files, files.revision'
+[[0,0.0,0.0],[[[1],[["_key","ShortText"]],["rroonga"]]]]
+#|i| [table][select][index][equal][accessor][key] <Packages>
+#|i| [table][select][index][selector][no-index][sub_filter] <Packages>
+#|i| [sub_filter][pre-filter][column][scalar] <Packages.file> -> <Files>
+#|i| [table][select][index][range] <Revisions.files_revision>
+#|i| [table][select][index][range] <Revisions.files_revision>
+#|i| [accessor][resolve][data-column][index] <Files.packages_files_index>
+log_level --level notice
+[[0,0.0,0.0],true]

  Added: test/command/suite/select/function/sub_filter/column/scalar/filtered.test (+33 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/sub_filter/column/scalar/filtered.test    2018-05-15 15:47:20 +0900 (4a2fadf7b)
@@ -0,0 +1,33 @@
+table_create Files TABLE_PAT_KEY ShortText
+column_create Files revision COLUMN_SCALAR UInt32
+
+table_create Packages TABLE_PAT_KEY ShortText
+column_create Packages file COLUMN_SCALAR Files
+
+column_create Files packages_files_index COLUMN_INDEX Packages file
+
+table_create Revisions TABLE_PAT_KEY UInt32
+column_create Revisions files_revision COLUMN_INDEX Files revision
+
+load --table Files
+[
+{"_key": "include/groonga.h", "revision": 30},
+{"_key": "lib/groonga.rb",    "revision": 12},
+{"_key": "ha_mroonga.cc",     "revision": 40}
+]
+
+load --table Packages
+[
+{"_key": "groonga", "file": "include/groonga.h"},
+{"_key": "rroonga", "file": "lib/groonga.rb"},
+{"_key": "mroonga", "file": "ha_mroonga.cc"}
+]
+
+#@add-important-log-levels info
+log_level --level info
+select Packages \
+  --filter '_key == "rroonga" && \
+            sub_filter(file, "revision >= 10 && revision < 40")' \
+  --output_columns '_key, files, files.revision'
+log_level --level notice
+#@remove-important-log-levels info

  Modified: test/command/suite/select/function/sub_filter/column/vector/filtered.expected (+1 -1)
===================================================================
--- test/command/suite/select/function/sub_filter/column/vector/filtered.expected    2018-05-15 15:36:38 +0900 (aed3acd44)
+++ test/command/suite/select/function/sub_filter/column/vector/filtered.expected    2018-05-15 15:47:20 +0900 (3e9f54fe8)
@@ -73,7 +73,7 @@ select Packages   --filter '_key == "rroonga" &&             sub_filter(files, "
 ]
 #|i| [table][select][index][equal][accessor][key] <Packages>
 #|i| [table][select][index][selector][no-index][sub_filter] <Packages>
-#|i| [sub_filter][pre-filter][column] <Packages.files> -> <Files>
+#|i| [sub_filter][pre-filter][column][vector] <Packages.files> -> <Files>
 #|i| [table][select][index][range] <Revisions.files_revision>
 #|i| [table][select][index][range] <Revisions.files_revision>
 #|i| [accessor][resolve][data-column][index] <Files.packages_files_index>
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180515/a738ebeb/attachment-0001.htm 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index