rroonga 9.0.2 → 10.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/Rakefile +9 -142
  4. data/doc/text/news.md +73 -1
  5. data/doc/text/tutorial.md +1 -1
  6. data/ext/groonga/extconf.rb +9 -74
  7. data/ext/groonga/rb-grn-context.c +27 -0
  8. data/ext/groonga/rb-grn-expression-builder.c +3 -3
  9. data/ext/groonga/rb-grn-flushable.c +7 -0
  10. data/ext/groonga/rb-grn-index-column.c +28 -0
  11. data/ext/groonga/rb-grn-index-cursor.c +19 -0
  12. data/ext/groonga/rb-grn-logger.c +17 -3
  13. data/ext/groonga/rb-grn-object.c +236 -22
  14. data/ext/groonga/rb-grn-table-key-support.c +26 -7
  15. data/ext/groonga/rb-grn-table.c +119 -87
  16. data/ext/groonga/rb-grn-type.c +5 -1
  17. data/ext/groonga/rb-grn-utils.c +17 -1
  18. data/ext/groonga/rb-grn.h +7 -13
  19. data/ext/groonga/rb-groonga.c +2 -2
  20. data/lib/groonga.rb +3 -7
  21. data/lib/groonga/dumper.rb +3 -0
  22. data/lib/groonga/record.rb +2 -2
  23. data/rroonga.gemspec +4 -5
  24. data/test/groonga-test-utils.rb +34 -5
  25. data/test/run-test.rb +1 -3
  26. data/test/test-accessor.rb +63 -7
  27. data/test/test-column.rb +12 -1
  28. data/test/test-context.rb +25 -0
  29. data/test/test-exception.rb +5 -0
  30. data/test/test-flushable.rb +51 -6
  31. data/test/test-index-column.rb +67 -6
  32. data/test/test-index-cursor.rb +26 -0
  33. data/test/test-logger.rb +56 -11
  34. data/test/test-plugin.rb +1 -0
  35. data/test/test-query-logger.rb +4 -3
  36. data/test/test-record.rb +2 -1
  37. data/test/test-remote.rb +56 -10
  38. data/test/test-schema-dumper.rb +13 -0
  39. data/test/test-schema.rb +9 -1
  40. data/test/test-table-arrow.rb +1 -1
  41. data/test/test-table.rb +21 -1
  42. data/test/test-variable.rb +23 -7
  43. metadata +65 -106
@@ -1,6 +1,6 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
- Copyright (C) 2009 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2020 Sutou Kouhei <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
@@ -42,9 +42,9 @@ build (VALUE self)
42
42
  }
43
43
 
44
44
  static VALUE
45
- build_block (VALUE self)
45
+ build_block (RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg))
46
46
  {
47
- return rb_funcall(rb_block_proc(), rb_intern("call"), 1, self);
47
+ return rb_funcall(rb_block_proc(), rb_intern("call"), 1, yielded_arg);
48
48
  }
49
49
 
50
50
  VALUE
@@ -43,15 +43,20 @@ rb_grn_flushable_flush (int argc, VALUE *argv, VALUE self)
43
43
  grn_ctx *context = NULL;
44
44
  grn_obj *object = NULL;
45
45
  VALUE rb_recursive_p;
46
+ VALUE rb_dependent_p;
46
47
  VALUE rb_options;
47
48
 
48
49
  rb_scan_args(argc, argv, "01", &rb_options);
49
50
  rb_grn_scan_options(rb_options,
50
51
  "recursive", &rb_recursive_p,
52
+ "dependent", &rb_dependent_p,
51
53
  NULL);
52
54
  if (NIL_P(rb_recursive_p)) {
53
55
  rb_recursive_p = Qtrue;
54
56
  }
57
+ if (NIL_P(rb_dependent_p)) {
58
+ rb_dependent_p = Qfalse;
59
+ }
55
60
 
56
61
  rb_grn_object_deconstruct(SELF(self), &object, &context,
57
62
  NULL, NULL, NULL, NULL);
@@ -63,6 +68,8 @@ rb_grn_flushable_flush (int argc, VALUE *argv, VALUE self)
63
68
 
