rroonga 5.0.0 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/Rakefile +1 -10
  4. data/ext/groonga/extconf.rb +3 -1
  5. data/ext/groonga/rb-grn-array.c +1 -1
  6. data/ext/groonga/rb-grn-column.c +33 -67
  7. data/ext/groonga/rb-grn-context.c +5 -5
  8. data/ext/groonga/rb-grn-database.c +2 -2
  9. data/ext/groonga/rb-grn-double-array-trie.c +4 -2
  10. data/ext/groonga/rb-grn-encoding-support.c +7 -1
  11. data/ext/groonga/rb-grn-equal-operator.c +85 -0
  12. data/ext/groonga/rb-grn-exception.c +17 -0
  13. data/ext/groonga/rb-grn-expression.c +85 -43
  14. data/ext/groonga/rb-grn-greater-equal-operator.c +88 -0
  15. data/ext/groonga/rb-grn-greater-operator.c +85 -0
  16. data/ext/groonga/rb-grn-hash.c +1 -1
  17. data/ext/groonga/rb-grn-index-column.c +150 -11
  18. data/ext/groonga/rb-grn-less-equal-operator.c +88 -0
  19. data/ext/groonga/rb-grn-less-operator.c +85 -0
  20. data/ext/groonga/rb-grn-logger.c +5 -5
  21. data/ext/groonga/rb-grn-match-operator.c +86 -0
  22. data/ext/groonga/rb-grn-normalizer.c +8 -1
  23. data/ext/groonga/rb-grn-not-equal-operator.c +85 -0
  24. data/ext/groonga/rb-grn-object.c +170 -36
  25. data/ext/groonga/rb-grn-operator.c +395 -172
  26. data/ext/groonga/rb-grn-patricia-trie.c +10 -8
  27. data/ext/groonga/rb-grn-plugin.c +51 -3
  28. data/ext/groonga/rb-grn-prefix-operator.c +86 -0
  29. data/ext/groonga/rb-grn-procedure-type.c +4 -0
  30. data/ext/groonga/rb-grn-query-logger.c +4 -4
  31. data/ext/groonga/rb-grn-regexp-operator.c +85 -0
  32. data/ext/groonga/rb-grn-snippet.c +1 -1
  33. data/ext/groonga/rb-grn-table-key-support.c +9 -5
  34. data/ext/groonga/rb-grn-table.c +52 -66
  35. data/ext/groonga/rb-grn-type.c +1 -1
  36. data/ext/groonga/rb-grn-utils.c +22 -3
  37. data/ext/groonga/rb-grn.h +31 -4
  38. data/ext/groonga/rb-groonga.c +9 -9
  39. data/lib/groonga/context.rb +31 -0
  40. data/lib/groonga/expression-builder.rb +14 -1
  41. data/lib/groonga/record.rb +10 -8
  42. data/lib/groonga/schema.rb +3 -1
  43. data/rroonga-build.rb +2 -2
  44. data/rroonga.gemspec +3 -3
  45. data/test/groonga-test-utils.rb +4 -0
  46. data/test/test-column.rb +28 -26
  47. data/test/test-exception.rb +1 -0
  48. data/test/test-expression-builder.rb +83 -1
  49. data/test/test-expression.rb +80 -48
  50. data/test/test-index-column.rb +102 -29
  51. data/test/test-normalizer.rb +35 -29
  52. data/test/test-operator.rb +214 -0
  53. data/test/test-plugin.rb +24 -6
  54. data/test/test-procedure.rb +29 -0
  55. data/test/test-schema-type.rb +14 -0
  56. data/test/test-table-select-mecab.rb +1 -4
  57. data/test/test-table.rb +7 -0
  58. data/test/test-token-regexp.rb +30 -0
  59. data/test/test-type.rb +24 -0
  60. metadata +61 -49
  61. data/doc/text/news.textile +0 -1217
