groonga 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/NEWS.ja.rdoc +11 -0
  2. data/NEWS.rdoc +11 -0
  3. data/README.ja.rdoc +4 -3
  4. data/README.rdoc +4 -3
  5. data/Rakefile +1 -1
  6. data/TUTORIAL.ja.rdoc +168 -44
  7. data/benchmark/common.rb +49 -0
  8. data/benchmark/read-write-small-many-items.rb +156 -0
  9. data/benchmark/write-small-many-items.rb +145 -0
  10. data/example/bookmark.rb +68 -20
  11. data/ext/rb-grn-array-cursor.c +8 -0
  12. data/ext/rb-grn-array.c +40 -11
  13. data/ext/rb-grn-column.c +38 -209
  14. data/ext/rb-grn-context.c +203 -56
  15. data/ext/rb-grn-database.c +119 -5
  16. data/ext/rb-grn-encoding-support.c +64 -0
  17. data/ext/rb-grn-encoding.c +58 -1
  18. data/ext/rb-grn-fix-size-column.c +220 -0
  19. data/ext/rb-grn-hash-cursor.c +8 -0
  20. data/ext/rb-grn-hash.c +244 -2
  21. data/ext/rb-grn-index-column.c +474 -0
  22. data/ext/rb-grn-object.c +143 -265
  23. data/ext/rb-grn-patricia-trie.c +148 -2
  24. data/ext/rb-grn-query.c +5 -3
  25. data/ext/rb-grn-record.c +3 -2
  26. data/ext/rb-grn-snippet.c +5 -3
  27. data/ext/rb-grn-table-cursor-key-support.c +3 -3
  28. data/ext/rb-grn-table-cursor.c +106 -112
  29. data/ext/rb-grn-table-key-support.c +220 -118
  30. data/ext/rb-grn-table.c +336 -80
  31. data/ext/rb-grn-type.c +5 -4
  32. data/ext/rb-grn-utils.c +62 -63
  33. data/ext/rb-grn.h +215 -14
  34. data/ext/rb-groonga.c +7 -16
  35. data/extconf.rb +3 -1
  36. data/html/favicon.ico +0 -0
  37. data/html/favicon.xcf +0 -0
  38. data/html/index.html +1 -7
  39. data/lib/groonga/record.rb +6 -1
  40. data/test/groonga-test-utils.rb +1 -0
  41. data/test/test-array.rb +81 -0
  42. data/test/test-column.rb +22 -12
  43. data/test/test-context.rb +1 -29
  44. data/test/test-database.rb +30 -0
  45. data/test/test-hash.rb +194 -0
  46. data/test/test-index-column.rb +57 -0
  47. data/test/test-patricia-trie.rb +82 -0
  48. data/test/test-record.rb +10 -10
  49. data/test/test-table.rb +37 -130
  50. data/test/test-type.rb +4 -3
  51. metadata +15 -4
  52. data/benchmark/small-many-items.rb +0 -175
data/ext/rb-grn-table.c CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  #include "rb-grn.h"
20
20
 
21
- #define SELF(object, context) (RVAL2GRNTABLE(object, context))
21
+ #define SELF(object) ((RbGrnTable *)DATA_PTR(object))
22
22
 
23
23
  VALUE rb_cGrnTable;
24
24
 
@@ -39,6 +39,85 @@ rb_grn_table_to_ruby_object (grn_ctx *context, grn_obj *table,
39
39
  return GRNOBJECT2RVAL(rb_cGrnTable, context, table, owner);
40
40
  }
41
41
 
