null+****@clear*****
null+****@clear*****
2010年 6月 29日 (火) 13:47:18 JST
Daijiro MORI 2010-06-29 04:47:18 +0000 (Tue, 29 Jun 2010) New Revision: 4f79ed6ff51a286f5958ee506fdac57d13e1bc57 Log: set_cursor_prefix() supports GRN_CURSOR_DESCENDING. Modified files: lib/pat.c Modified: lib/pat.c (+56 -48) =================================================================== --- lib/pat.c 2010-06-29 04:27:15 +0000 (2242b79) +++ lib/pat.c 2010-06-29 04:47:18 +0000 (7b5587c) @@ -1626,9 +1626,16 @@ set_cursor_prefix(grn_ctx *ctx, grn_pat *pat, grn_pat_cursor *c, if (!(k = pat_node_get_key(ctx, pat, node))) { break; } if (PAT_LEN(node) < key_size) { break; } if (!memcmp(k, key, key_size)) { - push(c, node->lr[1], ch); - if ((ch > len - 1) || !(flags & GRN_CURSOR_GT)) { - push(c, node->lr[0], ch); + if (flags & GRN_CURSOR_DESCENDING) { + if ((ch > len - 1) || !(flags & GRN_CURSOR_GT)) { + push(c, node->lr[0], ch); + } + push(c, node->lr[1], ch); + } else { + push(c, node->lr[1], ch); + if ((ch > len - 1) || !(flags & GRN_CURSOR_GT)) { + push(c, node->lr[0], ch); + } } } break; @@ -1646,9 +1653,6 @@ set_cursor_ascend(grn_ctx *ctx, grn_pat *pat, grn_pat_cursor *c, int r, check = -1, ch, c2; uint32_t len = key_size * 16; uint8_t keybuf[MAX_FIXED_KEY_SIZE]; - if (flags & GRN_CURSOR_PREFIX) { - return set_cursor_prefix(ctx, pat, c, key, key_size, flags); - } KEY_ENCODE(pat, keybuf, key, key_size); PAT_AT(pat, 0, node); for (id = node->lr[1]; id;) { @@ -1877,53 +1881,57 @@ grn_pat_cursor_open(grn_ctx *ctx, grn_pat *pat, c->rest = GRN_ID_MAX; c->curr_rec = GRN_ID_NIL; c->obj.header.domain = GRN_ID_NIL; - if (flags & GRN_CURSOR_DESCENDING) { - if (min) { - set_cursor_ascend(ctx, pat, c, min, min_size, flags); - c->obj.header.flags = GRN_CURSOR_ASCENDING; - c->tail = grn_pat_cursor_next(ctx, c); - c->sp = 0; - if (!c->tail) { goto exit; } - } - if (max) { - set_cursor_descend(ctx, pat, c, max, max_size, flags); - } else { - PAT_AT(pat, 0, node); - if (!node) { - grn_pat_cursor_close(ctx, c); - return NULL; + if (flags & GRN_CURSOR_PREFIX) { + set_cursor_prefix(ctx, pat, c, min, min_size, flags); + } else { + if (flags & GRN_CURSOR_DESCENDING) { + if (min) { + set_cursor_ascend(ctx, pat, c, min, min_size, flags); + c->obj.header.flags = GRN_CURSOR_ASCENDING; + c->tail = grn_pat_cursor_next(ctx, c); + c->sp = 0; + if (!c->tail) { goto exit; } } - if ((id = node->lr[1])) { - PAT_AT(pat, id, node); - if (node) { - int ch = PAT_CHK(node); - push(c, node->lr[0], ch); - push(c, node->lr[1], ch); + if (max) { + set_cursor_descend(ctx, pat, c, max, max_size, flags); + } else { + PAT_AT(pat, 0, node); + if (!node) { + grn_pat_cursor_close(ctx, c); + return NULL; + } + if ((id = node->lr[1])) { + PAT_AT(pat, id, node); + if (node) { + int ch = PAT_CHK(node); + push(c, node->lr[0], ch); + push(c, node->lr[1], ch); + } } } - } - } else { - if (max) { - set_cursor_descend(ctx, pat, c, max, max_size, flags); - c->obj.header.flags = GRN_CURSOR_DESCENDING; - c->tail = grn_pat_cursor_next(ctx, c); - c->sp = 0; - if (!c->tail) { goto exit; } - } - if (min) { - set_cursor_ascend(ctx, pat, c, min, min_size, flags); } else { - PAT_AT(pat, 0, node); - if (!node) { - grn_pat_cursor_close(ctx, c); - return NULL; + if (max) { + set_cursor_descend(ctx, pat, c, max, max_size, flags); + c->obj.header.flags = GRN_CURSOR_DESCENDING; + c->tail = grn_pat_cursor_next(ctx, c); + c->sp = 0; + if (!c->tail) { goto exit; } } - if ((id = node->lr[1])) { - PAT_AT(pat, id, node); - if (node) { - int ch = PAT_CHK(node); - push(c, node->lr[1], ch); - push(c, node->lr[0], ch); + if (min) { + set_cursor_ascend(ctx, pat, c, min, min_size, flags); + } else { + PAT_AT(pat, 0, node); + if (!node) { + grn_pat_cursor_close(ctx, c); + return NULL; + } + if ((id = node->lr[1])) { + PAT_AT(pat, id, node); + if (node) { + int ch = PAT_CHK(node); + push(c, node->lr[1], ch); + push(c, node->lr[0], ch); + } } } }