rroonga 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []