[Groonga-commit] groonga/grnxx [master] Implement BitwiseCompletionCursor.

Back to archive index

susumu.yata null+****@clear*****
Mon Apr 15 10:23:39 JST 2013


susumu.yata	2013-04-15 10:23:39 +0900 (Mon, 15 Apr 2013)

  New Revision: e06a60855ea6d9c00c80eac13fe8d852f08d7f7e
  https://github.com/groonga/grnxx/commit/e06a60855ea6d9c00c80eac13fe8d852f08d7f7e

  Message:
    Implement BitwiseCompletionCursor.

  Modified files:
    lib/grnxx/alpha/map.cpp
    lib/grnxx/alpha/map.hpp
    lib/grnxx/alpha/map/cursor.cpp
    lib/grnxx/alpha/map/cursor.hpp

  Modified: lib/grnxx/alpha/map.cpp (+17 -17)
===================================================================
--- lib/grnxx/alpha/map.cpp    2013-04-12 13:54:38 +0900 (ca2646d)
+++ lib/grnxx/alpha/map.cpp    2013-04-15 10:23:39 +0900 (0329f77)
@@ -241,23 +241,23 @@ MapCursor<T> *Map<T>::open_bitwise_completion_cursor(
 template <>
 MapCursor<GeoPoint> *Map<GeoPoint>::open_bitwise_completion_cursor(
     GeoPoint query, size_t bit_size, const MapCursorOptions &options) {
-  // TODO: Not supported.
-  return nullptr;
-}
-
-template <typename T>
-MapCursor<T> *Map<T>::open_neighbor_cursor(
-    T, size_t, const MapCursorOptions &) {
-  // Not supported.
-  return nullptr;
-}
-
-template <>
-MapCursor<GeoPoint> *Map<GeoPoint>::open_neighbor_cursor(
-    GeoPoint query, size_t min_size, const MapCursorOptions &options) {
-  // TODO: Not supported.
-  return nullptr;
-}
+  return new (std::nothrow) map::BitwiseCompletionCursor(
+      this, query, bit_size, options);
+}
+
+//template <typename T>
+//MapCursor<T> *Map<T>::open_neighbor_cursor(
+//    T, size_t, const MapCursorOptions &) {
+//  // Not supported.
+//  return nullptr;
+//}
+
+//template <>
+//MapCursor<GeoPoint> *Map<GeoPoint>::open_neighbor_cursor(
+//    GeoPoint query, size_t min_size, const MapCursorOptions &options) {
+//  // TODO: Not supported.
+//  return nullptr;
+//}
 
 template <typename T>
 MapCursor<T> *Map<T>::open_prefix_cursor(

  Modified: lib/grnxx/alpha/map.hpp (+1 -1)
===================================================================
--- lib/grnxx/alpha/map.hpp    2013-04-12 13:54:38 +0900 (fc5ef62)
+++ lib/grnxx/alpha/map.hpp    2013-04-15 10:23:39 +0900 (1480ed7)
@@ -160,7 +160,7 @@ class Map {
   virtual MapCursor<T> *open_bitwise_completion_cursor(
       T query, size_t bit_size,
       const MapCursorOptions &options = MapCursorOptions());
-  // Create a cursor for accessing keys similar to "query".
+  // Create a cursor for accessing keys close to "query".
 //  virtual MapCursor<T> *open_neighbor_cursor(
 //      T query, size_t min_size,
 //      const MapCursorOptions &options = MapCursorOptions());

  Modified: lib/grnxx/alpha/map/cursor.cpp (+42 -0)
===================================================================
--- lib/grnxx/alpha/map/cursor.cpp    2013-04-12 13:54:38 +0900 (560676d)
+++ lib/grnxx/alpha/map/cursor.cpp    2013-04-15 10:23:39 +0900 (ea185ed)
@@ -201,6 +201,11 @@ void ConditionalCursor<T>::init() {
   }
 }
 
+template <>
+void ConditionalCursor<GeoPoint>::init() {
+  init_order_by_id();
+}
+
 template <typename T>
 void ConditionalCursor<T>::init_order_by_id() {
   options_.flags |= MAP_CURSOR_ORDER_BY_ID;
@@ -251,6 +256,11 @@ void ConditionalCursor<T>::init_order_by_key() {
   }
 }
 
+template <>
+void ConditionalCursor<GeoPoint>::init_order_by_key() {
+  // Not supported.
+}
+
 template class ConditionalCursor<int8_t>;
 template class ConditionalCursor<int16_t>;
 template class ConditionalCursor<int32_t>;
@@ -327,6 +337,38 @@ template class KeyCursor<uint64_t>;
 template class KeyCursor<double>;
 template class KeyCursor<Slice>;
 
+BitwiseCompletionCursor::BitwiseCompletionCursor(
+    Map<GeoPoint> *map, GeoPoint query, size_t bit_size,
+    const MapCursorOptions &options)
+  : ConditionalCursor<GeoPoint>(map, options),
+    query_(query), mask_() {
+  if (bit_size >= 64) {
+    bit_size = 64;
+  }
+  switch (bit_size) {
+    case 0: {
+      mask_ = 0;
+      break;
+    }
+    case 1: {
+      mask_ = GeoPoint(1 << 31, 0).value();
+      break;
+    }
+    default: {
+      mask_ = GeoPoint(0xFFFFFFFFU << (32 - (bit_size / 2) - (bit_size % 2)),
+                       0xFFFFFFFFU << (32 - (bit_size / 2))).value();
+      break;
+    }
+  }
+  this->init();
+}
+
+BitwiseCompletionCursor::~BitwiseCompletionCursor() {}
+
+bool BitwiseCompletionCursor::is_valid(GeoPoint key) const {
+  return ((key.value() ^ query_.value()) & mask_) != 0;
+}
+
 PrefixCursor::PrefixCursor(Map<Slice> *map, Slice query, size_t min_size,
                            const MapCursorOptions &options)
   : ConditionalCursor<Slice>(map, options),

  Modified: lib/grnxx/alpha/map/cursor.hpp (+12 -7)
===================================================================
--- lib/grnxx/alpha/map/cursor.hpp    2013-04-12 13:54:38 +0900 (8c6ceda)
+++ lib/grnxx/alpha/map/cursor.hpp    2013-04-15 10:23:39 +0900 (e25fb0f)
@@ -87,13 +87,18 @@ class KeyCursor : public ConditionalCursor<T> {
   bool is_valid(T key) const;
 };
 
-// TODO
-//class BitwiseCompletionCursor : public ConditionalCursor<GeoPoint> {
-// public:
-//  BitwiseCompletionCursor(Map<GeoPoint> *map, GeoPoint query, size_t bit_size,
-//                          const MapCursorOptions &options);
-//  ~BitwiseCompletionCursor();
-//};
+class BitwiseCompletionCursor : public ConditionalCursor<GeoPoint> {
+ public:
+  BitwiseCompletionCursor(Map<GeoPoint> *map, GeoPoint query, size_t bit_size,
+                          const MapCursorOptions &options);
+  ~BitwiseCompletionCursor();
+
+ private:
+  GeoPoint query_;
+  uint64_t mask_;
+
+  bool is_valid(GeoPoint key) const;
+};
 
 class PrefixCursor : public ConditionalCursor<Slice> {
  public:
-------------- next part --------------
HTML����������������������������...
Download 



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