[Groonga-commit] groonga/groonga [master] fixed a bug --- a search result of grn::dat::PredictiveCursor + grn::dat::ASCENDING_CURSOR contains invalid keys.

Back to archive index

null+****@clear***** null+****@clear*****
2011年 7月 4日 (月) 17:20:38 JST


Susumu Yata	2011-07-04 08:20:38 +0000 (Mon, 04 Jul 2011)

  New Revision: 39f66f85c73465c7b8205cbabfda4a6ca8ed7eaa

  Log:
    fixed a bug --- a search result of grn::dat::PredictiveCursor + grn::dat::ASCENDING_CURSOR contains invalid keys.

  Modified files:
    lib/dat/predictive-cursor.cpp
    lib/dat/predictive-cursor.hpp

  Modified: lib/dat/predictive-cursor.cpp (+10 -2)
===================================================================
--- lib/dat/predictive-cursor.cpp    2011-07-04 08:18:05 +0000 (f5e755f)
+++ lib/dat/predictive-cursor.cpp    2011-07-04 08:20:38 +0000 (3437665)
@@ -101,6 +101,9 @@ void PredictiveCursor::init(const String &str) {
         trie_->ith_key(base.key_id(), &key);
         if ((key.length() >= str.length()) &&
             (key.str().substr(0, str.length()).compare(str, i) == 0)) {
+          if ((flags_ & ASCENDING_CURSOR) == ASCENDING_CURSOR) {
+            node_id |= IS_ROOT_FLAG;
+          }
           GRN_DAT_THROW_IF(MEMORY_ERROR, !buf_.push_back(node_id));
         }
       }
@@ -112,6 +115,10 @@ void PredictiveCursor::init(const String &str) {
       return;
     }
   }
+
+  if ((flags_ & ASCENDING_CURSOR) == ASCENDING_CURSOR) {
+    node_id |= IS_ROOT_FLAG;
+  }
   GRN_DAT_THROW_IF(MEMORY_ERROR, !buf_.push_back(node_id));
 }
 
@@ -128,11 +135,12 @@ void PredictiveCursor::swap(PredictiveCursor *cursor) {
 
 bool PredictiveCursor::ascending_next(Key *key) {
   while (!buf_.empty()) {
-    const UInt32 node_id = buf_.back();
+    const bool is_root = (buf_.back() & IS_ROOT_FLAG) == IS_ROOT_FLAG;
+    const UInt32 node_id = buf_.back() & ~IS_ROOT_FLAG;
     buf_.pop_back();
 
     const Node node = trie_->ith_node(node_id);
-    if (node.sibling() != INVALID_LABEL) {
+    if (!is_root && (node.sibling() != INVALID_LABEL)) {
       GRN_DAT_THROW_IF(MEMORY_ERROR,
           !buf_.push_back(node_id ^ node.label() ^ node.sibling()));
     }

  Modified: lib/dat/predictive-cursor.hpp (+1 -0)
===================================================================
--- lib/dat/predictive-cursor.hpp    2011-07-04 08:18:05 +0000 (fa3e7b4)
+++ lib/dat/predictive-cursor.hpp    2011-07-04 08:20:38 +0000 (5309f8a)
@@ -55,6 +55,7 @@ class PredictiveCursor : public Cursor {
   bool ascending_next(Key *key);
   bool descending_next(Key *key);
 
+  static const UInt32 IS_ROOT_FLAG    = 0x80000000U;
   static const UInt32 POST_ORDER_FLAG = 0x80000000U;
 
   // Disallows copy and assignment.




Groonga-commit メーリングリストの案内
Back to archive index