1 /* -*- c-basic-offset: 2 -*- */
2 /*
3   Copyright(C) 2009-2018  Brazil
4   Copyright(C) 2018-2022  Sutou Kouhei <kou@clear-code.com>
5 
6   This library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public
8   License as published by the Free Software Foundation; either
9   version 2.1 of the License, or (at your option) any later version.
10 
11   This library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15 
16   You should have received a copy of the GNU Lesser General Public
17   License along with this library; if not, write to the Free Software
18   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19 */
20 module groonga_d.table;
21 
22 
23 private static import groonga_d.groonga;
24 private static import groonga_d.hash;
25 private static import groonga_d.posting;
26 
27 extern(C):
28 nothrow @nogc:
29 
30 enum GRN_TABLE_MAX_KEY_SIZE = 0x1000;
31 
32 //GRN_API
33 groonga_d.groonga.grn_obj* grn_table_create(groonga_d.groonga.grn_ctx* ctx, const (char)* name, uint name_size, const (char)* path, groonga_d.groonga.grn_table_flags flags, groonga_d.groonga.grn_obj* key_type, groonga_d.groonga.grn_obj* value_type);
34 
35 //GRN_API
36 groonga_d.groonga.grn_obj* grn_table_create_similar(groonga_d.groonga.grn_ctx* ctx, const (char)* name, uint name_size, const (char)* path, groonga_d.groonga.grn_obj* base_table);
37 
38 /+
39 #define GRN_TABLE_OPEN_OR_CREATE(ctx, name, name_size, path, flags, key_type, value_type, table) (((table) = grn_ctx_get((ctx), (name), (name_size))) || ((table) = grn_table_create((ctx), (name), (name_size), (path), (flags), (key_type), (value_type))))
40 +/
41 
42 /* TODO: int *added -> groonga_d.groonga.grn_bool *added */
43 
44 //GRN_API
45 groonga_d.groonga.grn_id grn_table_add(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (void)* key, uint key_size, int* added);
46 
47 //GRN_API
48 groonga_d.groonga.grn_id grn_table_get(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (void)* key, uint key_size);
49 
50 //GRN_API
51 groonga_d.groonga.grn_id grn_table_at(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_id id);
52 
53 //GRN_API
54 groonga_d.groonga.grn_id grn_table_lcp_search(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (void)* key, uint key_size);
55 
56 //GRN_API
57 int grn_table_get_key(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_id id, void* keybuf, int buf_size);
58 
59 //GRN_API
60 groonga_d.groonga.grn_rc grn_table_delete(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (void)* key, uint key_size);
61 
62 //GRN_API
63 groonga_d.groonga.grn_rc grn_table_delete_by_id(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_id id);
64 
65 //GRN_API
66 groonga_d.groonga.grn_rc grn_table_update_by_id(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_id id, const (void)* dest_key, uint dest_key_size);
67 
68 //GRN_API
69 groonga_d.groonga.grn_rc grn_table_update(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (void)* src_key, uint src_key_size, const (void)* dest_key, uint dest_key_size);
70 
71 //GRN_API
72 groonga_d.groonga.grn_rc grn_table_truncate(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table);
73 
74 enum GRN_CURSOR_ASCENDING = 0x00 << 0;
75 enum GRN_CURSOR_DESCENDING = 0x01 << 0;
76 enum GRN_CURSOR_GE = 0x00 << 1;
77 enum GRN_CURSOR_GT = 0x01 << 1;
78 enum GRN_CURSOR_LE = 0x00 << 2;
79 enum GRN_CURSOR_LT = 0x01 << 2;
80 enum GRN_CURSOR_BY_KEY = 0x00 << 3;
81 enum GRN_CURSOR_BY_ID = 0x01 << 3;
82 enum GRN_CURSOR_PREFIX = 0x01 << 4;
83 enum GRN_CURSOR_SIZE_BY_BIT = 0x01 << 5;
84 enum GRN_CURSOR_RK = 0x01 << 6;
85 
86 //GRN_API
87 groonga_d.groonga.grn_table_cursor* grn_table_cursor_open(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (void)* min, uint min_size, const (void)* max, uint max_size, int offset, int limit, int flags);
88 
89 //GRN_API
90 groonga_d.groonga.grn_rc grn_table_cursor_close(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc);
91 
92 //GRN_API
93 groonga_d.groonga.grn_id grn_table_cursor_next(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc);
94 
95 //GRN_API
96 int grn_table_cursor_get_key(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc, void** key);
97 
98 //GRN_API
99 int grn_table_cursor_get_value(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc, void** value);
100 
101 //GRN_API
102 uint grn_table_cursor_get_key_value(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc, void** key, uint* key_size, void** value);
103 
104 //GRN_API
105 groonga_d.groonga.grn_rc grn_table_cursor_set_value(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc, const (void)* value, int flags);
106 
107 //GRN_API
108 groonga_d.groonga.grn_rc grn_table_cursor_delete(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc);
109 
110 //GRN_API
111 size_t grn_table_cursor_get_max_n_records(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* cursor);
112 
113 //GRN_API
114 groonga_d.groonga.grn_obj* grn_table_cursor_table(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc);
115 
116 //GRN_API
117 groonga_d.groonga.grn_obj* grn_index_cursor_open(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* tc, groonga_d.groonga.grn_obj* index, groonga_d.groonga.grn_id rid_min, groonga_d.groonga.grn_id rid_max, int flags);
118 
119 //GRN_API
120 groonga_d.groonga.grn_obj* grn_index_cursor_get_index_column(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor);
121 
122 //GRN_API
123 groonga_d.groonga.grn_rc grn_index_cursor_set_term_id(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor, groonga_d.groonga.grn_id term_id);
124 
125 //GRN_API
126 groonga_d.groonga.grn_rc grn_index_cursor_set_section_id(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor, uint section_id);
127 
128 //GRN_API
129 uint grn_index_cursor_get_section_id(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor);
130 
131 //GRN_API
132 groonga_d.groonga.grn_rc grn_index_cursor_set_scale(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor, float scale);
133 
134 //GRN_API
135 groonga_d.groonga.grn_rc grn_index_cursor_set_scales(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor, float* scales, size_t n_scales);
136 
137 //GRN_API
138 groonga_d.groonga.grn_rc grn_index_cursor_set_start_position(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor, uint position);
139 
140 //GRN_API
141 groonga_d.groonga.grn_rc grn_index_cursor_reset_start_position(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor);
142 
143 //GRN_API
144 uint grn_index_cursor_get_start_position(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor);
145 
146 //GRN_API
147 groonga_d.posting.grn_posting* grn_index_cursor_next(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* index_cursor, groonga_d.groonga.grn_id* term_id);
148 
149 alias grn_table_cursor_foreach_func = extern (C) nothrow @nogc groonga_d.groonga.grn_rc function(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* cursor, groonga_d.groonga.grn_id id, void* user_data);
150 
151 //GRN_API
152 groonga_d.groonga.grn_rc grn_table_cursor_foreach(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_table_cursor* cursor, grn_table_cursor_foreach_func func, void* user_data);
153 
154 /+
155 #define GRN_TABLE_EACH(ctx, table, head, tail, id, key, key_size, value, block) (ctx)->errlvl = groonga_d.groonga.grn_log_level.GRN_LOG_NOTICE; (ctx)->rc = groonga_d.groonga.grn_rc.GRN_SUCCESS; if ((ctx)->seqno & 1) { (ctx)->subno++; } else { (ctx)->seqno++; } if (table) { switch ((table)->header.type) { case groonga_d.groonga.GRN_TABLE_PAT_KEY : GRN_PAT_EACH((ctx), (grn_pat *)(table), (id), (key), (key_size), (value), block); break; case groonga_d.groonga.GRN_TABLE_DAT_KEY : GRN_DAT_EACH((ctx), (grn_dat *)(table), (id), (key), (key_size), block); break; case groonga_d.groonga.GRN_TABLE_HASH_KEY : GRN_HASH_EACH((ctx), (groonga_d.hash.grn_hash *)(table), (id), (key), (key_size), (value), block); break; case groonga_d.groonga.GRN_TABLE_NO_KEY : GRN_ARRAY_EACH((ctx), (grn_array *)(table), (head), (tail), (id), (value), block); break; } } if ((ctx)->subno) { (ctx)->subno--; } else { (ctx)->seqno++; }
156 
157 #define GRN_TABLE_EACH_BEGIN(ctx, table, cursor, id) do { if ((table)) { groonga_d.groonga.grn_table_cursor *cursor; cursor = grn_table_cursor_open((ctx), (table), NULL, 0, NULL, 0, 0, -1, GRN_CURSOR_ASCENDING); if (cursor) { groonga_d.groonga.grn_id id; while ((id = grn_table_cursor_next((ctx), cursor))) {
158 
159 #define GRN_TABLE_EACH_BEGIN_FLAGS(ctx, table, cursor, id, flags) do { if ((table)) { groonga_d.groonga.grn_table_cursor *cursor; cursor = grn_table_cursor_open((ctx), (table), NULL, 0, NULL, 0, 0, -1, (flags)); if (cursor) { groonga_d.groonga.grn_id id; while ((id = grn_table_cursor_next((ctx), cursor))) {
160 
161 #define GRN_TABLE_EACH_BEGIN_MIN(ctx, table, cursor, id, min, min_size, flags) do { if ((table)) { groonga_d.groonga.grn_table_cursor *cursor; cursor = grn_table_cursor_open((ctx), (table), (min), (min_size), NULL, 0, 0, -1, (flags)); if (cursor) { groonga_d.groonga.grn_id id; while ((id = grn_table_cursor_next((ctx), cursor))) {
162 
163 #define GRN_TABLE_EACH_END(ctx, cursor) } grn_table_cursor_close((ctx), cursor); } } } while (0)
164 +/
165 
166 	alias grn_table_sort_key = _grn_table_sort_key;
167 	alias grn_table_sort_flags = ubyte;
168 
169 enum GRN_TABLE_SORT_ASC = 0x00 << 0;
170 enum GRN_TABLE_SORT_DESC = 0x01 << 0;
171 
172 	struct _grn_table_sort_key
173 	{
174 		groonga_d.groonga.grn_obj* key;
175 		grn_table_sort_flags flags;
176 		int offset;
177 	}
178 
179 	//GRN_API
180 	int grn_table_sort(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, int offset, int limit, groonga_d.groonga.grn_obj* result, grn_table_sort_key* keys, int n_keys);
181 
182 	alias grn_table_group_result = _grn_table_group_result;
183 	alias grn_table_group_flags = uint;
184 
185 enum GRN_TABLE_GROUP_CALC_COUNT = 0x01 << 3;
186 enum GRN_TABLE_GROUP_CALC_MAX = 0x01 << 4;
187 enum GRN_TABLE_GROUP_CALC_MIN = 0x01 << 5;
188 enum GRN_TABLE_GROUP_CALC_SUM = 0x01 << 6;
189 	/* Deprecated since 10.0.4. Use GRN_TABLE_GROUP_CALC_MEAN instead. */
190 enum GRN_TABLE_GROUP_CALC_AVG = GRN_TABLE_GROUP_CALC_MEAN;
191 enum GRN_TABLE_GROUP_CALC_MEAN = 0x01 << 7;
192 enum GRN_TABLE_GROUP_CALC_AGGREGATOR = 0x01 << 8;
193 enum GRN_TABLE_GROUP_LIMIT = 0x01 << 9;
194 
195 	struct _grn_table_group_aggregator;
196 	alias grn_table_group_aggregator = _grn_table_group_aggregator;
197 
198 	//GRN_API
199 	grn_table_group_aggregator* grn_table_group_aggregator_open(groonga_d.groonga.grn_ctx* ctx);
200 
201 	//GRN_API
202 	groonga_d.groonga.grn_rc grn_table_group_aggregator_close(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator);
203 
204 	//GRN_API
205 	groonga_d.groonga.grn_rc grn_table_group_aggregator_set_output_column_name(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator, const (char)* name, int name_len);
206 
207 	//GRN_API
208 	const (char)* grn_table_group_aggregator_get_output_column_name(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator, uint* len);
209 
210 	//GRN_API
211 	groonga_d.groonga.grn_rc grn_table_group_aggregator_set_output_column_type(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator, groonga_d.groonga.grn_obj* type);
212 
213 	//GRN_API
214 	groonga_d.groonga.grn_obj* grn_table_group_aggregator_get_output_column_type(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator);
215 
216 	//GRN_API
217 	groonga_d.groonga.grn_rc grn_table_group_aggregator_set_output_column_flags(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator, groonga_d.groonga.grn_column_flags flags);
218 
219 	//GRN_API
220 	groonga_d.groonga.grn_column_flags grn_table_group_aggregator_get_output_column_flags(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator);
221 
222 	//GRN_API
223 	groonga_d.groonga.grn_rc grn_table_group_aggregator_set_expression(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator, const (char)* expression, int expression_len);
224 
225 	//GRN_API
226 	const (char)* grn_table_group_aggregator_get_expression(groonga_d.groonga.grn_ctx* ctx, grn_table_group_aggregator* aggregator, uint* expression_len);
227 
228 	struct _grn_table_group_result
229 	{
230 		groonga_d.groonga.grn_obj* table;
231 		ubyte key_begin;
232 		ubyte key_end;
233 		int limit;
234 		grn_table_group_flags flags;
235 		groonga_d.groonga.grn_operator op;
236 		uint max_n_subrecs;
237 		groonga_d.groonga.grn_obj* calc_target;
238 		grn_table_group_aggregator** aggregators;
239 		uint n_aggregators;
240 	}
241 
242 	//GRN_API
243 	groonga_d.groonga.grn_rc grn_table_group(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, grn_table_sort_key* keys, int n_keys, grn_table_group_result* results, int n_results);
244 
245 	//GRN_API
246 	grn_table_sort_key* grn_table_group_keys_parse(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (char)* raw_sort_keys, int raw_sort_keys_size, int* n_keys);
247 
248 	//GRN_API
249 	groonga_d.groonga.grn_rc grn_table_setoperation(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table1, groonga_d.groonga.grn_obj* table2, groonga_d.groonga.grn_obj* res, groonga_d.groonga.grn_operator op);
250 
251 	//GRN_API
252 	groonga_d.groonga.grn_rc grn_table_difference(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table1, groonga_d.groonga.grn_obj* table2, groonga_d.groonga.grn_obj* res1, groonga_d.groonga.grn_obj* res2);
253 
254 	//GRN_API
255 	int grn_table_columns(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (char)* name, uint name_size, groonga_d.groonga.grn_obj* res);
256 
257 	//GRN_API
258 	uint grn_table_size(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table);
259 
260 	//GRN_API
261 	groonga_d.groonga.grn_rc grn_table_rename(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (char)* name, uint name_size);
262 
263 	//GRN_API
264 	groonga_d.groonga.grn_obj* grn_table_select(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_obj* expr, groonga_d.groonga.grn_obj* result_set, groonga_d.groonga.grn_operator op);
265 
266 	//GRN_API
267 	grn_table_sort_key* grn_table_sort_key_from_str(groonga_d.groonga.grn_ctx* ctx, const (char)* str, uint str_size, groonga_d.groonga.grn_obj* table, uint* nkeys);
268 
269 	//GRN_API
270 	grn_table_sort_key* grn_table_sort_keys_parse(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (char)* raw_sort_keys, int raw_sort_keys_size, int* n_keys);
271 
272 	//GRN_API
273 	groonga_d.groonga.grn_rc grn_table_sort_key_close(groonga_d.groonga.grn_ctx* ctx, grn_table_sort_key* keys, uint nkeys);
274 
275 	//GRN_API
276 	groonga_d.groonga.grn_bool grn_table_is_grouped(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table);
277 
278 	//GRN_API
279 	uint grn_table_max_n_subrecs(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table);
280 
281 	//GRN_API
282 	groonga_d.groonga.grn_obj* grn_table_create_for_group(groonga_d.groonga.grn_ctx* ctx, const (char)* name, uint name_size, const (char)* path, groonga_d.groonga.grn_obj* group_key, groonga_d.groonga.grn_obj* value_type, uint max_n_subrecs);
283 
284 	//GRN_API
285 	uint grn_table_get_subrecs(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_id id, groonga_d.groonga.grn_id* subrecbuf, int* scorebuf, int buf_size);
286 
287 	//GRN_API
288 	groonga_d.groonga.grn_obj* grn_table_tokenize(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, const (char)* str, uint str_len, groonga_d.groonga.grn_obj* buf, groonga_d.groonga.grn_bool addp);
289 
290 	//GRN_API
291 	groonga_d.groonga.grn_rc grn_table_apply_expr(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_obj* output_column, groonga_d.groonga.grn_obj* expr);
292 
293 	//GRN_API
294 	groonga_d.groonga.grn_id grn_table_find_reference_object(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table);
295 
296 	//GRN_API
297 	groonga_d.groonga.grn_rc grn_table_copy(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* from, groonga_d.groonga.grn_obj* to);
298 
299 	//GRN_API
300 	groonga_d.groonga.grn_rc grn_table_get_duplicated_keys(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_obj** duplicated_keys);
301 
302 	//GRN_API
303 	bool grn_table_have_duplicated_keys(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table);
304 
305 	extern struct _grn_table_selector;
306 	alias grn_table_selector = _grn_table_selector;
307 
308 	//GRN_API
309 	grn_table_selector* grn_table_selector_open(groonga_d.groonga.grn_ctx* ctx, groonga_d.groonga.grn_obj* table, groonga_d.groonga.grn_obj* expr, groonga_d.groonga.grn_operator op);
310 
311 	//GRN_API
312 	groonga_d.groonga.grn_rc grn_table_selector_close(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector);
313 
314 	//GRN_API
315 	groonga_d.groonga.grn_id grn_table_selector_get_min_id(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector);
316 
317 	//GRN_API
318 	groonga_d.groonga.grn_rc grn_table_selector_set_min_id(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector, groonga_d.groonga.grn_id min_id);
319 
320 	//GRN_API
321 	bool grn_table_selector_get_use_sequential_scan(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector);
322 
323 	//GRN_API
324 	groonga_d.groonga.grn_rc grn_table_selector_set_use_sequential_scan(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector, bool use);
325 
326 	//GRN_API
327 	float grn_table_selector_get_weight_factor(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector);
328 
329 	//GRN_API
330 	groonga_d.groonga.grn_rc grn_table_selector_set_weight_factor(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector, float factor);
331 
332 	//GRN_API
333 	double grn_table_selector_get_enough_filtered_ratio(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector);
334 
335 	//GRN_API
336 	groonga_d.groonga.grn_rc grn_table_selector_set_enough_filtered_ratio(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector, double ratio);
337 
338 	//GRN_API
339 	long grn_table_selector_get_max_n_enough_filtered_records(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector);
340 
341 	//GRN_API
342 	groonga_d.groonga.grn_rc grn_table_selector_set_max_n_enough_filtered_records(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector, long n);
343 
344 	//GRN_API
345 	groonga_d.groonga.grn_obj* grn_table_selector_select(groonga_d.groonga.grn_ctx* ctx, grn_table_selector* table_selector, groonga_d.groonga.grn_obj* result_set);