rroonga 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. data/NEWS.ja.rdoc +46 -0
  2. data/NEWS.rdoc +46 -0
  3. data/README.ja.rdoc +2 -2
  4. data/README.rdoc +2 -3
  5. data/Rakefile +148 -11
  6. data/example/bookmark.rb +94 -91
  7. data/ext/groonga/extconf.rb +25 -25
  8. data/ext/groonga/groonga.def +2 -0
  9. data/ext/groonga/mkmf.log +7 -7
  10. data/ext/groonga/rb-grn-column.c +66 -0
  11. data/ext/groonga/rb-grn-context.c +92 -5
  12. data/ext/groonga/rb-grn-database.c +24 -1
  13. data/ext/groonga/rb-grn-exception.c +15 -0
  14. data/ext/groonga/rb-grn-hash.c +2 -2
  15. data/ext/groonga/rb-grn-index-column.c +8 -4
  16. data/ext/groonga/rb-grn-object.c +4 -2
  17. data/ext/groonga/rb-grn-patricia-trie.c +2 -2
  18. data/ext/groonga/rb-grn-snippet.c +1 -0
  19. data/ext/groonga/rb-grn-table-key-support.c +22 -19
  20. data/ext/groonga/rb-grn-table.c +63 -5
  21. data/ext/groonga/rb-grn.h +1 -1
  22. data/ext/groonga/rb-groonga.c +1 -0
  23. data/extconf.rb +1 -1
  24. data/html/developer.html +8 -2
  25. data/html/favicon.ico +0 -0
  26. data/html/favicon.svg +591 -0
  27. data/html/index.html +71 -8
  28. data/html/logo.svg +612 -0
  29. data/html/ranguba.css +92 -7
  30. data/html/readme.svg +256 -0
  31. data/lib/groonga/expression-builder.rb +8 -4
  32. data/lib/groonga/record.rb +77 -7
  33. data/lib/groonga/schema.rb +429 -100
  34. data/rroonga-build.rb +1 -1
  35. data/test/run-test.rb +1 -1
  36. data/test/test-array.rb +4 -0
  37. data/test/test-context.rb +8 -0
  38. data/test/test-database.rb +8 -1
  39. data/test/test-expression-builder.rb +14 -0
  40. data/test/test-fix-size-column.rb +4 -0
  41. data/test/test-hash.rb +10 -4
  42. data/test/test-index-column.rb +11 -0
  43. data/test/test-patricia-trie.rb +7 -1
  44. data/test/test-record.rb +14 -0
  45. data/test/test-remote.rb +3 -2
  46. data/test/test-schema-create-table.rb +32 -2
  47. data/test/test-schema.rb +108 -11
  48. data/test/test-table-select-normalize.rb +7 -3
  49. data/test/test-table-select.rb +12 -0
  50. data/test/test-table.rb +7 -0
  51. data/test/test-variable-size-column.rb +4 -0
  52. data/test-unit/Rakefile +40 -0
  53. data/test-unit/TODO +5 -0
  54. data/test-unit/bin/testrb +5 -0
  55. data/test-unit/html/classic.html +15 -0
  56. data/test-unit/html/index.html +25 -0
  57. data/test-unit/html/index.html.ja +27 -0
  58. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  59. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  60. data/test-unit/lib/test/unit/attribute.rb +125 -0
  61. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  62. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  63. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  64. data/test-unit/lib/test/unit/collector/load.rb +144 -0
  65. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  66. data/test-unit/lib/test/unit/collector.rb +36 -0
  67. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  68. data/test-unit/lib/test/unit/color.rb +96 -0
  69. data/test-unit/lib/test/unit/diff.rb +724 -0
  70. data/test-unit/lib/test/unit/error.rb +130 -0
  71. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  72. data/test-unit/lib/test/unit/failure.rb +136 -0
  73. data/test-unit/lib/test/unit/fixture.rb +176 -0
  74. data/test-unit/lib/test/unit/notification.rb +129 -0
  75. data/test-unit/lib/test/unit/omission.rb +191 -0
  76. data/test-unit/lib/test/unit/pending.rb +150 -0
  77. data/test-unit/lib/test/unit/priority.rb +180 -0
  78. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  79. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  80. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  81. data/test-unit/lib/test/unit/testcase.rb +476 -0
  82. data/test-unit/lib/test/unit/testresult.rb +89 -0
  83. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  84. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  85. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  86. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  87. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  88. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  89. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  90. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  91. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  92. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  93. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  94. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  95. data/test-unit/lib/test/unit/version.rb +7 -0
  96. data/test-unit/lib/test/unit.rb +323 -0
  97. data/test-unit/sample/adder.rb +13 -0
  98. data/test-unit/sample/subtracter.rb +12 -0
  99. data/test-unit/sample/test_adder.rb +20 -0
  100. data/test-unit/sample/test_subtracter.rb +20 -0
  101. data/test-unit/sample/test_user.rb +23 -0
  102. data/test-unit/test/collector/test-descendant.rb +133 -0
  103. data/test-unit/test/collector/test-load.rb +442 -0
  104. data/test-unit/test/collector/test_dir.rb +406 -0
  105. data/test-unit/test/collector/test_objectspace.rb +100 -0
  106. data/test-unit/test/run-test.rb +15 -0
  107. data/test-unit/test/test-attribute.rb +86 -0
  108. data/test-unit/test/test-color-scheme.rb +67 -0
  109. data/test-unit/test/test-color.rb +47 -0
  110. data/test-unit/test/test-diff.rb +518 -0
  111. data/test-unit/test/test-emacs-runner.rb +60 -0
  112. data/test-unit/test/test-fixture.rb +287 -0
  113. data/test-unit/test/test-notification.rb +33 -0
  114. data/test-unit/test/test-omission.rb +81 -0
  115. data/test-unit/test/test-pending.rb +70 -0
  116. data/test-unit/test/test-priority.rb +119 -0
  117. data/test-unit/test/test-testcase.rb +544 -0
  118. data/test-unit/test/test_assertions.rb +1151 -0
  119. data/test-unit/test/test_error.rb +26 -0
  120. data/test-unit/test/test_failure.rb +33 -0
  121. data/test-unit/test/test_testresult.rb +113 -0
  122. data/test-unit/test/test_testsuite.rb +129 -0
  123. data/test-unit/test/testunit-test-util.rb +14 -0
  124. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  125. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  126. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  127. data/test-unit/test/util/test_observable.rb +102 -0
  128. data/test-unit/test/util/test_procwrapper.rb +36 -0
  129. data/text/{TUTORIAL.ja.rdoc → tutorial.ja.rdoc} +165 -126
  130. metadata +106 -16
  131. data/html/favicon.xcf +0 -0
  132. data/html/logo.xcf +0 -0
  133. data/license/GPL +0 -340
  134. data/license/RUBY +0 -59
  135. data/pkg-config.rb +0 -333
