[Groonga-commit] groonga/grnxx at 6289ac1 [master] Support per-block evaluation in adjust() and evaluate().

アーカイブの一覧に戻る

susumu.yata null+****@clear*****
Tue Aug 5 19:14:06 JST 2014


susumu.yata	2014-08-05 19:14:06 +0900 (Tue, 05 Aug 2014)

  New Revision: 6289ac11488d4f3a24de13ea0e3a3613d42029f7
  https://github.com/groonga/grnxx/commit/6289ac11488d4f3a24de13ea0e3a3613d42029f7

  Message:
    Support per-block evaluation in adjust() and evaluate().

  Modified files:
    include/grnxx/expression.hpp
    lib/grnxx/expression.cpp

  Modified: include/grnxx/expression.hpp (+10 -0)
===================================================================
--- include/grnxx/expression.hpp    2014-08-05 17:57:36 +0900 (9e543a3)
+++ include/grnxx/expression.hpp    2014-08-05 19:14:06 +0900 (ed2db96)
@@ -75,6 +75,11 @@ class Expression {
   }
   // Return the result data type.
   DataType data_type() const;
+  // Return the evaluation block size.
+  Int block_size() const {
+    // TODO: This value should be optimized.
+    return 1024;
+  }
 
   // TODO: If the given record set contains many records (e.g. 1,048,576), the
   //       expression should be evaluated per block (e.g. 1,024).
@@ -135,6 +140,11 @@ class Expression {
   unique_ptr<ExpressionNode> root_;
 
   Expression(const Table *table, unique_ptr<ExpressionNode> &&root);
+
+  template <typename T>
+  bool evaluate_block(Error *error,
+                      const RecordSubset &record_set,
+                      Subarray<T> *results);
 };
 
 class ExpressionBuilder {

  Modified: lib/grnxx/expression.cpp (+29 -5)
===================================================================
--- lib/grnxx/expression.cpp    2014-08-05 17:57:36 +0900 (89435be)
+++ lib/grnxx/expression.cpp    2014-08-05 19:14:06 +0900 (1089188)
@@ -732,6 +732,13 @@ bool Expression::filter(Error *error, RecordSet *record_set, Int offset) {
 
 bool Expression::adjust(Error *error, RecordSet *record_set, Int offset) {
   RecordSubset subset = record_set->subset(offset);
+  while (subset.size() > block_size()) {
+    RecordSubset block = subset.subset(0, block_size());
+    if (!root_->adjust(error, &block)) {
+      return false;
+    }
+    subset = subset.subset(block_size());
+  }
   return root_->adjust(error, &subset);
 }
 
@@ -783,20 +790,37 @@ bool Expression::evaluate(Error *error,
                     record_set.size(), results->size());
     return false;
   }
+  RecordSubset input = record_set;
+  Subarray<T> output = *results;
+  while (input.size() > block_size()) {
+    RecordSubset subset = input.subset(0, block_size());
+    if (!evaluate_block(error, subset, &output)) {
+      return false;
+    }
+    input = input.subset(block_size());
+    output = output.subarray(block_size());
+  }
+  return evaluate_block(error, input, &output);
+}
+
+Expression::Expression(const Table *table, unique_ptr<ExpressionNode> &&root)
+    : table_(table),
+      root_(std::move(root)) {}
+
+template <typename T>
+bool Expression::evaluate_block(Error *error,
+                                const RecordSubset &record_set,
+                                Subarray<T> *results) {
   Node<T> *node = static_cast<Node<T> *>(root_.get());
   if (!node->evaluate(error, record_set)) {
     return false;
   }
-  for (Int i = 0; i < results->size(); ++i) {
+  for (Int i = 0; i < record_set.size(); ++i) {
     (*results)[i] = node->get(i);
   }
   return true;
 }
 
-Expression::Expression(const Table *table, unique_ptr<ExpressionNode> &&root)
-    : table_(table),
-      root_(std::move(root)) {}
-
 // -- ExpressionBuilder --
 
 unique_ptr<ExpressionBuilder> ExpressionBuilder::create(Error *error,
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る