[Groonga-commit] groonga/grnxx at 725a0d9 [new_data_types] Improve the implementation of sorting in Bool order.

Back to archive index

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 



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