42
+ void
43
+ rb_grn_table_unbind (RbGrnTable *rb_grn_table)
44
+ {
45
+ RbGrnObject *rb_grn_object;
46
+ grn_ctx *context;
47
+
48
+ rb_grn_object = RB_GRN_OBJECT(rb_grn_table);
49
+ context = rb_grn_object->context;
50
+
51
+ if (context)
52
+ grn_obj_close(context, rb_grn_table->value);
53
+
54
+ rb_grn_object_unbind(rb_grn_object);
55
+ }
56
+
57
+ static void
58
+ rb_grn_table_free (void *object)
59
+ {
60
+ RbGrnTable *rb_grn_table = object;
61
+
62
+ rb_grn_table_unbind(rb_grn_table);
63
+ xfree(rb_grn_table);
64
+ }
65
+
66
+ VALUE
67
+ rb_grn_table_alloc (VALUE klass)
68
+ {
69
+ return Data_Wrap_Struct(klass, NULL, rb_grn_table_free, NULL);
70
+ }
71
+
72
+ void
73
+ rb_grn_table_bind (RbGrnTable *rb_grn_table,
74
+ grn_ctx *context, grn_obj *table, rb_grn_boolean owner)
75
+ {
76
+ RbGrnObject *rb_grn_object;
77
+
78
+ rb_grn_object = RB_GRN_OBJECT(rb_grn_table);
79
+ rb_grn_object_bind(rb_grn_object, context, table, owner);
80
+ rb_grn_object->unbind = RB_GRN_UNBIND_FUNCTION(rb_grn_table_unbind);
81
+
82
+ rb_grn_table->value = grn_obj_open(context, GRN_BULK, 0,
83
+ rb_grn_object->range_id);
84
+ }
85
+
86
+ void
87
+ rb_grn_table_assign (VALUE self, VALUE rb_context,
88
+ grn_ctx *context, grn_obj *table,
89
+ rb_grn_boolean owner)
90
+ {
91
+ RbGrnTable *rb_grn_table;
92
+
93
+ rb_grn_table = ALLOC(RbGrnTable);
94
+ DATA_PTR(self) = rb_grn_table;
95
+ rb_grn_table_bind(rb_grn_table, context, table, owner);
96
+
97
+ rb_iv_set(self, "context", rb_context);
98
+ }
99
+
100
+ void
101
+ rb_grn_table_deconstruct (RbGrnTable *rb_grn_table,
102
+ grn_obj **table,
103
+ grn_ctx **context,
104
+ grn_id *domain_id,
105
+ grn_obj **domain,
106
+ grn_obj **value,
107
+ grn_id *range_id,
108
+ grn_obj **range)
109
+ {
110
+ RbGrnObject *rb_grn_object;
111
+
112
+ rb_grn_object = RB_GRN_OBJECT(rb_grn_table);
113
+ rb_grn_object_deconstruct(rb_grn_object, table, context,
114
+ domain_id, domain,
115
+ range_id, range);
116
+
117
+ if (value)
118
+ *value = rb_grn_table->value;
119
+ }
120
+
42
121
  VALUE
43
122
  rb_grn_table_s_create (int argc, VALUE *argv, VALUE klass,
44
123
  grn_obj_flags key_store)
@@ -66,7 +145,7 @@ rb_grn_table_s_create (int argc, VALUE *argv, VALUE klass,
66
145
  "value_size", &rb_value_size,
67
146
  NULL);
68
147
 
69
- context = rb_grn_context_ensure(rb_context);
148
+ context = rb_grn_context_ensure(&rb_context);
70
149
 
71
150
  if (!NIL_P(rb_name)) {
72
151
  name = StringValuePtr(rb_name);
@@ -98,7 +177,8 @@ rb_grn_table_s_create (int argc, VALUE *argv, VALUE klass,
98
177
 
99
178
  table = grn_table_create(context, name, name_size, path,
100
179
  flags, key_type, value_size);
101
- rb_table = GRNOBJECT2RVAL(klass, context, table, RB_GRN_TRUE);
180
+ rb_table = rb_grn_table_alloc(klass);
181
+ rb_grn_table_assign(rb_table, rb_context, context, table, RB_GRN_TRUE);
102
182
  rb_grn_context_check(context, rb_table);
103
183
 
104
184
  if (rb_block_given_p())
@@ -107,18 +187,19 @@ rb_grn_table_s_create (int argc, VALUE *argv, VALUE klass,
107
187
  return rb_table;
108
188
  }
109
189
 
110
- static grn_obj *
111
- rb_grn_table_open (int argc, VALUE *argv, grn_ctx **context)
190
+ grn_obj *
191
+ rb_grn_table_open_raw (int argc, VALUE *argv,
192
+ grn_ctx **context, VALUE *rb_context)
112
193
  {
113
194
  grn_obj *table;
114
195
  char *name = NULL, *path = NULL;
115
196
  unsigned name_size = 0;
116
- VALUE rb_path, options, rb_context, rb_name;
197
+ VALUE rb_path, options, rb_name;
117
198
 
118
199
  rb_scan_args(argc, argv, "01", &options);
119
200
 
120
201
  rb_grn_scan_options(options,
121
- "context", &rb_context,
202
+ "context", rb_context,
122
203
  "name", &rb_name,
123
204
  "path", &rb_path,
124
205
  NULL);
@@ -142,9 +223,16 @@ rb_grn_table_initialize (int argc, VALUE *argv, VALUE self)
142
223
  {
143
224
  grn_ctx *context = NULL;
144
225
  grn_obj *table;
226
+ VALUE rb_context;
145
227
 
146
- table = rb_grn_table_open(argc, argv, &context);
147
- rb_grn_object_initialize(self, context, table);
228
+ table = rb_grn_table_open_raw(argc, argv, &context, &rb_context);
229
+ /* FIXME!!!! */
230
+ if (self == rb_cGrnArray) {
231
+ rb_grn_table_assign(self, rb_context, context, table, RB_GRN_TRUE);
232
+ } else {
233
+ rb_grn_table_key_support_assign(self, rb_context, context,
234
+ table, RB_GRN_TRUE);
235
+ }
148
236
  rb_grn_context_check(context, self);
149
237
 
150
238
  return Qnil;
@@ -153,23 +241,44 @@ rb_grn_table_initialize (int argc, VALUE *argv, VALUE self)
153
241
  static VALUE
154
242
  rb_grn_table_s_open (int argc, VALUE *argv, VALUE klass)
155
243
  {
156
- grn_ctx *context = NULL;
244
+ VALUE rb_table;
157
245
  grn_obj *table;
158
- VALUE rb_table, rb_class;
246
+ grn_ctx *context = NULL;
247
+ VALUE rb_context;
159
248
 
160
- table = rb_grn_table_open(argc, argv, &context);
249
+ table = rb_grn_table_open_raw(argc, argv, &context, &rb_context);
161
250
  rb_grn_context_check(context, rb_ary_new4(argc, argv));
162
- if (klass != rb_cGrnTable) {
251
+
252
+ if (!table)
253
+ rb_raise(rb_eGrnError,
254
+ "unable to open table: %s: %s",
255
+ rb_grn_inspect(klass),
256
+ rb_grn_inspect(rb_ary_new4(argc, argv)));
257
+
258
+ if (klass == rb_cGrnTable) {
259
+ klass = GRNOBJECT2RCLASS(table);
260
+ } else {
261
+ VALUE rb_class;
262
+
163
263
  rb_class = GRNOBJECT2RCLASS(table);
164
- if (klass != rb_class)
264
+ if (rb_class != klass) {
165
265
  rb_raise(rb_eTypeError,
166
266
  "unexpected existing table type: %s: expected %s",
167
267
  rb_grn_inspect(rb_class),
168
268
  rb_grn_inspect(klass));
269
+ }
270
+ }
271
+
272
+ /* FIXME!!!! */
273
+ if (klass == rb_cGrnArray) {
274
+ rb_table = rb_grn_table_alloc(klass);
275
+ rb_grn_table_assign(rb_table, rb_context, context, table, RB_GRN_TRUE);
276
+ } else {
277
+ rb_table = rb_grn_table_key_support_alloc(klass);
278
+ rb_grn_table_key_support_assign(rb_table, rb_context, context,
279
+ table, RB_GRN_TRUE);
169
280
  }
170
281
 
171
- rb_table = rb_grn_object_alloc(klass);
172
- rb_grn_table_initialize(argc, argv, rb_table);
173
282
  if (rb_block_given_p())
174
283
  return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table);
175
284
  else
@@ -182,10 +291,14 @@ rb_grn_table_inspect_content (VALUE self, VALUE inspected)
182
291
  grn_ctx *context = NULL;
183
292
  grn_obj *table;
184
293
 
185
- table = SELF(self, &context);
294
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
295
+ NULL, NULL,
296
+ NULL, NULL, NULL);
186
297
 
187
298
  if (!table)
188
299
  return inspected;
300
+ if (!context)
301
+ return inspected;
189
302
 
190
303
  if (table->header.type != GRN_TABLE_NO_KEY) {
191
304
  grn_obj value;
@@ -193,7 +306,7 @@ rb_grn_table_inspect_content (VALUE self, VALUE inspected)
193
306
 
194
307
  rb_str_cat2(inspected, ", ");
195
308
  rb_str_cat2(inspected, "encoding: <");
196
- GRN_OBJ_INIT(&value, GRN_BULK, 0);
309
+ GRN_OBJ_INIT(&value, GRN_BULK, 0, GRN_ID_NIL);
197
310
  grn_obj_get_info(context, table, GRN_INFO_ENCODING, &value);
198
311
  encoding = *((grn_encoding *)GRN_BULK_HEAD(&value));
199
312
  grn_obj_close(context, &value);
@@ -241,12 +354,12 @@ rb_grn_table_define_column (int argc, VALUE *argv, VALUE self)
241
354
  char *name = NULL, *path = NULL;
242
355
  unsigned name_size = 0;
243
356
  grn_obj_flags flags = 0;
244
- rb_grn_boolean use_default_type = RB_GRN_FALSE;
245
357
  VALUE rb_name, rb_value_type;
246
358
  VALUE options, rb_path, rb_persistent, rb_type;
247
- VALUE rb_compress, rb_with_section, rb_with_weight, rb_with_position;
248
359
 
249
- table = SELF(self, &context);
360
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
361
+ NULL, NULL,
362
+ NULL, NULL, NULL);
250
363
 
251
364
  rb_scan_args(argc, argv, "21", &rb_name, &rb_value_type, &options);
252
365
 
@@ -257,10 +370,6 @@ rb_grn_table_define_column (int argc, VALUE *argv, VALUE self)
257
370
  "path", &rb_path,
258
371
  "persistent", &rb_persistent,
259
372
  "type", &rb_type,
260
- "compress", &rb_compress,
261
- "with_section", &rb_with_section,
262
- "with_weight", &rb_with_weight,
263
- "with_position", &rb_with_position,
264
373
  NULL);
265
374
 
266
375
  value_type = RVAL2GRNOBJECT(rb_value_type, &context);
@@ -273,21 +382,69 @@ rb_grn_table_define_column (int argc, VALUE *argv, VALUE self)
273
382
  if (RVAL2CBOOL(rb_persistent))
274
383
  flags |= GRN_OBJ_PERSISTENT;
275
384
 
276
- if (NIL_P(rb_type)) {
277
- use_default_type = RB_GRN_TRUE;
278
- } else if (rb_grn_equal_option(rb_type, "index")) {
279
- flags |= GRN_OBJ_COLUMN_INDEX;
280
- } else if (rb_grn_equal_option(rb_type, "scalar")) {
385
+ if (NIL_P(rb_type) ||
386
+ (rb_grn_equal_option(rb_type, "scalar"))) {
281
387
  flags |= GRN_OBJ_COLUMN_SCALAR;
282
388
  } else if (rb_grn_equal_option(rb_type, "vector")) {
283
389
  flags |= GRN_OBJ_COLUMN_VECTOR;
284
390
  } else {
285
391
  rb_raise(rb_eArgError,
286
392
  "invalid column type: %s: "
287
- "available types: [:index, :scalar, :vector, nil]",
393
+ "available types: [:scalar, :vector, nil]",
288
394
  rb_grn_inspect(rb_type));
289
395
  }
290
396
 
397
+ column = grn_column_create(context, table, name, name_size,
398
+ path, flags, value_type);
399
+ rb_grn_context_check(context, self);
400
+
401
+ return GRNCOLUMN2RVAL(Qnil, context, column, RB_GRN_TRUE);
402
+ }
403
+
404
+ static VALUE
405
+ rb_grn_table_define_index_column (int argc, VALUE *argv, VALUE self)
406
+ {
407
+ grn_ctx *context = NULL;
408
+ grn_obj *table;
409
+ grn_obj *value_type, *column;
410
+ char *name = NULL, *path = NULL;
411
+ unsigned name_size = 0;
412
+ grn_obj_flags flags = GRN_OBJ_COLUMN_INDEX;
413
+ VALUE rb_name, rb_value_type;
414
+ VALUE options, rb_path, rb_persistent;
415
+ VALUE rb_compress, rb_with_section, rb_with_weight, rb_with_position;
416
+ VALUE rb_column, rb_source, rb_sources;
417
+
418
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
419
+ NULL, NULL,
420
+ NULL, NULL, NULL);
421
+
422
+ rb_scan_args(argc, argv, "21", &rb_name, &rb_value_type, &options);
423
+
424
+ name = StringValuePtr(rb_name);
425
+ name_size = RSTRING_LEN(rb_name);
426
+
427
+ rb_grn_scan_options(options,
428
+ "path", &rb_path,
429
+ "persistent", &rb_persistent,
430
+ "compress", &rb_compress,
431
+ "with_section", &rb_with_section,
432
+ "with_weight", &rb_with_weight,
433
+ "with_position", &rb_with_position,
434
+ "source", &rb_source,
435
+ "sources", &rb_sources,
436
+ NULL);
437
+
438
+ value_type = RVAL2GRNOBJECT(rb_value_type, &context);
439
+
440
+ if (!NIL_P(rb_path)) {
441
+ path = StringValueCStr(rb_path);
442
+ flags |= GRN_OBJ_PERSISTENT;
443
+ }
444
+
445
+ if (RVAL2CBOOL(rb_persistent))
446
+ flags |= GRN_OBJ_PERSISTENT;
447
+
291
448
  if (NIL_P(rb_compress)) {
292
449
  } else if (rb_grn_equal_option(rb_compress, "zlib")) {
293
450
  flags |= GRN_OBJ_COMPRESS_ZLIB;
@@ -300,44 +457,45 @@ rb_grn_table_define_column (int argc, VALUE *argv, VALUE self)
300
457
  rb_grn_inspect(rb_compress));
301
458
  }
302
459
 
303
- if (RVAL2CBOOL(rb_with_section)) {
304
- if (use_default_type)
305
- flags |= GRN_OBJ_COLUMN_INDEX;
306
- if (flags & GRN_OBJ_COLUMN_INDEX)
307
- flags |= GRN_OBJ_WITH_SECTION;
308
- else
309
- rb_raise(rb_eArgError,
310
- "{:with_section => true} requires "
311
- "{:type => :index} option.");
312
- }
313
-
314
- if (RVAL2CBOOL(rb_with_weight)) {
315
- if (use_default_type)
316
- flags |= GRN_OBJ_COLUMN_INDEX;
317
- if (flags & GRN_OBJ_COLUMN_INDEX)
318
- flags |= GRN_OBJ_WITH_WEIGHT;
319
- else
320
- rb_raise(rb_eArgError,
321
- "{:with_weight => true} requires "
322
- "{:type => :index} option.");
460
+ if (RVAL2CBOOL(rb_with_section))
461
+ flags |= GRN_OBJ_WITH_SECTION;
462
+
463
+ if (RVAL2CBOOL(rb_with_weight))
464
+ flags |= GRN_OBJ_WITH_WEIGHT;
465
+
466
+ if (NIL_P(rb_with_position) &&
467
+ (table->header.type == GRN_TABLE_HASH_KEY ||
468
+ table->header.type == GRN_TABLE_PAT_KEY)) {
469
+ grn_id tokenizer_id;
470
+ grn_obj *tokenizer;
471
+
472
+ tokenizer = grn_obj_get_info(context, table,
473
+ GRN_INFO_DEFAULT_TOKENIZER,
474
+ NULL);
475
+ tokenizer_id = grn_obj_id(context, tokenizer);
476
+ if ((tokenizer_id == GRN_DB_UNIGRAM) ||
477
+ (tokenizer_id == GRN_DB_BIGRAM) ||
478
+ (tokenizer_id == GRN_DB_TRIGRAM)) {
479
+ rb_with_position = Qtrue;
480
+ }
323
481
  }
482
+ if (RVAL2CBOOL(rb_with_position))
483
+ flags |= GRN_OBJ_WITH_POSITION;
324
484
 
325
- if (RVAL2CBOOL(rb_with_position)) {
326
- if (use_default_type)
327
- flags |= GRN_OBJ_COLUMN_INDEX;
328
- if (flags & GRN_OBJ_COLUMN_INDEX)
329
- flags |= GRN_OBJ_WITH_POSITION;
330
- else
331
- rb_raise(rb_eArgError,
332
- "{:with_position => true} requires "
333
- "{:type => :index} option.");
334
- }
485
+ if (!NIL_P(rb_source) && !NIL_P(rb_sources))
486
+ rb_raise(rb_eArgError, "should not pass both of :source and :sources.");
335
487
 
336
488
  column = grn_column_create(context, table, name, name_size,
337
489
  path, flags, value_type);
338
490
  rb_grn_context_check(context, self);
339
491
 
340
- return GRNCOLUMN2RVAL(Qnil, context, column, RB_GRN_TRUE);
492
+ rb_column = GRNCOLUMN2RVAL(Qnil, context, column, RB_GRN_TRUE);
493
+ if (!NIL_P(rb_source))
494
+ rb_funcall(rb_column, rb_intern("source="), 1, rb_source);
495
+ if (!NIL_P(rb_sources))
496
+ rb_funcall(rb_column, rb_intern("sources="), 1, rb_sources);
497
+
498
+ return rb_column;
341
499
  }
342
500
 
343
501
  static VALUE
@@ -349,8 +507,11 @@ rb_grn_table_add_column (VALUE self, VALUE rb_name, VALUE rb_value_type,
349
507
  grn_obj *value_type, *column;
350
508
  char *name = NULL, *path = NULL;
351
509
  unsigned name_size = 0;
510
+ VALUE rb_column;
352
511
 
353
- table = SELF(self, &context);
512
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
513
+ NULL, NULL,
514
+ NULL, NULL, NULL);
354
515
 
355
516
  name = StringValuePtr(rb_name);
356
517
  name_size = RSTRING_LEN(rb_name);
@@ -363,7 +524,9 @@ rb_grn_table_add_column (VALUE self, VALUE rb_name, VALUE rb_value_type,
363
524
  path, value_type);
364
525
  rb_grn_context_check(context, self);
365
526
 
366
- return GRNCOLUMN2RVAL(Qnil, context, column, RB_GRN_TRUE);
527
+ rb_column = GRNCOLUMN2RVAL(Qnil, context, column, RB_GRN_TRUE);
528
+ rb_iv_set(rb_column, "table", self);
529
+ return rb_column;
367
530
  }
368
531
 
369
532
  static VALUE
@@ -375,17 +538,23 @@ rb_grn_table_get_column (VALUE self, VALUE rb_name)
375
538
  char *name = NULL;
376
539
  unsigned name_size = 0;
377
540
  rb_grn_boolean owner;
541
+ VALUE rb_column;
378
542
 
379
- table = SELF(self, &context);
543
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
544
+ NULL, NULL,
545
+ NULL, NULL, NULL);
380
546
 
