rroonga 9.0.3 → 9.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d57c8009b0208e7e7a664d88571dd572d1c57854eaacf642447370a46eb4b0ca
4
- data.tar.gz: dd1bbbf57c0625903acddf7bcefea6b1bf6d25b11250030b4e73e67964de0750
3
+ metadata.gz: b746af2f9292a37577708353f345c6d07f4555be55e75656fe442beadde5ed6b
4
+ data.tar.gz: 035b93cdea5b21cb27eba8e9d7780287e8efb7684560c0cda8769ed23de7b27d
5
5
  SHA512:
6
- metadata.gz: 1670c187030094b149c0519a691ec08955b4b0ec5ebad06e32b3356dfae8cfdfcafcf2b4dfea261524b2273089f764f8e619582dab065906919ccfc23e3f2809
7
- data.tar.gz: b10932d7b251953142d3d1ad25faeadc4ce37a408009aaad6f1927e9d1ae20edba8e0cafe4ff494c05805449d5c4df8d235a338ae5454126e559bd1101eda883
6
+ metadata.gz: 984a7bbf57965efeaa6167d8258be509a1bce1d3e688fc7b80b83bacdd9393e75a2d43a852f557c44a18007de92171e86218b0db0a5a19acc47d3b956f1f691c
7
+ data.tar.gz: 9f2071147b1c8bf0b921f00c52e7fbea18193100e71f9b47610e252425db346680dfed472a73ec5614e1a34c693c94bb73e1d117523a20ea31e664ecc2d6e21a
@@ -1,5 +1,35 @@
1
1
  # NEWS
2
2
 
3
+ ## 9.0.7: 2019-08-29 {#version-9-0-7}
4
+
5
+ ### Improvements
6
+
7
+ * {Groonga::Object#lexicon?} Added.
8
+
9
+ * {Groonga::IndexColumn} Added support "INDEX_LARGE".
10
+
11
+ * {Groonga::IndexCursor.min_enable?/min_enable=} Added.
12
+
13
+ * {Groonga::Context#match_escalation?/match_escalation=} Added.
14
+
15
+ * {Groona::Object#id_accessor?} Added.
16
+
17
+ * {Groonga::Logger.flags} Added support for thread id option.
18
+
19
+ * {Groonga::Object#bulk?} Added.
20
+
21
+ * {Groonga::Object#value_accessor?} Added.
22
+
23
+ * {Groonga::Table} Delegate support_score? from Groonga::Record to Groonga::Table.
24
+
25
+ * {Groonga::Flashable} Added support dependent option.
26
+
27
+ * {Groonga::Object#score_accessor?} Added.
28
+
29
+ * {Groonga::Object#nsubrecs_accessor? } Added.
30
+
31
+ * Translate a part of explanation of Groonga::Table into English.
32
+
3
33
  ## 9.0.3: 2019-05-10 {#version-9-0-3}
4
34
 
5
35
  ### Improvements
@@ -2,6 +2,7 @@
2
2
  /*
3
3
  Copyright (C) 2010-2018 Kouhei Sutou <kou@clear-code.com>
4
4
  Copyright (C) 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
@@ -604,6 +605,27 @@ rb_grn_context_get_ruby_encoding (VALUE self)
604
605
  return rb_grn_encoding_to_ruby_encoding_object(encoding);
605
606
  }
606
607
 
608
+ /*
609
+ * @overload force_match_escalation?
610
+ * @return [Bool]
611
+ */
612
+ static VALUE
613
+ rb_grn_context_force_match_escalation_p (VALUE self)
614
+ {
615
+ return CBOOL2RVAL(grn_ctx_get_force_match_escalation(SELF(self)));
616
+ }
617
+
618
+ /*
619
+ * @overload force_match_escalation=(force_match_escalation)
620
+ */
621
+ static VALUE
622
+ rb_grn_context_set_force_match_escalation (VALUE self, VALUE force_match_escalation)
623
+ {
624
+ grn_ctx_set_force_match_escalation(SELF(self),
625
+ RVAL2CBOOL(force_match_escalation));
626
+ return force_match_escalation;
627
+ }
628
+
607
629
  /*
608
630
  * このコンテキストを使って検索したときに検索の挙動をエスカレー
609
631
  * ションする閾値を返します。
@@ -1039,6 +1061,11 @@ rb_grn_init_context (VALUE mGrn)
1039
1061
  rb_define_method(cGrnContext, "encoding=", rb_grn_context_set_encoding, 1);
1040
1062
  rb_define_method(cGrnContext, "ruby_encoding",
1041
1063
  rb_grn_context_get_ruby_encoding, 0);
1064
+
1065
+ rb_define_method(cGrnContext, "force_match_escalation?",
1066
+ rb_grn_context_force_match_escalation_p, 0);
1067
+ rb_define_method(cGrnContext, "force_match_escalation=",
1068
+ rb_grn_context_set_force_match_escalation, 1);
1042
1069
  rb_define_method(cGrnContext, "match_escalation_threshold",
1043
1070
  rb_grn_context_get_match_escalation_threshold, 0);
1044
1071
  rb_define_method(cGrnContext, "match_escalation_threshold=",
@@ -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);