64
69
  if (RVAL2CBOOL(rb_recursive_p)) {
65
70
  grn_obj_flush_recursive(context, object);
71
+ } else if (RVAL2CBOOL(rb_dependent_p)) {
72
+ grn_obj_flush_recursive_dependent(context, object);
66
73
  } else {
67
74
  grn_obj_flush(context, object);
68
75
  }
@@ -1,5 +1,6 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
+ Copyright (C) 2019 Horimoto Yasuhiro <horimoto@clear-code.com>
3
4
  Copyright (C) 2009-2017 Kouhei Sutou <kou@clear-code.com>
4
5
  Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
5
6
 
@@ -972,6 +973,31 @@ rb_grn_index_column_medium_p (VALUE self)
972
973
  return CBOOL2RVAL(flags & GRN_OBJ_INDEX_MEDIUM);
973
974
  }
974
975
 
976
+ /*
977
+ * Checks whether the index column is large or not.
978
+ *
979
+ * @overload large?
980
+ * @return [Boolean] `true` if the index column size is large,
981
+ * `false` otherwise.
982
+ *
983
+ * @since 9.0.4
984
+ */
985
+ static VALUE
986
+ rb_grn_index_column_large_p (VALUE self)
987
+ {
988
+ grn_obj *column;
989
+ grn_ctx *context;
990
+ grn_column_flags flags;
991
+
992
+ rb_grn_index_column_deconstruct(SELF(self), &column, &context,
993
+ NULL, NULL,
994
+ NULL, NULL, NULL, NULL, NULL,
995
+ NULL, NULL);
996
+
997
+ flags = grn_column_get_flags(context, column);
998
+ return CBOOL2RVAL(flags & GRN_OBJ_INDEX_LARGE);
999
+ }
1000
+
975
1001
  static VALUE
976
1002
  call_close (VALUE object)
977
1003
  {
@@ -1442,6 +1468,8 @@ rb_grn_init_index_column (VALUE mGrn)
1442
1468
  rb_grn_index_column_small_p, 0);
1443
1469
  rb_define_method(rb_cGrnIndexColumn, "medium?",
1444
1470
  rb_grn_index_column_medium_p, 0);
1471
+ rb_define_method(rb_cGrnIndexColumn, "large?",
1472
+ rb_grn_index_column_large_p, 0);
1445
1473
 
1446
1474
  rb_define_method(rb_cGrnIndexColumn, "open_cursor",
1447
1475
  rb_grn_index_column_open_cursor, -1);