@@ -7,7 +7,7 @@ rroongaの操作方法を紹介します。
7
7
 
8
8
  == インストール
9
9
 
10
- Ruby/groongaはRubyGemsでインストールできます。
10
+ rroongaはRubyGemsでインストールできます。
11
11
 
12
12
  % sudo gem install rroonga
13
13
 
@@ -55,19 +55,23 @@ groongaには以下の3種類のテーブルがあります。
55
55
  ここではハッシュテーブルを利用して、<tt>Items</tt>という名前のテー
56
56
  ブルを作成します。キーは文字列とします。
57
57
 
58
- >> items = Groonga::Hash.create(:name => "Items", :key_type => "ShortText")
59
- => #<Groonga::Hash ...>
60
-
58
+ >> Groonga::Schema.create_table("Items", :type => :hash)
59
+ => [...]
61
60
 
62
61
  これで<tt>Items</tt>という名前のテーブルが作成できました。
63
62
 
63
+ 定義したテーブルはGroonga.[]で参照できます。
64
+
65
+ >> items = Groonga["Items"]
66
+ => #<Groonga::Hash ...>
67
+
64
68
  テーブルはRubyのHashのように扱えます。
65
69
 
66
70
  例えば、以下のように+size+でテーブルに登録されているレコード
67
71
  の件数を取得できます。
68
72
 
69
73
  >> items.size
70
- 0
74
+ => 0
71
75
 
72
76
  == レコードを追加する
73
77
 
@@ -75,7 +79,7 @@ groongaには以下の3種類のテーブルがあります。
75
79
 
76
80
  >> items.add("http://ja.wikipedia.org/wiki/Ruby")
77
81
  => #<Groonga::Record ...>
78
- >> items.add("http://www.ruby-lang.org/")
82
+ >> items.add("http://www.ruby-lang.org/ja/")
79
83
  => #<Groonga::Record ...>
80
84
 
81
85
  件数を確認すると確かに2件増えています。
@@ -85,7 +89,7 @@ groongaには以下の3種類のテーブルがあります。
85
89
 
86
90
  主キーを指定してレコードを取り出す時には以下のようにします。
87
91
 
88
- >> items.find("http://ja.wikipedia.org/wiki/Ruby")
92
+ >> items["http://ja.wikipedia.org/wiki/Ruby"]
89
93
  => #<Groonga::Record ...>
90
94
 
91
95
  == 全文検索を行う
@@ -93,42 +97,52 @@ groongaには以下の3種類のテーブルがあります。
93
97
  各itemのタイトル文字列を登録して、全文検索できるようにしてみ
94
98
  ましょう。
95
99
 
96
- まず<tt>Items</tt>テーブルに+title+という名前のカラムを追加します。
100
+ まず<tt>Items</tt>テーブルに+title+という名前のカラムを追加し
101
+ ます。ここでは、<tt>Text</tt>型のデータを持つカラムとして定義
102
+ します。
97
103
 