381
547
  name = StringValuePtr(rb_name);
382
548
  name_size = RSTRING_LEN(rb_name);
383
549
 
384
- column = grn_table_column(context, table, name, name_size);
550
+ column = grn_obj_column(context, table, name, name_size);
385
551
  rb_grn_context_check(context, self);
386
552
 
387
553
  owner = (column && column->header.type == GRN_ACCESSOR);
388
- return GRNCOLUMN2RVAL(Qnil, context, column, owner);
554
+ rb_column = GRNCOLUMN2RVAL(Qnil, context, column, owner);
555
+ if (owner)
556
+ rb_iv_set(rb_column, "table", self);
557
+ return rb_column;
389
558
  }
390
559
 
391
560
  static VALUE
@@ -401,7 +570,9 @@ rb_grn_table_get_columns (int argc, VALUE *argv, VALUE self)
401
570
  char *name = NULL;
402
571
  unsigned name_size = 0;
403
572
 
404
- table = SELF(self, &context);
573
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
574
+ NULL, NULL,
575
+ NULL, NULL, NULL);
405
576
 
406
577
  rb_scan_args(argc, argv, "01", &rb_name);
407
578
 
@@ -430,7 +601,7 @@ rb_grn_table_get_columns (int argc, VALUE *argv, VALUE self)
430
601
 