@@ -2,6 +2,7 @@
2
2
  /*
3
3
  Copyright (C) 2011 Haruka Yoshihara <yoshihara@clear-code.com>
4
4
  Copyright (C) 2012 Kouhei Sutou <kou@clear-code.com>
5
+ Copyright (C) 2019 Horimoto Yasuhiro <horimoto@clear-code.com>
5
6
 
6
7
  This library is free software; you can redistribute it and/or
7
8
  modify it under the terms of the GNU Lesser General Public
@@ -56,6 +57,19 @@ rb_grn_index_cursor_deconstruct (RbGrnIndexCursor *rb_grn_index_cursor,
56
57
  range_id, range);
57
58
  }
58
59
 
60
+ static VALUE
61
+ rb_grn_index_cursor_s_set_min_p (VALUE klass)
62
+ {
63
+ return CBOOL2RVAL(grn_ii_cursor_set_min_enable_get());
64
+ }
65
+
66
+ static VALUE
67
+ rb_grn_index_cursor_s_set_min_set (VALUE klass, VALUE enable)
68
+ {
69
+ grn_ii_cursor_set_min_enable_set(RVAL2CBOOL(enable));
70
+ return enable;
71
+ }
72
+
59
73
  static VALUE
60
74
  next_value (VALUE rb_posting,
61
75
  grn_ctx *context, grn_obj *cursor, VALUE rb_table, VALUE rb_lexicon)
@@ -158,6 +172,11 @@ rb_grn_init_index_cursor (VALUE mGrn)
158
172
  rb_define_alloc_func(rb_cGrnIndexCursor, rb_grn_object_alloc);
159
173
  rb_include_module(rb_cGrnIndexCursor, rb_mEnumerable);
160
174
 
175
+ rb_define_singleton_method(rb_cGrnIndexCursor, "set_min?",
176
+ rb_grn_index_cursor_s_set_min_p, 0);
177
+ rb_define_singleton_method(rb_cGrnIndexCursor, "set_min=",
178
+ rb_grn_index_cursor_s_set_min_set, 1);
179
+
161
180
  rb_define_method(rb_cGrnIndexCursor, "next", rb_grn_index_cursor_next, 0);
162
181
  rb_define_method(rb_cGrnIndexCursor, "each", rb_grn_index_cursor_each, -1);
163
182
  }
@@ -2,6 +2,7 @@
2
2
  /*
3
3
  Copyright (C) 2009-2015 Kouhei Sutou <kou@clear-code.com>
4
4
  Copyright (C) 2016-2017 Masafumi Yokoyama <yokoyama@clear-code.com>
5
+ Copyright (C) 2019 Horimoto Yasuhiro <horimoto@clear-code.com>
5
6
 
6
7
  This library is free software; you can redistribute it and/or
7
8
  modify it under the terms of the GNU Lesser General Public
@@ -315,15 +316,23 @@ rb_grn_logger_fin (grn_ctx *ctx, void *user_data)
315
316
  * ログの発生元のプロセスIDとgroongaのソースコードのファイ
316
317
  * ル名、行番号、関数名をブロックに渡したいなら +true+ を指
317
318
  * 定する。デフォルトでは渡す。
319
+ * @option options [Bool] :thread_id (true)
320
+ * Specifies whether `location` includes thread ID or not.
318
321
  */
319
322
  static VALUE
320
323
  rb_grn_logger_s_register (int argc, VALUE *argv, VALUE klass)
321
324
  {
322
325
  VALUE rb_context = Qnil;
323
326
  grn_ctx *context;
324
- VALUE rb_logger, rb_callback;
325
- VALUE rb_options, rb_max_level;
326
- VALUE rb_time, rb_title, rb_message, rb_location;
327
+ VALUE rb_logger;
328
+ VALUE rb_callback;
329
+ VALUE rb_options;
330
+ VALUE rb_max_level;
331
+ VALUE rb_time;
332
+ VALUE rb_title;
333
+ VALUE rb_message;
334
+ VALUE rb_location;
335
+ VALUE rb_thread_id;
327
336
  VALUE rb_flags;
328
337
  grn_log_level max_level = GRN_LOG_DEFAULT_LEVEL;
329
338
  int flags = 0;
@@ -343,6 +352,7 @@ rb_grn_logger_s_register (int argc, VALUE *argv, VALUE klass)
343
352
  "title", &rb_title,
344
353
  "message", &rb_message,
345
354
  "location", &rb_location,
355
+ "thread_id", &rb_thread_id,
346
356
  "flags", &rb_flags,
347
357
  NULL);