98
- >> title_column = items.define_column("title", "Text")
99
- => #<Groonga::VarSizeColumn ...>
104
+ >> Groonga::Schema.change_table("Items") do |table|
105
+ ?> table.text("title")
106
+ >> end
107
+ => [...]
100
108
 
101
- 2番目の引数は、追加するカラムのデータ型を示しています。
102
- <tt><int></tt>、<tt>Text</tt>、<tt><longtext></tt>等の型が基本型として用意されて
103
- います。
109
+ 定義したカラムは「#{テーブル名}.#{カラム名}」という名前になります。
110
+ テーブルと同じようにGroonga.[]で参照できます。
104
111
 
105
- 全文検索するためには、文字列を分解して得られる各単語を格納す
106
- るためのテーブルを別途しなければなりません。ここではTermsと
107
- いう名前でテーブルを定義します。
112
+ >> title_column = Groonga["Items.title"]
113
+ => #<Groonga::VariableSizeColumn ...>
108
114
 
109
- >> terms = Groonga::Hash.create(:name => "Terms",
110
- :key_type => "ShortText",
111
- :default_tokenizer => "TokenBigram")
112
- => #<Groonga::Hash ...>
115
+ 全文検索するために、文字列を分解して得られる各単語を格納する
116
+ ためのテーブルを別途用意します。ここではTermsという名前でテー
117
+ ブルを定義します。
118
+
119
+ >> Groonga::Schema.create_table("Terms",
120
+ ?> :type => :patricia_trie,
121
+ ?> :key_normalize => true,
122
+ ?> :default_tokenizer => "TokenBigram")
113
123
 
114
124
  ここでは、トークナイザとして<tt>:default_tokenzier =>
115
- "TokenBigram"</tt> を指定しています。トークナイザとは文字
116
- 列を単語に分解するオブジェクトのことです。デフォルトではトー
117
- クナイザは指定されていません。全文検索を利用するためにはトー
118
- クナイザを指定する必要があるので、ここではN-gramの一種である
119
- バイグラムを指定しています。
125
+ "TokenBigram"</tt> を指定しています。トークナイザとは文字列を
126
+ 単語に分解するオブジェクトのことです。デフォルトではトークナ
127
+ イザは指定されていません。全文検索を利用するためにはトークナ
128
+ イザを指定する必要があるので、ここではN-gramの一種であるバイ
129
+ グラムを指定しています。
120
130
 
121
131
  N-gramを利用した全文検索では、分解したN文字とその出現位置を利
122
132
  用して全文検索を行います。N-gramのNは文字列を何文字毎に分解す
123
133
  るかの文字数になります。groongaは1文字で分解するユニグラム、
124
134
  2文字のバイグラム、3文字のトリグラムをサポートしています。
125
135
 
136
+ また、大文字小文字の区別なく検索するために<tt>:key_normalize
137
+ => true</tt>も指定しています。
138
+
126
139
  単語格納用テーブルの準備ができたので、<tt>Items</tt>テーブ
127
140
  ルの+title+カラムに対するインデックスを定義します。
128
141
 
129
- >> title_index_column = terms.define_index_column("item_title", items,
130
- :source => "Items.title")
131
- => #<Groonga::IndexColumn ...>
142
+ >> Groonga::Schema.change_table("Terms") do |table|
143
+ ?> table.index("Items.title")
144
+ >> end
145
+ => [...]
132
146
 
133
147
  少し違和感を感じるかも知れませんが、<tt>Items</tt>テーブル
134
148
  のカラムに対するインデックスは、<tt>Terms</tt>テーブルのカ
@@ -148,22 +162,31 @@ N-gramを利用した全文検索では、分解したN文字とその出現位
148
162
 
149
163
  先ほど登録した各レコードの+title+カラムに値をセットします。
150
164
 
151
- >> items.find("http://ja.wikipedia.org/wiki/Ruby")["title"] = "Ruby"
165
+ >> items["http://ja.wikipedia.org/wiki/Ruby"].title = "Ruby"
152
166
  => "Ruby"
153
- >> items.find("http://www.ruby-lang.org/")["title"] = "オブジェクトスクリプト言語Ruby"
167
+ >> items["http://www.ruby-lang.org/ja/"].title = "オブジェクトスクリプト言語Ruby"
154
168
  "オブジェクトスクリプト言語Ruby"
155
169
 
156
170
  以下のようにして検索することができます。
157
171
 
158
- >> title_index_column.search("Ruby").collect {|record| record.key.key}
159
- ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/"]
172
+ >> ruby_items = items.select {|record| record.title =~ "Ruby"}
173
+ => #<Groonga::Hash ..., size: <2>>
160
174
 
161
175
  検索結果はGroonga::Hashで返されます。ハッシュのキーに見つかっ
162
- た<tt>Items</tt>のレコードが入っています。上の例では
163
- +record.key+で<tt>Items</tt>のレコードを取得して、さらにそ
164
- のキーを指定して(+record.key.key+)で<tt>Items</tt>のキー
165
- を返しています。
176
+ た<tt>Items</tt>のレコードが入っています。
166
177
 
