groonga 0.0.6 → 0.0.7
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/AUTHORS +4 -0
- data/NEWS.ja.rdoc +10 -0
- data/NEWS.rdoc +10 -0
- data/README.ja.rdoc +9 -3
- data/README.rdoc +10 -4
- data/Rakefile +1 -1
- data/TUTORIAL.ja.rdoc +3 -6
- data/example/bookmark.rb +1 -1
- data/example/search/config.ru +52 -28
- data/ext/rb-grn-column.c +24 -18
- data/ext/rb-grn-context.c +165 -17
- data/ext/rb-grn-encoding.c +37 -0
- data/ext/rb-grn-expression.c +286 -51
- data/ext/rb-grn-object.c +27 -8
- data/ext/rb-grn-operation.c +128 -22
- data/ext/rb-grn-patricia-trie.c +62 -0
- data/ext/rb-grn-snippet.c +7 -17
- data/ext/rb-grn-table.c +101 -31
- data/ext/rb-grn-utils.c +87 -22
- data/ext/rb-grn-variable-size-column.c +1 -1
- data/ext/rb-grn.h +27 -4
- data/ext/rb-groonga.c +12 -2
- data/extconf.rb +2 -1
- data/html/index.html +2 -2
- data/lib/groonga.rb +1 -0
- data/lib/groonga/expression-builder.rb +47 -12
- data/lib/groonga/patricia-trie.rb +40 -0
- data/lib/groonga/record.rb +17 -13
- data/misc/grnop2ruby.rb +49 -0
- data/pkg-config.rb +1 -1
- data/test-unit/lib/test/unit/assertions.rb +5 -2
- data/test-unit/lib/test/unit/autorunner.rb +19 -4
- data/test-unit/lib/test/unit/collector/load.rb +3 -1
- data/test-unit/lib/test/unit/color-scheme.rb +5 -1
- data/test-unit/lib/test/unit/error.rb +7 -5
- data/test-unit/lib/test/unit/runner/tap.rb +8 -0
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +63 -8
- data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
- data/test-unit/test/collector/test-load.rb +1 -5
- data/test-unit/test/test-color-scheme.rb +4 -0
- data/test/groonga-test-utils.rb +10 -0
- data/test/run-test.rb +5 -1
- data/test/test-column.rb +58 -0
- data/test/test-database.rb +8 -1
- data/test/test-expression.rb +48 -6
- data/test/test-hash.rb +7 -0
- data/test/test-patricia-trie.rb +39 -0
- data/test/test-record.rb +2 -2
- data/test/test-remote.rb +52 -0
- data/test/test-schema.rb +1 -1
- data/test/test-table-select-normalize.rb +48 -0
- data/test/test-table-select.rb +101 -0
- data/test/test-table.rb +0 -9
- data/test/test-variable-size-column.rb +28 -0
- metadata +16 -5
data/ext/rb-grn-object.c
CHANGED
@@ -78,11 +78,15 @@ rb_grn_object_from_ruby_object (VALUE object, grn_ctx **context)
|
|
78
78
|
return rb_grn_object->object;
|
79
79
|
}
|
80
80
|
|
81
|
-
|
82
|
-
rb_grn_object_finalizer (grn_ctx *context, grn_obj
|
81
|
+
static grn_obj *
|
82
|
+
rb_grn_object_finalizer (grn_ctx *context, int n_args, grn_obj **grn_objects,
|
83
83
|
grn_user_data *user_data)
|
84
84
|
{
|
85
85
|
RbGrnObject *rb_grn_object;
|
86
|
+
grn_obj *grn_object = *grn_objects;
|
87
|
+
|
88
|
+
if (rb_grn_exited)
|
89
|
+
return NULL;
|
86
90
|
|
87
91
|
rb_grn_object = user_data->ptr;
|
88
92
|
|
@@ -137,7 +141,7 @@ rb_grn_object_finalizer (grn_ctx *context, grn_obj *grn_object,
|
|
137
141
|
break;
|
138
142
|
}
|
139
143
|
|
140
|
-
return
|
144
|
+
return NULL;
|
141
145
|
}
|
142
146
|
|
143
147
|
void
|
@@ -149,12 +153,12 @@ rb_grn_object_free (RbGrnObject *rb_grn_object)
|
|
149
153
|
context = rb_grn_object->context;
|
150
154
|
grn_object = rb_grn_object->object;
|
151
155
|
debug("rb-free: %p:%p:%p\n", context, grn_object, rb_grn_object);
|
152
|
-
if (context && grn_object) {
|
156
|
+
if (!rb_grn_exited && context && grn_object) {
|
153
157
|
rb_grn_object->context = NULL;
|
154
158
|
rb_grn_object->object = NULL;
|
155
159
|
debug("type: %x\n", grn_object->header.type);
|
156
160
|
if (rb_grn_object->need_close) {
|
157
|
-
|
161
|
+
grn_obj_unlink(context, grn_object);
|
158
162
|
}
|
159
163
|
}
|
160
164
|
xfree(rb_grn_object);
|
@@ -599,8 +603,8 @@ rb_grn_object_inspect_content_flags (VALUE inspected,
|
|
599
603
|
rb_ary_push(inspected_flags, rb_str_new2("TABLE_PAT_KEY"));
|
600
604
|
if (flags & GRN_OBJ_TABLE_NO_KEY)
|
601
605
|
rb_ary_push(inspected_flags, rb_str_new2("TABLE_NO_KEY"));
|
602
|
-
if (flags &
|
603
|
-
rb_ary_push(inspected_flags, rb_str_new2("
|
606
|
+
if (flags & GRN_OBJ_TABLE_VIEW)
|
607
|
+
rb_ary_push(inspected_flags, rb_str_new2("TABLE_VIEW"));
|
604
608
|
}
|
605
609
|
|
606
610
|
switch (object->header.type) {
|
@@ -1048,7 +1052,7 @@ rb_grn_object_array_set (VALUE self, VALUE rb_id, VALUE rb_value)
|
|
1048
1052
|
* call-seq:
|
1049
1053
|
* object.append(id, value)
|
1050
1054
|
*
|
1051
|
-
* _object_の_id_
|
1055
|
+
* _object_の_id_に対応する値の最後に_value_を追加する。
|
1052
1056
|
*/
|
1053
1057
|
static VALUE
|
1054
1058
|
rb_grn_object_append_value (VALUE self, VALUE rb_id, VALUE rb_value)
|
@@ -1056,6 +1060,20 @@ rb_grn_object_append_value (VALUE self, VALUE rb_id, VALUE rb_value)
|
|
1056
1060
|
return rb_grn_object_set(self, rb_id, rb_value, GRN_OBJ_APPEND);
|
1057
1061
|
}
|
1058
1062
|
|
1063
|
+
/*
|
1064
|
+
* Document-method: prepend
|
1065
|
+
*
|
1066
|
+
* call-seq:
|
1067
|
+
* object.prepend(id, value)
|
1068
|
+
*
|
1069
|
+
* _object_の_id_に対応する値の最初に_value_を追加する。
|
1070
|
+
*/
|
1071
|
+
static VALUE
|
1072
|
+
rb_grn_object_prepend_value (VALUE self, VALUE rb_id, VALUE rb_value)
|
1073
|
+
{
|
1074
|
+
return rb_grn_object_set(self, rb_id, rb_value, GRN_OBJ_PREPEND);
|
1075
|
+
}
|
1076
|
+
|
1059
1077
|
static VALUE
|
1060
1078
|
rb_grn_object_remove (VALUE self)
|
1061
1079
|
{
|
@@ -1097,6 +1115,7 @@ rb_grn_init_object (VALUE mGrn)
|
|
1097
1115
|
rb_define_method(rb_cGrnObject, "[]", rb_grn_object_array_reference, 1);
|
1098
1116
|
rb_define_method(rb_cGrnObject, "[]=", rb_grn_object_array_set, 2);
|
1099
1117
|
rb_define_method(rb_cGrnObject, "append", rb_grn_object_append_value, 2);
|
1118
|
+
rb_define_method(rb_cGrnObject, "prepend", rb_grn_object_prepend_value, 2);
|
1100
1119
|
|
1101
1120
|
rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, 0);
|
1102
1121
|
}
|
data/ext/rb-grn-operation.c
CHANGED
@@ -25,40 +25,64 @@ rb_grn_init_operation (VALUE mGrn)
|
|
25
25
|
{
|
26
26
|
rb_mGrnOperation = rb_define_module_under(mGrn, "Operation");
|
27
27
|
|
28
|
-
rb_define_const(rb_mGrnOperation, "NO_OPERATION",
|
29
|
-
UINT2NUM(GRN_OP_NOP));
|
30
28
|
rb_define_const(rb_mGrnOperation, "PUSH",
|
31
29
|
UINT2NUM(GRN_OP_PUSH));
|
32
30
|
rb_define_const(rb_mGrnOperation, "POP",
|
33
31
|
UINT2NUM(GRN_OP_POP));
|
32
|
+
rb_define_const(rb_mGrnOperation, "NO_OPERATION",
|
33
|
+
UINT2NUM(GRN_OP_NOP));
|
34
34
|
rb_define_const(rb_mGrnOperation, "CALL",
|
35
35
|
UINT2NUM(GRN_OP_CALL));
|
36
36
|
rb_define_const(rb_mGrnOperation, "INTERN",
|
37
37
|
UINT2NUM(GRN_OP_INTERN));
|
38
|
-
rb_define_const(rb_mGrnOperation, "
|
39
|
-
UINT2NUM(
|
40
|
-
rb_define_const(rb_mGrnOperation, "
|
41
|
-
UINT2NUM(
|
42
|
-
rb_define_const(rb_mGrnOperation, "VARIABLE_SET_VALUE",
|
43
|
-
UINT2NUM(GRN_OP_VAR_SET_VALUE));
|
44
|
-
rb_define_const(rb_mGrnOperation, "OBJECT_GET_VALUE",
|
45
|
-
UINT2NUM(GRN_OP_OBJ_GET_VALUE));
|
46
|
-
rb_define_const(rb_mGrnOperation, "OBJECT_SET_VALUE",
|
47
|
-
UINT2NUM(GRN_OP_OBJ_SET_VALUE));
|
48
|
-
rb_define_const(rb_mGrnOperation, "OBJECT_SEARCH",
|
49
|
-
UINT2NUM(GRN_OP_OBJ_SEARCH));
|
50
|
-
rb_define_const(rb_mGrnOperation, "TABLE_SELECT",
|
51
|
-
UINT2NUM(GRN_OP_TABLE_SELECT));
|
52
|
-
rb_define_const(rb_mGrnOperation, "TABLE_SORT",
|
53
|
-
UINT2NUM(GRN_OP_TABLE_SORT));
|
54
|
-
rb_define_const(rb_mGrnOperation, "TABLE_GROUP",
|
55
|
-
UINT2NUM(GRN_OP_TABLE_GROUP));
|
56
|
-
rb_define_const(rb_mGrnOperation, "JSON_PUT",
|
57
|
-
UINT2NUM(GRN_OP_JSON_PUT));
|
38
|
+
rb_define_const(rb_mGrnOperation, "GET_REFERENCE",
|
39
|
+
UINT2NUM(GRN_OP_GET_REF));
|
40
|
+
rb_define_const(rb_mGrnOperation, "GET_VALUE",
|
41
|
+
UINT2NUM(GRN_OP_GET_VALUE));
|
58
42
|
rb_define_const(rb_mGrnOperation, "AND",
|
59
43
|
UINT2NUM(GRN_OP_AND));
|
44
|
+
rb_define_const(rb_mGrnOperation, "BUT",
|
45
|
+
UINT2NUM(GRN_OP_BUT));
|
60
46
|
rb_define_const(rb_mGrnOperation, "OR",
|
61
47
|
UINT2NUM(GRN_OP_OR));
|
48
|
+
rb_define_const(rb_mGrnOperation, "ASSIGN",
|
49
|
+
UINT2NUM(GRN_OP_ASSIGN));
|
50
|
+
rb_define_const(rb_mGrnOperation, "STAR_ASSIGN",
|
51
|
+
UINT2NUM(GRN_OP_STAR_ASSIGN));
|
52
|
+
rb_define_const(rb_mGrnOperation, "SLASH_ASSIGN",
|
53
|
+
UINT2NUM(GRN_OP_SLASH_ASSIGN));
|
54
|
+
rb_define_const(rb_mGrnOperation, "MODULO_ASSIGN",
|
55
|
+
UINT2NUM(GRN_OP_MOD_ASSIGN));
|
56
|
+
rb_define_const(rb_mGrnOperation, "PLUS_ASSIGN",
|
57
|
+
UINT2NUM(GRN_OP_PLUS_ASSIGN));
|
58
|
+
rb_define_const(rb_mGrnOperation, "MINUS_ASSIGN",
|
59
|
+
UINT2NUM(GRN_OP_MINUS_ASSIGN));
|
60
|
+
rb_define_const(rb_mGrnOperation, "SHIFTL_ASSIGN",
|
61
|
+
UINT2NUM(GRN_OP_SHIFTL_ASSIGN));
|
62
|
+
rb_define_const(rb_mGrnOperation, "SHIRTR_ASSIGN",
|
63
|
+
UINT2NUM(GRN_OP_SHIRTR_ASSIGN));
|
64
|
+
rb_define_const(rb_mGrnOperation, "SHIFTRR_ASSIGN",
|
65
|
+
UINT2NUM(GRN_OP_SHIFTRR_ASSIGN));
|
66
|
+
rb_define_const(rb_mGrnOperation, "AND_ASSIGN",
|
67
|
+
UINT2NUM(GRN_OP_AND_ASSIGN));
|
68
|
+
rb_define_const(rb_mGrnOperation, "XOR_ASSIGN",
|
69
|
+
UINT2NUM(GRN_OP_XOR_ASSIGN));
|
70
|
+
rb_define_const(rb_mGrnOperation, "OR_ASSIGN",
|
71
|
+
UINT2NUM(GRN_OP_OR_ASSIGN));
|
72
|
+
rb_define_const(rb_mGrnOperation, "JUMP",
|
73
|
+
UINT2NUM(GRN_OP_JUMP));
|
74
|
+
rb_define_const(rb_mGrnOperation, "CJUMP",
|
75
|
+
UINT2NUM(GRN_OP_CJUMP));
|
76
|
+
rb_define_const(rb_mGrnOperation, "COMMA",
|
77
|
+
UINT2NUM(GRN_OP_COMMA));
|
78
|
+
rb_define_const(rb_mGrnOperation, "BITWISE_OR",
|
79
|
+
UINT2NUM(GRN_OP_BITWISE_OR));
|
80
|
+
rb_define_const(rb_mGrnOperation, "BITWISE_XOR",
|
81
|
+
UINT2NUM(GRN_OP_BITWISE_XOR));
|
82
|
+
rb_define_const(rb_mGrnOperation, "BITWISE_AND",
|
83
|
+
UINT2NUM(GRN_OP_BITWISE_AND));
|
84
|
+
rb_define_const(rb_mGrnOperation, "BITWISE_NOT",
|
85
|
+
UINT2NUM(GRN_OP_BITWISE_NOT));
|
62
86
|
rb_define_const(rb_mGrnOperation, "EQUAL",
|
63
87
|
UINT2NUM(GRN_OP_EQUAL));
|
64
88
|
rb_define_const(rb_mGrnOperation, "NOT_EQUAL",
|
@@ -71,8 +95,90 @@ rb_grn_init_operation (VALUE mGrn)
|
|
71
95
|
UINT2NUM(GRN_OP_LESS_EQUAL));
|
72
96
|
rb_define_const(rb_mGrnOperation, "GREATER_EQUAL",
|
73
97
|
UINT2NUM(GRN_OP_GREATER_EQUAL));
|
98
|
+
rb_define_const(rb_mGrnOperation, "IN",
|
99
|
+
UINT2NUM(GRN_OP_IN));
|
74
100
|
rb_define_const(rb_mGrnOperation, "MATCH",
|
75
101
|
UINT2NUM(GRN_OP_MATCH));
|
102
|
+
rb_define_const(rb_mGrnOperation, "NEAR",
|
103
|
+
UINT2NUM(GRN_OP_NEAR));
|
104
|
+
rb_define_const(rb_mGrnOperation, "NEAR2",
|
105
|
+
UINT2NUM(GRN_OP_NEAR2));
|
106
|
+
rb_define_const(rb_mGrnOperation, "SIMILAR",
|
107
|
+
UINT2NUM(GRN_OP_SIMILAR));
|
108
|
+
rb_define_const(rb_mGrnOperation, "TERM_EXTRACT",
|
109
|
+
UINT2NUM(GRN_OP_TERM_EXTRACT));
|
110
|
+
rb_define_const(rb_mGrnOperation, "SHIFTL",
|
111
|
+
UINT2NUM(GRN_OP_SHIFTL));
|
112
|
+
rb_define_const(rb_mGrnOperation, "SHIFTR",
|
113
|
+
UINT2NUM(GRN_OP_SHIFTR));
|
114
|
+
rb_define_const(rb_mGrnOperation, "SHIFTRR",
|
115
|
+
UINT2NUM(GRN_OP_SHIFTRR));
|
116
|
+
rb_define_const(rb_mGrnOperation, "PLUS",
|
117
|
+
UINT2NUM(GRN_OP_PLUS));
|
118
|
+
rb_define_const(rb_mGrnOperation, "MINUS",
|
119
|
+
UINT2NUM(GRN_OP_MINUS));
|
120
|
+
rb_define_const(rb_mGrnOperation, "STAR",
|
121
|
+
UINT2NUM(GRN_OP_STAR));
|
122
|
+
rb_define_const(rb_mGrnOperation, "SLASH",
|
123
|
+
UINT2NUM(GRN_OP_SLASH));
|
124
|
+
rb_define_const(rb_mGrnOperation, "MODULO",
|
125
|
+
UINT2NUM(GRN_OP_MOD));
|
126
|
+
rb_define_const(rb_mGrnOperation, "DELETE",
|
127
|
+
UINT2NUM(GRN_OP_DELETE));
|
128
|
+
rb_define_const(rb_mGrnOperation, "INCREMENT",
|
129
|
+
UINT2NUM(GRN_OP_INCR));
|
130
|
+
rb_define_const(rb_mGrnOperation, "DECREMENT",
|
131
|
+
UINT2NUM(GRN_OP_DECR));
|
132
|
+
rb_define_const(rb_mGrnOperation, "INCREMENT_POST",
|
133
|
+
UINT2NUM(GRN_OP_INCR_POST));
|
134
|
+
rb_define_const(rb_mGrnOperation, "DECREMENT_POST",
|
135
|
+
UINT2NUM(GRN_OP_DECR_POST));
|
136
|
+
rb_define_const(rb_mGrnOperation, "NOT",
|
137
|
+
UINT2NUM(GRN_OP_NOT));
|
138
|
+
rb_define_const(rb_mGrnOperation, "ADJUST",
|
139
|
+
UINT2NUM(GRN_OP_ADJUST));
|
140
|
+
rb_define_const(rb_mGrnOperation, "EXACT",
|
141
|
+
UINT2NUM(GRN_OP_EXACT));
|
142
|
+
rb_define_const(rb_mGrnOperation, "LONGEST_COMMON_PREFIX",
|
143
|
+
UINT2NUM(GRN_OP_LCP));
|
144
|
+
rb_define_const(rb_mGrnOperation, "PARTIAL",
|
145
|
+
UINT2NUM(GRN_OP_PARTIAL));
|
146
|
+
rb_define_const(rb_mGrnOperation, "UNSPLIT",
|
147
|
+
UINT2NUM(GRN_OP_UNSPLIT));
|
148
|
+
rb_define_const(rb_mGrnOperation, "PREFIX",
|
149
|
+
UINT2NUM(GRN_OP_PREFIX));
|
150
|
+
rb_define_const(rb_mGrnOperation, "SUFFIX",
|
151
|
+
UINT2NUM(GRN_OP_SUFFIX));
|
152
|
+
rb_define_const(rb_mGrnOperation, "GEO_DISTANCE1",
|
153
|
+
UINT2NUM(GRN_OP_GEO_DISTANCE1));
|
154
|
+
rb_define_const(rb_mGrnOperation, "GEO_DISTANCE2",
|
155
|
+
UINT2NUM(GRN_OP_GEO_DISTANCE2));
|
156
|
+
rb_define_const(rb_mGrnOperation, "GEO_DISTANCE3",
|
157
|
+
UINT2NUM(GRN_OP_GEO_DISTANCE3));
|
158
|
+
rb_define_const(rb_mGrnOperation, "GEO_DISTANCE4",
|
159
|
+
UINT2NUM(GRN_OP_GEO_DISTANCE4));
|
160
|
+
rb_define_const(rb_mGrnOperation, "GEO_WITHINP5",
|
161
|
+
UINT2NUM(GRN_OP_GEO_WITHINP5));
|
162
|
+
rb_define_const(rb_mGrnOperation, "GEO_WITHINP6",
|
163
|
+
UINT2NUM(GRN_OP_GEO_WITHINP6));
|
164
|
+
rb_define_const(rb_mGrnOperation, "GEO_WITHINP8",
|
165
|
+
UINT2NUM(GRN_OP_GEO_WITHINP8));
|
166
|
+
rb_define_const(rb_mGrnOperation, "OBJECT_SEARCH",
|
167
|
+
UINT2NUM(GRN_OP_OBJ_SEARCH));
|
168
|
+
rb_define_const(rb_mGrnOperation, "EXPRESSION_GET_VARIABLE",
|
169
|
+
UINT2NUM(GRN_OP_EXPR_GET_VAR));
|
170
|
+
rb_define_const(rb_mGrnOperation, "TABLE_CREATE",
|
171
|
+
UINT2NUM(GRN_OP_TABLE_CREATE));
|
172
|
+
rb_define_const(rb_mGrnOperation, "TABLE_SELECT",
|
173
|
+
UINT2NUM(GRN_OP_TABLE_SELECT));
|
174
|
+
rb_define_const(rb_mGrnOperation, "TABLE_SORT",
|
175
|
+
UINT2NUM(GRN_OP_TABLE_SORT));
|
176
|
+
rb_define_const(rb_mGrnOperation, "TABLE_GROUP",
|
177
|
+
UINT2NUM(GRN_OP_TABLE_GROUP));
|
178
|
+
rb_define_const(rb_mGrnOperation, "JSON_PUT",
|
179
|
+
UINT2NUM(GRN_OP_JSON_PUT));
|
180
|
+
|
181
|
+
|
76
182
|
/*
|
77
183
|
rb_define_const(rb_mGrnOperation, "GEO_DISTANCE1",
|
78
184
|
UINT2NUM(GRN_OP_GEO_DISTANCE1));
|
data/ext/rb-grn-patricia-trie.c
CHANGED
@@ -150,6 +150,66 @@ rb_grn_patricia_trie_search (int argc, VALUE *argv, VALUE self)
|
|
150
150
|
return rb_result;
|
151
151
|
}
|
152
152
|
|
153
|
+
static VALUE
|
154
|
+
rb_grn_patricia_trie_scan (VALUE self, VALUE rb_string)
|
155
|
+
{
|
156
|
+
grn_ctx *context;
|
157
|
+
grn_obj *table;
|
158
|
+
VALUE rb_result = Qnil;
|
159
|
+
grn_pat_scan_hit hits[1024];
|
160
|
+
const char *string;
|
161
|
+
long string_length;
|
162
|
+
rb_grn_boolean block_given;
|
163
|
+
|
164
|
+
string = StringValuePtr(rb_string);
|
165
|
+
string_length = RSTRING_LEN(rb_string);
|
166
|
+
|
167
|
+
rb_grn_table_key_support_deconstruct(SELF(self), &table, &context,
|
168
|
+
NULL, NULL, NULL,
|
169
|
+
NULL, NULL, NULL);
|
170
|
+
|
171
|
+
block_given = rb_block_given_p();
|
172
|
+
if (!block_given)
|
173
|
+
rb_result = rb_ary_new();
|
174
|
+
|
175
|
+
while (string_length > 0) {
|
176
|
+
const char *rest;
|
177
|
+
int i, n_hits;
|
178
|
+
long previous_offset = 0;
|
179
|
+
|
180
|
+
n_hits = grn_pat_scan(context, (grn_pat *)table,
|
181
|
+
string, string_length,
|
182
|
+
hits, sizeof(hits) / sizeof(*hits),
|
183
|
+
&rest);
|
184
|
+
for (i = 0; i < n_hits; i++) {
|
185
|
+
VALUE record, term, matched_info;
|
186
|
+
|
187
|
+
if (hits[i].offset < previous_offset)
|
188
|
+
continue;
|
189
|
+
|
190
|
+
record = rb_grn_record_new(self, hits[i].id, Qnil);
|
191
|
+
term = rb_grn_context_rb_string_new(context,
|
192
|
+
string + hits[i].offset,
|
193
|
+
hits[i].length);
|
194
|
+
matched_info = rb_ary_new3(4,
|
195
|
+
record,
|
196
|
+
term,
|
197
|
+
UINT2NUM(hits[i].offset),
|
198
|
+
UINT2NUM(hits[i].length));
|
199
|
+
if (block_given) {
|
200
|
+
rb_yield(matched_info);
|
201
|
+
} else {
|
202
|
+
rb_ary_push(rb_result, matched_info);
|
203
|
+
}
|
204
|
+
previous_offset = hits[i].offset;
|
205
|
+
}
|
206
|
+
string_length -= rest - string;
|
207
|
+
string = rest;
|
208
|
+
}
|
209
|
+
|
210
|
+
return rb_result;
|
211
|
+
}
|
212
|
+
|
153
213
|
void
|
154
214
|
rb_grn_init_patricia_trie (VALUE mGrn)
|
155
215
|
{
|
@@ -162,4 +222,6 @@ rb_grn_init_patricia_trie (VALUE mGrn)
|
|
162
222
|
|
163
223
|
rb_define_method(rb_cGrnPatriciaTrie, "search",
|
164
224
|
rb_grn_patricia_trie_search, -1);
|
225
|
+
rb_define_method(rb_cGrnPatriciaTrie, "scan",
|
226
|
+
rb_grn_patricia_trie_scan, 1);
|
165
227
|
}
|
data/ext/rb-grn-snippet.c
CHANGED
@@ -18,10 +18,6 @@
|
|
18
18
|
|
19
19
|
#include "rb-grn.h"
|
20
20
|
|
21
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
22
|
-
# include <ruby/encoding.h>
|
23
|
-
#endif
|
24
|
-
|
25
21
|
#define SELF(object) (rb_rb_grn_snippet_from_ruby_object(object))
|
26
22
|
|
27
23
|
typedef struct _RbGrnSnippet RbGrnSnippet;
|
@@ -73,7 +69,8 @@ rb_rb_grn_snippet_free (void *object)
|
|
73
69
|
}
|
74
70
|
|
75
71
|
VALUE
|
76
|
-
rb_grn_snippet_to_ruby_object (grn_ctx *context, grn_snip *snippet
|
72
|
+
rb_grn_snippet_to_ruby_object (grn_ctx *context, grn_snip *snippet,
|
73
|
+
rb_grn_boolean owner)
|
77
74
|
{
|
78
75
|
RbGrnSnippet *rb_grn_snippet;
|
79
76
|
|
@@ -83,7 +80,7 @@ rb_grn_snippet_to_ruby_object (grn_ctx *context, grn_snip *snippet)
|
|
83
80
|
rb_grn_snippet = ALLOC(RbGrnSnippet);
|
84
81
|
rb_grn_snippet->context = context;
|
85
82
|
rb_grn_snippet->snippet = snippet;
|
86
|
-
rb_grn_snippet->owner =
|
83
|
+
rb_grn_snippet->owner = owner;
|
87
84
|
|
88
85
|
return Data_Wrap_Struct(rb_cGrnSnippet, NULL,
|
89
86
|
rb_rb_grn_snippet_free, rb_grn_snippet);
|
@@ -224,19 +221,16 @@ rb_grn_snippet_execute (VALUE self, VALUE rb_string)
|
|
224
221
|
unsigned int i, n_results, max_tagged_length;
|
225
222
|
VALUE rb_results;
|
226
223
|
char *result;
|
227
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
228
|
-
rb_encoding *encoding;
|
229
|
-
#endif
|
230
224
|
|
231
225
|
rb_grn_snippet = SELF(self);
|
232
226
|
context = rb_grn_snippet->context;
|
233
227
|
snippet = rb_grn_snippet->snippet;
|
234
228
|
|
235
|
-
string = StringValuePtr(rb_string);
|
236
|
-
string_length = RSTRING_LEN(rb_string);
|
237
229
|
#ifdef HAVE_RUBY_ENCODING_H
|
238
|
-
|
230
|
+
rb_string = rb_grn_context_rb_string_encode(context, rb_string);
|
239
231
|
#endif
|
232
|
+
string = StringValuePtr(rb_string);
|
233
|
+
string_length = RSTRING_LEN(rb_string);
|
240
234
|
|
241
235
|
rc = grn_snip_exec(context, snippet, string, string_length,
|
242
236
|
&n_results, &max_tagged_length);
|
@@ -250,11 +244,7 @@ rb_grn_snippet_execute (VALUE self, VALUE rb_string)
|
|
250
244
|
|
251
245
|
rc = grn_snip_get_result(context, snippet, i, result, &result_length);
|
252
246
|
rb_grn_rc_check(rc, self);
|
253
|
-
|
254
|
-
rb_result = rb_enc_str_new(result, result_length, encoding);
|
255
|
-
#else
|
256
|
-
rb_result = rb_str_new(result, result_length);
|
257
|
-
#endif
|
247
|
+
rb_result = rb_grn_context_rb_string_new(context, result, result_length);
|
258
248
|
rb_ary_push(rb_results, rb_result);
|
259
249
|
}
|
260
250
|
|
data/ext/rb-grn-table.c
CHANGED
@@ -813,9 +813,9 @@ rb_grn_table_sort (int argc, VALUE *argv, VALUE self)
|
|
813
813
|
grn_obj *result;
|
814
814
|
grn_table_sort_key *keys;
|
815
815
|
int i, n_keys;
|
816
|
-
int n_records, limit =
|
816
|
+
int n_records, offset = 0, limit = -1;
|
817
817
|
VALUE rb_keys, options;
|
818
|
-
VALUE rb_limit;
|
818
|
+
VALUE rb_offset, rb_limit;
|
819
819
|
VALUE *rb_sort_keys;
|
820
820
|
grn_table_cursor *cursor;
|
821
821
|
VALUE rb_result;
|
@@ -876,15 +876,19 @@ rb_grn_table_sort (int argc, VALUE *argv, VALUE self)
|
|
876
876
|
}
|
877
877
|
|
878
878
|
rb_grn_scan_options(options,
|
879
|
+
"offset", &rb_offset,
|
879
880
|
"limit", &rb_limit,
|
880
881
|
NULL);
|
881
882
|
|
883
|
+
if (!NIL_P(rb_offset))
|
884
|
+
offset = NUM2INT(rb_offset);
|
882
885
|
if (!NIL_P(rb_limit))
|
883
886
|
limit = NUM2INT(rb_limit);
|
884
887
|
|
885
888
|
result = grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY,
|
886
889
|
NULL, table);
|
887
|
-
n_records = grn_table_sort(context, table,
|
890
|
+
n_records = grn_table_sort(context, table, offset, limit,
|
891
|
+
result, keys, n_keys);
|
888
892
|
|
889
893
|
rb_result = rb_ary_new();
|
890
894
|
cursor = grn_table_cursor_open(context, result, NULL, 0, NULL, 0,
|
@@ -1240,13 +1244,93 @@ rb_grn_table_is_locked (int argc, VALUE *argv, VALUE self)
|
|
1240
1244
|
return CBOOL2RVAL(grn_obj_is_locked(context, table));
|
1241
1245
|
}
|
1242
1246
|
|
1247
|
+
/*
|
1248
|
+
* call-seq:
|
1249
|
+
* table.select(options) {|record| ...} -> Groonga::Hash
|
1250
|
+
* table.select(query, options) -> Groonga::Hash
|
1251
|
+
*
|
1252
|
+
* _table_からブロックまたは文字列で指定した条件にマッチする
|
1253
|
+
* レコードを返す。返されたテーブルには+expression+という特
|
1254
|
+
* 異メソッドがあり、指定した条件を表している
|
1255
|
+
* Groonga::Expressionを取得できる。
|
1256
|
+
* Groonga::Expression#snippetを使うことにより、指定した条件
|
1257
|
+
* 用のスニペットを簡単に生成できる。
|
1258
|
+
*
|
1259
|
+
* results = table.select do |record|
|
1260
|
+
* result["description"] =~ "groonga"
|
1261
|
+
* end
|
1262
|
+
* snippet = results.expression.snippet([["<em>", "</em>"]])
|
1263
|
+
* results.each do |record|
|
1264
|
+
* puts "#{record['name']}の説明文の中で「groonga」が含まれる部分"
|
1265
|
+
* snippet.execute(record["description"].each do |snippet|
|
1266
|
+
* puts "---"
|
1267
|
+
* puts "#{snippet}..."
|
1268
|
+
* puts "---"
|
1269
|
+
* end
|
1270
|
+
* end
|
1271
|
+
*
|
1272
|
+
* 出力例
|
1273
|
+
* Ruby/groongaの説明文の中で「groonga」が含まれる部分
|
1274
|
+
* ---
|
1275
|
+
* Ruby/<em>groonga</em>は<em>groonga</em>のいわゆるDB-APIの層の...
|
1276
|
+
* ---
|
1277
|
+
*
|
1278
|
+
* _query_には「[カラム名]:[演算子][値]」という書式で条件を
|
1279
|
+
* 指定する。演算子は以下の通り。
|
1280
|
+
*
|
1281
|
+
* [なし]
|
1282
|
+
* [カラム値] == [値]
|
1283
|
+
* [+!+]
|
1284
|
+
* [カラム値] != [値]
|
1285
|
+
* [+<+]
|
1286
|
+
* [カラム値] < [値]
|
1287
|
+
* [+>+]
|
1288
|
+
* [カラム値] > [値]
|
1289
|
+
* [+<=+]
|
1290
|
+
* [カラム値] <= [値]
|
1291
|
+
* [+>=+]
|
1292
|
+
* [カラム値] >= [値]
|
1293
|
+
* [+@+]
|
1294
|
+
* [カラム値]が[値]を含んでいるかどうか
|
1295
|
+
*
|
1296
|
+
* 例:
|
1297
|
+
* "name:daijiro" # "name"カラムの値が"daijiro"のレコードにマッチ
|
1298
|
+
* "description:@groonga" # "description"カラムに
|
1299
|
+
* # "groonga"を含んでいるレコードにマッチ
|
1300
|
+
*
|
1301
|
+
* ブロックで条件を指定する場合はGroonga::ExpressionBuilder
|
1302
|
+
* を参照。
|
1303
|
+
*
|
1304
|
+
* _options_に指定可能な値は以下の通り。
|
1305
|
+
*
|
1306
|
+
* [+:operator+]
|
1307
|
+
* マッチしたレコードをどのように扱うか。指定可能な値は以
|
1308
|
+
* 下の通り。省略した場合はGroonga::Operation::OR。
|
1309
|
+
*
|
1310
|
+
* [Groonga::Operation::OR]
|
1311
|
+
* マッチしたレコードを追加。すでにレコードが追加され
|
1312
|
+
* ている場合は何もしない。
|
1313
|
+
* [Groonga::Operation::AND]
|
1314
|
+
* マッチしたレコードのスコアを増加。マッチしなかった
|
1315
|
+
* レコードを削除。
|
1316
|
+
* [Groonga::Operation::BUT]
|
1317
|
+
* マッチしたレコードを削除。
|
1318
|
+
* [Groonga::Operation::ADJUST]
|
1319
|
+
* マッチしたレコードのスコアを増加。
|
1320
|
+
*
|
1321
|
+
* [+:result+]
|
1322
|
+
* 検索結果を格納するテーブル。マッチしたレコードが追加さ
|
1323
|
+
* れていく。省略した場合は新しくテーブルを作成して返す。
|
1324
|
+
*
|
1325
|
+
* [+:name+]
|
1326
|
+
* 条件の名前。省略した場合は名前を付けない。
|
1327
|
+
*/
|
1243
1328
|
static VALUE
|
1244
1329
|
rb_grn_table_select (int argc, VALUE *argv, VALUE self)
|
1245
1330
|
{
|
1246
1331
|
grn_ctx *context;
|
1247
1332
|
grn_obj *table, *result, *expression;
|
1248
1333
|
grn_operator operator = GRN_OP_OR;
|
1249
|
-
grn_rc rc;
|
1250
1334
|
VALUE rb_query = Qnil, query_or_options, options;
|
1251
1335
|
VALUE rb_name, rb_operator, rb_result;
|
1252
1336
|
VALUE rb_expression, builder;
|
@@ -1258,11 +1342,6 @@ rb_grn_table_select (int argc, VALUE *argv, VALUE self)
|
|
1258
1342
|
NULL, NULL, NULL);
|
1259
1343
|
|
1260
1344
|
if (RVAL2CBOOL(rb_obj_is_kind_of(query_or_options, rb_cString))) {
|
1261
|
-
if (rb_block_given_p())
|
1262
|
-
rb_raise(rb_eArgError,
|
1263
|
-
"should not specify both of query string and "
|
1264
|
-
"expression block: %s",
|
1265
|
-
rb_grn_inspect(rb_ary_new4(argc, argv)));
|
1266
1345
|
rb_query = query_or_options;
|
1267
1346
|
} else {
|
1268
1347
|
if (!NIL_P(options))
|
@@ -1292,31 +1371,22 @@ rb_grn_table_select (int argc, VALUE *argv, VALUE self)
|
|
1292
1371
|
result = RVAL2GRNTABLE(rb_result, &context);
|
1293
1372
|
}
|
1294
1373
|
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
rb_grn_object_deconstruct(RB_GRN_OBJECT(DATA_PTR(rb_expression)),
|
1299
|
-
&expression, NULL,
|
1300
|
-
NULL, NULL, NULL, NULL);
|
1301
|
-
} else {
|
1302
|
-
const char *name = NULL, *query;
|
1303
|
-
unsigned name_size = 0, query_size;
|
1304
|
-
|
1305
|
-
query = StringValueCStr(rb_query);
|
1306
|
-
query_size = RSTRING_LEN(rb_query);
|
1307
|
-
if (!NIL_P(rb_name)) {
|
1308
|
-
name = StringValueCStr(rb_name);
|
1309
|
-
name_size = RSTRING_LEN(rb_name);
|
1310
|
-
}
|
1311
|
-
expression = grn_expr_create_from_str(context, name, name_size,
|
1312
|
-
query, query_size,
|
1313
|
-
table, NULL);
|
1374
|
+
builder = rb_grn_record_expression_builder_new(self, rb_name);
|
1375
|
+
if (!NIL_P(rb_query)) {
|
1376
|
+
rb_funcall(builder, rb_intern("query="), 1, rb_query);
|
1314
1377
|
}
|
1378
|
+
rb_expression = rb_grn_record_expression_builder_build(builder);
|
1379
|
+
rb_grn_object_deconstruct(RB_GRN_OBJECT(DATA_PTR(rb_expression)),
|
1380
|
+
&expression, NULL,
|
1381
|
+
NULL, NULL, NULL, NULL);
|
1315
1382
|
|
1316
|
-
|
1317
|
-
rc = grn_table_select(context, table, expression, result, operator);
|
1383
|
+
grn_table_select(context, table, expression, result, operator);
|
1318
1384
|
rb_grn_context_check(context, self);
|
1319
|
-
|
1385
|
+
|
1386
|
+
rb_attr(rb_singleton_class(rb_result),
|
1387
|
+
rb_intern("expression"),
|
1388
|
+
RB_GRN_TRUE, RB_GRN_FALSE, RB_GRN_FALSE);
|
1389
|
+
rb_iv_set(rb_result, "@expression", rb_expression);
|
1320
1390
|
|
1321
1391
|
return rb_result;
|
1322
1392
|
}
|