[Groonga-commit] groonga/groonga [master] Remove view related codes

Back to archive index

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

  Merged 5280bdc: Merge pull request #49 from groonga/remove-view

  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);




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