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