431
602
  grn_table_cursor_get_key(context, cursor, &key);
432
603
  column_id = key;
433
- column = grn_ctx_get(context, *column_id);
604
+ column = grn_ctx_at(context, *column_id);
434
605
  rb_column = GRNOBJECT2RVAL(Qnil, context, column, RB_GRN_FALSE);
435
606
  rb_ary_push(rb_columns, rb_column);
436
607
  }
@@ -454,7 +625,9 @@ rb_grn_table_open_grn_cursor (int argc, VALUE *argv, VALUE self,
454
625
  int flags = 0;
455
626
  VALUE options, rb_min, rb_max, rb_order, rb_greater_than, rb_less_than;
456
627
 
457
- table = SELF(self, context);
628
+ rb_grn_table_deconstruct(SELF(self), &table, context,
629
+ NULL, NULL,
630
+ NULL, NULL, NULL);
458
631
 
459
632
  rb_scan_args(argc, argv, "01", &options);
460
633
 
@@ -531,7 +704,7 @@ rb_grn_table_get_records (int argc, VALUE *argv, VALUE self)
531
704
  cursor = rb_grn_table_open_grn_cursor(argc, argv, self, &context);
532
705
  records = rb_ary_new();
533
706
  while ((record_id = grn_table_cursor_next(context, cursor))) {
534
- rb_ary_push(records, rb_grn_record_new(self, record_id));
707
+ rb_ary_push(records, rb_grn_record_new(self, record_id, Qnil));
535
708
  }
536
709
  grn_table_cursor_close(context, cursor);
537
710
 
@@ -545,7 +718,9 @@ rb_grn_table_get_size (VALUE self)
545
718
  grn_obj *table;
546
719
  unsigned int size;
547
720
 
548
- table = SELF(self, &context);
721
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
722
+ NULL, NULL,
723
+ NULL, NULL, NULL);
549
724
  size = grn_table_size(context, table);
