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����������������������������...ダウンロード