susumu.yata
null+****@clear*****
Thu Nov 27 15:01:54 JST 2014
susumu.yata 2014-11-27 15:01:54 +0900 (Thu, 27 Nov 2014) New Revision: 725a0d987279945fcc98af44108a5000299778f0 https://github.com/groonga/grnxx/commit/725a0d987279945fcc98af44108a5000299778f0 Message: Improve the implementation of sorting in Bool order. Modified files: lib/grnxx/impl/sorter.cpp Modified: lib/grnxx/impl/sorter.cpp (+30 -10) =================================================================== --- lib/grnxx/impl/sorter.cpp 2014-11-27 14:07:42 +0900 (f7bb15f) +++ lib/grnxx/impl/sorter.cpp 2014-11-27 15:01:54 +0900 (7a1026c) @@ -446,18 +446,38 @@ void BoolNode::sort(ArrayRef<Record> records, size_t begin, size_t end) { // - Posterior values: [posterior_offset, na_offset) // - N/A: [na_offset, records.size()) order_.expression->evaluate(records, &values_); - size_t posterior_offset = 0; + size_t posterior_offset = records.size(); size_t na_offset = records.size(); - for (size_t i = 0; i < na_offset; ) { - if (values_[i].is_na()) { - std::swap(records[i], records[na_offset - 1]); - values_[i] = values_[na_offset - 1]; - --na_offset; - } else { - if (values_[i].raw() == prior_raw_) { - std::swap(records[posterior_offset], records[i]); - ++posterior_offset; + for (size_t i = 0; i < posterior_offset; ) { + while (i < posterior_offset) { + if (values_[i].is_na()) { + Record temp = records[i]; + records[i] = records[posterior_offset - 1]; + values_[i] = values_[posterior_offset - 1]; + records[posterior_offset - 1] = records[na_offset - 1]; + records[na_offset - 1] = temp; + --posterior_offset; + --na_offset; + } else if (values_[i].raw() == prior_raw_) { + ++i; + } else { + break; + } + } + while (i < posterior_offset) { + if (values_[posterior_offset - 1].is_na()) { + --posterior_offset; + --na_offset; + std::swap(records[posterior_offset], records[na_offset]); + } else if (values_[posterior_offset - 1].raw() == prior_raw_) { + break; + } else { + --posterior_offset; } + } + if (i < posterior_offset) { + --posterior_offset; + std::swap(records[i], records[posterior_offset]); ++i; } } -------------- next part -------------- HTML����������������������������... Download