@@ -0,0 +1,88 @@
1
+ /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
+ /*
3
+ Copyright (C) 2015 Kouhei Sutou <kou@clear-code.com>
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Lesser General Public
7
+ License version 2.1 as published by the Free Software Foundation.
8
+
9
+ This library is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ Lesser General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Lesser General Public
15
+ License along with this library; if not, write to the Free Software
16
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+ */
18
+
19
+ #include "rb-grn.h"
20
+
21
+ VALUE rb_cGrnLessEqualOperator;
22
+
23
+ /*
24
+ * Executes a less-or-equal operation.
25
+ *
26
+ * @example Executes less-or-equal operations with the default context
27
+ * Groonga::Operator::LESS_EQUAL.exec(1, 1) # => true
28
+ * Groonga::Operator::LESS_EQUAL.exec(1, 2) # => true
29
+ * Groonga::Operator::LESS_EQUAL.exec(2, 1) # => false
30
+ *
31
+ * @example Executes less-or-equal operations with the specified context
32
+ * context = Groonga::Context.new
33
+ * Groonga::Operator::LESS_EQUAL.exec(1, 1,
34
+ * :context => context) # => true
35
+ * Groonga::Operator::LESS_EQUAL.exec(1, 2,
36
+ * :context => context) # => true
37
+ * Groonga::Operator::LESS_EQUAL.exec(2, 1,
38
+ * :context => context) # => false
39
+ *
40
+ * @overload exec(x, y, options={})
41
+ * @param x [::Object] The left hand side value.
42
+ * @param y [::Object] The right hand side value.
43
+ * @param options [::Hash] The options.
44
+ * @option options [Groonga::Context] (Groonga::Context.default)
45
+ * The context to executes the operation.
46
+ * @return [Boolean] `true` if `x` is less than or equal to`y`,
47
+ * `false` otherwise.
48
+ */
49
+ static VALUE
50
+ rb_grn_less_equal_operator_exec (int argc, VALUE *argv, VALUE self)
51
+ {
52
+ grn_bool less_equal;
53
+ VALUE rb_x;
54
+ VALUE rb_y;
55
+ VALUE rb_options;
56
+ VALUE rb_context;
57
+ grn_ctx *context;
58
+ grn_obj x;
59
+ grn_obj y;
60
+
61
+ rb_scan_args(argc, argv, "21", &rb_x, &rb_y, &rb_options);
62
+
63
+ rb_grn_scan_options(rb_options,
64
+ "context", &rb_context,
65
+ NULL);
66
+ context = rb_grn_context_ensure(&rb_context);
67
+
68
+ GRN_VOID_INIT(&x);
69
+ GRN_VOID_INIT(&y);
70
+ RVAL2GRNBULK(rb_x, context, &x);
71
+ RVAL2GRNBULK(rb_y, context, &y);
72
+ less_equal = grn_operator_exec_less_equal(context, &x, &y);
73
+ GRN_OBJ_FIN(context, &x);
74
+ GRN_OBJ_FIN(context, &y);
75
+
76
+ return CBOOL2RVAL(less_equal);
77
+ }
78
+
79
+ void
80
+ rb_grn_init_less_equal_operator (VALUE mGrn)
81
+ {
82
+ rb_cGrnLessEqualOperator = rb_define_class_under(mGrn,
83
+ "LessEqualOperator",
84
+ rb_cGrnOperator);
85
+
86
+ rb_define_method(rb_cGrnLessEqualOperator, "exec",
87
+ rb_grn_less_equal_operator_exec, -1);
88
+ }
@@ -0,0 +1,85 @@
1
+ /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
+ /*
3
+ Copyright (C) 2015 Kouhei Sutou <kou@clear-code.com>
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Lesser General Public
7
+ License version 2.1 as published by the Free Software Foundation.
8
+
9
+ This library is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ Lesser General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Lesser General Public
15
+ License along with this library; if not, write to the Free Software
16
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+ */
18
+
19
+ #include "rb-grn.h"
20
+
21
+ VALUE rb_cGrnLessOperator;
22
+
23
+ /*
24
+ * Executes a less operation.
25
+ *
26
+ * @example Executes less operations with the default context
27
+ * Groonga::Operator::LESS.exec(1, 2) # => true
28
+ * Groonga::Operator::LESS.exec(2, 1) # => false
29
+ *
30
+ * @example Executes less operations with the specified context
31
+ * context = Groonga::Context.new
32
+ * Groonga::Operator::LESS.exec(1, 2,
33
+ * :context => context) # => true
34
+ * Groonga::Operator::LESS.exec(2, 1,
35
+ * :context => context) # => false
36
+ *
37
+ * @overload exec(x, y, options={})
38
+ * @param x [::Object] The left hand side value.
39
+ * @param y [::Object] The right hand side value.
40
+ * @param options [::Hash] The options.
41
+ * @option options [Groonga::Context] (Groonga::Context.default)
42
+ * The context to executes the operation.
43
+ * @return [Boolean] `true` if `x` is less than `y`, `false`
44
+ * otherwise.
45
+ */
46
+ static VALUE
47
+ rb_grn_less_operator_exec (int argc, VALUE *argv, VALUE self)
48
+ {
49
+ grn_bool less;
50
+ VALUE rb_x;
51
+ VALUE rb_y;
52
+ VALUE rb_options;
53
+ VALUE rb_context;
54
+ grn_ctx *context;
55
+ grn_obj x;
56
+ grn_obj y;
57
+
58
+ rb_scan_args(argc, argv, "21", &rb_x, &rb_y, &rb_options);
59
+
60
+ rb_grn_scan_options(rb_options,
61
+ "context", &rb_context,
62
+ NULL);
63
+ context = rb_grn_context_ensure(&rb_context);
64
+
65
+ GRN_VOID_INIT(&x);
66
+ GRN_VOID_INIT(&y);
67
+ RVAL2GRNBULK(rb_x, context, &x);
68
+ RVAL2GRNBULK(rb_y, context, &y);
69
+ less = grn_operator_exec_less(context, &x, &y);
70
+ GRN_OBJ_FIN(context, &x);
71
+ GRN_OBJ_FIN(context, &y);
72
+
73
+ return CBOOL2RVAL(less);
74
+ }
75
+
76
+ void
77
+ rb_grn_init_less_operator (VALUE mGrn)
78
+ {
79
+ rb_cGrnLessOperator = rb_define_class_under(mGrn,
80
+ "LessOperator",
81
+ rb_cGrnOperator);
82
+
83
+ rb_define_method(rb_cGrnLessOperator, "exec",
84
+ rb_grn_less_operator_exec, -1);
85
+ }
@@ -159,10 +159,10 @@ rb_grn_logger_log (grn_ctx *ctx, grn_log_level level,
159
159
  /* TODO: use rb_protect(). */
160
160
  rb_funcall(handler, id_log, 5,
161
161
  GRNLOGLEVEL2RVAL(level),
162
- rb_str_new2(timestamp),
163
- rb_str_new2(title),
164
- rb_str_new2(message),
165
- rb_str_new2(location));
162
+ rb_str_new_cstr(timestamp),
163
+ rb_str_new_cstr(title),
164
+ rb_str_new_cstr(message),
165
+ rb_str_new_cstr(location));
166
166
  }