550
725
  return UINT2NUM(size);
551
726
  }
@@ -557,7 +732,9 @@ rb_grn_table_truncate (VALUE self)
557
732
  grn_obj *table;
558
733
  grn_rc rc;
559
734
 
560
- table = SELF(self, &context);
735
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
736
+ NULL, NULL,
737
+ NULL, NULL, NULL);
561
738
  rc = grn_table_truncate(context, table);
562
739
  rb_grn_rc_check(rc, self);
563
740
 
@@ -570,21 +747,25 @@ rb_grn_table_each (VALUE self)
570
747
  grn_ctx *context = NULL;
571
748
  grn_obj *table;
572
749
  grn_table_cursor *cursor;
750
+ VALUE rb_cursor;
573
751
  grn_id id;
574
752
 
575
- table = SELF(self, &context);
753
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
754
+ NULL, NULL,
755
+ NULL, NULL, NULL);
576
756
  cursor = grn_table_cursor_open(context, table, NULL, 0, NULL, 0, 0);
577
- rb_iv_set(self, "cursor", GRNTABLECURSOR2RVAL(Qnil, context, cursor));
757
+ rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
758
+ rb_iv_set(self, "cursor", rb_cursor);
578
759
  while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
579
- rb_yield(rb_grn_record_new(self, id));
760
+ rb_yield(rb_grn_record_new(self, id, Qnil));
580
761
  }