178
+ >> ruby_items.collect {|record| record.key.key}
179
+ => ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/ja/"]
180
+
181
+ 上の例では+record.key+で<tt>Items</tt>のレコードを取得して、
182
+ さらにそのキーを指定して(+record.key.key+)で<tt>Items</tt>
183
+ のキーを返しています。
184
+
185
+ +record["_key"]+でアクセスすると自動的に参照しているレコード
186
+ を辿っていき、参照先のキーにアクセスできます。
187
+
188
+ >> ruby_items.collect {|record| record["_key"]}
189
+ => ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/ja/"]
167
190
 
168
191
  == マルチユーザ向けのブックマークアプリケーション
169
192
 
@@ -178,37 +201,35 @@ http://qwik.jp/senna/senna2.files/rect4605.png
178
201
 
179
202
  まず、<tt>Users</tt>テーブルを追加します。
180
203
 
181
- >> users = Groonga::Hash.create(:name => "Users",
182
- :key_type => "ShortText")
183
- => #<Groonga::Hash ...>
184
- >> users.define_column("name", "Text")
185
- => #<Groonga::VarSizeColumn ...>
186
-
204
+ >> Groonga::Schema.create_table("Users", :type => :hash) do |table|
205
+ ?> table.text("name")
206
+ >> end
207
+ => [...]
187
208
 
188
209
  次に、<tt>Comments</tt>テーブルを追加します。
189
210
 
190
- >> comments = Groonga::Array.create(:name => "Comments")
191
- => #<Groonga::Array ...>
192
- >> comments.define_column("item", items)
193
- => #<Groonga::FixSizeColumn ..>
194
- >> comments.define_column("author", users)
195
- => #<Groonga::FixSizeColumn ..>
196
- >> comments.define_column("content", "Text")
197
- => #<Groonga::VarSizeColumn ..>
198
- >> comments.define_column("issued", "Time")
199
- => #<Groonga::FixSizeColumn ..>
211
+ >> Groonga::Schema.create_table("Comments") do |table|
212
+ ?> table.reference("item")
213
+ >> table.reference("author", "Users")
214
+ >> table.text("content")
215
+ >> table.time("issued")
216
+ >> end
217
+ => [...]
200
218
 
201
219
  <tt>Comments</tt>テーブルの+content+カラムを全文検索できる
202
220
  ようにインデックスを定義します。
203
221
 
204
- >> terms.define_index_column("comment_content", comments,
205
- :source => "Comments.content")
206
- => #<Groonga::IndexColumn ...>
222
+ >> Groonga::Schema.change_table("Terms") do |table|
223
+ ?> table.index("Comments.content")
224
+ >> end
225
+ => [...]
207
226
 
208
227
  これでテーブルが定義できました。
209
228
 
210
229
  続いてユーザを何人か追加します。
211
230
 
231
+ >> users = Groonga["Users"]
232
+ => #<Groonga::Hash ...>
212
233
  >> users.add("moritan", :name => "モリタン")
213
234
  => #<Groonga::Record ...>
214
235
  >> users.add("taporobo", :name => "タポロボ")
@@ -217,28 +238,32 @@ http://qwik.jp/senna/senna2.files/rect4605.png
217
238
  次に、実際にユーザがブックマークを貼る時の処理を実行してみま
218
239
  しょう。
219
240
 
220
- ユーザ+moritan+が、はてなダイアリーのとあるページをブックマーク
221
- したと想定します。
241
+ ユーザ+moritan+が、Ruby関連のとあるページをブックマークしたと
242
+ 想定します。
222
243
 
223
244
  まず対象のページが<tt>Items</tt>テーブルに登録済かどうか調
224
245
  べます。
225
246
 
226
- >> items.find("http://d.hatena.ne.jp/brazil/20050829/1125321936")
227
- => nil
247
+ >> items.has_key?("http://www.rubyist.net/~matz/")
248
+ => false
228
249
 
229
250
  未登録なのでまず当該ページを<tt>Items</tt>に登録します。
230
251
 
231
- >> items.add("http://d.hatena.ne.jp/brazil/20050829/1125321936",
232
- :title => "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語")
252
+ >> items.add("http://www.rubyist.net/~matz/",
253
+ ?> :title => "Matzにっき")
233
254
  => #<Groonga::Record ...>
234
255
 
235
256
  次に、登録したitemを+item+カラムの値に指定して
236
257
  <tt>Comments</tt>にレコードを登録します。
237
258
 
238
- >> comments.add(:item => "http://d.hatena.ne.jp/brazil/20050829/1125321936",
239
- :author => "moritan",
240
- :content => "JavaScript LISP",
241
- :issued => 1187430026)
259
+ >> require "time"
260
+ => true
261
+ >> comments = Groonga["Comments"]
262
+ => #<Groonga::Array ...>
263
+ >> comments.add(:item => "http://www.rubyist.net/~matz/",
264
+ ?> :author => "moritan",
265
+ ?> :content => "Ruby Matz",
266
+ ?> :issued => Time.parse("2010-11-20T18:01:22+09:00"))
242
267
  => #<Groonga::Record ...>