167
167
 
168
168
  static void
@@ -359,7 +359,7 @@ rb_grn_logger_s_get_path (VALUE klass)
359
359
 
360
360
  path = grn_default_logger_get_path();
361
361
  if (path) {
362
- rb_path = rb_str_new2(path);
362
+ rb_path = rb_str_new_cstr(path);
363
363
  }
364
364
  return rb_path;
365
365
  }
@@ -0,0 +1,86 @@
1
+ /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
+ /*
3
+ Copyright (C) 2015 Kouhei Sutou <kou@clear-code.com>
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Lesser General Public
7
+ License version 2.1 as published by the Free Software Foundation.
8
+
9
+ This library is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ Lesser General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Lesser General Public
15
+ License along with this library; if not, write to the Free Software
16
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+ */
18
+
19
+ #include "rb-grn.h"
20
+
21
+ VALUE rb_cGrnMatchOperator;
22
+
23
+ /*
24
+ * Executes a match operation. Match operation checks whether `text`
25
+ * contains `sub_text` or not.
26
+ *
27
+ * @example Executes match operations with the default context
28
+ * Groonga::Operator::MATCH.exec("Hello Rroonga", "Rroonga") # => true
29
+ * Groonga::Operator::MATCH.exec("Hello Rroonga", "Groonga") # => false
30
+ *
31
+ * @example Executes match operations with the specified context
32
+ * context = Groonga::Context.new
33
+ * Groonga::Operator::MATCH.exec("Hello Rroonga", "Rroonga",
34
+ * :context => context) # => true
35
+ * Groonga::Operator::MATCH.exec("Hello Rroonga", "Groonga",
36
+ * :context => context) # => false
37
+ *
38
+ * @overload exec(text, sub_text, options={})
39
+ * @param text [String] The text to be matched.
40
+ * @param sub_text [String] The sub text to be contained.
41
+ * @param options [::Hash] The options.
42
+ * @option options [Groonga::Context] (Groonga::Context.default)
43
+ * The context to executes the operation.
44
+ * @return [Boolean] `true` if `text` contains `sub_text`, `false`
45
+ * otherwise.
46
+ */
47
+ static VALUE
48
+ rb_grn_match_operator_exec (int argc, VALUE *argv, VALUE self)
49
+ {
50
+ grn_bool matched;
51
+ VALUE rb_text;
52
+ VALUE rb_sub_text;
53
+ VALUE rb_options;
54
+ VALUE rb_context;
55
+ grn_ctx *context;
56
+ grn_obj text;
57
+ grn_obj sub_text;
58
+
59
+ rb_scan_args(argc, argv, "21", &rb_text, &rb_sub_text, &rb_options);
60
+
61
+ rb_grn_scan_options(rb_options,
62
+ "context", &rb_context,
63
+ NULL);
64
+ context = rb_grn_context_ensure(&rb_context);
65
+
66
+ GRN_VOID_INIT(&text);
67
+ GRN_VOID_INIT(&sub_text);
68
+ RVAL2GRNBULK(rb_text, context, &text);
69
+ RVAL2GRNBULK(rb_sub_text, context, &sub_text);
70
+ matched = grn_operator_exec_match(context, &text, &sub_text);
71
+ GRN_OBJ_FIN(context, &text);
72
+ GRN_OBJ_FIN(context, &sub_text);
73
+
74
+ return CBOOL2RVAL(matched);
75
+ }
76
+
77
+ void
78
+ rb_grn_init_match_operator (VALUE mGrn)
79
+ {
80
+ rb_cGrnMatchOperator = rb_define_class_under(mGrn,
81
+ "MatchOperator",
82
+ rb_cGrnOperator);
83
+
84
+ rb_define_method(rb_cGrnMatchOperator, "exec",
85
+ rb_grn_match_operator_exec, -1);
86
+ }
@@ -1,6 +1,6 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
- Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
4
4
 