581
- grn_table_cursor_close(context, cursor);
762
+ rb_grn_table_cursor_close(rb_cursor);
582
763
  rb_iv_set(self, "cursor", Qnil);
583
764
 
584
765
  return Qnil;
585
766
  }
586
767
 
587
- static VALUE
768
+ VALUE
588
769
  rb_grn_table_delete (VALUE self, VALUE rb_id)
589
770
  {
590
771
  grn_ctx *context = NULL;
@@ -592,7 +773,9 @@ rb_grn_table_delete (VALUE self, VALUE rb_id)
592
773
  grn_id id;
593
774
  grn_rc rc;
594
775
 
595
- table = SELF(self, &context);
776
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
777
+ NULL, NULL,
778
+ NULL, NULL, NULL);
596
779
 
597
780
  id = NUM2UINT(rb_id);
598
781
  rc = grn_table_delete_by_id(context, table, id);
@@ -614,7 +797,9 @@ rb_grn_table_sort (int argc, VALUE *argv, VALUE self)
614
797
  VALUE rb_limit;
615
798
  VALUE *rb_sort_keys;
616
799
 
617
- table = SELF(self, &context);
800
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
801
+ NULL, NULL,
802
+ NULL, NULL, NULL);
618
803
 
619
804
  rb_scan_args(argc, argv, "11", &rb_keys, &options);
620
805
  rb_grn_scan_options(options,
@@ -664,10 +849,76 @@ rb_grn_table_sort (int argc, VALUE *argv, VALUE self)
664
849
  return GRNOBJECT2RVAL(Qnil, context, result, RB_GRN_TRUE);
665
850
  }
666
851
 
852
+ /*
853
+ * Document-method: []
854
+ *
855
+ * call-seq:
856
+ * table[id] -> 値
857
+ *
858
+ * _table_の_id_に対応する値を返す。
859
+ */
860
+ VALUE
861
+ rb_grn_table_array_reference (VALUE self, VALUE rb_id)
862
+ {
863
+ grn_id id;
864
+ grn_ctx *context;
865
+ grn_obj *table;
866
+ grn_obj *range;
867
+ grn_obj *value;
868
+
869
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
870
+ NULL, NULL,
871
+ &value, NULL, &range);
872
+
873
+ id = NUM2UINT(rb_id);
874
+ GRN_BULK_REWIND(value);
875
+ grn_obj_get_value(context, table, id, value);
876
+ rb_grn_context_check(context, self);
877
+
878
+ if (GRN_BULK_EMPTYP(value))
879
+ return Qnil;
880
+ else
881
+ return rb_str_new(GRN_BULK_HEAD(value), GRN_BULK_VSIZE(value));
882
+ }
883
+
884
+ /*
885
+ * Document-method: []=
886
+ *
887
+ * call-seq:
888
+ * table[id] = value
889
+ *
890
+ * _table_の_id_に対応する値を設定する。既存の値は上書きさ
891
+ * れる。
892
+ */
893
+ VALUE
894
+ rb_grn_table_array_set (VALUE self, VALUE rb_id, VALUE rb_value)
895
+ {
896
+ grn_id id;
897
+ grn_ctx *context;
898
+ grn_obj *table;
899
+ grn_obj *range;
900
+ grn_obj *value;
901
+ grn_rc rc;
902
+
903
+ rb_grn_table_deconstruct(SELF(self), &table, &context,
904
+ NULL, NULL,
905
+ &value, NULL, &range);
906
+
907
+ id = NUM2UINT(rb_id);
908
+ GRN_BULK_REWIND(value);
909
+ RVAL2GRNBULK(rb_value, context, value);
910
+ rc = grn_obj_set_value(context, table, id, value, GRN_OBJ_SET);
911
+ rb_grn_context_check(context, self);
912
+ rb_grn_rc_check(rc, self);
913
+
914
+ return Qnil;
915
+ }
916
+
667
917
  void