243
268
 
244
269
  == メソッド化
@@ -246,14 +271,17 @@ http://qwik.jp/senna/senna2.files/rect4605.png
246
271
  上記の一連の手続きをメソッドにまとめてみます。
247
272
 
248
273
  >> @items = items
274
+ => #<Groonga::Hash ...>
249
275
  >> @comments = comments
276
+ => #<Groonga::Array ...>
250
277
  >> def add_bookmark(url, title, author, content, issued)
251
- >> item = @items.find(url) || @items.add(url, :title => title)
278
+ >> item = @items[url] || @items.add(url, :title => title)
252
279
  >> @comments.add(:item => item,
253
- >> :author => author,
254
- >> :content => content,
255
- >> :issued => issued)
256
- >> end
280
+ ?> :author => author,
281
+ ?> :content => content,
282
+ ?> :issued => issued)
283
+ >> end
284
+ => nil
257
285
 
258
286
  +itmes+と+comments+をインスタンス変数に代入しているのはメソッ
259
287
  ド内からでも見えるようにするためです。
@@ -267,15 +295,18 @@ http://qwik.jp/senna/senna2.files/rect4605.png
267
295
  作成したメソッドを呼び出していくつかブックマークを登録してみ
268
296
  ましょう。
269
297
 
270
- >> add_bookmark("http://practical-scheme.net/docs/cont-j.html",
271
- "なんでも継続", "moritan", "継続 LISP Scheme", 1187568692)
298
+ >> add_bookmark("http://jp.rubyist.net/magazine/",
299
+ ?> "Rubyist Magazine - るびま", "moritan", "Ruby 記事",
300
+ ?> Time.parse("2010-10-07T14:18:28+09:00"))
272
301
  => #<Groonga::Record ...>
273
- >> add_bookmark("http://d.hatena.ne.jp/higepon/20070815/1187192864",
274
- "末尾再帰", "taporobo", "末尾再帰 Scheme LISP", 1187568793)
302
+ >> add_bookmark("http://groonga.rubyforge.org/",
303
+ ?> "Rubyでgroonga使って全文検索 - ラングバ", "taporobo",
304
+ ?> "Ruby groonga 全文検索",
305
+ ?> Time.parse("2010-11-11T12:39:59+09:00"))
275
306
  => #<Groonga::Record ...>
276
- >> add_bookmark("http://practical-scheme.net/docs/cont-j.html",
277
- "なんでも継続", "taporobo", "トランポリン LISP continuation",
278
- 1187568692)
307
+ >> add_bookmark("http://www.rubyist.net/~matz/",
308
+ ?> "Matz日記", "taporobo", "Ruby 日記",
309
+ ?> Time.parse("2010-07-28T20:46:23+09:00"))
279
310
  => #<Groonga::Record ...>
280
311
 
281
312
  == 全文検索その2
@@ -283,25 +314,27 @@ http://qwik.jp/senna/senna2.files/rect4605.png
283
314
  登録したレコードに対して全文検索を実行してみます。
284
315
 
285
316
  >> records = comments.select do |record|
286
- >> record["content"] =~ "LISP"
287
- >> end
317
+ ?> record["content"] =~ "Ruby"
318
+ >> end
319
+ => #<Groonga::Hash ...>
288
320
  >> records.each do |record|
289
- >> record = record.key
321
+ ?> record = record.key
290
322
  >> p [record.id,
291
- >> record[".issued"],
292
- >> record[".item.title"],
293
- >> record[".author.name"],
294
- >> record[".content"]]
295
- >> end
296
- [1, Sat Aug 18 18:40:26 +0900 2007, "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語", "モリタン", "JavaScript LISP"]
297
- [2, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "モリタン", "継続 LISP Scheme"]
298
- [3, Mon Aug 20 09:13:13 +0900 2007, "末尾再帰", "タポロボ", "末尾再帰 Scheme LISP"]
299
- [4, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "タポロボ", "トランポリン LISP continuation"]
300
-
301
- カラムへのアクセスは、カラム名を+.+で繋いで複合データ型の要素
302
- を再帰的に辿ることができます。(同様の出力を普通のRDBで実現す
303
- るためには、<tt>Items</tt>テーブル、<tt>Comments</tt>テー
304
- ブル、<tt>Users</tt>テーブルのJOIN操作が必要になります。)
323
+ ?> record.issued,
324
+ ?> record.item.title,
325
+ ?> record.author.name,
326
+ ?> record.content]
327
+ >> end
328
+ [1, Sat Nov 20 18:01:22 +0900 2010, "Matzにっき", "モリタン", "Ruby Matz"]
329
+ [2, Thu Oct 07 14:18:28 +0900 2010, "Rubyist Magazine - るびま", "モリタン", "Ruby 記事"]
330
+ [3, Thu Nov 11 12:39:59 +0900 2010, "Rubyでgroonga使って全文検索 - ラングバ", "タポロボ", "Ruby groonga 全文検索検"]
331
+ [4, Wed Jul 28 20:46:23 +0900 2010, "Matzにっき", "タポロボ", "Ruby 日記"]
332
+
333
+ カラム名と同じメソッドでカラムへのアクセスできます。複合デー
334
+ タ型の要素も再帰的に辿ることができます。(同様の出力を普通の
335
+ RDBで実現するためには、<tt>Items</tt>テーブル、
336
+ <tt>Comments</tt>テーブル、<tt>Users</tt>テーブルのJOIN操作が
337
+ 必要になります。)
305
338
 