5
5
  This library is free software; you can redistribute it and/or
6
6
  modify it under the terms of the GNU Lesser General Public
@@ -73,6 +73,10 @@ rb_grn_normalizer_s_normalize (int argc, VALUE *argv, VALUE klass)
73
73
 
74
74
  context = rb_grn_context_ensure(&rb_context);
75
75
  rb_encoded_string = rb_grn_context_rb_string_encode(context, rb_string);
76
+ if (RSTRING_LEN(rb_encoded_string) == 0) {
77
+ return rb_grn_context_rb_string_new(context, "", 0);
78
+ }
79
+
76
80
  if (NIL_P(rb_remove_blank_p)) {
77
81
  rb_remove_blank_p = Qtrue;
78
82
  }
@@ -91,6 +95,9 @@ rb_grn_normalizer_s_normalize (int argc, VALUE *argv, VALUE klass)
91
95
  normalizer,
92
96
  flags);
93
97
  rb_grn_context_check(context, argv[0]);
98
+ if (!grn_string) {
99
+ return Qnil;
100
+ }
94
101
  grn_string_get_normalized(context, grn_string,
95
102
  &normalized_string, &normalized_string_length,
96
103
  NULL);
@@ -0,0 +1,85 @@
1
+ /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
+ /*
3
+ Copyright (C) 2015 Kouhei Sutou <kou@clear-code.com>
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Lesser General Public
7
+ License version 2.1 as published by the Free Software Foundation.
8
+
9
+ This library is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ Lesser General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Lesser General Public
15
+ License along with this library; if not, write to the Free Software
16
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
+ */
18
+
19
+ #include "rb-grn.h"
20
+
21
+ VALUE rb_cGrnNotEqualOperator;
22
+
23
+ /*
24
+ * Executes a not-equal operation.
25
+ *
26
+ * @example Executes not-equal operations with the default context
27
+ * Groonga::Operator::NOT_EQUAL.exec("hello", "Hello") # => true
28
+ * Groonga::Operator::NOT_EQUAL.exec("hello", "hello") # => false
29
+ *
30
+ * @example Executes not-equal operations with the specified context
31
+ * context = Groonga::Context.new
32
+ * Groonga::Operator::NOT_EQUAL.exec("hello", "Hello",
33
+ * :context => context) # => true
34
+ * Groonga::Operator::NOT_EQUAL.exec("hello", "hello",
35
+ * :context => context) # => false
36
+ *
37
+ * @overload exec(x, y, options={})
38
+ * @param x [::Object] The left hand side value.
39
+ * @param y [::Object] The right hand side value.
40
+ * @param options [::Hash] The options.
41
+ * @option options [Groonga::Context] (Groonga::Context.default)
42
+ * The context to executes the operation.
43
+ * @return [Boolean] `true` if `x` does not equal to `y`, `false`
44
+ * otherwise.
45
+ */
46
+ static VALUE
47
+ rb_grn_not_equal_operator_exec (int argc, VALUE *argv, VALUE self)
48
+ {
49
+ grn_bool not_equal;
50
+ VALUE rb_x;
51
+ VALUE rb_y;
52
+ VALUE rb_options;
53
+ VALUE rb_context;
54
+ grn_ctx *context;
55
+ grn_obj x;
56
+ grn_obj y;
57
+
58
+ rb_scan_args(argc, argv, "21", &rb_x, &rb_y, &rb_options);
59
+
60
+ rb_grn_scan_options(rb_options,
61
+ "context", &rb_context,
62
+ NULL);
63
+ context = rb_grn_context_ensure(&rb_context);
64
+
65
+ GRN_VOID_INIT(&x);
66
+ GRN_VOID_INIT(&y);
67
+ RVAL2GRNBULK(rb_x, context, &x);
68
+ RVAL2GRNBULK(rb_y, context, &y);
69
+ not_equal = grn_operator_exec_not_equal(context, &x, &y);
70
+ GRN_OBJ_FIN(context, &x);
71
+ GRN_OBJ_FIN(context, &y);
72
+
73
+ return CBOOL2RVAL(not_equal);
74
+ }
75
+
76
+ void
77
+ rb_grn_init_not_equal_operator (VALUE mGrn)
78
+ {
79
+ rb_cGrnNotEqualOperator = rb_define_class_under(mGrn,
80
+ "NotEqualOperator",
81
+ rb_cGrnOperator);
82
+
83
+ rb_define_method(rb_cGrnNotEqualOperator, "exec",
84
+ rb_grn_not_equal_operator_exec, -1);
85
+ }
@@ -538,17 +538,15 @@ rb_grn_named_object_set_name (RbGrnNamedObject *rb_grn_named_object,
538
538
  rb_grn_named_object->name = NULL;
539
539
  }