668
918
  rb_grn_init_table (VALUE mGrn)
669
919
  {
670
920
  rb_cGrnTable = rb_define_class_under(mGrn, "Table", rb_cGrnObject);
921
+ rb_define_alloc_func(rb_cGrnTable, rb_grn_table_alloc);
671
922
 
672
923
  rb_include_module(rb_cGrnTable, rb_mEnumerable);
673
924
 
@@ -680,6 +931,8 @@ rb_grn_init_table (VALUE mGrn)
680
931
 
681
932
  rb_define_method(rb_cGrnTable, "define_column",
682
933
  rb_grn_table_define_column, -1);
934
+ rb_define_method(rb_cGrnTable, "define_index_column",
935
+ rb_grn_table_define_index_column, -1);
683
936
  rb_define_method(rb_cGrnTable, "add_column",
684
937
  rb_grn_table_add_column, 3);
685
938
  rb_define_method(rb_cGrnTable, "column",
@@ -699,6 +952,9 @@ rb_grn_init_table (VALUE mGrn)
699
952
 
700
953
  rb_define_method(rb_cGrnTable, "sort", rb_grn_table_sort, -1);
701
954
 
955
+ rb_define_method(rb_cGrnTable, "[]", rb_grn_table_array_reference, 1);
956
+ rb_define_method(rb_cGrnTable, "[]=", rb_grn_table_array_set, 2);
957
+
702
958
  rb_grn_init_table_key_support(mGrn);
703
959
  rb_grn_init_array(mGrn);
704
960
  rb_grn_init_hash(mGrn);
data/ext/rb-grn-type.c CHANGED
@@ -60,7 +60,7 @@ rb_grn_type_initialize (int argc, VALUE *argv, VALUE self)
60
60
  name = StringValuePtr(rb_name);
61
61
  name_size = RSTRING_LEN(rb_name);
62
62
 
63
- context = rb_grn_context_ensure(rb_context);
63
+ context = rb_grn_context_ensure(&rb_context);
64
64
 
65
65
  if (NIL_P(rb_key_type)) {
66
66
  flags = GRN_OBJ_KEY_VAR_SIZE;
@@ -85,7 +85,7 @@ rb_grn_type_initialize (int argc, VALUE *argv, VALUE self)
85
85
  }
86
86
 
87
87
  type = grn_type_create(context, name, name_size, flags, size);
88
- rb_grn_object_initialize(self, context, type);
88
+ rb_grn_object_assign(self, rb_context, context, type, RB_GRN_TRUE);
89
89
  rb_grn_context_check(context, rb_ary_new4(argc, argv));
90
90
 
91
91
  return Qnil;
@@ -98,9 +98,10 @@ rb_grn_init_type (VALUE mGrn)
98
98
 
99
99
  rb_define_method(rb_cGrnType, "initialize", rb_grn_type_initialize, -1);
100
100
 
101
- rb_define_const(rb_cGrnType, "INT", INT2NUM(GRN_DB_INT));
102
- rb_define_const(rb_cGrnType, "UINT", INT2NUM(GRN_DB_UINT));
101
+ rb_define_const(rb_cGrnType, "INT32", INT2NUM(GRN_DB_INT32));
102
+ rb_define_const(rb_cGrnType, "UINT32", INT2NUM(GRN_DB_UINT32));
103
103
  rb_define_const(rb_cGrnType, "INT64", INT2NUM(GRN_DB_INT64));
104
+ rb_define_const(rb_cGrnType, "UINT64", INT2NUM(GRN_DB_UINT64));
104
105
  rb_define_const(rb_cGrnType, "FLOAT", INT2NUM(GRN_DB_FLOAT));
105
106
  rb_define_const(rb_cGrnType, "TIME", INT2NUM(GRN_DB_TIME));
106
107
  rb_define_const(rb_cGrnType, "SHORT_TEXT", INT2NUM(GRN_DB_SHORTTEXT));