306
339
  上の式の中で、肝心の検索処理は、第一引数の式を評価する時点で
307
340
  完了していて、レコードセットオブジェクトとしてメモリに蓄積さ
@@ -314,31 +347,33 @@ http://qwik.jp/senna/senna2.files/rect4605.png
314
347
 
315
348
  以下は、日付で降順にソートしてから出力した例です。
316
349
 
317
- >> records.sort([{:key => ".issued", :order => "descending"}]).each do |record|
318
- >> record = record.key
350
+ >> records.sort([{:key => "issued", :order => "descending"}]).each do |record|
351
+ ?> record = record.key
319
352
  >> p [record.id,
320
- >> record[".issued"],
321
- >> record[".item.title"],
322
- >> record[".author.name"],
323
- >> record[".content"]]
324
- >> end
325
- [3, Mon Aug 20 09:13:13 +0900 2007, "末尾再帰", "タポロボ", "末尾再帰 Scheme LISP"]
326
- [2, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "モリタン", "継続 LISP Scheme"]
327
- [4, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "タポロボ", "トランポリン LISP continuation"]
328
- [1, Sat Aug 18 18:40:26 +0900 2007, "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語", "モリタン", "JavaScript LISP"]
353
+ ?> record.issued,
354
+ ?> record.item.title,
355
+ ?> record.author.name,
356
+ ?> record.content]
357
+ >> end
358
+ [1, Sat Nov 20 18:01:22 +0900 2010, "Matzにっき", "モリタン", "Ruby Matz"]
359
+ [3, Thu Nov 11 12:39:59 +0900 2010, "Rubyでgroonga使って全文検索 - ラングバ", "タポロボ", "Ruby groonga 全文検索"]
360
+ [2, Thu Oct 07 14:18:28 +0900 2010, "Rubyist Magazine - るびま", "モリタン", "Ruby 記事"]
361
+ [4, Wed Jul 28 20:46:23 +0900 2010, "Matzにっき, "タポロボ", "Ruby 日記"]
362
+ => [...]
329
363
 
330
364
  同じitemが何度も出てくると検索結果が見にくいので、item毎にグ
331
365
  ループ化してみます。
332
366
 
333
367
  >> records.group("item").each do |record|
334
- >> item = record.key
368
+ ?> item = record.key
335
369
  >> p [record.n_sub_records,
336
- >> item.key,
337
- >> item[".title"]]
338
- >> end
339
- [1, "http://d.hatena.ne.jp/brazil/20050829/1125321936", "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語"]
340
- [2, "http://practical-scheme.net/docs/cont-j.html", "なんでも継続"]
341
- [1, "http://d.hatena.ne.jp/higepon/20070815/1187192864", "末尾再帰"]
370
+ ?> item.key,
371
+ ?> item.title]
372
+ >> end
373
+ [2, "http://www.rubyist.net/~matz/", "Matzにっき"]
374
+ [1, "http://jp.rubyist.net/magazine/", "Rubyist Magazine - るびま"]
375
+ [1, "http://groonga.rubyforge.org/", "Rubyでgroonga使って全文検索 - ラングバ"]
376
+ => nil
342
377
 
343
378
  +n_sub_records+というのはグループ化した単位に含まれるレコード
344
379
  の件数を示します。SQLで言えば、GROUP BY句を含むクエリのcount
@@ -346,8 +381,6 @@ http://qwik.jp/senna/senna2.files/rect4605.png
346
381
 
347
382
  == 少し複雑な検索
348
383
 
349
- ↓はまだ動かない!!!
350
-
351
384
  さらに実用的な検索について考えてみましょう。
352
385
 
353
386
  ブックマークが大量に蓄積されるに従って、より的確に適合度を算
@@ -373,22 +406,28 @@ http://qwik.jp/senna/senna2.files/rect4605.png
373
406
  以下のようにして、commentとitemとそれぞれに対する検索結果を求
374
407
  めます。
375
408
 