540
540
  if (name_size > 0) {
541
- RbGrnObject *rb_grn_object;
542
541
  rb_grn_named_object->name = ALLOC_N(char, name_size + 1);
543
542
  memcpy(rb_grn_named_object->name, name, name_size);
544
543
  rb_grn_named_object->name[name_size] = '\0';
545
- rb_grn_object = RB_GRN_OBJECT(rb_grn_named_object);
546
544
  debug("set-name: %p:%p:%p %s(%#x): <%.*s>\n",
547
- rb_grn_object->context,
548
- rb_grn_object->object,
545
+ RB_GRN_OBJECT(rb_grn_named_object)->context,
546
+ RB_GRN_OBJECT(rb_grn_named_object)->object,
549
547
  rb_grn_named_object,
550
- rb_grn_inspect_type(rb_grn_object->object->header.type),
551
- rb_grn_object->object->header.type,
548
+ rb_grn_inspect_type(RB_GRN_OBJECT(rb_grn_named_object)->header.type),
549
+ RB_GRN_OBJECT(rb_grn_named_object)->object->header.type,
552
550
  name_size, name);
553
551
  }
554
552
  rb_grn_named_object->name_size = name_size;
@@ -837,13 +835,13 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
837
835
 
838
836
  if (0) {
839
837
  if (flags & GRN_OBJ_TABLE_HASH_KEY)
840
- rb_ary_push(inspected_flags, rb_str_new2("TABLE_HASH_KEY"));
838
+ rb_ary_push(inspected_flags, rb_str_new_cstr("TABLE_HASH_KEY"));
841
839
  if (flags & GRN_OBJ_TABLE_PAT_KEY)
842
- rb_ary_push(inspected_flags, rb_str_new2("TABLE_PAT_KEY"));
840
+ rb_ary_push(inspected_flags, rb_str_new_cstr("TABLE_PAT_KEY"));
843
841
  if (flags & GRN_OBJ_TABLE_DAT_KEY)
844
- rb_ary_push(inspected_flags, rb_str_new2("TABLE_DAT_KEY"));
842
+ rb_ary_push(inspected_flags, rb_str_new_cstr("TABLE_DAT_KEY"));
845
843
  if (flags & GRN_OBJ_TABLE_NO_KEY)
846
- rb_ary_push(inspected_flags, rb_str_new2("TABLE_NO_KEY"));
844
+ rb_ary_push(inspected_flags, rb_str_new_cstr("TABLE_NO_KEY"));
847
845
  }
848
846
 
