groonga 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS.ja.rdoc +13 -0
- data/NEWS.rdoc +13 -0
- data/README.ja.rdoc +2 -1
- data/README.rdoc +2 -1
- data/Rakefile +0 -1
- data/TUTORIAL.ja.rdoc +49 -4
- data/benchmark/read-write-many-small-items.rb +5 -4
- data/benchmark/write-many-small-items.rb +5 -4
- data/example/bookmark.rb +30 -1
- data/example/index-html.rb +79 -0
- data/example/search/config.ru +182 -0
- data/example/search/public/css/groonga.css +122 -0
- data/ext/rb-grn-array.c +12 -9
- data/ext/rb-grn-column.c +13 -8
- data/ext/rb-grn-context.c +34 -16
- data/ext/rb-grn-database.c +3 -2
- data/ext/rb-grn-expression-builder.c +8 -2
- data/ext/rb-grn-expression.c +3 -3
- data/ext/rb-grn-hash.c +13 -10
- data/ext/rb-grn-object.c +127 -19
- data/ext/rb-grn-patricia-trie.c +8 -7
- data/ext/rb-grn-table-cursor.c +2 -40
- data/ext/rb-grn-table.c +154 -42
- data/ext/rb-grn-type.c +18 -10
- data/ext/rb-grn-utils.c +22 -20
- data/ext/rb-grn.h +9 -12
- data/extconf.rb +1 -1
- data/html/developer.html +1 -1
- data/html/index.html +2 -2
- data/lib/groonga/expression-builder.rb +133 -63
- data/lib/groonga/schema.rb +229 -37
- data/test/groonga-test-utils.rb +1 -1
- data/test/test-array.rb +1 -0
- data/test/test-context.rb +7 -1
- data/test/test-database.rb +11 -3
- data/test/test-expression-builder.rb +26 -2
- data/test/test-fix-size-column.rb +2 -1
- data/test/test-hash.rb +6 -1
- data/test/test-record.rb +2 -1
- data/test/test-schema.rb +85 -10
- data/test/test-table.rb +99 -3
- data/test/test-type.rb +3 -2
- data/test/test-variable-size-column.rb +2 -1
- data/test-unit/Rakefile +6 -1
- data/test-unit/lib/test/unit/autorunner.rb +26 -3
- data/test-unit/lib/test/unit/priority.rb +21 -1
- data/test-unit/lib/test/unit/testcase.rb +101 -36
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +7 -4
- data/test-unit/test/{test_testcase.rb → test-testcase.rb} +30 -1
- data/test-unit/test/test_assertions.rb +1 -1
- metadata +9 -6
data/ext/rb-grn-array.c
CHANGED
@@ -62,8 +62,11 @@ VALUE rb_cGrnArray;
|
|
62
62
|
* Groonga::Contextに結びついているデータベースが一時デー
|
63
63
|
* タベースの場合は例外が発生する。
|
64
64
|
*
|
65
|
-
* [+:
|
66
|
-
*
|
65
|
+
* [+:value_type+]
|
66
|
+
* 値の型を指定する。省略すると値のための領域を確保しない。
|
67
|
+
* 値を保存したい場合は必ず指定すること。
|
68
|
+
*
|
69
|
+
* 参考: Groonga::Type.new
|
67
70
|
*
|
68
71
|
* [+:sub_records+]
|
69
72
|
* +true+を指定すると#groupでグループ化したときに、
|
@@ -91,13 +94,13 @@ static VALUE
|
|
91
94
|
rb_grn_array_s_create (int argc, VALUE *argv, VALUE klass)
|
92
95
|
{
|
93
96
|
grn_ctx *context = NULL;
|
94
|
-
grn_obj *table;
|
97
|
+
grn_obj *value_type = NULL, *table;
|
95
98
|
const char *name = NULL, *path = NULL;
|
96
|
-
unsigned name_size = 0
|
99
|
+
unsigned name_size = 0;
|
97
100
|
grn_obj_flags flags = GRN_TABLE_NO_KEY;
|
98
101
|
VALUE rb_table;
|
99
102
|
VALUE options, rb_context, rb_name, rb_path, rb_persistent;
|
100
|
-
VALUE
|
103
|
+
VALUE rb_value_type, rb_sub_records;
|
101
104
|
|
102
105
|
rb_scan_args(argc, argv, "01", &options);
|
103
106
|
|
@@ -106,7 +109,7 @@ rb_grn_array_s_create (int argc, VALUE *argv, VALUE klass)
|
|
106
109
|
"name", &rb_name,
|
107
110
|
"path", &rb_path,
|
108
111
|
"persistent", &rb_persistent,
|
109
|
-
"
|
112
|
+
"value_type", &rb_value_type,
|
110
113
|
"sub_records", &rb_sub_records,
|
111
114
|
NULL);
|
112
115
|
|
@@ -126,14 +129,14 @@ rb_grn_array_s_create (int argc, VALUE *argv, VALUE klass)
|
|
126
129
|
if (RVAL2CBOOL(rb_persistent))
|
127
130
|
flags |= GRN_OBJ_PERSISTENT;
|
128
131
|
|
129
|
-
if (!NIL_P(
|
130
|
-
|
132
|
+
if (!NIL_P(rb_value_type))
|
133
|
+
value_type = RVAL2GRNOBJECT(rb_value_type, &context);
|
131
134
|
|
132
135
|
if (RVAL2CBOOL(rb_sub_records))
|
133
136
|
flags |= GRN_OBJ_WITH_SUBREC;
|
134
137
|
|
135
138
|
table = grn_table_create(context, name, name_size, path,
|
136
|
-
flags, NULL,
|
139
|
+
flags, NULL, value_type);
|
137
140
|
if (!table)
|
138
141
|
rb_grn_context_check(context, rb_ary_new4(argc, argv));
|
139
142
|
rb_table = GRNOBJECT2RVAL(klass, context, table, RB_GRN_TRUE);
|
data/ext/rb-grn-column.c
CHANGED
@@ -170,10 +170,14 @@ rb_grn_column_select (int argc, VALUE *argv, VALUE self)
|
|
170
170
|
grn_rc rc;
|
171
171
|
VALUE options;
|
172
172
|
VALUE rb_query, rb_name, rb_operator, rb_result;
|
173
|
-
|
173
|
+
char *name = NULL, *query;
|
174
|
+
unsigned name_size = 0, query_size;
|
174
175
|
|
175
176
|
rb_scan_args(argc, argv, "11", &rb_query, &options);
|
176
177
|
|
178
|
+
query = StringValueCStr(rb_query);
|
179
|
+
query_size = RSTRING_LEN(rb_query);
|
180
|
+
|
177
181
|
rb_grn_column_deconstruct(SELF(self), &column, &context,
|
178
182
|
NULL, NULL,
|
179
183
|
NULL, NULL, NULL);
|
@@ -185,6 +189,11 @@ rb_grn_column_select (int argc, VALUE *argv, VALUE self)
|
|
185
189
|
"name", &rb_name,
|
186
190
|
NULL);
|
187
191
|
|
192
|
+
if (!NIL_P(rb_name)) {
|
193
|
+
name = StringValueCStr(rb_name);
|
194
|
+
name_size = RSTRING_LEN(rb_name);
|
195
|
+
}
|
196
|
+
|
188
197
|
if (!NIL_P(rb_operator))
|
189
198
|
operator = NUM2INT(rb_operator);
|
190
199
|
|
@@ -198,13 +207,9 @@ rb_grn_column_select (int argc, VALUE *argv, VALUE self)
|
|
198
207
|
result = RVAL2GRNTABLE(rb_result, &context);
|
199
208
|
}
|
200
209
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
rb_grn_object_deconstruct(RB_GRN_OBJECT(DATA_PTR(rb_expression)),
|
205
|
-
&expression, NULL,
|
206
|
-
NULL, NULL, NULL, NULL);
|
207
|
-
|
210
|
+
expression = grn_expr_create_from_str(context, name, name_size,
|
211
|
+
query, query_size,
|
212
|
+
table, column);
|
208
213
|
rc = grn_table_select(context, table, expression, result, operator);
|
209
214
|
rb_grn_context_check(context, self);
|
210
215
|
rb_grn_rc_check(rc, self);
|
data/ext/rb-grn-context.c
CHANGED
@@ -44,23 +44,25 @@ static VALUE cGrnContext;
|
|
44
44
|
grn_ctx *
|
45
45
|
rb_grn_context_from_ruby_object (VALUE object)
|
46
46
|
{
|
47
|
-
|
47
|
+
RbGrnContext *rb_grn_context;
|
48
48
|
|
49
49
|
if (!RVAL2CBOOL(rb_obj_is_kind_of(object, cGrnContext))) {
|
50
50
|
rb_raise(rb_eTypeError, "not a groonga context");
|
51
51
|
}
|
52
52
|
|
53
|
-
Data_Get_Struct(object,
|
54
|
-
if (!
|
53
|
+
Data_Get_Struct(object, RbGrnContext, rb_grn_context);
|
54
|
+
if (!rb_grn_context)
|
55
55
|
rb_raise(rb_eGrnError, "groonga context is NULL");
|
56
|
-
return context;
|
56
|
+
return &(rb_grn_context->context);
|
57
57
|
}
|
58
58
|
|
59
59
|
static void
|
60
60
|
rb_grn_context_free (void *pointer)
|
61
61
|
{
|
62
|
-
|
62
|
+
RbGrnContext *rb_grn_context = pointer;
|
63
|
+
grn_ctx *context;
|
63
64
|
|
65
|
+
context = &(rb_grn_context->context);
|
64
66
|
debug("context-free: %p\n", context);
|
65
67
|
if (context->stat != GRN_CTX_FIN) {
|
66
68
|
grn_obj *database;
|
@@ -73,7 +75,9 @@ rb_grn_context_free (void *pointer)
|
|
73
75
|
grn_ctx_fin(context);
|
74
76
|
}
|
75
77
|
debug("context-free: %p: done\n", context);
|
76
|
-
xfree(
|
78
|
+
xfree(rb_grn_context);
|
79
|
+
|
80
|
+
GRN_CTX_USER_DATA(context)->ptr = NULL;
|
77
81
|
}
|
78
82
|
|
79
83
|
static VALUE
|
@@ -226,6 +230,7 @@ rb_grn_context_s_set_default_options (VALUE self, VALUE options)
|
|
226
230
|
static VALUE
|
227
231
|
rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
|
228
232
|
{
|
233
|
+
RbGrnContext *rb_grn_context;
|
229
234
|
grn_ctx *context;
|
230
235
|
int flags = 0;
|
231
236
|
grn_rc rc;
|
@@ -245,11 +250,14 @@ rb_grn_context_initialize (int argc, VALUE *argv, VALUE self)
|
|
245
250
|
"encoding", &rb_encoding,
|
246
251
|
NULL);
|
247
252
|
|
248
|
-
|
249
|
-
DATA_PTR(self) =
|
253
|
+
rb_grn_context = ALLOC(RbGrnContext);
|
254
|
+
DATA_PTR(self) = rb_grn_context;
|
255
|
+
context = &(rb_grn_context->context);
|
250
256
|
rc = grn_ctx_init(context, flags);
|
251
257
|
rb_grn_context_check(context, self);
|
252
258
|
|
259
|
+
GRN_CTX_USER_DATA(context)->ptr = rb_grn_context;
|
260
|
+
|
253
261
|
if (!NIL_P(rb_encoding)) {
|
254
262
|
grn_encoding encoding;
|
255
263
|
|
@@ -432,23 +440,33 @@ rb_grn_context_array_reference (VALUE self, VALUE name_or_id)
|
|
432
440
|
{
|
433
441
|
grn_ctx *context;
|
434
442
|
grn_obj *object;
|
443
|
+
const char *name;
|
444
|
+
unsigned int name_size;
|
445
|
+
grn_id id;
|
435
446
|
|
436
447
|
context = SELF(self);
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
448
|
+
switch (TYPE(name_or_id)) {
|
449
|
+
case T_SYMBOL:
|
450
|
+
name = rb_id2name(SYM2ID(name_or_id));
|
451
|
+
name_size = strlen(name);
|
452
|
+
object = rb_grn_context_get_backward_compatibility(context,
|
453
|
+
name, name_size);
|
454
|
+
break;
|
455
|
+
case T_STRING:
|
441
456
|
name = StringValuePtr(name_or_id);
|
442
457
|
name_size = RSTRING_LEN(name_or_id);
|
443
458
|
object = rb_grn_context_get_backward_compatibility(context,
|
444
459
|
name, name_size);
|
445
|
-
|
446
|
-
|
460
|
+
break;
|
461
|
+
case T_FIXNUM:
|
447
462
|
id = NUM2UINT(name_or_id);
|
448
463
|
object = grn_ctx_at(context, id);
|
449
|
-
|
450
|
-
|
464
|
+
break;
|
465
|
+
default:
|
466
|
+
rb_raise(rb_eArgError,
|
467
|
+
"should be String, Symbol or unsigned integer: %s",
|
451
468
|
rb_grn_inspect(name_or_id));
|
469
|
+
break;
|
452
470
|
}
|
453
471
|
|
454
472
|
return GRNOBJECT2RVAL(Qnil, context, object, RB_GRN_FALSE);
|
data/ext/rb-grn-database.c
CHANGED
@@ -252,7 +252,8 @@ rb_grn_database_each (VALUE self)
|
|
252
252
|
|
253
253
|
rb_grn_database_deconstruct(SELF(self), &database, &context,
|
254
254
|
NULL, NULL, NULL, NULL);
|
255
|
-
cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0,
|
255
|
+
cursor = grn_table_cursor_open(context, database, NULL, 0, NULL, 0,
|
256
|
+
0, 0, GRN_CURSOR_ASCENDING);
|
256
257
|
rb_cursor = GRNTABLECURSOR2RVAL(Qnil, context, cursor);
|
257
258
|
rb_iv_set(self, "cursor", rb_cursor);
|
258
259
|
while ((id = grn_table_cursor_next(context, cursor)) != GRN_ID_NIL) {
|
@@ -262,7 +263,7 @@ rb_grn_database_each (VALUE self)
|
|
262
263
|
if (object)
|
263
264
|
rb_yield(GRNOBJECT2RVAL(Qnil, context, object, RB_GRN_FALSE));
|
264
265
|
}
|
265
|
-
|
266
|
+
rb_grn_object_close(rb_cursor);
|
266
267
|
rb_iv_set(self, "cursor", Qnil);
|
267
268
|
|
268
269
|
return Qnil;
|
@@ -50,13 +50,19 @@ build_block (VALUE self)
|
|
50
50
|
VALUE
|
51
51
|
rb_grn_record_expression_builder_build (VALUE self)
|
52
52
|
{
|
53
|
-
|
53
|
+
if (rb_block_given_p())
|
54
|
+
return rb_iterate(build, self, build_block, self);
|
55
|
+
else
|
56
|
+
return build(self);
|
54
57
|
}
|
55
58
|
|
56
59
|
VALUE
|
57
60
|
rb_grn_column_expression_builder_build (VALUE self)
|
58
61
|
{
|
59
|
-
|
62
|
+
if (rb_block_given_p())
|
63
|
+
return rb_iterate(build, self, build_block, self);
|
64
|
+
else
|
65
|
+
return build(self);
|
60
66
|
}
|
61
67
|
|
62
68
|
void
|
data/ext/rb-grn-expression.c
CHANGED
@@ -26,10 +26,10 @@ void
|
|
26
26
|
rb_grn_expression_finalizer (grn_ctx *context, grn_obj *object,
|
27
27
|
RbGrnExpression *rb_grn_expression)
|
28
28
|
{
|
29
|
-
if (
|
30
|
-
|
29
|
+
if (context && rb_grn_expression->value)
|
30
|
+
grn_obj_close(context, rb_grn_expression->value);
|
31
31
|
|
32
|
-
|
32
|
+
rb_grn_expression->value = NULL;
|
33
33
|
}
|
34
34
|
|
35
35
|
void
|
data/ext/rb-grn-hash.c
CHANGED
@@ -80,8 +80,11 @@ VALUE rb_cGrnHash;
|
|
80
80
|
* 省略した場合は文字列をキーとして使用する。この場合、
|
81
81
|
* 4096バイトまで使用可能である。
|
82
82
|
*
|
83
|
-
* [+:
|
84
|
-
*
|
83
|
+
* [+:value_type+]
|
84
|
+
* 値の型を指定する。省略すると値のための領域を確保しない。
|
85
|
+
* 値を保存したい場合は必ず指定すること。
|
86
|
+
*
|
87
|
+
* 参考: Groonga::Type.new
|
85
88
|
*
|
86
89
|
* [+:default_tokenizer+]
|
87
90
|
* Groonga::IndexColumnで使用するトークナイザを指定する。
|
@@ -142,13 +145,13 @@ static VALUE
|
|
142
145
|
rb_grn_hash_s_create (int argc, VALUE *argv, VALUE self)
|
143
146
|
{
|
144
147
|
grn_ctx *context;
|
145
|
-
grn_obj *key_type = NULL, *table;
|
148
|
+
grn_obj *key_type = NULL, *value_type = NULL, *table;
|
146
149
|
const char *name = NULL, *path = NULL;
|
147
|
-
unsigned name_size = 0
|
150
|
+
unsigned name_size = 0;
|
148
151
|
grn_obj_flags flags = GRN_TABLE_HASH_KEY;
|
149
152
|
VALUE rb_table;
|
150
153
|
VALUE options, rb_context, rb_name, rb_path, rb_persistent;
|
151
|
-
VALUE rb_key_type,
|
154
|
+
VALUE rb_key_type, rb_value_type, rb_default_tokenizer;
|
152
155
|
VALUE rb_sub_records;
|
153
156
|
|
154
157
|
rb_scan_args(argc, argv, "01", &options);
|
@@ -159,7 +162,7 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE self)
|
|
159
162
|
"path", &rb_path,
|
160
163
|
"persistent", &rb_persistent,
|
161
164
|
"key_type", &rb_key_type,
|
162
|
-
"
|
165
|
+
"value_type", &rb_value_type,
|
163
166
|
"default_tokenizer", &rb_default_tokenizer,
|
164
167
|
"sub_records", &rb_sub_records,
|
165
168
|
NULL);
|
@@ -186,14 +189,14 @@ rb_grn_hash_s_create (int argc, VALUE *argv, VALUE self)
|
|
186
189
|
key_type = RVAL2GRNOBJECT(rb_key_type, &context);
|
187
190
|
}
|
188
191
|
|
189
|
-
if (!NIL_P(
|
190
|
-
|
192
|
+
if (!NIL_P(rb_value_type))
|
193
|
+
value_type = RVAL2GRNOBJECT(rb_value_type, &context);
|
191
194
|
|
192
|
-
if (RVAL2CBOOL(rb_sub_records))
|
195
|
+
if (RVAL2CBOOL(rb_sub_records))
|
193
196
|
flags |= GRN_OBJ_WITH_SUBREC;
|
194
197
|
|
195
198
|
table = grn_table_create(context, name, name_size, path,
|
196
|
-
flags, key_type,
|
199
|
+
flags, key_type, value_type);
|
197
200
|
if (!table)
|
198
201
|
rb_grn_context_check(context, rb_ary_new4(argc, argv));
|
199
202
|
rb_table = rb_grn_object_alloc(self);
|
data/ext/rb-grn-object.c
CHANGED
@@ -83,7 +83,6 @@ rb_grn_object_finalizer (grn_ctx *context, grn_obj *grn_object,
|
|
83
83
|
grn_user_data *user_data)
|
84
84
|
{
|
85
85
|
RbGrnObject *rb_grn_object;
|
86
|
-
rb_grn_boolean need_finalize = RB_GRN_TRUE;
|
87
86
|
|
88
87
|
rb_grn_object = user_data->ptr;
|
89
88
|
|
@@ -95,19 +94,9 @@ rb_grn_object_finalizer (grn_ctx *context, grn_obj *grn_object,
|
|
95
94
|
rb_grn_object->context, rb_grn_object->object,
|
96
95
|
grn_object->header.type);
|
97
96
|
|
98
|
-
if (rb_grn_object->context != context ||
|
99
|
-
rb_grn_object->object != grn_object) {
|
100
|
-
if (grn_object->header.type == GRN_DB)
|
101
|
-
grn_ctx_use(context, NULL);
|
102
|
-
need_finalize = RB_GRN_FALSE;
|
103
|
-
}
|
104
|
-
|
105
97
|
rb_grn_object->context = NULL;
|
106
98
|
rb_grn_object->object = NULL;
|
107
99
|
|
108
|
-
if (!need_finalize)
|
109
|
-
return GRN_SUCCESS;
|
110
|
-
|
111
100
|
switch (grn_object->header.type) {
|
112
101
|
case GRN_DB:
|
113
102
|
grn_ctx_use(context, NULL);
|
@@ -115,6 +104,9 @@ rb_grn_object_finalizer (grn_ctx *context, grn_obj *grn_object,
|
|
115
104
|
case GRN_TYPE:
|
116
105
|
case GRN_ACCESSOR:
|
117
106
|
case GRN_PROC:
|
107
|
+
case GRN_CURSOR_TABLE_HASH_KEY:
|
108
|
+
case GRN_CURSOR_TABLE_PAT_KEY:
|
109
|
+
case GRN_CURSOR_TABLE_NO_KEY:
|
118
110
|
break;
|
119
111
|
case GRN_TABLE_HASH_KEY:
|
120
112
|
case GRN_TABLE_PAT_KEY:
|
@@ -140,7 +132,7 @@ rb_grn_object_finalizer (grn_ctx *context, grn_obj *grn_object,
|
|
140
132
|
break;
|
141
133
|
default:
|
142
134
|
rb_raise(rb_eTypeError,
|
143
|
-
"unsupported groonga object type: 0x%x",
|
135
|
+
"unsupported groonga object type for finalizer: 0x%x",
|
144
136
|
grn_object->header.type);
|
145
137
|
break;
|
146
138
|
}
|
@@ -161,8 +153,9 @@ rb_grn_object_free (RbGrnObject *rb_grn_object)
|
|
161
153
|
rb_grn_object->context = NULL;
|
162
154
|
rb_grn_object->object = NULL;
|
163
155
|
debug("type: %x\n", grn_object->header.type);
|
164
|
-
if (rb_grn_object->need_close)
|
156
|
+
if (rb_grn_object->need_close) {
|
165
157
|
grn_obj_close(context, grn_object);
|
158
|
+
}
|
166
159
|
}
|
167
160
|
xfree(rb_grn_object);
|
168
161
|
}
|
@@ -217,7 +210,7 @@ rb_grn_object_to_ruby_class (grn_obj *object)
|
|
217
210
|
break;
|
218
211
|
default:
|
219
212
|
rb_raise(rb_eTypeError,
|
220
|
-
"unsupported groonga object type: 0x%x",
|
213
|
+
"unsupported groonga object type for class detection: 0x%x",
|
221
214
|
object->header.type);
|
222
215
|
break;
|
223
216
|
}
|
@@ -266,17 +259,20 @@ rb_grn_object_bind_common (VALUE klass, VALUE self, VALUE rb_context,
|
|
266
259
|
rb_grn_object->need_close = RB_GRN_TRUE;
|
267
260
|
switch (object->header.type) {
|
268
261
|
case GRN_DB:
|
262
|
+
case GRN_CURSOR_TABLE_HASH_KEY:
|
263
|
+
case GRN_CURSOR_TABLE_PAT_KEY:
|
264
|
+
case GRN_CURSOR_TABLE_NO_KEY:
|
269
265
|
case GRN_TABLE_HASH_KEY:
|
270
266
|
case GRN_TABLE_PAT_KEY:
|
271
267
|
case GRN_TABLE_NO_KEY:
|
272
268
|
case GRN_COLUMN_FIX_SIZE:
|
273
269
|
case GRN_COLUMN_VAR_SIZE:
|
274
270
|
case GRN_COLUMN_INDEX:
|
271
|
+
case GRN_EXPR:
|
275
272
|
grn_obj_user_data(context, object)->ptr = rb_grn_object;
|
276
273
|
grn_obj_set_finalizer(context, object, rb_grn_object_finalizer);
|
277
274
|
break;
|
278
275
|
case GRN_PROC:
|
279
|
-
case GRN_EXPR:
|
280
276
|
case GRN_TYPE:
|
281
277
|
rb_grn_object->need_close = RB_GRN_FALSE;
|
282
278
|
break;
|
@@ -320,10 +316,10 @@ rb_grn_object_assign (VALUE klass, VALUE self, VALUE rb_context,
|
|
320
316
|
|
321
317
|
if (klass == rb_cGrnDatabase ||
|
322
318
|
(RVAL2CBOOL(rb_obj_is_kind_of(self, rb_cGrnType))) ||
|
323
|
-
klass == rb_cGrnAccessor ||
|
324
319
|
klass == rb_cGrnHashCursor ||
|
325
320
|
klass == rb_cGrnPatriciaTrieCursor ||
|
326
321
|
klass == rb_cGrnArrayCursor ||
|
322
|
+
klass == rb_cGrnAccessor ||
|
327
323
|
klass == rb_cGrnProcedure ||
|
328
324
|
klass == rb_cGrnVariable) {
|
329
325
|
rb_grn_object = ALLOC(RbGrnObject);
|
@@ -359,7 +355,7 @@ rb_grn_object_assign (VALUE klass, VALUE self, VALUE rb_context,
|
|
359
355
|
context, object);
|
360
356
|
} else {
|
361
357
|
rb_raise(rb_eTypeError,
|
362
|
-
"unsupported groonga object type: 0x%x",
|
358
|
+
"unsupported groonga object type for assignment: 0x%x",
|
363
359
|
object->header.type);
|
364
360
|
}
|
365
361
|
|
@@ -424,7 +420,7 @@ rb_grn_object_close (VALUE self)
|
|
424
420
|
* _object_が開放済みの場合は+true+を返し、そうでない場合は
|
425
421
|
* +false+を返す。
|
426
422
|
*/
|
427
|
-
|
423
|
+
VALUE
|
428
424
|
rb_grn_object_closed_p (VALUE self)
|
429
425
|
{
|
430
426
|
grn_obj *object;
|
@@ -536,7 +532,11 @@ rb_grn_object_inspect_content_domain (VALUE inspected,
|
|
536
532
|
|
537
533
|
domain_object = grn_ctx_at(context, domain);
|
538
534
|
if (domain_object) {
|
539
|
-
|
535
|
+
if (domain_object == object) {
|
536
|
+
rb_str_cat2(inspected, "self");
|
537
|
+
} else {
|
538
|
+
rb_grn_object_inspect_object(inspected, context, domain_object);
|
539
|
+
}
|
540
540
|
} else {
|
541
541
|
rb_str_concat(inspected, rb_obj_as_string(UINT2NUM(domain)));
|
542
542
|
}
|
@@ -579,6 +579,112 @@ rb_grn_object_inspect_content_range (VALUE inspected,
|
|
579
579
|
return inspected;
|
580
580
|
}
|
581
581
|
|
582
|
+
static VALUE
|
583
|
+
rb_grn_object_inspect_content_flags (VALUE inspected,
|
584
|
+
grn_ctx *context, grn_obj *object)
|
585
|
+
{
|
586
|
+
grn_obj_flags flags;
|
587
|
+
VALUE inspected_flags;
|
588
|
+
|
589
|
+
rb_str_cat2(inspected, "flags: ");
|
590
|
+
|
591
|
+
flags = object->header.flags;
|
592
|
+
|
593
|
+
inspected_flags = rb_ary_new();
|
594
|
+
|
595
|
+
if (0) {
|
596
|
+
if (flags & GRN_OBJ_TABLE_HASH_KEY)
|
597
|
+
rb_ary_push(inspected_flags, rb_str_new2("TABLE_HASH_KEY"));
|
598
|
+
if (flags & GRN_OBJ_TABLE_PAT_KEY)
|
599
|
+
rb_ary_push(inspected_flags, rb_str_new2("TABLE_PAT_KEY"));
|
600
|
+
if (flags & GRN_OBJ_TABLE_NO_KEY)
|
601
|
+
rb_ary_push(inspected_flags, rb_str_new2("TABLE_NO_KEY"));
|
602
|
+
if (flags & GRN_OBJ_TABLE_ALIAS)
|
603
|
+
rb_ary_push(inspected_flags, rb_str_new2("TABLE_ALIAS"));
|
604
|
+
}
|
605
|
+
|
606
|
+
switch (object->header.type) {
|
607
|
+
case GRN_COLUMN_FIX_SIZE:
|
608
|
+
case GRN_COLUMN_VAR_SIZE:
|
609
|
+
case GRN_TYPE:
|
610
|
+
if (flags & GRN_OBJ_KEY_UINT)
|
611
|
+
rb_ary_push(inspected_flags, rb_str_new2("KEY_UINT"));
|
612
|
+
if (flags & GRN_OBJ_KEY_INT)
|
613
|
+
rb_ary_push(inspected_flags, rb_str_new2("KEY_INT"));
|
614
|
+
if (flags & GRN_OBJ_KEY_FLOAT)
|
615
|
+
rb_ary_push(inspected_flags, rb_str_new2("KEY_FLOAT"));
|
616
|
+
break;
|
617
|
+
default:
|
618
|
+
break;
|
619
|
+
}
|
620
|
+
|
621
|
+
switch (object->header.type) {
|
622
|
+
case GRN_TABLE_HASH_KEY:
|
623
|
+
case GRN_TABLE_PAT_KEY:
|
624
|
+
if (flags & GRN_OBJ_KEY_WITH_SIS)
|
625
|
+
rb_ary_push(inspected_flags, rb_str_new2("KEY_WITH_SIS"));
|
626
|
+
if (flags & GRN_OBJ_KEY_NORMALIZE)
|
627
|
+
rb_ary_push(inspected_flags, rb_str_new2("KEY_NORMALIZE"));
|
628
|
+
break;
|
629
|
+
default:
|
630
|
+
break;
|
631
|
+
}
|
632
|
+
|
633
|
+
if (0) {
|
634
|
+
if (flags & GRN_OBJ_COLUMN_SCALAR)
|
635
|
+
rb_ary_push(inspected_flags, rb_str_new2("COLUMN_SCALAR"));
|
636
|
+
if (flags & GRN_OBJ_COLUMN_VECTOR)
|
637
|
+
rb_ary_push(inspected_flags, rb_str_new2("COLUMN_VECTOR"));
|
638
|
+
if (flags & GRN_OBJ_COLUMN_INDEX)
|
639
|
+
rb_ary_push(inspected_flags, rb_str_new2("COLUMN_INDEX"));
|
640
|
+
}
|
641
|
+
|
642
|
+
switch (object->header.type) {
|
643
|
+
case GRN_COLUMN_FIX_SIZE:
|
644
|
+
case GRN_COLUMN_VAR_SIZE:
|
645
|
+
if (flags & GRN_OBJ_COMPRESS_ZLIB)
|
646
|
+
rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_ZLIB"));
|
647
|
+
if (flags & GRN_OBJ_COMPRESS_LZO)
|
648
|
+
rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_LZO"));
|
649
|
+
break;
|
650
|
+
default:
|
651
|
+
break;
|
652
|
+
}
|
653
|
+
|
654
|
+
if (flags & GRN_OBJ_WITH_SECTION)
|
655
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_SECTION"));
|
656
|
+
if (flags & GRN_OBJ_WITH_WEIGHT)
|
657
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_WEIGHT"));
|
658
|
+
if (flags & GRN_OBJ_WITH_POSITION)
|
659
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_POSITION"));
|
660
|
+
if (flags & GRN_OBJ_WITH_BUFFER)
|
661
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_BUFFER"));
|
662
|
+
|
663
|
+
if (flags & GRN_OBJ_UNIT_DOCUMENT_SECTION)
|
664
|
+
rb_ary_push(inspected_flags, rb_str_new2("UNIT_DOCUMENT_SECTION"));
|
665
|
+
if (flags & GRN_OBJ_UNIT_DOCUMENT_POSITION)
|
666
|
+
rb_ary_push(inspected_flags, rb_str_new2("UNIT_DOCUMENT_POSITION"));
|
667
|
+
|
668
|
+
if (flags & GRN_OBJ_UNIT_SECTION_POSITION)
|
669
|
+
rb_ary_push(inspected_flags, rb_str_new2("UNIT_SECTION_POSITION"));
|
670
|
+
|
671
|
+
if (flags & GRN_OBJ_UNIT_USERDEF_DOCUMENT)
|
672
|
+
rb_ary_push(inspected_flags, rb_str_new2("UNIT_USERDEF_DOCUMENT"));
|
673
|
+
if (flags & GRN_OBJ_UNIT_USERDEF_SECTION)
|
674
|
+
rb_ary_push(inspected_flags, rb_str_new2("UNIT_USERDEF_SECTION"));
|
675
|
+
if (flags & GRN_OBJ_UNIT_USERDEF_POSITION)
|
676
|
+
rb_ary_push(inspected_flags, rb_str_new2("UNIT_USERDEF_POSITION"));
|
677
|
+
|
678
|
+
if (flags & GRN_OBJ_WITH_SUBREC)
|
679
|
+
rb_ary_push(inspected_flags, rb_str_new2("WITH_SUBREC"));
|
680
|
+
|
681
|
+
rb_str_cat2(inspected, "<");
|
682
|
+
rb_str_concat(inspected, rb_ary_join(inspected_flags, rb_str_new2("|")));
|
683
|
+
rb_str_cat2(inspected, ">");
|
684
|
+
|
685
|
+
return inspected;
|
686
|
+
}
|
687
|
+
|
582
688
|
VALUE
|
583
689
|
rb_grn_object_inspect_object_content (VALUE inspected,
|
584
690
|
grn_ctx *context, grn_obj *object)
|
@@ -592,6 +698,8 @@ rb_grn_object_inspect_object_content (VALUE inspected,
|
|
592
698
|
rb_grn_object_inspect_content_domain(inspected, context, object);
|
593
699
|
rb_str_cat2(inspected, ", ");
|
594
700
|
rb_grn_object_inspect_content_range(inspected, context, object);
|
701
|
+
rb_str_cat2(inspected, ", ");
|
702
|
+
rb_grn_object_inspect_content_flags(inspected, context, object);
|
595
703
|
|
596
704
|
return inspected;
|
597
705
|
}
|
data/ext/rb-grn-patricia-trie.c
CHANGED
@@ -26,13 +26,14 @@ static VALUE
|
|
26
26
|
rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
|
27
27
|
{
|
28
28
|
grn_ctx *context;
|
29
|
-
grn_obj *key_type = NULL, *table;
|
29
|
+
grn_obj *key_type = NULL, *value_type = NULL, *table;
|
30
30
|
const char *name = NULL, *path = NULL;
|
31
|
-
unsigned name_size = 0
|
31
|
+
unsigned name_size = 0;
|
32
32
|
grn_obj_flags flags = GRN_TABLE_PAT_KEY;
|
33
33
|
VALUE rb_table;
|
34
34
|
VALUE options, rb_context, rb_name, rb_path, rb_persistent;
|
35
|
-
VALUE rb_key_normalize, rb_key_with_sis, rb_key_type
|
35
|
+
VALUE rb_key_normalize, rb_key_with_sis, rb_key_type;
|
36
|
+
VALUE rb_value_type;
|
36
37
|
VALUE rb_default_tokenizer, rb_sub_records;
|
37
38
|
|
38
39
|
rb_scan_args(argc, argv, "01", &options);
|
@@ -45,7 +46,7 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
|
|
45
46
|
"key_normalize", &rb_key_normalize,
|
46
47
|
"key_with_sis", &rb_key_with_sis,
|
47
48
|
"key_type", &rb_key_type,
|
48
|
-
"
|
49
|
+
"value_type", &rb_value_type,
|
49
50
|
"default_tokenizer", &rb_default_tokenizer,
|
50
51
|
"sub_records", &rb_sub_records,
|
51
52
|
NULL);
|
@@ -78,14 +79,14 @@ rb_grn_patricia_trie_s_create (int argc, VALUE *argv, VALUE self)
|
|
78
79
|
key_type = RVAL2GRNOBJECT(rb_key_type, &context);
|
79
80
|
}
|
80
81
|
|
81
|
-
if (!NIL_P(
|
82
|
-
|
82
|
+
if (!NIL_P(rb_value_type))
|
83
|
+
value_type = RVAL2GRNOBJECT(rb_value_type, &context);
|
83
84
|
|
84
85
|
if (RVAL2CBOOL(rb_sub_records))
|
85
86
|
flags |= GRN_OBJ_WITH_SUBREC;
|
86
87
|
|
87
88
|
table = grn_table_create(context, name, name_size, path,
|
88
|
-
flags, key_type,
|
89
|
+
flags, key_type, value_type);
|
89
90
|
if (!table)
|
90
91
|
rb_grn_context_check(context, rb_ary_new4(argc, argv));
|
91
92
|
rb_table = rb_grn_object_alloc(self);
|
data/ext/rb-grn-table-cursor.c
CHANGED
@@ -57,44 +57,6 @@ rb_grn_table_cursor_deconstruct (RbGrnTableCursor *rb_grn_table_cursor,
|
|
57
57
|
range_id, range);
|
58
58
|
}
|
59
59
|
|
60
|
-
VALUE
|
61
|
-
rb_grn_table_cursor_close (VALUE self)
|
62
|
-
{
|
63
|
-
RbGrnTableCursor *rb_grn_table_cursor;
|
64
|
-
grn_table_cursor *cursor;
|
65
|
-
grn_ctx *context;
|
66
|
-
|
67
|
-
rb_grn_table_cursor = SELF(self);
|
68
|
-
rb_grn_table_cursor_deconstruct(rb_grn_table_cursor, &cursor, &context,
|
69
|
-
NULL, NULL, NULL, NULL);
|
70
|
-
|
71
|
-
if (context && cursor) {
|
72
|
-
RbGrnObject *rb_grn_object;
|
73
|
-
|
74
|
-
rb_grn_object = RB_GRN_OBJECT(rb_grn_table_cursor);
|
75
|
-
grn_obj_close(context, cursor);
|
76
|
-
rb_grn_object->context = NULL;
|
77
|
-
rb_grn_object->object = NULL;
|
78
|
-
}
|
79
|
-
|
80
|
-
return Qnil;
|
81
|
-
}
|
82
|
-
|
83
|
-
static VALUE
|
84
|
-
rb_grn_table_cursor_closed_p (VALUE self)
|
85
|
-
{
|
86
|
-
grn_table_cursor *cursor;
|
87
|
-
grn_ctx *context;
|
88
|
-
|
89
|
-
rb_grn_table_cursor_deconstruct(SELF(self), &cursor, &context,
|
90
|
-
NULL, NULL, NULL, NULL);
|
91
|
-
|
92
|
-
if (context && cursor)
|
93
|
-
return Qfalse;
|
94
|
-
else
|
95
|
-
return Qtrue;
|
96
|
-
}
|
97
|
-
|
98
60
|
static VALUE
|
99
61
|
rb_grn_table_cursor_get_value (VALUE self)
|
100
62
|
{
|
@@ -204,9 +166,9 @@ rb_grn_init_table_cursor (VALUE mGrn)
|
|
204
166
|
rb_include_module(rb_cGrnTableCursor, rb_mEnumerable);
|
205
167
|
|
206
168
|
rb_define_method(rb_cGrnTableCursor, "close",
|
207
|
-
|
169
|
+
rb_grn_object_close, 0);
|
208
170
|
rb_define_method(rb_cGrnTableCursor, "closed?",
|
209
|
-
|
171
|
+
rb_grn_object_closed_p, 0);
|
210
172
|
|
211
173
|
rb_define_method(rb_cGrnTableCursor, "value",
|
212
174
|
rb_grn_table_cursor_get_value, 0);
|