376
- >> ruby_comments = @comments.select {|record| record["content"] =~ "Ruby"}
377
- #<Groonga::Hash ..., size: <2>>
378
- >> ruby_items = @items.select("*W1:50 title:@Ruby")
379
- #<Groonga::Hash ..., size: <2>>
409
+ >> ruby_comments = @comments.select {|record| record.content =~ "Ruby"}
410
+ => #<Groonga::Hash ..., size: <4>
411
+ >> ruby_items = @items.select do |record|
412
+ ?> target = record.match_target do |match_record|
413
+ ?> match_record.title * 10
414
+ >> end
415
+ >> target =~ "Ruby"
416
+ >> end
417
+ #<Groonga::Hash ..., size: <4>>
380
418
 
381
419
  _ruby_comments_の結果をitem毎にグループ化し、_ruby_items_と
382
420
  unionして出力します。
383
421
 
384
422
  >> ruby_items = ruby_comments.group("item").union!(ruby_items)
385
- #<Groonga::Hash ..., size: <4>>
386
- >> ruby_items.sort([{:key => "._score", :order => "descendant"}]).each do |record|
387
- >> p [record["._score"], record[".title"]]
423
+ #<Groonga::Hash ..., size: <5>>
424
+ >> ruby_items.sort([{:key => "_score", :order => "descending"}]).each do |record|
425
+ >> p [record.score, record.title]
388
426
  >> end
389
- [1, "るびま"]
390
- [1, "オブジェクトスクリプト言語Ruby"]
391
- [1, "Ruby"]
392
- [1, "ラングバ"]
427
+ [10, "Rubyist Magazine - るびま"]
428
+ [10, "Ruby"]
429
+ [10, "Rubyでgroonga使って全文検索 - ラングバ"]
430
+ [10, "オブジェクトスクリプト言語Ruby"]
431
+ [2, "Matzにっき"]
393
432
 
394
- これで目的の結果が得られました。(FIXME: 得られていない!)
433
+ これで目的の結果が得られました。
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rroonga
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 1
10
- version: 1.0.1
9
+ - 2
10
+ version: 1.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kouhei Sutou
@@ -19,13 +19,27 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2010-09-12 00:00:00 +09:00
22
+ date: 2010-11-25 00:00:00 +09:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
- name: rubyforge
26
+ name: pkg-config
27
27
  prerelease: false
28
28
  requirement: &id001 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ hash: 3
34
+ segments:
35
+ - 0
36
+ version: "0"
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: rubyforge
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
29
43
  none: false
30
44
  requirements:
31
45
  - - ">="
@@ -37,7 +51,7 @@ dependencies:
37
51
  - 4
38
52
  version: 2.0.4
39
53
  type: :development
40
- version_requirements: *id001
54
+ version_requirements: *id002
41
55
  description: |-
42
56
  rroonga is a extension library to use groonga's DB-API
43
57
  layer. rroonga provides Rubyish readable and writable
@@ -51,12 +65,12 @@ executables: []
51
65
  extensions:
52
66
  - extconf.rb
53
67
  extra_rdoc_files:
54
- - text/expression.rdoc
55
- - text/TUTORIAL.ja.rdoc
56
68
  - NEWS.rdoc
57
- - README.rdoc
58
- - README.ja.rdoc
59
69
  - NEWS.ja.rdoc
70
+ - README.ja.rdoc
71
+ - README.rdoc
72
+ - text/expression.rdoc
73
+ - text/tutorial.ja.rdoc
60
74
  files:
61
75
  - AUTHORS
62
76
  - NEWS.ja.rdoc
@@ -73,6 +87,7 @@ files:
73
87
  - example/search/public/css/groonga.css
74
88
  - ext/.gitignore
75
89
  - ext/groonga/extconf.rb
90
+ - ext/groonga/groonga.def
76
91
  - ext/groonga/mkmf.log
77
92
  - ext/groonga/rb-grn-accessor.c
78
93
  - ext/groonga/rb-grn-array-cursor.c
@@ -118,15 +133,16 @@ files:
118
133
  - html/developer.svg
119
134
  - html/download.svg
120
135
  - html/favicon.ico
121
- - html/favicon.xcf
136
+ - html/favicon.svg
122
137
  - html/footer.html.erb
123
138
  - html/head.html.erb
124
139
  - html/header.html.erb
125
140
  - html/heading-mark.svg
126
141
  - html/index.html
127
142
  - html/install.svg
128
- - html/logo.xcf
143
+ - html/logo.svg
129
144
  - html/ranguba.css
145
+ - html/readme.svg
130
146
  - html/tutorial.svg
131
147
  - lib/groonga.rb
132
148
  - lib/groonga/context.rb
@@ -136,12 +152,86 @@ files:
136
152
  - lib/groonga/record.rb
137
153
  - lib/groonga/schema.rb
138
154
  - lib/groonga/view-record.rb
139
- - license/GPL
140
155
  - license/LGPL
141
- - license/RUBY
142
156
  - misc/grnop2ruby.rb
143
- - pkg-config.rb
144
157
  - rroonga-build.rb