849
847
  switch (object->header.type) {
@@ -851,20 +849,20 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
851
849
  case GRN_COLUMN_VAR_SIZE:
852
850
  case GRN_TYPE:
853
851
  if (flags & GRN_OBJ_KEY_VAR_SIZE) {
854
- rb_ary_push(inspected_flags, rb_str_new2("KEY_VAR_SIZE"));
852
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_VAR_SIZE"));
855
853
  } else {
856
854
  switch (flags & GRN_OBJ_KEY_MASK) {
857
855
  case GRN_OBJ_KEY_UINT:
858
- rb_ary_push(inspected_flags, rb_str_new2("KEY_UINT"));
856
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_UINT"));
859
857
  break;
860
858
  case GRN_OBJ_KEY_INT:
861
- rb_ary_push(inspected_flags, rb_str_new2("KEY_INT"));
859
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_INT"));
862
860
  break;
863
861
  case GRN_OBJ_KEY_FLOAT:
864
- rb_ary_push(inspected_flags, rb_str_new2("KEY_FLOAT"));
862
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_FLOAT"));
865
863
  break;
866
864
  case GRN_OBJ_KEY_GEO_POINT:
867
- rb_ary_push(inspected_flags, rb_str_new2("KEY_GEO_POINT"));
865
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_GEO_POINT"));
868
866
  break;
869
867
  default:
870
868
  break;
@@ -880,9 +878,9 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
880
878
  case GRN_TABLE_PAT_KEY:
881
879
  case GRN_TABLE_DAT_KEY:
882
880
  if (flags & GRN_OBJ_KEY_WITH_SIS)
883
- rb_ary_push(inspected_flags, rb_str_new2("KEY_WITH_SIS"));
881
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_WITH_SIS"));
884
882
  if (flags & GRN_OBJ_KEY_NORMALIZE)
885
- rb_ary_push(inspected_flags, rb_str_new2("KEY_NORMALIZE"));
883
+ rb_ary_push(inspected_flags, rb_str_new_cstr("KEY_NORMALIZE"));
886
884
  break;
887
885
  default:
888
886
  break;
@@ -890,57 +888,57 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
890
888
 
891
889
  if (0) {
892
890
  if (flags & GRN_OBJ_COLUMN_SCALAR)
893
- rb_ary_push(inspected_flags, rb_str_new2("COLUMN_SCALAR"));
891
+ rb_ary_push(inspected_flags, rb_str_new_cstr("COLUMN_SCALAR"));
894
892
  if (flags & GRN_OBJ_COLUMN_VECTOR)
895
- rb_ary_push(inspected_flags, rb_str_new2("COLUMN_VECTOR"));
893
+ rb_ary_push(inspected_flags, rb_str_new_cstr("COLUMN_VECTOR"));
896
894
  if (flags & GRN_OBJ_COLUMN_INDEX)
897
- rb_ary_push(inspected_flags, rb_str_new2("COLUMN_INDEX"));
895
+ rb_ary_push(inspected_flags, rb_str_new_cstr("COLUMN_INDEX"));
898
896
  }
899
897
 
900
898
  switch (object->header.type) {
901
899
  case GRN_COLUMN_FIX_SIZE:
902
900
  case GRN_COLUMN_VAR_SIZE:
903
901
  if (flags & GRN_OBJ_COMPRESS_ZLIB)
904
- rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_ZLIB"));
902
+ rb_ary_push(inspected_flags, rb_str_new_cstr("COMPRESS_ZLIB"));
905
903
  if (flags & GRN_OBJ_COMPRESS_LZ4)
906
- rb_ary_push(inspected_flags, rb_str_new2("COMPRESS_LZ4"));
904
+ rb_ary_push(inspected_flags, rb_str_new_cstr("COMPRESS_LZ4"));
907
905
  break;
908
906
  case GRN_COLUMN_INDEX:
909
907
  if (flags & GRN_OBJ_WITH_SECTION)
910
- rb_ary_push(inspected_flags, rb_str_new2("WITH_SECTION"));
908
+ rb_ary_push(inspected_flags, rb_str_new_cstr("WITH_SECTION"));
911
909
  if (flags & GRN_OBJ_WITH_WEIGHT)
912
- rb_ary_push(inspected_flags, rb_str_new2("WITH_WEIGHT"));
910
+ rb_ary_push(inspected_flags, rb_str_new_cstr("WITH_WEIGHT"));
913
911
  if (flags & GRN_OBJ_WITH_POSITION)
914
- rb_ary_push(inspected_flags, rb_str_new2("WITH_POSITION"));
912
+ rb_ary_push(inspected_flags, rb_str_new_cstr("WITH_POSITION"));
915
913
  break;
916
914
  default:
917
915
  break;
918
916
  }
919
917
 
920
918
  if (flags & GRN_OBJ_RING_BUFFER)
921
- rb_ary_push(inspected_flags, rb_str_new2("RING_BUFFER"));
919
+ rb_ary_push(inspected_flags, rb_str_new_cstr("RING_BUFFER"));
922
920
 
923
921
  if (flags & GRN_OBJ_WITH_SUBREC) {
924
- rb_ary_push(inspected_flags, rb_str_new2("WITH_SUBREC"));
922
+ rb_ary_push(inspected_flags, rb_str_new_cstr("WITH_SUBREC"));
925
923
 
926
924
  if (flags & GRN_OBJ_UNIT_DOCUMENT_SECTION)
927
- rb_ary_push(inspected_flags, rb_str_new2("UNIT_DOCUMENT_SECTION"));
925
+ rb_ary_push(inspected_flags, rb_str_new_cstr("UNIT_DOCUMENT_SECTION"));
928
926
  if (flags & GRN_OBJ_UNIT_DOCUMENT_POSITION)
929
- rb_ary_push(inspected_flags, rb_str_new2("UNIT_DOCUMENT_POSITION"));
927
+ rb_ary_push(inspected_flags, rb_str_new_cstr("UNIT_DOCUMENT_POSITION"));
930
928
 
931
929
  if (flags & GRN_OBJ_UNIT_SECTION_POSITION)
932
- rb_ary_push(inspected_flags, rb_str_new2("UNIT_SECTION_POSITION"));
930
+ rb_ary_push(inspected_flags, rb_str_new_cstr("UNIT_SECTION_POSITION"));
933
931
 
934
932
  if (flags & GRN_OBJ_UNIT_USERDEF_DOCUMENT)
935
- rb_ary_push(inspected_flags, rb_str_new2("UNIT_USERDEF_DOCUMENT"));
933
+ rb_ary_push(inspected_flags, rb_str_new_cstr("UNIT_USERDEF_DOCUMENT"));
936
934
  if (flags & GRN_OBJ_UNIT_USERDEF_SECTION)
937
- rb_ary_push(inspected_flags, rb_str_new2("UNIT_USERDEF_SECTION"));
935
+ rb_ary_push(inspected_flags, rb_str_new_cstr("UNIT_USERDEF_SECTION"));
938
936
  if (flags & GRN_OBJ_UNIT_USERDEF_POSITION)
939
- rb_ary_push(inspected_flags, rb_str_new2("UNIT_USERDEF_POSITION"));
937
+ rb_ary_push(inspected_flags, rb_str_new_cstr("UNIT_USERDEF_POSITION"));
940
938
  }
941
939
 
942
940
  rb_str_cat2(inspected, "<");
943
- rb_str_concat(inspected, rb_ary_join(inspected_flags, rb_str_new2("|")));
941
+ rb_str_concat(inspected, rb_ary_join(inspected_flags, rb_str_new_cstr("|")));
944
942
  rb_str_cat2(inspected, ">");
945
943
 
946
944
  return inspected;
@@ -1010,7 +1008,7 @@ rb_grn_object_inspect (VALUE self)
1010
1008
  {
1011
1009
  VALUE inspected;
1012
1010
 
1013
- inspected = rb_str_new2("");
1011
+ inspected = rb_str_new_cstr("");
1014
1012
  rb_grn_object_inspect_header(self, inspected);
1015
1013
  rb_grn_object_inspect_content(self, inspected);
1016
1014
  rb_grn_object_inspect_footer(self, inspected);
@@ -1064,7 +1062,7 @@ rb_grn_object_get_path (VALUE self)
1064
1062
  if (!path)
1065
1063
  return Qnil;
1066
1064
  else
1067
- return rb_str_new2(path);
1065
+ return rb_str_new_cstr(path);
1068
1066
  }
1069
1067
 
1070
1068
  /*
@@ -1504,6 +1502,134 @@ rb_grn_object_builtin_p (VALUE self)
1504
1502
  return CBOOL2RVAL(builtin);
1505
1503
  }
1506
1504
 
1505
+ /*
1506
+ * Checks whether the object is table or not.
1507
+ *
1508
+ * @overload table?
1509
+ * @return [Boolean] `true` if the object is table, `false` otherwise.
1510
+ *
1511
+ * @since 5.0.1
1512
+ */
1513
+ static VALUE
1514
+ rb_grn_object_table_p (VALUE self)
1515
+ {
1516
+ grn_ctx *context;
1517
+ grn_obj *object;
1518
+ grn_bool table_p = GRN_FALSE;
1519
+
1520
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1521
+ NULL, NULL, NULL, NULL);
1522
+
1523
+ if (context && object) {
1524
+ table_p = grn_obj_is_table(context, object);
1525
+ }
1526
+
1527
+ return CBOOL2RVAL(table_p);
1528
+ }
1529
+
1530
+ /*
1531
+ * Checks whether the object is procedure or not.
1532
+ *
1533
+ * @overload procedure?
1534
+ * @return [Boolean] `true` if the object is procedure, `false` otherwise.
1535
+ *
1536
+ * @since 5.0.1
1537
+ */
1538
+ static VALUE
1539
+ rb_grn_object_procedure_p (VALUE self)
1540
+ {
1541
+ grn_ctx *context;
1542
+ grn_obj *object;
1543
+ grn_bool procedure_p = GRN_FALSE;
1544
+
1545
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1546
+ NULL, NULL, NULL, NULL);
1547
+
1548
+ if (context && object) {
1549
+ procedure_p = grn_obj_is_proc(context, object);
1550
+ }
1551
+
1552
+ return CBOOL2RVAL(procedure_p);
1553
+ }
1554
+
1555
+ /*
1556
+ * Checks whether the object is function procedure or not.
1557
+ *
1558
+ * @overload function_procedure?
1559
+ * @return [Boolean] `true` if the object is function procedure,
1560
+ * `false` otherwise.
1561
+ *
1562
+ * @since 5.0.1
1563
+ */
1564
+ static VALUE
1565
+ rb_grn_object_function_procedure_p (VALUE self)
1566
+ {
1567
+ grn_ctx *context;
1568
+ grn_obj *object;
1569
+ grn_bool function_procedure_p = GRN_FALSE;
1570
+
1571
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1572
+ NULL, NULL, NULL, NULL);
1573
+
1574
+ if (context && object) {
1575
+ function_procedure_p = grn_obj_is_function_proc(context, object);
1576
+ }
1577
+
1578
+ return CBOOL2RVAL(function_procedure_p);
1579
+ }
1580
+
1581
+ /*
1582
+ * Checks whether the object is selector procedure or not.
1583
+ *
1584
+ * @overload selector_procedure?
1585
+ * @return [Boolean] `true` if the object is selector procedure,
1586
+ * `false` otherwise.
1587
+ *
1588
+ * @since 5.0.1
1589
+ */
1590
+ static VALUE
1591
+ rb_grn_object_selector_procedure_p (VALUE self)
1592
+ {
1593
+ grn_ctx *context;
1594
+ grn_obj *object;
1595
+ grn_bool selector_procedure_p = GRN_FALSE;
1596
+
1597
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1598
+ NULL, NULL, NULL, NULL);
1599
+
1600
+ if (context && object) {
1601
+ selector_procedure_p = grn_obj_is_selector_proc(context, object);
1602
+ }
1603
+
1604
+ return CBOOL2RVAL(selector_procedure_p);
1605
+ }
1606
+
1607
+ /*
1608
+ * Checks whether the object is scorer procedure or not.
1609
+ *
1610
+ * @overload scorer_procedure?
1611
+ * @return [Boolean] `true` if the object is scorer procedure,
1612
+ * `false` otherwise.
1613
+ *
1614
+ * @since 5.0.1
1615
+ */
1616
+ static VALUE
1617
+ rb_grn_object_scorer_procedure_p (VALUE self)
1618
+ {
1619
+ grn_ctx *context;
1620
+ grn_obj *object;
1621
+ grn_bool scorer_procedure_p = GRN_FALSE;
1622
+
1623
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1624
+ NULL, NULL, NULL, NULL);
1625
+
1626
+ if (context && object) {
1627
+ scorer_procedure_p = grn_obj_is_scorer_proc(context, object);
1628
+ }
1629
+
1630
+ return CBOOL2RVAL(scorer_procedure_p);
1631
+ }
1632
+
1507
1633
  void
1508
1634
  rb_grn_init_object (VALUE mGrn)
1509
1635
  {
@@ -1539,4 +1665,12 @@ rb_grn_init_object (VALUE mGrn)
1539
1665
  rb_define_method(rb_cGrnObject, "remove", rb_grn_object_remove, 0);
1540
1666
 
1541
1667
  rb_define_method(rb_cGrnObject, "builtin?", rb_grn_object_builtin_p, 0);
1668
+ rb_define_method(rb_cGrnObject, "table?", rb_grn_object_table_p, 0);
1669
+ rb_define_method(rb_cGrnObject, "procedure?", rb_grn_object_procedure_p, 0);
1670
+ rb_define_method(rb_cGrnObject, "function_procedure?",
1671
+ rb_grn_object_function_procedure_p, 0);
1672
+ rb_define_method(rb_cGrnObject, "selector_procedure?",
1673
+ rb_grn_object_selector_procedure_p, 0);
1674
+ rb_define_method(rb_cGrnObject, "scorer_procedure?",
1675
+ rb_grn_object_scorer_procedure_p, 0);
1542
1676
  }