348
358
  if (!NIL_P(rb_max_level)) {
@@ -361,6 +371,9 @@ rb_grn_logger_s_register (int argc, VALUE *argv, VALUE klass)
361
371
  if (NIL_P(rb_location) || CBOOL2RVAL(rb_location)) {
362
372
  flags |= GRN_LOG_LOCATION;
363
373
  }
374
+ if (NIL_P(rb_thread_id) || CBOOL2RVAL(rb_thread_id)) {
375
+ flags |= GRN_LOG_THREAD_ID;
376
+ }
364
377
  if (!NIL_P(rb_flags)) {
365
378
  flags = rb_funcall(rb_mGrnLoggerFlags, id_parse, 2,
366
379
  INT2NUM(flags), rb_flags);
@@ -693,6 +706,7 @@ rb_grn_init_logger (VALUE mGrn)
693
706
  DEFINE_FLAG(MESSAGE);
694
707
  DEFINE_FLAG(LOCATION);
695
708
  DEFINE_FLAG(PID);
709
+ DEFINE_FLAG(THREAD_ID);
696
710
  #undef DEFINE_FLAG
697
711
 
698
712
  rb_cGrnCallbackLogger =
@@ -2,6 +2,7 @@
2
2
  /*
3
3
  Copyright (C) 2009-2018 Kouhei Sutou <kou@clear-code.com>
4
4
  Copyright (C) 2014-2016 Masafumi Yokoyama <yokoyama@clear-code.com>
5
+ Copyright (C) 2019 Horimoto Yasuhiro <horimoto@clear-code.com>
5
6
 
6
7
  This library is free software; you can redistribute it and/or
7
8
  modify it under the terms of the GNU Lesser General Public
@@ -939,6 +940,8 @@ rb_grn_object_inspect_content_flags_with_label (VALUE inspected,
939
940
  rb_ary_push(inspected_flags, rb_str_new_cstr("SMALL"));
940
941
  if (column_flags & GRN_OBJ_INDEX_MEDIUM)
941
942
  rb_ary_push(inspected_flags, rb_str_new_cstr("MEDIUM"));
943
+ if (column_flags & GRN_OBJ_INDEX_LARGE)
944
+ rb_ary_push(inspected_flags, rb_str_new_cstr("LARGE"));
942
945
  break;
943
946
  default:
944
947
  break;
@@ -1355,7 +1358,7 @@ rb_grn_object_array_reference (VALUE self, VALUE rb_id)
1355
1358
  return rb_value;
1356
1359
  }
1357
1360
 
1358
- static grn_bool
1361
+ static bool
1359
1362
  rb_uvector_value_p (RbGrnObject *rb_grn_object, VALUE rb_value)
1360
1363
  {
1361
1364
  VALUE first_element;
@@ -1363,7 +1366,7 @@ rb_uvector_value_p (RbGrnObject *rb_grn_object, VALUE rb_value)
1363
1366
  switch (rb_grn_object->range->header.type) {
1364
1367
  case GRN_TYPE:
1365
1368
  if (!(rb_grn_object->range->header.flags & GRN_OBJ_KEY_VAR_SIZE)) {
1366
- return GRN_TRUE;
1369
+ return true;
1367
1370
  }
1368
1371
  break;
1369
1372
  case GRN_TABLE_HASH_KEY:
@@ -1379,7 +1382,7 @@ rb_uvector_value_p (RbGrnObject *rb_grn_object, VALUE rb_value)
1379
1382
  break;
1380
1383
  }
1381
1384
 
1382
- return GRN_FALSE;
1385
+ return false;
1383
1386
  }
1384
1387
 
1385
1388
  typedef struct {
@@ -1527,7 +1530,7 @@ rb_grn_object_remove (int argc, VALUE *argv, VALUE self)
1527
1530
  grn_ctx *context;
1528
1531
  VALUE rb_options;
1529
1532
  VALUE rb_dependent_p;
1530
- grn_bool dependent_p = GRN_FALSE;
1533
+ bool dependent_p = false;
1531
1534
 
1532
1535
  rb_grn_object = SELF(self);
1533
1536
  if (!rb_grn_object->object)
@@ -1560,7 +1563,7 @@ rb_grn_object_builtin_p (VALUE self)
1560
1563
  {
1561
1564
  grn_ctx *context;
1562
1565
  grn_obj *object;
1563
- grn_bool builtin = GRN_FALSE;
1566
+ bool builtin = false;
1564
1567
 
1565
1568
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1566
1569
  NULL, NULL, NULL, NULL);
@@ -1585,7 +1588,7 @@ rb_grn_object_table_p (VALUE self)
1585
1588
  {
1586
1589
  grn_ctx *context;
1587
1590
  grn_obj *object;
1588
- grn_bool table_p = GRN_FALSE;
1591
+ bool table_p = false;
1589
1592
 
1590
1593
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1591
1594
  NULL, NULL, NULL, NULL);
@@ -1610,7 +1613,7 @@ rb_grn_object_column_p (VALUE self)
1610
1613
  {
1611
1614
  grn_ctx *context;
1612
1615
  grn_obj *object;
1613
- grn_bool column_p = GRN_FALSE;
1616
+ bool column_p = false;
1614
1617
 
1615
1618
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1616
1619
  NULL, NULL, NULL, NULL);
@@ -1636,7 +1639,7 @@ rb_grn_object_reference_column_p (VALUE self)
1636
1639
  {
1637
1640
  grn_ctx *context;
1638
1641
  grn_obj *object;
1639
- grn_bool reference_column_p = GRN_FALSE;
1642
+ bool reference_column_p = false;
1640
1643
 
1641
1644
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1642
1645
  NULL, NULL, NULL, NULL);
@@ -1662,7 +1665,7 @@ rb_grn_object_index_column_p (VALUE self)
1662
1665
  {
1663
1666
  grn_ctx *context;
1664
1667
  grn_obj *object;
1665
- grn_bool index_column_p = GRN_FALSE;
1668
+ bool index_column_p = false;
1666
1669
 
1667
1670
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1668
1671
  NULL, NULL, NULL, NULL);
@@ -1687,7 +1690,7 @@ rb_grn_object_procedure_p (VALUE self)
1687
1690
  {
1688
1691
  grn_ctx *context;
1689
1692
  grn_obj *object;
1690
- grn_bool procedure_p = GRN_FALSE;
1693
+ bool procedure_p = false;
1691
1694
 
1692
1695
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1693
1696
  NULL, NULL, NULL, NULL);
@@ -1713,7 +1716,7 @@ rb_grn_object_function_procedure_p (VALUE self)
1713
1716
  {
1714
1717
  grn_ctx *context;
1715
1718
  grn_obj *object;
1716
- grn_bool function_procedure_p = GRN_FALSE;
1719
+ bool function_procedure_p = false;
1717
1720
 
1718
1721
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1719
1722
  NULL, NULL, NULL, NULL);
@@ -1739,7 +1742,7 @@ rb_grn_object_selector_procedure_p (VALUE self)
1739
1742
  {
1740
1743
  grn_ctx *context;
1741
1744
  grn_obj *object;
1742
- grn_bool selector_procedure_p = GRN_FALSE;
1745
+ bool selector_procedure_p = false;
1743
1746
 
1744
1747
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1745
1748
  NULL, NULL, NULL, NULL);
@@ -1765,7 +1768,7 @@ rb_grn_object_selector_only_procedure_p (VALUE self)
1765
1768
  {
1766
1769
  grn_ctx *context;
1767
1770
  grn_obj *object;
1768
- grn_bool selector_only_procedure_p = GRN_FALSE;
1771
+ bool selector_only_procedure_p = false;
1769
1772
 
1770
1773
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1771
1774
  NULL, NULL, NULL, NULL);
@@ -1791,7 +1794,7 @@ rb_grn_object_scorer_procedure_p (VALUE self)
1791
1794
  {
1792
1795
  grn_ctx *context;
1793
1796
  grn_obj *object;
1794
- grn_bool scorer_procedure_p = GRN_FALSE;
1797
+ bool scorer_procedure_p = false;
1795
1798
 
1796
1799
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1797
1800
  NULL, NULL, NULL, NULL);
@@ -1817,7 +1820,7 @@ rb_grn_object_window_function_procedure_p (VALUE self)
1817
1820
  {
1818
1821
  grn_ctx *context;
1819
1822
  grn_obj *object;
1820
- grn_bool window_function_procedure_p = GRN_FALSE;
1823
+ bool window_function_procedure_p = false;
1821
1824
 
1822
1825
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1823
1826
  NULL, NULL, NULL, NULL);
@@ -1844,7 +1847,7 @@ rb_grn_object_accessor_p (VALUE self)
1844
1847
  {
1845
1848
  grn_ctx *context;
1846
1849
  grn_obj *object;
1847
- grn_bool accessor_p = GRN_FALSE;
1850
+ bool accessor_p = false;
1848
1851
 
1849
1852
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1850
1853
  NULL, NULL, NULL, NULL);
@@ -1857,7 +1860,7 @@ rb_grn_object_accessor_p (VALUE self)
1857
1860
  }
1858
1861
 
1859
1862
  /*
1860
- * Checks whether the object is key accessor or not.
1863
+ * Checks whether the object is an accessor for `_key` or not.
1861
1864
  *
1862
1865
  * @example `true` case: `column("_key")` is an accessor and it's an accessor for `_key`
1863
1866
  * Groonga::Schema.create_table("Users", :key_type => :short_text)
@@ -1880,7 +1883,7 @@ rb_grn_object_key_accessor_p (VALUE self)
1880
1883
  {
1881
1884
  grn_ctx *context;
1882
1885
  grn_obj *object;
1883
- grn_bool key_accessor_p = GRN_FALSE;
1886
+ bool key_accessor_p = false;
1884
1887
 
1885
1888
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1886
1889
  NULL, NULL, NULL, NULL);
@@ -1892,6 +1895,153 @@ rb_grn_object_key_accessor_p (VALUE self)
1892
1895
  return CBOOL2RVAL(key_accessor_p);
1893
1896
  }
1894
1897
 
1898
+ /*
1899
+ * Checks whether the object is an accessor for `_id` or not.
1900
+ *
1901
+ * @example `true` case: `column("_id")` is an accessor and it's an accessor for `_id`
1902
+ * Groonga::Schema.create_table("Users", :key_type => :short_text)
1903
+ * users = Groonga["Users"]
1904
+ * users.column("_id").id_accessor? # => true
1905
+ *
1906
+ * @example `false` case: `column("_key")` is an accessor but it's not an accessor for `_id`
1907
+ * Groonga::Schema.create_table("Users", :key_type => :short_text)
1908
+ * users = Groonga["Users"]
1909
+ * users.column("_key").id_accessor? # => false
1910
+ *
1911
+ * @overload id_accessor?
1912
+ * @return [Boolean] `true` if the object is an accessor for `_id`,
1913
+ * `false` otherwise.
1914
+ *
1915
+ * @since 9.0.4
1916
+ */
1917
+ static VALUE
1918
+ rb_grn_object_id_accessor_p (VALUE self)
1919
+ {
1920
+ grn_ctx *context;
1921
+ grn_obj *object;
1922
+ bool id_accessor_p = false;
1923
+
1924
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1925
+ NULL, NULL, NULL, NULL);
1926
+
1927
+ if (context && object) {
1928
+ id_accessor_p = grn_obj_is_id_accessor(context, object);
1929
+ }
1930
+
1931
+ return CBOOL2RVAL(id_accessor_p);
1932
+ }
1933
+
1934
+ /*
1935
+ * Checks whether the object is an accessor for `_value` or not.
1936
+ *
1937
+ * @example `true` case: `column("_value")` is an accessor and it's an accessor for `_value`
1938
+ * Groonga::Schema.create_table("Users",
1939
+ * :key_type => :short_text,
1940
+ * :value_type => "UInt32")
1941
+ * users = Groonga["Users"]
1942
+ * users.column("_value").value_accessor? # => true
1943
+ *
1944
+ * @example `false` case: `column("_key")` is an accessor but it's not an accessor for `_value`
1945
+ * Groonga::Schema.create_table("Users", :key_type => :short_text)
1946
+ * users = Groonga["Users"]
1947
+ * users.column("_key").value_accessor? # => false
1948
+ *
1949
+ * @overload value_accessor?
1950
+ * @return [Boolean] `true` if the object is an accessor for `_value`,
1951
+ * `false` otherwise.
1952
+ *
1953
+ * @since 9.0.4
1954
+ */
1955
+ static VALUE
1956
+ rb_grn_object_value_accessor_p (VALUE self)
1957
+ {
1958
+ grn_ctx *context;
1959
+ grn_obj *object;
1960
+ bool value_accessor_p = false;
1961
+
1962
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1963
+ NULL, NULL, NULL, NULL);
1964
+
1965
+ if (context && object) {
1966
+ value_accessor_p = grn_obj_is_value_accessor(context, object);
1967
+ }
1968
+
1969
+ return CBOOL2RVAL(value_accessor_p);
1970
+ }
1971
+
1972
+ /*
1973
+ * Checks whether the object is an accessor for `_socre` or not.
1974
+ *
1975
+ * @example `true` case: `column("_score")` is an accessor and it's an accessor for `_score`
1976
+ * Groonga::Schema.create_table("Users", :key_type => :short_text)
1977
+ * users = Groonga["Users"]
1978
+ * users.select.column("_score").socre_accessor? # => true
1979
+ *
1980
+ * @example `false` case: `column("_key")` is an accessor but it's not an accessor for `_score`
1981
+ * Groonga::Schema.create_table("Users", :key_type => :short_text)
1982
+ * users = Groonga["Users"]
1983
+ * users.column("_key").score_accessor? # => false
1984
+ *
1985
+ * @overload score_accessor?
1986
+ * @return [Boolean] `true` if the object is an accessor for `_score`,
1987
+ * `false` otherwise.
1988
+ *
1989
+ * @since 9.0.4
1990
+ */
1991
+ static VALUE
1992
+ rb_grn_object_score_accessor_p (VALUE self)
1993
+ {
1994
+ grn_ctx *context;
1995
+ grn_obj *object;
1996
+ bool score_accessor_p = false;
1997
+
1998
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
1999
+ NULL, NULL, NULL, NULL);
2000
+
2001
+ if (context && object) {
2002
+ score_accessor_p = grn_obj_is_score_accessor(context, object);
2003
+ }
2004
+
2005
+ return CBOOL2RVAL(score_accessor_p);
2006
+ }
2007
+
2008
+ /*
2009
+ * Checks whether the object is an accessor for `_nsubrecs` or not.
2010
+ *
2011
+ * @example `true` case: `column("_nsubrecs")` is an accessor and it's an accessor for `_nsubrecs`
2012
+ * users = Groonga::Hash.create(:name => "Users",
2013
+ * :key_type => "ShortText")
2014
+ * grouped_users = users.group("_key")
2015
+ * grouped_users.column("_nsubrecs").n_sub_records_accessor? # => true
2016
+ *
2017
+ * @example `false` case: `column("_key")` is an accessor but it's not an accessor for `_nsubrecs`
2018
+ * Groonga::Schema.create_table("Users", :key_type => :short_text)
2019
+ * users = Groonga["Users"]
2020
+ * users.column("_key").n_sub_records_accessor? # => false
2021
+ *
2022
+ * @overload n_sub_records_accessor?
2023
+ * @return [Boolean] `true` if the object is an accessor for `_nsubrecs`,
2024
+ * `false` otherwise.
2025
+ *
2026
+ * @since 9.0.4
2027
+ */
2028
+ VALUE
2029
+ rb_grn_object_n_sub_records_accessor_p (VALUE self)
2030
+ {
2031
+ grn_ctx *context;
2032
+ grn_obj *object;
2033
+ bool n_sub_records_accessor_p = false;
2034
+
2035
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
2036
+ NULL, NULL, NULL, NULL);
2037
+
2038
+ if (context && object) {
2039
+ n_sub_records_accessor_p = grn_obj_is_nsubrecs_accessor(context, object);
2040
+ }
2041
+
2042
+ return CBOOL2RVAL(n_sub_records_accessor_p);
2043
+ }
2044
+
1895
2045
  /*
1896
2046
  * Update the last modified time of the `object`. It's meaningful only
1897
2047
  * for persistent database, table and column.
@@ -1962,11 +2112,15 @@ rb_grn_object_dirty_p (VALUE self)
1962
2112
  {
1963
2113
  grn_ctx *context;
1964
2114
  grn_obj *object;
1965
- grn_bool is_dirty;
2115
+ bool is_dirty = false;
1966
2116
 
1967
2117
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1968
2118
  NULL, NULL, NULL, NULL);
1969
- is_dirty = grn_obj_is_dirty(context, object);
2119
+
2120
+ if (context && object) {
2121
+ is_dirty = grn_obj_is_dirty(context, object);
2122
+ }
2123
+
1970
2124
  return CBOOL2RVAL(is_dirty);
1971
2125
  }
1972
2126
 
@@ -1981,14 +2135,62 @@ rb_grn_object_corrupt_p (VALUE self)
1981
2135
  {
1982
2136
  grn_ctx *context;
1983
2137
  grn_obj *object;
1984
- grn_bool is_corrupt;
2138
+ bool is_corrupt = false;
1985
2139
 
1986
2140
  rb_grn_object_deconstruct(SELF(self), &object, &context,
1987
2141
  NULL, NULL, NULL, NULL);
1988
- is_corrupt = grn_obj_is_corrupt(context, object);
2142
+
2143
+ if (context && object) {
2144
+ is_corrupt = grn_obj_is_corrupt(context, object);
2145
+ }
2146
+
1989
2147
  return CBOOL2RVAL(is_corrupt);
1990
2148
  }
1991
2149
 
2150
+ /*
2151
+ * @overload lexicon?
2152
+ * @return [Boolean] `true` if the object is lexicon, `false` otherwise.
2153
+ *
2154
+ * @since 9.0.4
2155
+ */
2156
+ static VALUE
2157
+ rb_grn_object_lexicon_p (VALUE self)
2158
+ {
2159
+ grn_ctx *context;
2160
+ grn_obj *object;
2161
+ bool is_lexicon = false;
2162
+
2163
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
2164
+ NULL, NULL, NULL, NULL);
2165
+
2166
+ if (context && object) {
2167
+ is_lexicon = grn_obj_is_lexicon(context, object);
2168
+ }
2169
+
2170
+ return CBOOL2RVAL(is_lexicon);
2171
+ }
2172
+
2173
+ /*
2174
+ * @overload bulk?
2175
+ * @return [Boolean] `true` if the object is bulk, `false` otherwise.
2176
+ *
2177
+ * @since 9.0.4
2178
+ */
2179
+ static VALUE
2180
+ rb_grn_object_bulk_p (VALUE self)
2181
+ {
2182
+ grn_ctx *context;
2183
+ grn_obj *object;
2184
+ bool is_bulk = false;
2185
+
2186
+ rb_grn_object_deconstruct(SELF(self), &object, &context,
2187
+ NULL, NULL, NULL, NULL);
2188
+ if (context && object) {
2189
+ is_bulk = grn_obj_is_bulk(context, object);
2190
+ }
2191
+ return CBOOL2RVAL(is_bulk);
2192
+ }
2193
+
1992
2194
  /*
1993
2195
  * @overload disk_usage
1994
2196
  * @return [Integer] The number of bytes used by this object in disk.
@@ -2064,6 +2266,14 @@ rb_grn_init_object (VALUE mGrn)
2064
2266
  rb_grn_object_accessor_p, 0);
2065
2267
  rb_define_method(rb_cGrnObject, "key_accessor?",
2066
2268
  rb_grn_object_key_accessor_p, 0);
2269
+ rb_define_method(rb_cGrnObject, "id_accessor?",
2270
+ rb_grn_object_id_accessor_p, 0);
2271
+ rb_define_method(rb_cGrnObject, "value_accessor?",
2272
+ rb_grn_object_value_accessor_p, 0);
2273
+ rb_define_method(rb_cGrnObject, "score_accessor?",
2274
+ rb_grn_object_score_accessor_p, 0);
2275
+ rb_define_method(rb_cGrnObject, "n_sub_records_accessor?",
2276
+ rb_grn_object_n_sub_records_accessor_p, 0);
2067
2277
 
2068
2278
  rb_define_method(rb_cGrnObject, "touch", rb_grn_object_touch, -1);
2069
2279
  rb_define_method(rb_cGrnObject, "last_modified",
@@ -2072,6 +2282,10 @@ rb_grn_init_object (VALUE mGrn)
2072
2282
  rb_grn_object_dirty_p, 0);
2073
2283
  rb_define_method(rb_cGrnObject, "corrupt?",
2074
2284
  rb_grn_object_corrupt_p, 0);
2285
+ rb_define_method(rb_cGrnObject, "lexicon?",
2286
+ rb_grn_object_lexicon_p, 0);
2287
+ rb_define_method(rb_cGrnObject, "bulk?",
2288
+ rb_grn_object_bulk_p, 0);
2075
2289
 
2076
2290
  rb_define_method(rb_cGrnObject, "disk_usage",
2077
2291
  rb_grn_object_get_disk_usage, 0);