null+****@clear*****
null+****@clear*****
2011年 7月 4日 (月) 17:44:12 JST
Susumu Yata 2011-07-04 08:44:12 +0000 (Mon, 04 Jul 2011)
New Revision: 65704f68f0483bfacbbd295777b382029afb9ae5
Log:
modified grn_dat_cursor to support GRN_CURSOR_BY_ID and GRN_CURSOR_PREFIX.
Modified files:
lib/dat.cpp
lib/dat/string.hpp
Modified: lib/dat.cpp (+42 -31)
===================================================================
--- lib/dat.cpp 2011-07-04 08:20:38 +0000 (91cb51c)
+++ lib/dat.cpp 2011-07-04 08:44:12 +0000 (f8cca8f)
@@ -21,7 +21,7 @@
#include "dat.h"
#include "util.h"
#include "dat/trie.hpp"
-#include "dat/common-prefix-cursor.hpp"
+#include "dat/cursor-factory.hpp"
extern "C" {
@@ -298,27 +298,38 @@ grn_dat_cursor_open(grn_ctx *ctx, grn_dat *dat,
dc->cursor = NULL;
GRN_DB_OBJ_SET_TYPE(dc, GRN_CURSOR_TABLE_DAT_KEY);
if ((flags & GRN_CURSOR_BY_ID)) {
- // Cursor is now an abstract type;
- // dc->cursor = new grn::dat::Cursor;
- /* todo */
+ grn::dat::Trie *trie = static_cast<grn::dat::Trie *>(dat->handle);
+ grn::dat::Cursor *cursor = grn::dat::CursorFactory::open(*trie,
+ min, min_size, max, max_size, offset, limit,
+ grn::dat::ID_RANGE_CURSOR |
+ ((flags & GRN_CURSOR_DESCENDING) ? grn::dat::DESCENDING_CURSOR : 0) |
+ ((flags & GRN_CURSOR_GT) ? grn::dat::EXCEPT_LOWER_BOUND : 0) |
+ ((flags & GRN_CURSOR_LT) ? grn::dat::EXCEPT_UPPER_BOUND : 0));
+ dc->cursor = cursor;
} else {
if ((flags & GRN_CURSOR_PREFIX)) {
if (max && max_size) {
- if ((dat->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE)) {
+// if ((dat->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE)) {
grn::dat::Trie *trie = static_cast<grn::dat::Trie *>(dat->handle);
- grn::dat::CommonPrefixCursor *cursor;
- cursor = new grn::dat::CommonPrefixCursor;
- cursor->open(*trie, grn::dat::String(max, max_size), min_size, offset, limit);
+ grn::dat::Cursor *cursor = grn::dat::CursorFactory::open(*trie,
+ NULL, min_size, max, max_size, offset, limit,
+ grn::dat::COMMON_PREFIX_CURSOR | grn::dat::DESCENDING_CURSOR);
dc->cursor = cursor;
- } else {
- /* todo: near */
- }
+// } else {
+// /* todo: near */
+// }
} else {
if (min && min_size) {
if (flags & GRN_CURSOR_RK) {
/* todo: rk search */
} else {
- /* todo: prefix */
+ grn::dat::Trie *trie = static_cast<grn::dat::Trie *>(dat->handle);
+ grn::dat::Cursor *cursor = grn::dat::CursorFactory::open(*trie,
+ min, min_size, NULL, 0, offset, limit,
+ grn::dat::PREDICTIVE_CURSOR |
+ ((flags & GRN_CURSOR_DESCENDING) ? grn::dat::DESCENDING_CURSOR : 0) |
+ ((flags & GRN_CURSOR_GT) ? grn::dat::EXCEPT_EXACT_MATCH : 0));
+ dc->cursor = cursor;
}
}
}
@@ -328,25 +339,25 @@ grn_dat_cursor_open(grn_ctx *ctx, grn_dat *dat,
/* todo */
}
}
- if (flags & GRN_CURSOR_DESCENDING) {
- if (min && min_size) {
- /* todo */
- }
- if (max && max_size) {
- /* todo */
- } else {
- /* todo */
- }
- } else {
- if (max && max_size) {
- /* todo */
- }
- if (min && min_size) {
- /* todo */
- } else {
- /* todo */
- }
- }
+// if (flags & GRN_CURSOR_DESCENDING) {
+// if (min && min_size) {
+// /* todo */
+// }
+// if (max && max_size) {
+// /* todo */
+// } else {
+// /* todo */
+// }
+// } else {
+// if (max && max_size) {
+// /* todo */
+// }
+// if (min && min_size) {
+// /* todo */
+// } else {
+// /* todo */
+// }
+// }
if (dc->cursor) {
dc->dat = dat;
/* open stuff */
Modified: lib/dat/string.hpp (+2 -3)
===================================================================
--- lib/dat/string.hpp 2011-07-04 08:20:38 +0000 (bd137fa)
+++ lib/dat/string.hpp 2011-07-04 08:44:12 +0000 (1a47de3)
@@ -64,15 +64,14 @@ class String {
GRN_DAT_DEBUG_THROW_IF(offset > length());
GRN_DAT_DEBUG_THROW_IF(offset > rhs.length());
- UInt32 i;
- for (i = offset; i < length(); ++i) {
+ for (UInt32 i = offset; i < length(); ++i) {
if (i >= rhs.length()) {
return 1;
} else if ((*this)[i] != rhs[i]) {
return (*this)[i] - rhs[i];
}
}
- return (i == rhs.length()) ? 0 : -1;
+ return (length() == rhs.length()) ? 0 : -1;
}
bool starts_with(const String &str) const {