158
+ - test-unit/Rakefile
159
+ - test-unit/TODO
160
+ - test-unit/bin/testrb
161
+ - test-unit/html/classic.html
162
+ - test-unit/html/index.html
163
+ - test-unit/html/index.html.ja
164
+ - test-unit/lib/test/unit.rb
165
+ - test-unit/lib/test/unit/assertionfailederror.rb
166
+ - test-unit/lib/test/unit/assertions.rb
167
+ - test-unit/lib/test/unit/attribute.rb
168
+ - test-unit/lib/test/unit/autorunner.rb
169
+ - test-unit/lib/test/unit/collector.rb
170
+ - test-unit/lib/test/unit/collector/descendant.rb
171
+ - test-unit/lib/test/unit/collector/dir.rb
172
+ - test-unit/lib/test/unit/collector/load.rb
173
+ - test-unit/lib/test/unit/collector/objectspace.rb
174
+ - test-unit/lib/test/unit/color-scheme.rb
175
+ - test-unit/lib/test/unit/color.rb
176
+ - test-unit/lib/test/unit/diff.rb
177
+ - test-unit/lib/test/unit/error.rb
178
+ - test-unit/lib/test/unit/exceptionhandler.rb
179
+ - test-unit/lib/test/unit/failure.rb
180
+ - test-unit/lib/test/unit/fixture.rb
181
+ - test-unit/lib/test/unit/notification.rb
182
+ - test-unit/lib/test/unit/omission.rb
183
+ - test-unit/lib/test/unit/pending.rb
184
+ - test-unit/lib/test/unit/priority.rb
185
+ - test-unit/lib/test/unit/runner/console.rb
186
+ - test-unit/lib/test/unit/runner/emacs.rb
187
+ - test-unit/lib/test/unit/runner/tap.rb
188
+ - test-unit/lib/test/unit/testcase.rb
189
+ - test-unit/lib/test/unit/testresult.rb
190
+ - test-unit/lib/test/unit/testsuite.rb
191
+ - test-unit/lib/test/unit/ui/console/outputlevel.rb
192
+ - test-unit/lib/test/unit/ui/console/testrunner.rb
193
+ - test-unit/lib/test/unit/ui/emacs/testrunner.rb
194
+ - test-unit/lib/test/unit/ui/tap/testrunner.rb
195
+ - test-unit/lib/test/unit/ui/testrunner.rb
196
+ - test-unit/lib/test/unit/ui/testrunnermediator.rb
197
+ - test-unit/lib/test/unit/ui/testrunnerutilities.rb
198
+ - test-unit/lib/test/unit/util/backtracefilter.rb
199
+ - test-unit/lib/test/unit/util/method-owner-finder.rb
200
+ - test-unit/lib/test/unit/util/observable.rb
201
+ - test-unit/lib/test/unit/util/procwrapper.rb
202
+ - test-unit/lib/test/unit/version.rb
203
+ - test-unit/sample/adder.rb
204
+ - test-unit/sample/subtracter.rb
205
+ - test-unit/sample/test_adder.rb
206
+ - test-unit/sample/test_subtracter.rb
207
+ - test-unit/sample/test_user.rb
208
+ - test-unit/test/collector/test-descendant.rb
209
+ - test-unit/test/collector/test-load.rb
210
+ - test-unit/test/collector/test_dir.rb
211
+ - test-unit/test/collector/test_objectspace.rb
212
+ - test-unit/test/run-test.rb
213
+ - test-unit/test/test-attribute.rb
214
+ - test-unit/test/test-color-scheme.rb
215
+ - test-unit/test/test-color.rb
216
+ - test-unit/test/test-diff.rb
217
+ - test-unit/test/test-emacs-runner.rb
218
+ - test-unit/test/test-fixture.rb
219
+ - test-unit/test/test-notification.rb
220
+ - test-unit/test/test-omission.rb
221
+ - test-unit/test/test-pending.rb
222
+ - test-unit/test/test-priority.rb
223
+ - test-unit/test/test-testcase.rb
224
+ - test-unit/test/test_assertions.rb
225
+ - test-unit/test/test_error.rb
226
+ - test-unit/test/test_failure.rb
227
+ - test-unit/test/test_testresult.rb
228
+ - test-unit/test/test_testsuite.rb
229
+ - test-unit/test/testunit-test-util.rb
230
+ - test-unit/test/ui/test_testrunmediator.rb
231
+ - test-unit/test/util/test-method-owner-finder.rb
232
+ - test-unit/test/util/test_backtracefilter.rb
233
+ - test-unit/test/util/test_observable.rb
234
+ - test-unit/test/util/test_procwrapper.rb
145
235
  - test/.gitignore
146
236
  - test/groonga-test-utils.rb
147
237
  - test/run-test.rb
@@ -182,8 +272,8 @@ files:
182
272
  - test/test-vector-column.rb
183
273
  - test/test-version.rb
184
274
  - test/test-view.rb
185
- - text/TUTORIAL.ja.rdoc
186
275
  - text/expression.rdoc
276
+ - text/tutorial.ja.rdoc
187
277
  has_rdoc: true
188
278
  homepage: http://groonga.rubyforge.org/
189
279
  licenses: []