Kouhei Sutou
null+****@clear*****
Tue Jan 8 17:48:30 JST 2013
Kouhei Sutou 2013-01-08 17:48:30 +0900 (Tue, 08 Jan 2013) New Revision: 0bae36af224dcb9d768f8473409d73086f39b85c https://github.com/groonga/groonga/commit/0bae36af224dcb9d768f8473409d73086f39b85c Log: Remove view related codes View is an experimental feature. So nobody isn't used it. Removed files: test/unit/core/test-view-operations.c test/unit/core/test-view.c Modified files: include/groonga.h lib/db.c lib/db.h lib/expr.c lib/output.c lib/proc.c lib/str.c lib/util.c plugins/suggest/suggest.c plugins/table/table.c test/unit/core/Makefile.am test/unit/core/test-command-dump.c test/unit/lib/grn-assertions.c test/unit/lib/grn-assertions.h test/unit/lib/grn-test-utils.c test/unit/lib/grn-test-utils.h Modified: include/groonga.h (+1 -5) =================================================================== --- include/groonga.h 2012-12-30 00:19:42 +0900 (cf25deb) +++ include/groonga.h 2013-01-08 17:48:30 +0900 (e8fb8b2) @@ -1,5 +1,5 @@ /* - Copyright(C) 2009-2012 Brazil + Copyright(C) 2009-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -373,7 +373,6 @@ typedef unsigned short int grn_obj_flags; #define GRN_OBJ_TABLE_PAT_KEY (0x01) #define GRN_OBJ_TABLE_DAT_KEY (0x02) #define GRN_OBJ_TABLE_NO_KEY (0x03) -#define GRN_OBJ_TABLE_VIEW (0x04) #define GRN_OBJ_KEY_MASK (0x07<<3) #define GRN_OBJ_KEY_UINT (0x00<<3) @@ -429,7 +428,6 @@ typedef unsigned short int grn_obj_flags; #define GRN_MSG (0x07) #define GRN_QUERY (0x08) #define GRN_ACCESSOR (0x09) -#define GRN_ACCESSOR_VIEW (0x0a) #define GRN_SNIP (0x0b) #define GRN_PATSNIP (0x0c) #define GRN_STRING (0x0d) @@ -437,7 +435,6 @@ typedef unsigned short int grn_obj_flags; #define GRN_CURSOR_TABLE_PAT_KEY (0x11) #define GRN_CURSOR_TABLE_DAT_KEY (0x12) #define GRN_CURSOR_TABLE_NO_KEY (0x13) -#define GRN_CURSOR_TABLE_VIEW (0x14) #define GRN_CURSOR_COLUMN_INDEX (0x18) #define GRN_CURSOR_COLUMN_GEO_INDEX (0x1a) #define GRN_TYPE (0x20) @@ -447,7 +444,6 @@ typedef unsigned short int grn_obj_flags; #define GRN_TABLE_PAT_KEY (0x31) #define GRN_TABLE_DAT_KEY (0x32) #define GRN_TABLE_NO_KEY (0x33) -#define GRN_TABLE_VIEW (0x34) #define GRN_DB (0x37) #define GRN_COLUMN_FIX_SIZE (0x40) #define GRN_COLUMN_VAR_SIZE (0x41) Modified: lib/db.c (+12 -768) =================================================================== --- lib/db.c 2012-12-30 00:19:42 +0900 (9e965db) +++ lib/db.c 2013-01-08 17:48:30 +0900 (b112741) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009-2012 Brazil +/* Copyright(C) 2009-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -400,9 +400,6 @@ grn_obj_io(grn_obj *obj) case GRN_TABLE_NO_KEY : io = ((grn_array *)obj)->io; break; - case GRN_TABLE_VIEW : - io = ((grn_view *)obj)->hash->io; - break; case GRN_COLUMN_VAR_SIZE : io = ((grn_ja *)obj)->io; break; @@ -676,10 +673,6 @@ calc_rec_size(grn_obj_flags flags, uint32_t *max_n_subrecs, static void _grn_obj_remove(grn_ctx *ctx, grn_obj *obj); -static grn_obj *grn_view_create(grn_ctx *ctx, const char *path, grn_obj_flags flags); -static grn_obj *grn_view_transcript(grn_ctx *ctx, const char *path, grn_obj *key_type, - grn_obj *value_type, grn_obj_flags flags); - static grn_rc grn_table_create_validate(grn_ctx *ctx, const char *name, unsigned int name_size, const char *path, grn_obj_flags flags, @@ -720,37 +713,6 @@ grn_table_create_validate(grn_ctx *ctx, const char *name, unsigned int name_size name_size, name); } break; - case GRN_OBJ_TABLE_VIEW : - if (key_type) { - int key_name_size; - char key_name[GRN_TABLE_MAX_KEY_SIZE]; - key_name_size = grn_obj_name(ctx, key_type, key_name, - GRN_TABLE_MAX_KEY_SIZE); - ERR(GRN_INVALID_ARGUMENT, - "[table][create] " - "key isn't available for view table: <%.*s> (%.*s)", - name_size, name, key_name_size, key_name); - } else if (value_type) { - int value_name_size; - char value_name[GRN_TABLE_MAX_KEY_SIZE]; - value_name_size = grn_obj_name(ctx, value_type, value_name, - GRN_TABLE_MAX_KEY_SIZE); - ERR(GRN_INVALID_ARGUMENT, - "[table][create] " - "value isn't available for view table: <%.*s> (%.*s)", - name_size, name, value_name_size, value_name); - } else if (flags & GRN_OBJ_KEY_WITH_SIS) { - ERR(GRN_INVALID_ARGUMENT, - "[table][create] " - "key with SIS isn't available for view table: <%.*s>", - name_size, name); - } else if (flags & GRN_OBJ_KEY_NORMALIZE) { - ERR(GRN_INVALID_ARGUMENT, - "[table][create] " - "key normalization isn't available for view table: <%.*s>", - name_size, name); - } - break; } return ctx->rc; } @@ -810,7 +772,6 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned int name_size, case GRN_TABLE_PAT_KEY : case GRN_TABLE_DAT_KEY : case GRN_TABLE_NO_KEY : - case GRN_TABLE_VIEW : key_size = sizeof(grn_id); break; default : @@ -852,7 +813,6 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned int name_size, case GRN_TABLE_PAT_KEY : case GRN_TABLE_DAT_KEY : case GRN_TABLE_NO_KEY : - case GRN_TABLE_VIEW : value_size = sizeof(grn_id); break; default : @@ -901,37 +861,17 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned int name_size, &subrec_offset, &key_size, &value_size); switch (flags & GRN_OBJ_TABLE_TYPE_MASK) { case GRN_OBJ_TABLE_HASH_KEY : - if (key_type && key_type->header.type == GRN_TABLE_VIEW) { - res = grn_view_transcript(ctx, path, key_type, value_type, flags); - } else { - res = (grn_obj *)grn_hash_create(ctx, path, key_size, value_size, flags); - } + res = (grn_obj *)grn_hash_create(ctx, path, key_size, value_size, flags); break; case GRN_OBJ_TABLE_PAT_KEY : - if (key_type && key_type->header.type == GRN_TABLE_VIEW) { - res = grn_view_transcript(ctx, path, key_type, value_type, flags); - } else { - res = (grn_obj *)grn_pat_create(ctx, path, key_size, value_size, flags); - } + res = (grn_obj *)grn_pat_create(ctx, path, key_size, value_size, flags); break; case GRN_OBJ_TABLE_DAT_KEY : - if (key_type && key_type->header.type == GRN_TABLE_VIEW) { - res = grn_view_transcript(ctx, path, key_type, value_type, flags); - } else { - res = (grn_obj *)grn_dat_create(ctx, path, key_size, value_size, flags); - } + res = (grn_obj *)grn_dat_create(ctx, path, key_size, value_size, flags); break; case GRN_OBJ_TABLE_NO_KEY : - if (value_type && value_type->header.type == GRN_TABLE_VIEW) { - res = grn_view_transcript(ctx, path, key_type, value_type, flags); - } else { - domain = range; - res = (grn_obj *)grn_array_create(ctx, path, value_size, flags); - } - break; - case GRN_OBJ_TABLE_VIEW : - domain = range = GRN_ID_NIL; - res = grn_view_create(ctx, path, flags); + domain = range; + res = (grn_obj *)grn_array_create(ctx, path, value_size, flags); break; } if (res) { @@ -1230,105 +1170,6 @@ grn_table_add_by_key(grn_ctx *ctx, grn_obj *table, grn_obj *key, int *added) return id; } -static grn_obj * -grn_view_create(grn_ctx *ctx, const char *path, grn_obj_flags flags) -{ - grn_view *res; - if ((res = GRN_MALLOC(sizeof(grn_view)))) { - if ((res->hash = grn_hash_create(ctx, path, sizeof(grn_id), 0, flags))) { - GRN_DB_OBJ_SET_TYPE(res, GRN_TABLE_VIEW); - res->obj.header.flags = flags; - res->obj.header.domain = GRN_ID_NIL; - res->n_keys = 0; - res->offset = 0; - res->limit = -1; - res->keys = NULL; - return (grn_obj *)res; - } - GRN_FREE(res); - } - return NULL; -} - -static grn_obj * -grn_view_open(grn_ctx *ctx, const char *path) -{ - grn_view *res; - if ((res = GRN_MALLOC(sizeof(grn_view)))) { - if ((res->hash = grn_hash_open(ctx, path))) { - GRN_DB_OBJ_SET_TYPE(res, GRN_TABLE_VIEW); - res->n_keys = 0; - res->offset = 0; - res->keys = NULL; - return (grn_obj *)res; - } - GRN_FREE(res); - } - return NULL; -} - -grn_rc -grn_view_close(grn_ctx *ctx, grn_view *v) -{ - grn_hash_close(ctx, v->hash); - GRN_FREE(v); - return ctx->rc; -} - -static grn_obj * -grn_view_transcript(grn_ctx *ctx, const char *path, - grn_obj *key_type, grn_obj *value_type, grn_obj_flags flags) -{ - grn_id *tp; - grn_obj *res = grn_view_create(ctx, path, flags); - /* todo : support persistent view */ - if (key_type) { - grn_view *v = (grn_view *)key_type; - GRN_HASH_EACH(ctx, v->hash, id, &tp, NULL, NULL, { - grn_view_add(ctx, res, - grn_table_create(ctx, NULL, 0, NULL, flags, - grn_ctx_at(ctx, *tp), value_type)); - }); - } else if (value_type) { - grn_view *v = (grn_view *)value_type; - GRN_HASH_EACH(ctx, v->hash, id, &tp, NULL, NULL, { - grn_view_add(ctx, res, - grn_table_create(ctx, NULL, 0, NULL, flags, - NULL, grn_ctx_at(ctx, *tp))); - }); - } - return res; -} - -grn_id -grn_view_add(grn_ctx *ctx, grn_obj *view, grn_obj *table) -{ - if (!view || view->header.type != GRN_TABLE_VIEW) { - ERR(GRN_INVALID_ARGUMENT, "invalid view"); - return ctx->rc; - } - if (!GRN_OBJ_TABLEP(table)) { - ERR(GRN_INVALID_ARGUMENT, "invalid table"); - return ctx->rc; - } - { - grn_view *v = (grn_view *)view; - grn_id id = DB_OBJ(table)->id; - return grn_hash_add(ctx, v->hash, (void *)&id, sizeof(grn_id), NULL, NULL); - } -} - -uint32_t -grn_view_size(grn_ctx *ctx, grn_view *view) -{ - grn_id *tp; - uint32_t n = 0; - GRN_HASH_EACH(ctx, view->hash, id, &tp, NULL, NULL, { - n += grn_table_size(ctx, grn_ctx_at(ctx, *tp)); - }); - return n; -} - grn_id grn_table_get(grn_ctx *ctx, grn_obj *table, const void *key, unsigned int key_size) { @@ -1919,9 +1760,6 @@ grn_table_size(grn_ctx *ctx, grn_obj *table) case GRN_TABLE_NO_KEY : n = GRN_ARRAY_SIZE((grn_array *)table); break; - case GRN_TABLE_VIEW : - n = grn_view_size(ctx, (grn_view *)table); - break; default : ERR(GRN_INVALID_ARGUMENT, "not supported"); break; @@ -2015,259 +1853,6 @@ grn_table_add_subrec(grn_obj *table, grn_rset_recinfo *ri, int score, grn_table_add_subrec_inline(table, ri, score, pi, dir); } -typedef struct { - grn_db_obj obj; - grn_id curr_rec; - grn_view *view; - int n_entries; - uint32_t rest; - grn_table_cursor **bins; -} grn_view_cursor; - -static int compare_cursor(grn_ctx *ctx, grn_table_cursor *a, grn_table_cursor *b, int n_keys); -static grn_id grn_view_cursor_next(grn_ctx *ctx, grn_view_cursor *vc); - -#define VIEW_CURSOR_OFFSET(tc) (DB_OBJ(tc)->max_n_subrecs) -#define VIEW_CURSOR_DELAY(tc) (DB_OBJ(tc)->subrec_size) - -static grn_view_cursor * -grn_view_cursor_open(grn_ctx *ctx, grn_obj *view, - const void *min, unsigned int min_size, - const void *max, unsigned int max_size, - int offset, int limit, int flags) -{ - grn_id *tp; - grn_view_cursor *vc; - grn_view *v = (grn_view *)view; - if (v && (vc = GRN_MALLOCN(grn_view_cursor, 1))) { - vc->view = v; - vc->curr_rec = GRN_ID_NIL; - VIEW_CURSOR_DELAY(vc) = 1; - GRN_DB_OBJ_SET_TYPE(vc, GRN_CURSOR_TABLE_VIEW); - if ((vc->bins = GRN_MALLOCN(grn_table_cursor *, GRN_HASH_SIZE(v->hash)))) { - int i = 0, n, n2; - uint32_t view_cursor_offset = 0; - grn_hash *hash = v->hash; - grn_table_cursor *c, *c2; - GRN_HASH_EACH(ctx, hash, id, &tp, NULL, NULL, { - c = grn_table_cursor_open(ctx, grn_ctx_at(ctx, *tp), - min, min_size, max, max_size, 0, offset + limit, flags); - if (!c) { break; } - VIEW_CURSOR_OFFSET(c) = view_cursor_offset++; - if (!grn_table_cursor_next_inline(ctx, c)) { - grn_table_cursor_close(ctx, c); - continue; - } - for (n = i++; n; n = n2) { - n2 = (n - 1) >> 1; - c2 = vc->bins[n2]; - if (!compare_cursor(ctx, c2, c, v->n_keys)) { break; } - vc->bins[n] = c2; - } - vc->bins[n] = c; - }); - vc->n_entries = i; - vc->rest = GRN_ID_MAX; - offset += v->offset; - while (offset--) { if (!grn_view_cursor_next(ctx, vc)) { break; } } - vc->rest = (limit < 0) ? GRN_ID_MAX : limit; - if (v->limit >= 0 && v->limit < vc->rest) { vc->rest = v->limit; } - return vc; - } - GRN_FREE(vc); - } - return NULL; -} - -const char * -grn_table_cursor_get_sort_key_value_(grn_ctx *ctx, grn_table_cursor *tc, int offset, - uint32_t *size, grn_table_sort_key **key) -{ - const char * res = NULL; - *size = 0; - while (tc->header.type == GRN_CURSOR_TABLE_VIEW) { - tc = ((grn_view_cursor *)tc)->bins[0]; - } - if (tc->header.type == GRN_CURSOR_TABLE_NO_KEY) { - grn_id id; - grn_array_cursor *ac = (grn_array_cursor *)tc; - if (ac->array->keys && offset < ac->array->n_keys && - grn_array_get_value(ctx, ac->array, ac->curr_rec, &id) == sizeof(grn_id)) { - *key = ac->array->keys + offset; - res = grn_obj_get_value_(ctx, (*key)->key, id, size); - } - } - return res; -} - -static void -grn_view_cursor_recalc_min(grn_ctx *ctx, grn_view_cursor *vc) -{ - int n = 0, n1, n2, m; - int n_keys = vc->view->n_keys; - if ((m = vc->n_entries) > 1) { - grn_table_cursor *c = vc->bins[0], *c1, *c2; - for (;;) { - n1 = n * 2 + 1; - n2 = n1 + 1; - c1 = n1 < m ? vc->bins[n1] : NULL; - c2 = n2 < m ? vc->bins[n2] : NULL; - if (c1 && compare_cursor(ctx, c, c1, n_keys)) { - if (c2 && compare_cursor(ctx, c, c2, n_keys) && compare_cursor(ctx, c1, c2, n_keys)) { - vc->bins[n] = c2; - n = n2; - } else { - vc->bins[n] = c1; - n = n1; - } - } else { - if (c2 && compare_cursor(ctx, c, c2, n_keys)) { - vc->bins[n] = c2; - n = n2; - } else { - vc->bins[n] = c; - break; - } - } - } - } -} - -/* -static int -grn_table_cursor_target_id(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id) -{ - int len; - switch (tc->header.type) { - case GRN_CURSOR_TABLE_PAT_KEY : - GRN_RECORD_PUT(ctx, id, ((grn_pat_cursor *)tc)->pat->obj.id); - len = sizeof(grn_id); - break; - case GRN_CURSOR_TABLE_DAT_KEY : - GRN_RECORD_PUT(ctx, id, ((grn_dat_cursor *)tc)->dat->obj.id); - len = sizeof(grn_id); - break; - case GRN_CURSOR_TABLE_HASH_KEY : - GRN_RECORD_PUT(ctx, id, ((grn_hash_cursor *)tc)->hash->obj.id); - len = sizeof(grn_id); - break; - case GRN_CURSOR_TABLE_NO_KEY : - GRN_RECORD_PUT(ctx, id, ((grn_array_cursor *)tc)->array->obj.id); - len = sizeof(grn_id); - break; - case GRN_CURSOR_TABLE_VIEW : - GRN_RECORD_PUT(ctx, id, ((grn_view_cursor *)tc)->view->obj.id); - len = sizeof(grn_id); - break; - default : - len = 0; - break; - } - return len; -} -*/ - -static grn_rc grn_table_cursor_next_o_(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id); - -static grn_id -grn_table_cursor_curr(grn_ctx *ctx, grn_table_cursor *tc) -{ - grn_id id = GRN_ID_NIL; - while (tc && tc->header.type == GRN_CURSOR_TABLE_VIEW) { - grn_view_cursor *vc = (grn_view_cursor *)tc; - if (!vc->n_entries) { return GRN_ID_NIL; } - tc = vc->bins[0]; - } - if (!tc) { - ERR(GRN_INVALID_ARGUMENT, "tc is null"); - } else { - switch (tc->header.type) { - case GRN_CURSOR_TABLE_PAT_KEY : - id = ((grn_pat_cursor *)tc)->curr_rec; - break; - case GRN_CURSOR_TABLE_DAT_KEY : - id = ((grn_dat_cursor *)tc)->curr_rec; - break; - case GRN_CURSOR_TABLE_HASH_KEY : - id = ((grn_hash_cursor *)tc)->curr_rec; - break; - case GRN_CURSOR_TABLE_NO_KEY : - id = ((grn_array_cursor *)tc)->curr_rec; - break; - } - } - return id; -} - -static grn_id -grn_view_cursor_next(grn_ctx *ctx, grn_view_cursor *vc) -{ - if (!vc->rest) { return GRN_ID_NIL; } - if (VIEW_CURSOR_DELAY(vc)) { - VIEW_CURSOR_DELAY(vc) = 0; - } else { - grn_table_cursor *tc = vc->bins[0]; - if (!grn_table_cursor_next_inline(ctx, tc)) { - grn_table_cursor_close(ctx, tc); - vc->bins[0] = vc->bins[--vc->n_entries]; - } - grn_view_cursor_recalc_min(ctx, vc); - } - if (vc->n_entries) { - grn_table_cursor *tc = vc->bins[0]; - vc->rest--; - return grn_table_cursor_curr(ctx, tc); - } else { - return GRN_ID_NIL; - } -} - -static grn_rc -grn_table_cursor_curr_o(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id) -{ - while (tc->header.type == GRN_CURSOR_TABLE_VIEW) { - grn_view_cursor *vc = (grn_view_cursor *)tc; - if (!vc->n_entries) { return GRN_END_OF_DATA; } - tc = vc->bins[0]; - GRN_UINT32_PUT(ctx, id, VIEW_CURSOR_OFFSET(tc)); - } - GRN_RECORD_PUT(ctx, id, grn_table_cursor_curr(ctx, tc)); - return ctx->rc; -} - -static grn_rc -grn_view_cursor_next_o(grn_ctx *ctx, grn_view_cursor *vc, grn_obj *id) -{ - if (!vc->rest) { return GRN_END_OF_DATA; } - if (VIEW_CURSOR_DELAY(vc)) { - VIEW_CURSOR_DELAY(vc) = 0; - } else { - grn_table_cursor *tc = vc->bins[0]; - if (!grn_table_cursor_next_inline(ctx, tc)) { - grn_table_cursor_close(ctx, tc); - vc->bins[0] = vc->bins[--vc->n_entries]; - } - grn_view_cursor_recalc_min(ctx, vc); - } - if (vc->n_entries) { - grn_table_cursor *tc = vc->bins[0]; - GRN_UINT32_PUT(ctx, id, VIEW_CURSOR_OFFSET(tc)); - vc->rest--; - return grn_table_cursor_curr_o(ctx, tc, id); - } else { - return GRN_END_OF_DATA; - } -} - -static void -grn_view_cursor_close(grn_ctx *ctx, grn_view_cursor *vc) -{ - int i = vc->n_entries; - while (i--) { grn_table_cursor_close(ctx, vc->bins[i]); } - GRN_FREE(vc->bins); - GRN_FREE(vc); -} - grn_table_cursor * grn_table_cursor_open(grn_ctx *ctx, grn_obj *table, const void *min, unsigned int min_size, @@ -2326,10 +1911,6 @@ grn_table_cursor_open(grn_ctx *ctx, grn_obj *table, GRN_ID_NIL, GRN_ID_NIL, offset, limit, flags); break; - case GRN_TABLE_VIEW : - tc = (grn_table_cursor *)grn_view_cursor_open(ctx, table, - min, min_size, - max, max_size, offset, limit, flags); } } if (tc) { @@ -2407,9 +1988,6 @@ grn_table_cursor_close(grn_ctx *ctx, grn_table_cursor *tc) case GRN_CURSOR_TABLE_NO_KEY : grn_array_cursor_close(ctx, (grn_array_cursor *)tc); break; - case GRN_CURSOR_TABLE_VIEW : - grn_view_cursor_close(ctx, (grn_view_cursor *)tc); - break; default : rc = GRN_INVALID_ARGUMENT; break; @@ -2438,9 +2016,6 @@ grn_table_cursor_next_inline(grn_ctx *ctx, grn_table_cursor *tc) case GRN_CURSOR_TABLE_NO_KEY : id = grn_array_cursor_next(ctx, (grn_array_cursor *)tc); break; - case GRN_CURSOR_TABLE_VIEW : - id = grn_view_cursor_next(ctx, (grn_view_cursor *)tc); - break; case GRN_CURSOR_COLUMN_INDEX : { grn_posting *ip = grn_index_cursor_next(ctx, (grn_obj *)tc, NULL); @@ -2461,29 +2036,6 @@ grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc) GRN_API_RETURN(id); } -static grn_rc -grn_table_cursor_next_o_(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id) -{ - if (tc->header.type == GRN_CURSOR_TABLE_VIEW) { - return grn_view_cursor_next_o(ctx, (grn_view_cursor *)tc, id); - } else { - grn_id rid = grn_table_cursor_next_inline(ctx, tc); - if (rid) { - GRN_RECORD_PUT(ctx, id, rid); - return ctx->rc; - } else { - return GRN_END_OF_DATA; - } - } -} - -grn_rc -grn_table_cursor_next_o(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id) -{ - GRN_BULK_REWIND(id); - return grn_table_cursor_next_o_(ctx, tc, id); -} - int grn_table_cursor_get_key(grn_ctx *ctx, grn_table_cursor *tc, void **key) { @@ -3071,10 +2623,6 @@ grn_obj_search(grn_ctx *ctx, grn_obj *obj, grn_obj *query, #define GRN_TABLE_GROUP_FILTER_PREFIX 0 #define GRN_TABLE_GROUP_FILTER_SUFFIX (1L<<2) -static grn_rc grn_view_group(grn_ctx *ctx, grn_obj *table, - grn_table_sort_key *keys, int n_keys, - grn_table_group_result *results, int n_results); - static int accelerated_table_group(grn_ctx *ctx, grn_obj *table, grn_obj *key, grn_obj *res) { @@ -3270,9 +2818,7 @@ grn_table_group(grn_ctx *ctx, grn_obj *table, return GRN_INVALID_ARGUMENT; } GRN_API_ENTER; - if (table->header.type == GRN_TABLE_VIEW) { - rc = grn_view_group(ctx, table, keys, n_keys, results, n_results); - } else { + { int k, r; void *key; grn_obj bulk; @@ -3520,8 +3066,6 @@ grn_table_difference(grn_ctx *ctx, grn_obj *table1, grn_obj *table2, static grn_obj *grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int name_size); -static grn_obj *grn_view_get_accessor(grn_ctx *ctx, grn_obj *obj, - const char *name, unsigned int name_size); static grn_obj * grn_obj_column_(grn_ctx *ctx, grn_obj *table, const char *name, unsigned int name_size) @@ -3549,13 +3093,9 @@ grn_obj_column(grn_ctx *ctx, grn_obj *table, const char *name, unsigned int name grn_obj *column = NULL; GRN_API_ENTER; if (GRN_OBJ_TABLEP(table)) { - if (table->header.type == GRN_TABLE_VIEW) { - column = grn_view_get_accessor(ctx, table, name, name_size); - } else { - if (grn_db_check_name(ctx, name, name_size) || - !(column = grn_obj_column_(ctx, table, name, name_size))) { - column = grn_obj_get_accessor(ctx, table, name, name_size); - } + if (grn_db_check_name(ctx, name, name_size) || + !(column = grn_obj_column_(ctx, table, name, name_size))) { + column = grn_obj_get_accessor(ctx, table, name, name_size); } } else if (GRN_ACCESSORP(table)) { column = grn_obj_get_accessor(ctx, table, name, name_size); @@ -4206,7 +3746,6 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int grn_accessor *res = NULL, **rp = NULL, **rp0 = NULL; if (!obj) { return NULL; } GRN_API_ENTER; - // todo : support GRN_ACCESSOR_VIEW if (obj->header.type == GRN_ACCESSOR) { for (rp0 = (grn_accessor **)&obj; *rp0; rp0 = &(*rp0)->next) { res = *rp0; @@ -4498,114 +4037,13 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int GRN_API_RETURN((grn_obj *)res); } -static grn_obj * -grn_view_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int name_size) -{ - int n = 0; - grn_id *tp; - grn_obj **ap; - grn_view *v = (grn_view *)obj; - grn_hash *hash = v->hash; - grn_accessor_view *a = GRN_MALLOCN(grn_accessor_view, 1); - if (!a) { return NULL; } - a->header.type = GRN_ACCESSOR_VIEW; - a->header.impl_flags = GRN_OBJ_ALLOCATED; - a->header.flags = 0; - a->header.domain = DB_OBJ(obj)->id; - a->range = GRN_ID_NIL; - a->naccessors = GRN_HASH_SIZE(hash); - ap = a->accessors = GRN_MALLOCN(grn_obj *, a->naccessors); - GRN_HASH_EACH(ctx, hash, id, &tp, NULL, NULL, { - grn_obj *table = grn_ctx_at(ctx, *tp); - grn_obj *column = grn_obj_column(ctx, table, name, name_size); - *ap++ = column; - if (column) { n++; } - }); - if (!n) { - GRN_FREE(a->accessors); - GRN_FREE(a); - a = NULL; - } - return (grn_obj *)a; -} - -static grn_rc -grn_accessor_view_close(grn_ctx *ctx, grn_obj *obj) -{ - int i; - grn_accessor_view *a = (grn_accessor_view *)obj; - for (i = 0; i < a->naccessors; i++) { - grn_obj_unlink(ctx, a->accessors[i]); - } - GRN_FREE(a->accessors); - GRN_FREE(a); - return ctx->rc; -} - grn_obj * grn_table_create_for_group(grn_ctx *ctx, const char *name, unsigned int name_size, const char *path, grn_obj_flags flags, grn_obj *group_key, grn_obj *value_type) { - if (group_key->header.type != GRN_ACCESSOR_VIEW) { - grn_obj *key_type = grn_ctx_at(ctx, grn_obj_get_range(ctx, group_key)); - return grn_table_create(ctx, name, name_size, path, flags, key_type, value_type); - } else { - int n; - grn_obj **ap; - grn_accessor_view *a = (grn_accessor_view *)group_key; - grn_obj *res = grn_table_create(ctx, name, name_size, path, - (flags & ~GRN_OBJ_TABLE_TYPE_MASK)|GRN_OBJ_TABLE_VIEW, - NULL, value_type); - if (res) { - for (n = a->naccessors, ap = a->accessors; n; n--, ap++) { - grn_view_add(ctx, res, - grn_table_create_for_group(ctx, NULL, 0, NULL, flags, *ap, value_type)); - } - } - return res; - } -} - -static grn_rc -grn_view_group(grn_ctx *ctx, grn_obj *table, - grn_table_sort_key *keys, int n_keys, - grn_table_group_result *results, int n_results) -{ - if (n_keys != 1 || n_results != 1) { - return GRN_FUNCTION_NOT_IMPLEMENTED; - } else { - grn_obj *t, *r; - grn_id *tp, rid; - grn_view *tv = (grn_view *)table; - grn_view *rv = (grn_view *)results->table; - grn_hash *th = tv->hash; - grn_hash *rh = rv->hash; - grn_table_sort_key *keys_ = GRN_MALLOCN(grn_table_sort_key, n_keys); - grn_table_group_result *results_ = GRN_MALLOCN(grn_table_group_result, n_results); - grn_table_sort_key *ks, *kd, *ke = keys + n_keys; - if (keys_) { - if (results_) { - memcpy(results_, results, sizeof(grn_table_group_result) * n_results); - for (ks = keys, kd =keys_; ks < ke ; ks++, kd++) { kd->flags = ks->flags; } - GRN_HASH_EACH(ctx, th, id, &tp, NULL, NULL, { - grn_hash_get_key(ctx, rh, id, &rid, sizeof(grn_id)); - t = grn_ctx_at(ctx, *tp); - r = grn_ctx_at(ctx, rid); - for (ks = keys, kd =keys_; ks < ke ; ks++, kd++) { - kd->key = ((grn_accessor_view *)ks->key)->accessors[id - 1]; - } - results_->table = r; - /* todo : sampling */ - grn_table_group(ctx, t, keys_, n_keys, results_, n_results); - }); - /* todo : merge */ - GRN_FREE(results_); - } - GRN_FREE(keys_); - } - } - return GRN_SUCCESS; + grn_obj *key_type = grn_ctx_at(ctx, grn_obj_get_range(ctx, group_key)); + return grn_table_create(ctx, name, name_size, path, flags, key_type, value_type); } inline static grn_bool @@ -4658,8 +4096,6 @@ grn_obj_get_range_info(grn_ctx *ctx, grn_obj *obj, break; } } - } else if (obj->header.type == GRN_ACCESSOR_VIEW) { - *range_id = GRN_DB_OBJECT; } } @@ -4699,8 +4135,6 @@ grn_obj_is_persistent(grn_ctx *ctx, grn_obj *obj) break; } } - } else if (obj->header.type == GRN_ACCESSOR_VIEW) { - /* todo */ } return res; } @@ -5727,9 +5161,6 @@ grn_obj_get_value_(grn_ctx *ctx, grn_obj *obj, grn_id id, uint32_t *size) const char *value = NULL; *size = 0; switch (obj->header.type) { - case GRN_ACCESSOR_VIEW : - ERR(GRN_FUNCTION_NOT_IMPLEMENTED, "GRN_ACCESSOR_VIEW not supported"); - break; case GRN_ACCESSOR : value = grn_accessor_get_value_(ctx, (grn_accessor *)obj, id, size); break; @@ -5798,9 +5229,6 @@ grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value) goto exit; } switch (obj->header.type) { - case GRN_ACCESSOR_VIEW : - ERR(GRN_FUNCTION_NOT_IMPLEMENTED, "GRN_ACCESSOR_VIEW not supported"); - break; case GRN_ACCESSOR : value = grn_accessor_get_value(ctx, (grn_accessor *)obj, id, value); value->header.domain = grn_obj_get_range(ctx, obj); @@ -5918,55 +5346,6 @@ exit : GRN_API_RETURN(value); } -grn_obj * -grn_obj_get_value_o(grn_ctx *ctx, grn_obj *obj, grn_obj *id, grn_obj *value) -{ - grn_id *idp = (grn_id *)GRN_BULK_HEAD(id); - uint32_t ids = GRN_BULK_VSIZE(id); - while (obj->header.type == GRN_ACCESSOR_VIEW) { - uint32_t n; - grn_accessor_view *v = (grn_accessor_view *)obj; - if (ids < sizeof(grn_id)) { - ERR(GRN_NO_MEMORY_AVAILABLE, "invalid id."); - return NULL; - } - n = *idp; - if (n >= v->naccessors) { - ERR(GRN_NO_MEMORY_AVAILABLE, "invalid id"); - return NULL; - } - if (!(obj = v->accessors[n])) { return value; } - idp++; - ids -= sizeof(grn_id); - } - return grn_obj_get_value(ctx, obj, *idp, value); -} - -grn_rc -grn_obj_set_value_o(grn_ctx *ctx, grn_obj *obj, grn_obj *id, - grn_obj *value, int flags) -{ - grn_id *idp = (grn_id *)GRN_BULK_HEAD(id); - uint32_t ids = GRN_BULK_VSIZE(id); - while (obj->header.type == GRN_ACCESSOR_VIEW) { - uint32_t n; - grn_accessor_view *v = (grn_accessor_view *)obj; - if (ids < sizeof(grn_id)) { - ERR(GRN_NO_MEMORY_AVAILABLE, "invalid id."); - return ctx->rc; - } - n = *idp; - if (n >= v->naccessors) { - ERR(GRN_NO_MEMORY_AVAILABLE, "invalid id"); - return ctx->rc; - } - obj = v->accessors[n]; - idp++; - ids -= sizeof(grn_id); - } - return grn_obj_set_value(ctx, obj, *idp, value, flags); -} - int grn_obj_get_values(grn_ctx *ctx, grn_obj *obj, grn_id offset, void **values) { @@ -7222,11 +6601,6 @@ grn_ctx_at(grn_ctx *ctx, grn_id id) vp->ptr = (grn_obj *)grn_array_open(ctx, buffer); UNPACK_INFO(); break; - case GRN_TABLE_VIEW : - GET_PATH(spec, buffer, s, id); - vp->ptr = grn_view_open(ctx, buffer); - UNPACK_INFO(); - break; case GRN_COLUMN_VAR_SIZE : GET_PATH(spec, buffer, s, id); vp->ptr = (grn_obj *)grn_ja_open(ctx, buffer); @@ -7360,9 +6734,6 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj) } rc = GRN_SUCCESS; break; - case GRN_ACCESSOR_VIEW : - rc = grn_accessor_view_close(ctx, obj); - break; case GRN_SNIP : rc = grn_snip_close_real(ctx, (grn_snip *)obj); break; @@ -7381,9 +6752,6 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj) case GRN_CURSOR_TABLE_NO_KEY : grn_array_cursor_close(ctx, (grn_array_cursor *)obj); break; - case GRN_CURSOR_TABLE_VIEW : - grn_view_cursor_close(ctx, (grn_view_cursor *)obj); - break; case GRN_CURSOR_COLUMN_INDEX : { grn_index_cursor *ic = (grn_index_cursor *)obj; @@ -7413,9 +6781,6 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj) case GRN_TABLE_NO_KEY : rc = grn_array_close(ctx, (grn_array *)obj); break; - case GRN_TABLE_VIEW : - rc = grn_view_close(ctx, (grn_view *)obj); - break; case GRN_COLUMN_VAR_SIZE : rc = grn_ja_close(ctx, (grn_ja *)obj); break; @@ -7700,14 +7065,6 @@ grn_column_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size) grn_rc grn_column_name_(grn_ctx *ctx, grn_obj *obj, grn_obj *buf) { - while (obj->header.type == GRN_ACCESSOR_VIEW) { - grn_accessor_view *a = (grn_accessor_view *)obj; - uint32_t n = a->naccessors; - for (;;) { - if (!n) { return ctx->rc; } - if ((obj = a->accessors[--n])) { break; } - } - } if (GRN_DB_OBJP(obj)) { if (DB_OBJ(obj)->id && DB_OBJ(obj)->id < GRN_ID_MAX) { uint32_t len; @@ -8159,114 +7516,6 @@ pack(grn_ctx *ctx, grn_obj *table, sort_entry *head, sort_entry *tail, } static int -compare_cursor(grn_ctx *ctx, grn_table_cursor *a, grn_table_cursor *b, int n_keys) -{ - int i; - uint8_t type; - uint32_t as, bs, cs; - const unsigned char *ap, *bp, *cp; - grn_table_sort_key *ak, *bk; - for (i = 0; i < n_keys; i++) { - ap = grn_table_cursor_get_sort_key_value_(ctx, a, i, &as, &ak); - bp = grn_table_cursor_get_sort_key_value_(ctx, b, i, &bs, &bk); - if (ak->flags & GRN_TABLE_SORT_DESC) { - cp = ap; ap = bp; bp = cp; - cs = as; as = bs; bs = cs; - } - type = ak->offset; - switch (type) { - case KEY_ID : - if (ap != bp) { return ap > bp; } - break; - case KEY_BULK : - for (;; ap++, bp++, as--, bs--) { - if (!as) { if (bs) { return 0; } else { break; } } - if (!bs) { return 1; } - if (*ap < *bp) { return 0; } - if (*ap > *bp) { return 1; } - } - break; - case KEY_INT8 : - CMPNUM(int8_t); - break; - case KEY_INT16 : - CMPNUM(int16_t); - break; - case KEY_INT32 : - CMPNUM(int32_t); - break; - case KEY_INT64 : - CMPNUM(int64_t); - break; - case KEY_UINT8 : - CMPNUM(uint8_t); - break; - case KEY_UINT16 : - CMPNUM(uint16_t); - break; - case KEY_UINT32 : - CMPNUM(uint32_t); - break; - case KEY_UINT64 : - CMPNUM(uint64_t); - break; - case KEY_FLOAT32 : - { - float va = *((float *)(ap)); - float vb = *((float *)(bp)); - if (va < vb || va > vb) { return va > vb; } - } - break; - case KEY_FLOAT64 : - { - double va = *((double *)(ap)); - double vb = *((double *)(bp)); - if (va < vb || va > vb) { return va > vb; } - } - break; - } - } - return VIEW_CURSOR_OFFSET(a) > VIEW_CURSOR_OFFSET(b); -} - -static int -grn_view_sort(grn_ctx *ctx, grn_obj *table, int offset, int limit, - grn_obj *result, grn_table_sort_key *keys, int n_keys) -{ - int i = 0; - grn_obj *t, *r; - grn_id *tp, rid; - grn_view *tv = (grn_view *)table; - grn_view *rv = (grn_view *)result; - grn_hash *th = tv->hash; - grn_hash *rh = rv->hash; - grn_table_sort_key *keys_ = GRN_MALLOCN(grn_table_sort_key, n_keys); - grn_table_sort_key *ks, *kd, *ke = keys + n_keys; - if (keys_) { - rv->keys = keys; - rv->n_keys = n_keys; - rv->offset = offset; - rv->limit = limit; - for (ks = keys, kd =keys_; ks < ke ; ks++, kd++) { kd->flags = ks->flags; } - GRN_HASH_EACH(ctx, th, id, &tp, NULL, NULL, { - grn_hash_get_key(ctx, rh, id, &rid, sizeof(grn_id)); - t = grn_ctx_at(ctx, *tp); - r = grn_ctx_at(ctx, rid); - for (ks = keys, kd =keys_; ks < ke ; ks++, kd++) { - kd->key = ((grn_accessor_view *)ks->key)->accessors[id - 1]; - } - i += grn_table_sort(ctx, t, 0, offset + limit, r, keys_, n_keys); - if (r->header.type == GRN_TABLE_NO_KEY) { - grn_array_copy_sort_key(ctx, (grn_array *)r, keys_, n_keys); - } - }); - GRN_FREE(keys_); - if (i > limit) { i = limit; } - } - return i; -} - -static int range_is_idp(grn_obj *obj) { if (obj && obj->header.type == GRN_ACCESSOR) { @@ -8295,10 +7544,6 @@ grn_table_sort(grn_ctx *ctx, grn_obj *table, int offset, int limit, WARN(GRN_INVALID_ARGUMENT, "table is null"); goto exit; } - if (table->header.type == GRN_TABLE_VIEW) { - i = grn_view_sort(ctx, table, offset, limit, result, keys, n_keys); - goto exit; - } if (!(result && result->header.type == GRN_TABLE_NO_KEY)) { WARN(GRN_INVALID_ARGUMENT, "result is not a array"); goto exit; @@ -8742,7 +7987,6 @@ tokenize(const char *str, size_t str_len, const char **tokbuf, int buf_size, con return tok - tokbuf; } -// todo : support view grn_rc grn_obj_columns(grn_ctx *ctx, grn_obj *table, const char *str, unsigned int str_size, grn_obj *res) Modified: lib/db.h (+2 -26) =================================================================== --- lib/db.h 2012-12-30 00:19:42 +0900 (0db78e5) +++ lib/db.h 2013-01-08 17:48:30 +0900 (c2223c8) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009-2012 Brazil +/* Copyright(C) 2009-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -112,13 +112,8 @@ void grn_table_add_subrec(grn_obj *table, grn_rset_recinfo *ri, int score, grn_obj *grn_obj_graft(grn_ctx *ctx, grn_obj *obj); -GRN_API grn_id grn_view_add(grn_ctx *ctx, grn_obj *view, grn_obj *table); - grn_rc grn_column_name_(grn_ctx *ctx, grn_obj *obj, grn_obj *buf); -GRN_API grn_rc grn_table_cursor_next_o(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id); -GRN_API grn_obj *grn_obj_get_value_o(grn_ctx *ctx, grn_obj *obj, grn_obj *id, grn_obj *value); -grn_rc grn_obj_set_value_o(grn_ctx *ctx, grn_obj *obj, grn_obj *id, grn_obj *value, int flags); typedef enum { PROC_INIT = 0, @@ -130,15 +125,6 @@ struct _grn_type { grn_db_obj obj; }; -typedef struct { - grn_db_obj obj; - grn_hash *hash; - grn_table_sort_key *keys; - int n_keys; - int offset; - int limit; -} grn_view; - #define GRN_TABLE_SORT_GEO (0x02<<0) #define GRN_OBJ_TMP_OBJECT 0x80000000 @@ -215,15 +201,6 @@ GRN_API grn_rc grn_proc_call(grn_ctx *ctx, grn_obj *proc, grn_obj *grn_expr_get_or_add_var(grn_ctx *ctx, grn_obj *expr, const char *name, unsigned int name_size); -typedef struct _grn_accessor_view grn_accessor_view; - -struct _grn_accessor_view { - grn_obj_header header; - grn_id range; - /* -- compatible with grn_db_obj -- */ - uint32_t naccessors; - grn_obj **accessors; -}; typedef struct _grn_accessor grn_accessor; @@ -382,8 +359,7 @@ grn_rc grn_db_check_name(grn_ctx *ctx, const char *name, unsigned int name_size) grn_rc grn_db_obj_init(grn_ctx *ctx, grn_obj *db, grn_id id, grn_db_obj *obj); #define GRN_ACCESSORP(obj) \ - ((obj) && (((grn_obj *)(obj))->header.type == GRN_ACCESSOR ||\ - ((grn_obj *)(obj))->header.type == GRN_ACCESSOR_VIEW)) + ((obj) && (((grn_obj *)(obj))->header.type == GRN_ACCESSOR)) #define GRN_TRUEP(ctx, v, result) do {\ switch (v->header.type) { \ Modified: lib/expr.c (+1 -54) =================================================================== --- lib/expr.c 2012-12-30 00:19:42 +0900 (6893b76) +++ lib/expr.c 2013-01-08 17:48:30 +0900 (a09e60f) @@ -1,6 +1,6 @@ /* -*- c-basic-offset: 2 -*- */ /* - Copyright(C) 2010-2012 Brazil + Copyright(C) 2010-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -3765,7 +3765,6 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n, if (ec->value) { switch (ec->value->header.type) { case GRN_ACCESSOR : - case GRN_ACCESSOR_VIEW : if (grn_column_index(ctx, ec->value, c->op, &index, 1, &sid)) { int32_t weight = get_weight(ctx, ec); si->flags |= SCAN_ACCESSOR; @@ -3992,55 +3991,6 @@ grn_table_select_(grn_ctx *ctx, grn_obj *table, grn_obj *expr, grn_obj *v, } } -grn_obj * -grn_view_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr, - grn_obj *res, grn_operator op) -{ - if (res) { - if (res->header.type != GRN_TABLE_VIEW || - (res->header.domain != DB_OBJ(table)->id)) { - ERR(GRN_INVALID_ARGUMENT, "view table required"); - return NULL; - } - } else { - if (!(res = grn_table_create(ctx, NULL, 0, NULL, - GRN_TABLE_HASH_KEY|GRN_OBJ_WITH_SUBREC, table, NULL))) { - return NULL; - } - } - { - grn_obj *t, *r; - grn_id *tp, rid; - grn_view *tv = (grn_view *)table; - grn_view *rv = (grn_view *)res; - grn_hash *th = tv->hash; - grn_hash *rh = rv->hash; - grn_expr *e = (grn_expr *)expr; - grn_expr_code *cs, *cd, *c0 = e->codes, *ce = e->codes + e->codes_curr; - if ((e->codes = GRN_MALLOCN(grn_expr_code, e->codes_curr))) { - memcpy(e->codes, c0, sizeof(grn_expr_code) * e->codes_curr); - GRN_HASH_EACH(ctx, th, id, &tp, NULL, NULL, { - grn_hash_get_key(ctx, rh, id, &rid, sizeof(grn_id)); - t = grn_ctx_at(ctx, *tp); - r = grn_ctx_at(ctx, rid); - for (cs = c0, cd = e->codes; cs < ce; cs++, cd++) { - if (cs->value && cs->value->header.type == GRN_ACCESSOR_VIEW) { - grn_accessor_view *a = (grn_accessor_view *)cs->value; - if (!(cd->value = a->accessors[id - 1])) { - cd->value = grn_null; - } - } - } - grn_table_select(ctx, t, expr, r, op); - }); - - GRN_FREE(e->codes); - } - e->codes = c0; - } - return res; -} - static inline grn_bool grn_table_select_index_range(grn_ctx *ctx, grn_obj *table, grn_obj *index, scan_info *si, grn_obj *res) @@ -4370,9 +4320,6 @@ grn_table_select(grn_ctx *ctx, grn_obj *table, grn_obj *expr, grn_obj *v; unsigned int res_size; grn_bool res_created = GRN_FALSE; - if (table->header.type == GRN_TABLE_VIEW) { - return grn_view_select(ctx, table, expr, res, op); - } if (res) { if (res->header.type != GRN_TABLE_HASH_KEY || (res->header.domain != DB_OBJ(table)->id)) { Modified: lib/output.c (+13 -48) =================================================================== --- lib/output.c 2012-12-30 00:19:42 +0900 (f1ac0d0) +++ lib/output.c 2013-01-08 17:48:30 +0900 (2615716) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009-2012 Brazil +/* Copyright(C) 2009-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -607,35 +607,6 @@ exit : grn_obj_close(ctx, &buf); } -static void -grn_text_atoj_o(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, - grn_obj *obj, grn_obj *id) -{ - grn_id *idp = (grn_id *)GRN_BULK_HEAD(id); - uint32_t ids = GRN_BULK_VSIZE(id); - for (;;) { - if (ids < sizeof(grn_id)) { - ERR(GRN_INVALID_ARGUMENT, "invalid id."); - return; - } - if (obj->header.type == GRN_ACCESSOR_VIEW) { - uint32_t n; - grn_accessor_view *v = (grn_accessor_view *)obj; - n = *idp; - if (n >= v->naccessors) { - ERR(GRN_INVALID_ARGUMENT, "invalid id"); - return; - } - if (!(obj = v->accessors[n])) { return ; } - idp++; - ids -= sizeof(grn_id); - } else { - break; - } - } - grn_text_atoj(ctx, outbuf, output_type, obj, *idp); -} - static inline void grn_output_void(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, grn_obj *bulk, grn_obj_format *format) @@ -711,6 +682,7 @@ grn_output_bulk(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, if (format) { int j; int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *); + grn_id id = GRN_RECORD_VALUE(bulk); grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { grn_output_array_open(ctx, outbuf, output_type, "COLUMNS", ncolumns); @@ -742,12 +714,12 @@ grn_output_bulk(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, } grn_output_array_open(ctx, outbuf, output_type, "HIT", ncolumns); for (j = 0; j < ncolumns; j++) { - grn_text_atoj_o(ctx, outbuf, output_type, columns[j], bulk); + grn_text_atoj(ctx, outbuf, output_type, columns[j], id); } grn_output_array_close(ctx, outbuf, output_type); } else { grn_obj *table = grn_ctx_at(ctx, bulk->header.domain); - grn_id id = *((grn_id *)GRN_BULK_HEAD(bulk)); + grn_id id = GRN_RECORD_VALUE(bulk); if (table && table->header.type != GRN_TABLE_NO_KEY) { grn_obj *accessor = grn_obj_column(ctx, table, "_key", 4); if (accessor) { @@ -1173,6 +1145,7 @@ grn_output_table_records_by_expression(grn_ctx *ctx, grn_obj *outbuf, grn_obj_format *format) { int n_elements = 0; + grn_id id; grn_obj *record; grn_expr *expr = (grn_expr *)format->expression; grn_expr_code *code; @@ -1180,10 +1153,11 @@ grn_output_table_records_by_expression(grn_ctx *ctx, grn_obj *outbuf, n_elements = count_n_elements_in_expression(ctx, format->expression); record = grn_expr_get_var_by_offset(ctx, format->expression, 0); - while (!grn_table_cursor_next_o(ctx, tc, record)) { + while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { int previous_comma_offset = -1; grn_bool is_first_comma = GRN_TRUE; grn_bool have_comma = GRN_FALSE; + GRN_RECORD_SET(ctx, record, id); grn_output_array_open(ctx, outbuf, output_type, "HIT", n_elements); for (code = expr->codes; code < code_end; code++) { if (code->op == GRN_OP_COMMA) { @@ -1218,7 +1192,6 @@ grn_output_table_records_by_expression(grn_ctx *ctx, grn_obj *outbuf, } grn_output_array_close(ctx, outbuf, output_type); - GRN_BULK_REWIND(record); } } @@ -1229,18 +1202,16 @@ grn_output_table_records_by_columns(grn_ctx *ctx, grn_obj *outbuf, grn_obj_format *format) { int i; - grn_obj id; + grn_id id; int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *); grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); - GRN_TEXT_INIT(&id, 0); - while (!grn_table_cursor_next_o(ctx, tc, &id)) { + while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { grn_output_array_open(ctx, outbuf, output_type, "HIT", ncolumns); for (i = 0; i < ncolumns; i++) { - grn_text_atoj_o(ctx, outbuf, output_type, columns[i], &id); + grn_text_atoj(ctx, outbuf, output_type, columns[i], id); } grn_output_array_close(ctx, outbuf, output_type); } - GRN_OBJ_FIN(ctx, &id); } static inline void @@ -1292,17 +1263,12 @@ grn_output_table(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, 0, -1, GRN_CURSOR_ASCENDING); grn_output_array_open(ctx, outbuf, output_type, "HIT", -1); if (tc) { - grn_obj id; - GRN_TEXT_INIT(&id, 0); - for (i = 0; !grn_table_cursor_next_o(ctx, tc, &id); i++) { - /* todo: - grn_text_atoj_o(ctx, outbuf, output_type, column, &id); - */ + grn_id id; + for (i = 0; (id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL; i++) { GRN_BULK_REWIND(&buf); - grn_obj_get_value_o(ctx, column, &id, &buf); + grn_obj_get_value(ctx, column, id, &buf); grn_text_esc(ctx, outbuf, GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf)); } - GRN_OBJ_FIN(ctx, &id); grn_table_cursor_close(ctx, tc); } grn_output_array_close(ctx, outbuf, output_type); @@ -1336,7 +1302,6 @@ grn_output_obj(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, case GRN_TABLE_HASH_KEY : case GRN_TABLE_PAT_KEY : case GRN_TABLE_NO_KEY : - case GRN_TABLE_VIEW : grn_output_table(ctx, outbuf, output_type, obj, format); break; } Modified: lib/proc.c (+3 -55) =================================================================== --- lib/proc.c 2012-12-30 00:19:42 +0900 (56600c9) +++ lib/proc.c 2013-01-08 17:48:30 +0900 (c9fcc19) @@ -629,7 +629,9 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len, cacheable *= ((grn_expr *)scorer_)->cacheable; taintable += ((grn_expr *)scorer_)->taintable; if ((tc = grn_table_cursor_open(ctx, res, NULL, 0, NULL, 0, 0, -1, 0))) { - while (!grn_table_cursor_next_o(ctx, tc, v)) { + grn_id id; + while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { + GRN_RECORD_SET(ctx, v, id); grn_expr_exec(ctx, scorer_, 0); } grn_table_cursor_close(ctx, tc); @@ -928,9 +930,6 @@ grn_parse_table_create_flags(grn_ctx *ctx, const char *nptr, const char *end) } else if (!memcmp(nptr, "TABLE_NO_KEY", 12)) { flags |= GRN_OBJ_TABLE_NO_KEY; nptr += 12; - } else if (!memcmp(nptr, "TABLE_VIEW", 10)) { - flags |= GRN_OBJ_TABLE_VIEW; - nptr += 10; } else if (!memcmp(nptr, "KEY_NORMALIZE", 13)) { flags |= GRN_OBJ_KEY_NORMALIZE; nptr += 13; @@ -1002,9 +1001,6 @@ grn_table_create_flags_to_text(grn_ctx *ctx, grn_obj *buf, grn_obj_flags flags) case GRN_OBJ_TABLE_NO_KEY: GRN_TEXT_PUTS(ctx, buf, "TABLE_NO_KEY"); break; - case GRN_OBJ_TABLE_VIEW: - GRN_TEXT_PUTS(ctx, buf, "TABLE_VIEW"); - break; } if (flags & GRN_OBJ_KEY_WITH_SIS) { GRN_TEXT_PUTS(ctx, buf, "|KEY_WITH_SIS"); @@ -1554,7 +1550,6 @@ is_table(grn_obj *obj) case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: - case GRN_TABLE_VIEW: return GRN_TRUE; default: return GRN_FALSE; @@ -1711,20 +1706,6 @@ proc_missing(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) } static grn_obj * -proc_view_add(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) -{ - grn_obj *view = grn_ctx_get(ctx, - GRN_TEXT_VALUE(VAR(0)), - GRN_TEXT_LEN(VAR(0))); - grn_obj *table = grn_ctx_get(ctx, - GRN_TEXT_VALUE(VAR(1)), - GRN_TEXT_LEN(VAR(1))); - grn_view_add(ctx, view, table); - GRN_OUTPUT_BOOL(!ctx->rc); - return NULL; -} - -static grn_obj * proc_quit(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) { ctx->stat = GRN_CTX_QUITTING; @@ -2069,7 +2050,6 @@ dump_index_column_sources(grn_ctx *ctx, grn_obj *outbuf, grn_obj *column) case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_HASH_KEY: - case GRN_TABLE_VIEW: GRN_TEXT_PUTS(ctx, outbuf, "_key"); break; default: @@ -2132,7 +2112,6 @@ reference_column_p(grn_ctx *ctx, grn_obj *column) case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: - case GRN_TABLE_VIEW: return GRN_TRUE; default: return GRN_FALSE; @@ -2170,29 +2149,6 @@ dump_columns(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table, } static void -dump_view(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table) -{ - grn_view *view = (grn_view *)table; - grn_id id; - grn_hash_cursor *cursor; - - cursor = grn_hash_cursor_open(ctx, view->hash, NULL, 0, NULL, 0, 0, -1, 0); - while ((id = grn_hash_cursor_next(ctx, cursor)) != GRN_ID_NIL) { - grn_id *table_id; - int key_size = grn_hash_cursor_get_key(ctx, cursor, ((void **)&table_id)); - if (key_size != 4) { - ERR(GRN_INVALID_ARGUMENT, "corrupted view table"); - } - GRN_TEXT_PUTS(ctx, outbuf, "view_add "); - dump_obj_name(ctx, outbuf, table); - GRN_TEXT_PUTC(ctx, outbuf, ' '); - dump_obj_name(ctx, outbuf, grn_ctx_at(ctx, *table_id)); - GRN_TEXT_PUTC(ctx, outbuf, '\n'); - } - grn_hash_cursor_close(ctx, cursor); -} - -static void dump_records(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table) { grn_obj **columns; @@ -2207,9 +2163,6 @@ dump_records(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table) case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: break; - case GRN_TABLE_VIEW: - dump_view(ctx, outbuf, table); - return; default: return; } @@ -2472,7 +2425,6 @@ dump_schema(grn_ctx *ctx, grn_obj *outbuf) case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: case GRN_TABLE_NO_KEY: - case GRN_TABLE_VIEW: dump_table(ctx, outbuf, object, &pending_columns); break; default: @@ -3591,10 +3543,6 @@ grn_db_init_builtin_query(grn_ctx *ctx) DEF_VAR(vars[0], "path"); DEF_COMMAND(GRN_EXPR_MISSING_NAME, proc_missing, 1, vars); - DEF_VAR(vars[0], "view"); - DEF_VAR(vars[1], "table"); - DEF_COMMAND("view_add", proc_view_add, 2, vars); - DEF_COMMAND("quit", proc_quit, 0, vars); DEF_COMMAND("shutdown", proc_shutdown, 0, vars); Modified: lib/str.c (+18 -50) =================================================================== --- lib/str.c 2012-12-30 00:19:42 +0900 (d016a16) +++ lib/str.c 2013-01-08 17:48:30 +0900 (a26e1b9) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2009-2011 Brazil +/* Copyright(C) 2009-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -2591,35 +2591,6 @@ exit : grn_obj_close(ctx, &buf); } -static grn_rc -grn_text_atoj_o(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj *id) -{ - grn_id *idp = (grn_id *)GRN_BULK_HEAD(id); - uint32_t ids = GRN_BULK_VSIZE(id); - for (;;) { - if (ids < sizeof(grn_id)) { - ERR(GRN_INVALID_ARGUMENT, "invalid id."); - return ctx->rc; - } - if (obj->header.type == GRN_ACCESSOR_VIEW) { - uint32_t n; - grn_accessor_view *v = (grn_accessor_view *)obj; - n = *idp; - if (n >= v->naccessors) { - ERR(GRN_INVALID_ARGUMENT, "invalid id"); - return ctx->rc; - } - if (!(obj = v->accessors[n])) { return ctx->rc; } - idp++; - ids -= sizeof(grn_id); - } else { - break; - } - } - grn_text_atoj(ctx, bulk, obj, *idp); - return ctx->rc; -} - grn_rc grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) { @@ -2692,6 +2663,7 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) if (format) { int j; int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *); + grn_id id = GRN_RECORD_VALUE(obj); grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); if (format->flags & GRN_OBJ_FORMAT_WITH_COLUMN_NAMES) { GRN_TEXT_PUTS(ctx, bulk, "["); @@ -2726,12 +2698,12 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) GRN_TEXT_PUTC(ctx, bulk, '['); for (j = 0; j < ncolumns; j++) { if (j) { GRN_TEXT_PUTC(ctx, bulk, ','); } - grn_text_atoj_o(ctx, bulk, columns[j], obj); + grn_text_atoj(ctx, bulk, columns[j], id); } GRN_TEXT_PUTC(ctx, bulk, ']'); } else { grn_obj *table = grn_ctx_at(ctx, obj->header.domain); - grn_id id = *((grn_id *)GRN_BULK_HEAD(obj)); + grn_id id = GRN_RECORD_VALUE(obj); if (table && table->header.type != GRN_TABLE_NO_KEY) { /* todo : temporal patch. grn_table_at() is kinda costful... */ if (grn_table_at(ctx, table, id)) { @@ -2908,11 +2880,10 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) case GRN_TABLE_HASH_KEY : case GRN_TABLE_PAT_KEY : case GRN_TABLE_NO_KEY : - case GRN_TABLE_VIEW : if (format) { int i, j; int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *); - grn_obj id, **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); + grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); grn_table_cursor *tc = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, format->offset, format->limit, GRN_CURSOR_ASCENDING); @@ -2950,13 +2921,13 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) } GRN_TEXT_PUTC(ctx, bulk, ']'); } - GRN_TEXT_INIT(&id, 0); if (tc) { - for (i = 0; !grn_table_cursor_next_o(ctx, tc, &id); i++) { + grn_id id; + for (i = 0; (id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL; i++) { GRN_TEXT_PUTS(ctx, bulk, ",["); for (j = 0; j < ncolumns; j++) { if (j) { GRN_TEXT_PUTC(ctx, bulk, ','); } - grn_text_atoj_o(ctx, bulk, columns[j], &id); + grn_text_atoj(ctx, bulk, columns[j], id); } GRN_TEXT_PUTC(ctx, bulk, ']'); } @@ -2965,19 +2936,16 @@ grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *format) GRN_TEXT_PUTC(ctx, bulk, ']'); } else { int i; - grn_obj id, *column = grn_obj_column(ctx, obj, "_key", 4); + grn_id id; + grn_obj *column = grn_obj_column(ctx, obj, "_key", 4); grn_table_cursor *tc = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, 0, -1, GRN_CURSOR_ASCENDING); GRN_TEXT_PUTC(ctx, bulk, '['); if (tc) { - GRN_TEXT_INIT(&id, 0); - for (i = 0; !grn_table_cursor_next_o(ctx, tc, &id); i++) { + for (i = 0; (id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL; i++) { if (i) { GRN_TEXT_PUTC(ctx, bulk, ','); } - /* todo: - grn_text_atoj_o(ctx, bulk, column, &id); - */ GRN_BULK_REWIND(&buf); - grn_obj_get_value_o(ctx, column, &id, &buf); + grn_obj_get_value(ctx, column, id, &buf); grn_text_esc(ctx, bulk, GRN_BULK_HEAD(&buf), GRN_BULK_VSIZE(&buf)); } grn_table_cursor_close(ctx, tc); @@ -3065,11 +3033,10 @@ grn_text_otoxml(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *forma case GRN_TABLE_HASH_KEY : case GRN_TABLE_PAT_KEY : case GRN_TABLE_NO_KEY : - case GRN_TABLE_VIEW : { int i, j; int ncolumns = GRN_BULK_VSIZE(&format->columns)/sizeof(grn_obj *); - grn_obj id, **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); + grn_obj **columns = (grn_obj **)GRN_BULK_HEAD(&format->columns); grn_table_cursor *tc = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, format->offset, format->limit, GRN_CURSOR_ASCENDING); @@ -3095,9 +3062,10 @@ grn_text_otoxml(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *forma /* TODO: add TIME attribute to RESULTSET element. */ if (tc) { int hit_no; - GRN_TEXT_INIT(&id, 0); + grn_id id; for (i = format->offset + 1, hit_no = format->hits_offset + 1; - !grn_table_cursor_next_o(ctx, tc, &id); i++, hit_no++) { + (id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL; + i++, hit_no++) { switch (format->flags & GRN_OBJ_FORMAT_XML_ELEMENT_MASK) { case GRN_OBJ_FORMAT_XML_ELEMENT_RESULTSET: GRN_TEXT_PUTS(ctx, bulk, "<HIT NO=\""); @@ -3111,7 +3079,7 @@ grn_text_otoxml(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *forma GRN_TEXT_PUTS(ctx, bulk, "\">"); GRN_BULK_REWIND(&buf); - grn_obj_get_value_o(ctx, columns[j], &id, &buf); + grn_obj_get_value(ctx, columns[j], id, &buf); grn_text_otoxml(ctx, bulk, &buf, NULL); GRN_TEXT_PUTS(ctx, bulk, "</FIELD>\n"); @@ -3126,7 +3094,7 @@ grn_text_otoxml(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj, grn_obj_format *forma grn_text_escape_xml(ctx, bulk, GRN_TEXT_VALUE(&buf), GRN_TEXT_LEN(&buf)); GRN_TEXT_PUTS(ctx, bulk, "=\""); GRN_BULK_REWIND(&buf); - grn_obj_get_value_o(ctx, columns[j], &id, &buf); + grn_obj_get_value(ctx, columns[j], id, &buf); grn_text_otoxml(ctx, bulk, &buf, NULL); GRN_TEXT_PUTS(ctx, bulk, "\" "); } Modified: lib/util.c (+1 -13) =================================================================== --- lib/util.c 2012-12-30 00:19:42 +0900 (bc654a3) +++ lib/util.c 2013-01-08 17:48:30 +0900 (adfd309) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2 -*- */ -/* Copyright(C) 2010-2011 Brazil +/* Copyright(C) 2010-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -149,9 +149,6 @@ grn_inspect_type(grn_ctx *ctx, grn_obj *buf, unsigned char type) case GRN_ACCESSOR : GRN_TEXT_PUTS(ctx, buf, "GRN_ACCESSOR"); break; - case GRN_ACCESSOR_VIEW : - GRN_TEXT_PUTS(ctx, buf, "GRN_ACCESSOR_VIEW"); - break; case GRN_SNIP : GRN_TEXT_PUTS(ctx, buf, "GRN_SNIP"); break; @@ -173,9 +170,6 @@ grn_inspect_type(grn_ctx *ctx, grn_obj *buf, unsigned char type) case GRN_CURSOR_TABLE_NO_KEY : GRN_TEXT_PUTS(ctx, buf, "GRN_CURSOR_TABLE_NO_KEY"); break; - case GRN_CURSOR_TABLE_VIEW : - GRN_TEXT_PUTS(ctx, buf, "GRN_CURSOR_TABLE_VIEW"); - break; case GRN_CURSOR_COLUMN_INDEX : GRN_TEXT_PUTS(ctx, buf, "GRN_CURSOR_COLUMN_INDEX"); break; @@ -203,9 +197,6 @@ grn_inspect_type(grn_ctx *ctx, grn_obj *buf, unsigned char type) case GRN_TABLE_NO_KEY : GRN_TEXT_PUTS(ctx, buf, "GRN_TABLE_NO_KEY"); break; - case GRN_TABLE_VIEW : - GRN_TEXT_PUTS(ctx, buf, "GRN_TABLE_VIEW"); - break; case GRN_DB : GRN_TEXT_PUTS(ctx, buf, "GRN_DB"); break; @@ -815,7 +806,6 @@ grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj) /* TODO */ break; case GRN_ACCESSOR : - case GRN_ACCESSOR_VIEW : grn_accessor_inspect(ctx, buffer, obj); return buffer; case GRN_SNIP : @@ -833,7 +823,6 @@ grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj) return buffer; case GRN_CURSOR_TABLE_DAT_KEY : case GRN_CURSOR_TABLE_NO_KEY : - case GRN_CURSOR_TABLE_VIEW : case GRN_CURSOR_COLUMN_INDEX : case GRN_CURSOR_COLUMN_GEO_INDEX : /* TODO */ @@ -853,7 +842,6 @@ grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj) case GRN_TABLE_NO_KEY : grn_table_inspect(ctx, buffer, obj); return buffer; - case GRN_TABLE_VIEW : case GRN_DB : /* TODO */ break; Modified: plugins/suggest/suggest.c (+5 -4) =================================================================== --- plugins/suggest/suggest.c 2012-12-30 00:19:42 +0900 (54f29d1) +++ plugins/suggest/suggest.c 2013-01-08 17:48:30 +0900 (0d84cfc) @@ -1,5 +1,5 @@ /* -*- c-basic-offset: 2; indent-tabs-mode: nil -*- */ -/* Copyright(C) 2010-2012 Brazil +/* Copyright(C) 2010-2013 Brazil This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -456,13 +456,14 @@ correct(grn_ctx *ctx, grn_obj *items, grn_obj *items_boost, grn_expr_append_op(ctx, expr, GRN_OP_MINUS_ASSIGN, 2); if ((tc = grn_table_cursor_open(ctx, res, NULL, 0, NULL, 0, 0, -1, 0))) { + grn_id id; grn_obj score_value; GRN_INT32_INIT(&score_value, 0); - while (!grn_table_cursor_next_o(ctx, tc, var)) { + while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { + GRN_RECORD_SET(ctx, var, id); grn_expr_exec(ctx, expr, 0); GRN_BULK_REWIND(&score_value); - grn_obj_get_value(ctx, score, GRN_RECORD_VALUE(var), - &score_value); + grn_obj_get_value(ctx, score, id, &score_value); if (GRN_INT32_VALUE(&score_value) < frequency_threshold) { grn_table_cursor_delete(ctx, tc); } Modified: plugins/table/table.c (+3 -2) =================================================================== --- plugins/table/table.c 2012-12-30 00:19:42 +0900 (7c2a26e) +++ plugins/table/table.c 2013-01-08 17:48:30 +0900 (f3d451d) @@ -359,7 +359,9 @@ command_each(grn_ctx *ctx, int nargs, grn_obj **args, GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE); if ((tc = grn_table_cursor_open(ctx, table_, NULL, 0, NULL, 0, 0, -1, 0))) { - while (!grn_table_cursor_next_o(ctx, tc, v)) { + grn_id id; + while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { + GRN_RECORD_SET(ctx, v, id); grn_expr_exec(ctx, expr_, 0); } grn_table_cursor_close(ctx, tc); @@ -485,7 +487,6 @@ command_get_resolve_parameters(grn_ctx *ctx, grn_user_data *user_data, case GRN_TABLE_HASH_KEY: case GRN_TABLE_PAT_KEY: case GRN_TABLE_DAT_KEY: - case GRN_TABLE_VIEW: if (key_length && id_length) { ERR(GRN_INVALID_ARGUMENT, "[table][get] should not specify both key and ID: " Modified: test/unit/core/Makefile.am (+0 -4) =================================================================== --- test/unit/core/Makefile.am 2012-12-30 00:19:42 +0900 (99c6e9d) +++ test/unit/core/Makefile.am 2013-01-08 17:48:30 +0900 (f57253e) @@ -33,8 +33,6 @@ noinst_LTLIBRARIES = \ test-cast-basic.la \ test-cast-table.la \ test-encoding.la \ - test-view.la \ - test-view-operations.la \ test-plugin.la \ test-function.la \ test-function-edit-distance.la \ @@ -123,8 +121,6 @@ test_text_la_SOURCES = test-text.c test_cast_basic_la_SOURCES = test-cast-basic.c test_cast_table_la_SOURCES = test-cast-table.c test_encoding_la_SOURCES = test-encoding.c -test_view_la_SOURCES = test-view.c -test_view_operations_la_SOURCES = test-view-operations.c test_plugin_la_SOURCES = test-plugin.c test_function_la_SOURCES = test-function.c test_function_edit_distance_la_SOURCES = test-function-edit-distance.c Modified: test/unit/core/test-command-dump.c (+1 -13) =================================================================== --- test/unit/core/test-command-dump.c 2012-12-30 00:19:42 +0900 (2b8c8be) +++ test/unit/core/test-command-dump.c 2013-01-08 17:48:30 +0900 (99aca44) @@ -2,7 +2,7 @@ /* Copyright (C) 2010 Brazil Copyright (C) 2009 Ryo Onodera <onodera �� clear-code.com> - Copyright (C) 2009-2012 Kouhei Sutou <kou �� clear-code.com> + Copyright (C) 2009-2013 Kouhei Sutou <kou �� clear-code.com> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -211,17 +211,6 @@ data_array_create(void) "Int32"); } -static void -data_view_create(void) -{ - ADD_DATA("view", - "table_create Blog TABLE_VIEW", - "Blog", - GRN_OBJ_TABLE_VIEW, - NULL, - NULL); -} - void data_table_create(void) { @@ -229,7 +218,6 @@ data_table_create(void) data_patricia_trie_create(); data_double_array_trie_create(); data_array_create(); - data_view_create(); } #undef ADD_DATA Deleted: test/unit/core/test-view-operations.c (+0 -245) 100644 =================================================================== --- test/unit/core/test-view-operations.c 2012-12-30 00:19:42 +0900 (8002bd4) +++ /dev/null @@ -1,245 +0,0 @@ -/* -*- c-basic-offset: 2; coding: utf-8 -*- */ -/* - Copyright (C) 2010-2012 Kouhei Sutou <kou �� clear-code.com> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License version 2.1 as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include <gcutter.h> -#include <glib/gstdio.h> - -#include "../lib/grn-assertions.h" -#include <db.h> - -void test_sort(void); -void test_select(void); - -static grn_logger_info *logger; -static grn_ctx *context; -static grn_obj *database, *entries, *users, *dogs, *result; -static grn_obj *expression, *variable; - -static gchar *tmp_directory; -static gchar *database_path; - -void -cut_startup(void) -{ - tmp_directory = g_build_filename(grn_test_get_tmp_dir(), - "test-view", - NULL); - database_path = g_build_filename(tmp_directory, "database.groonga", NULL); -} - -void -cut_shutdown(void) -{ - g_free(database_path); - g_free(tmp_directory); -} - -static void -remove_tmp_directory(void) -{ - cut_remove_path(tmp_directory, NULL); -} - -static void -setup_ddl(void) -{ - assert_send_command("table_create Entries TABLE_VIEW"); - assert_send_command("table_create Users --key_type ShortText"); - assert_send_command("table_create Dogs --key_type ShortText"); - - entries = get_object("Entries"); - users = get_object("Users"); - dogs = get_object("Dogs"); - - grn_view_add(context, entries, users); - grn_test_assert_context(context); - grn_view_add(context, entries, dogs); - grn_test_assert_context(context); -} - -static void -setup_data(void) -{ - assert_send_command("load '[[\"_key\"],[\"morita\"],[\"gunyara-kun\"],[\"yu\"]]' " - "Users"); - assert_send_command("load '[[\"_key\"],[\"pochi\"],[\"bob\"],[\"taro\"]]' Dogs"); -} - -static void -setup_database(void) -{ - database = grn_db_create(context, database_path, NULL); - grn_test_assert_context(context); - - setup_ddl(); - setup_data(); -} - -void -cut_setup(void) -{ - entries = NULL; - users = NULL; - dogs = NULL; - result = NULL; - expression = NULL; - variable = NULL; - - logger = setup_grn_logger(); - - context = g_new(grn_ctx, 1); - grn_ctx_init(context, 0); - - remove_tmp_directory(); - g_mkdir_with_parents(tmp_directory, 0700); - - setup_database(); -} - -static void -teardown_database(void) -{ - if (variable) { - grn_obj_unlink(context, variable); - } - - if (expression) { - grn_obj_unlink(context, expression); - } - - if (result) { - grn_obj_unlink(context, result); - } - - if (entries) { - grn_obj_unlink(context, entries); - } - - if (users) { - grn_obj_unlink(context, users); - } - - if (dogs) { - grn_obj_unlink(context, dogs); - } - - if (database) { - grn_obj_unlink(context, database); - } - - if (context) { - grn_ctx_fin(context); - g_free(context); - } -} - -void -cut_teardown(void) -{ - teardown_database(); - - teardown_grn_logger(logger); - - remove_tmp_directory(); -} - -void -test_sort(void) -{ - grn_obj *result; - grn_table_sort_key keys[1]; - gint limit, n_records; - - result = grn_table_create(context, NULL, 0, NULL, GRN_TABLE_VIEW, NULL, NULL); - grn_view_add(context, result, - grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY, - NULL, users)); - grn_view_add(context, result, - grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY, - NULL, dogs)); - - keys[0].key = grn_obj_column(context, entries, "_key", strlen("_key")); - keys[0].flags = GRN_TABLE_SORT_DESC; - limit = 2; - n_records = grn_table_sort(context, entries, 0, limit, result, - keys, sizeof(keys[0]) / sizeof(keys)); - grn_test_assert_equal_view(context, - gcut_take_new_list_string("yu", - "taro", - NULL), - result, - "_key"); - cut_assert_equal_int(limit, n_records); -} - -void -test_sort_offset(void) -{ - grn_obj *result; - grn_table_sort_key keys[1]; - gint offset, limit, n_records; - - result = grn_table_create(context, NULL, 0, NULL, GRN_TABLE_VIEW, NULL, NULL); - grn_view_add(context, result, - grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY, - NULL, users)); - grn_view_add(context, result, - grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY, - NULL, dogs)); - - keys[0].key = grn_obj_column(context, entries, "_key", strlen("_key")); - keys[0].flags = GRN_TABLE_SORT_DESC; - offset = 1; - limit = 2; - n_records = grn_table_sort(context, entries, offset, limit, result, - keys, sizeof(keys[0]) / sizeof(keys)); - grn_test_assert_equal_view(context, - gcut_take_new_list_string("taro", - "pochi", - NULL), - result, - "_key"); - cut_assert_equal_int(limit, n_records); -} - -static grn_obj * -query(const gchar *string) -{ - GRN_EXPR_CREATE_FOR_QUERY(context, entries, expression, variable); - grn_test_assert(grn_expr_parse(context, expression, - string, strlen(string), - NULL, GRN_OP_MATCH, GRN_OP_AND, - GRN_EXPR_SYNTAX_QUERY | - GRN_EXPR_ALLOW_PRAGMA | - GRN_EXPR_ALLOW_COLUMN)); - grn_test_assert_context(context); - return expression; -} - -void -test_select(void) -{ - result = grn_table_select(context, entries, query("_key:@ta"), - NULL, GRN_OP_OR); - grn_test_assert_equal_view(context, - gcut_take_new_list_string("morita", - "taro", - NULL), - result, - "_key"); -} Deleted: test/unit/core/test-view.c (+0 -177) 100644 =================================================================== --- test/unit/core/test-view.c 2012-12-30 00:19:42 +0900 (07c3391) +++ /dev/null @@ -1,177 +0,0 @@ -/* -*- c-basic-offset: 2; coding: utf-8 -*- */ -/* - Copyright (C) 2010 Kouhei Sutou <kou �� clear-code.com> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License version 2.1 as published by the Free Software Foundation. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include <gcutter.h> -#include <glib/gstdio.h> - -#include "../lib/grn-assertions.h" -#include <db.h> - -void data_create(void); -void test_create(gconstpointer data); -void test_add(void); - -static grn_logger_info *logger; -static grn_ctx *context; -static grn_obj *database, *view; -static grn_obj *entries, *users, *dogs; - -static gchar *tmp_directory; -static gchar *database_path; - -void -cut_startup(void) -{ - tmp_directory = g_build_filename(grn_test_get_tmp_dir(), - "test-view", - NULL); - database_path = g_build_filename(tmp_directory, "database.groonga", NULL); -} - -void -cut_shutdown(void) -{ - g_free(database_path); - g_free(tmp_directory); -} - -static void -remove_tmp_directory(void) -{ - cut_remove_path(tmp_directory, NULL); -} - -void -cut_setup(void) -{ - view = NULL; - entries = NULL; - users = NULL; - dogs = NULL; - - logger = setup_grn_logger(); - - context = g_new(grn_ctx, 1); - grn_ctx_init(context, 0); - - remove_tmp_directory(); - g_mkdir_with_parents(tmp_directory, 0700); - - database = grn_db_create(context, database_path, NULL); - grn_test_assert_context(context); -} - -static void -teardown_database(void) -{ - if (view) { - grn_obj_unlink(context, view); - } - - if (entries) { - grn_obj_unlink(context, entries); - } - - if (users) { - grn_obj_unlink(context, users); - } - - if (dogs) { - grn_obj_unlink(context, dogs); - } - - if (database) { - grn_obj_unlink(context, database); - } - - if (context) { - grn_ctx_fin(context); - g_free(context); - } -} - -void -cut_teardown(void) -{ - teardown_database(); - - teardown_grn_logger(logger); - - remove_tmp_directory(); -} - -void -data_create(void) -{ -#define ADD_DATA(label, name, path) \ - gcut_add_datum(label, \ - "name", G_TYPE_STRING, name, \ - "path", G_TYPE_STRING, path, \ - NULL) - - ADD_DATA("anonymous", NULL, NULL); - ADD_DATA("named", "Entries", NULL); - ADD_DATA("named - explicit path", "Entries", - cut_build_path(tmp_directory, "view.db", NULL)); - -#undef ADD_DATA -} - -void -test_create(gconstpointer data) -{ - const gchar *name, *path; - grn_obj_flags flags = GRN_OBJ_TABLE_VIEW; - - name = gcut_data_get_string(data, "name"); - path = gcut_data_get_string(data, "path"); - - if (name || path) { - flags |= GRN_OBJ_PERSISTENT; - } - - view = grn_table_create(context, - name, name ? strlen(name) : 0, - path, - flags, - NULL, NULL); - grn_test_assert_not_null(context, view); -} - -void -test_add(void) -{ - assert_send_command("table_create Entries TABLE_VIEW"); - assert_send_command("table_create Users --key_type ShortText"); - assert_send_command("table_create Dogs --key_type ShortText"); - - entries = get_object("Entries"); - users = get_object("Users"); - dogs = get_object("Dogs"); - - grn_view_add(context, entries, users); - grn_test_assert_context(context); - grn_view_add(context, entries, dogs); - grn_test_assert_context(context); - - cut_assert_equal_uint(0, grn_table_size(context, entries)); - assert_send_command("load '[[\"_key\"],[\"morita\"]]' Users"); - cut_assert_equal_uint(1, grn_table_size(context, entries)); - assert_send_command("load '[[\"_key\"],[\"pochi\"]]' Dogs"); - cut_assert_equal_uint(2, grn_table_size(context, entries)); -} Modified: test/unit/lib/grn-assertions.c (+0 -15) =================================================================== --- test/unit/lib/grn-assertions.c 2012-12-30 00:19:42 +0900 (1f9d52f) +++ test/unit/lib/grn-assertions.c 2013-01-08 17:48:30 +0900 (98f21f5) @@ -361,21 +361,6 @@ grn_test_assert_equal_table_helper (grn_ctx *context, } void -grn_test_assert_equal_view_helper (grn_ctx *context, - const GList *expected, - grn_obj *view, - const gchar *text_column_name, - const gchar *expected_expression, - const gchar *view_expression, - const gchar *text_column_name_expression) -{ - const GList *records; - - records = grn_test_view_collect_string(context, view, text_column_name); - gcut_assert_equal_list_string(expected, records); -} - -void grn_test_assert_send_command_error_helper (grn_ctx *context, grn_rc expected_rc, const gchar *expected_message, Modified: test/unit/lib/grn-assertions.h (+0 -19) =================================================================== --- test/unit/lib/grn-assertions.h 2012-12-30 00:19:42 +0900 (c0616b1) +++ test/unit/lib/grn-assertions.h 2013-01-08 17:48:30 +0900 (bba3e34) @@ -149,17 +149,6 @@ __VA_ARGS__), \ grn_test_assert_equal_table(context, expected, table)) -#define grn_test_assert_equal_view(context, expected, view, \ - text_column_name, ...) \ - cut_trace_with_info_expression( \ - cut_test_with_user_message( \ - grn_test_assert_equal_view_helper((context), (expected), (view), \ - (text_column_name), \ - #expected, #view, \ - #text_column_name), \ - __VA_ARGS__), \ - grn_test_assert_equal_view(context, expected, view, text_column_name)) - #define grn_test_assert_send_command_error(context, expected_rc, \ expected_message, command, \ ...) \ @@ -249,14 +238,6 @@ void grn_test_assert_equal_table_helper const gchar *expected_expression, const gchar *select_result_expression, const gchar *text_column_name_expression); -void grn_test_assert_equal_view_helper - (grn_ctx *context, - const GList *expected, - grn_obj *view, - const gchar *text_column_name, - const gchar *expected_expression, - const gchar *view_expression, - const gchar *text_column_name_expression); void grn_test_assert_send_command_error_helper (grn_ctx *context, grn_rc expected_rc, Modified: test/unit/lib/grn-test-utils.c (+0 -34) =================================================================== --- test/unit/lib/grn-test-utils.c 2012-12-30 00:19:42 +0900 (5b93abc) +++ test/unit/lib/grn-test-utils.c 2013-01-08 17:48:30 +0900 (8210dfd) @@ -733,40 +733,6 @@ grn_test_table_collect_string(grn_ctx *context, return records; } -const GList * -grn_test_view_collect_string(grn_ctx *context, - grn_obj *view, - const gchar *text_column_name) -{ - GList *records = NULL; - grn_table_cursor *cursor; - grn_obj id, value; - grn_obj *text_column; - - cursor = grn_table_cursor_open(context, view, NULL, 0, NULL, 0, - 0, -1, GRN_CURSOR_ASCENDING); - cut_assert_not_null(cursor); - GRN_TEXT_INIT(&id, 0); - GRN_TEXT_INIT(&value, 0); - text_column = grn_obj_column(context, view, - text_column_name, strlen(text_column_name)); - while (grn_table_cursor_next_o(context, cursor, &id) == GRN_SUCCESS) { - GRN_BULK_REWIND(&value); - grn_obj_get_value_o(context, text_column, &id, &value); - records = g_list_append(records, g_strndup(GRN_TEXT_VALUE(&value), - GRN_TEXT_LEN(&value))); - } - grn_obj_unlink(context, &id); - grn_obj_unlink(context, &value); - grn_obj_unlink(context, text_column); - gcut_take_list(records, g_free); - - grn_test_assert(grn_table_cursor_close(context, cursor)); - grn_test_assert_context(context); - - return records; -} - gint grn_test_coordinate_in_milliseconds(gdouble coordinate_in_degree) { Modified: test/unit/lib/grn-test-utils.h (+0 -3) =================================================================== --- test/unit/lib/grn-test-utils.h 2012-12-30 00:19:42 +0900 (b1e878d) +++ test/unit/lib/grn-test-utils.h 2013-01-08 17:48:30 +0900 (8ad7fc3) @@ -91,9 +91,6 @@ void grn_test_send_commands (grn_ctx *context, const GList *grn_test_table_collect_string (grn_ctx *context, grn_obj *table, const gchar *text_column_name); -const GList *grn_test_view_collect_string (grn_ctx *context, - grn_obj *view, - const gchar *text_column_name); gint grn_test_coordinate_in_milliseconds (gdouble coordinate_in_degree);