rroonga 1.0.1-x86-mingw32 → 1.1.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (387) hide show
  1. data/NEWS.ja.rdoc +146 -0
  2. data/NEWS.rdoc +146 -0
  3. data/README.ja.rdoc +7 -5
  4. data/README.rdoc +6 -5
  5. data/Rakefile +170 -18
  6. data/benchmark/create-wikipedia-database.rb +212 -0
  7. data/benchmark/read-write-many-small-items.rb +0 -0
  8. data/benchmark/repeat-load.rb +213 -0
  9. data/benchmark/select.rb +1052 -0
  10. data/benchmark/write-many-small-items.rb +0 -0
  11. data/example/bookmark.rb +94 -91
  12. data/example/index-html.rb +0 -0
  13. data/ext/groonga/extconf.rb +6 -6
  14. data/ext/groonga/rb-grn-accessor.c +1 -1
  15. data/ext/groonga/rb-grn-array.c +1 -1
  16. data/ext/groonga/rb-grn-column.c +201 -10
  17. data/ext/groonga/rb-grn-context.c +119 -20
  18. data/ext/groonga/rb-grn-database.c +27 -4
  19. data/ext/groonga/rb-grn-exception.c +15 -0
  20. data/ext/groonga/rb-grn-expression.c +14 -10
  21. data/ext/groonga/rb-grn-hash.c +4 -4
  22. data/ext/groonga/rb-grn-index-column.c +10 -6
  23. data/ext/groonga/rb-grn-logger.c +2 -2
  24. data/ext/groonga/rb-grn-object.c +33 -29
  25. data/ext/groonga/{rb-grn-operation.c → rb-grn-operator.c} +89 -87
  26. data/ext/groonga/rb-grn-patricia-trie.c +12 -12
  27. data/ext/groonga/rb-grn-plugin.c +134 -0
  28. data/ext/groonga/rb-grn-procedure.c +1 -1
  29. data/ext/groonga/rb-grn-query.c +7 -7
  30. data/ext/groonga/rb-grn-snippet.c +4 -3
  31. data/ext/groonga/rb-grn-table-cursor.c +1 -1
  32. data/ext/groonga/rb-grn-table-key-support.c +27 -24
  33. data/ext/groonga/rb-grn-table.c +119 -58
  34. data/ext/groonga/rb-grn-type.c +1 -1
  35. data/ext/groonga/rb-grn-utils.c +20 -19
  36. data/ext/groonga/rb-grn-variable.c +1 -1
  37. data/ext/groonga/rb-grn-view-accessor.c +1 -1
  38. data/ext/groonga/rb-grn-view.c +1 -1
  39. data/ext/groonga/rb-grn.h +26 -20
  40. data/ext/groonga/rb-groonga.c +6 -4
  41. data/extconf.rb +10 -4
  42. data/html/developer.html +8 -2
  43. data/html/favicon.ico +0 -0
  44. data/html/favicon.svg +591 -0
  45. data/html/index.html +78 -12
  46. data/html/logo.svg +612 -0
  47. data/html/ranguba.css +92 -7
  48. data/html/readme.svg +256 -0
  49. data/lib/groonga.so +0 -0
  50. data/lib/groonga/context.rb +52 -1
  51. data/lib/groonga/expression-builder.rb +42 -6
  52. data/lib/groonga/record.rb +84 -15
  53. data/lib/groonga/schema.rb +524 -122
  54. data/pkg/rroonga-1.1.0-x86-mingw32/NEWS.ja.rdoc +326 -0
  55. data/pkg/rroonga-1.1.0-x86-mingw32/NEWS.rdoc +328 -0
  56. data/pkg/rroonga-1.1.0-x86-mingw32/README.ja.rdoc +68 -0
  57. data/pkg/rroonga-1.1.0-x86-mingw32/README.rdoc +68 -0
  58. data/pkg/rroonga-1.1.0-x86-mingw32/text/expression.rdoc +285 -0
  59. data/{text/TUTORIAL.ja.rdoc → pkg/rroonga-1.1.0-x86-mingw32/text/tutorial.ja.rdoc} +165 -126
  60. data/pkg/rroonga-1.1.0/NEWS.ja.rdoc +326 -0
  61. data/pkg/rroonga-1.1.0/NEWS.rdoc +328 -0
  62. data/pkg/rroonga-1.1.0/README.ja.rdoc +68 -0
  63. data/pkg/rroonga-1.1.0/README.rdoc +68 -0
  64. data/pkg/rroonga-1.1.0/text/expression.rdoc +285 -0
  65. data/pkg/rroonga-1.1.0/text/tutorial.ja.rdoc +433 -0
  66. data/rroonga-build.rb +3 -3
  67. data/test/run-test.rb +1 -1
  68. data/test/test-array.rb +4 -0
  69. data/test/test-column.rb +31 -1
  70. data/test/test-context-select.rb +45 -14
  71. data/test/test-context.rb +44 -0
  72. data/test/test-database.rb +21 -1
  73. data/test/test-expression-builder.rb +46 -5
  74. data/test/test-fix-size-column.rb +12 -0
  75. data/test/test-hash.rb +10 -4
  76. data/test/test-index-column.rb +33 -0
  77. data/test/test-patricia-trie.rb +6 -0
  78. data/test/test-plugin.rb +29 -0
  79. data/test/test-record.rb +84 -1
  80. data/test/test-remote.rb +3 -2
  81. data/test/test-schema-create-table.rb +32 -2
  82. data/test/test-schema-type.rb +167 -0
  83. data/test/test-schema.rb +159 -12
  84. data/test/test-table-select-weight.rb +20 -1
  85. data/test/test-table-select.rb +12 -0
  86. data/test/test-table.rb +65 -0
  87. data/test/test-variable-size-column.rb +12 -0
  88. data/text/tutorial.ja.rdoc +433 -0
  89. data/vendor/local/bin/grntest.exe +0 -0
  90. data/vendor/local/bin/groonga.exe +0 -0
  91. data/vendor/local/bin/libgroonga-0.dll +0 -0
  92. data/vendor/local/etc/groonga/init.d/redhat/groonga +1 -9
  93. data/vendor/local/include/groonga/groonga.h +156 -6
  94. data/vendor/local/include/groonga/groonga/plugin.h +44 -0
  95. data/vendor/local/lib/groonga/plugins/suggest/suggest.a +0 -0
  96. data/vendor/local/lib/groonga/plugins/suggest/suggest.dll +0 -0
  97. data/vendor/local/lib/groonga/plugins/suggest/suggest.dll.a +0 -0
  98. data/vendor/local/lib/groonga/{modules → plugins}/suggest/suggest.la +2 -2
  99. data/vendor/local/lib/libgroonga.a +0 -0
  100. data/vendor/local/lib/libgroonga.dll.a +0 -0
  101. data/vendor/local/lib/libgroonga.la +1 -1
  102. data/vendor/local/lib/pkgconfig/groonga.pc +3 -2
  103. data/vendor/local/share/groonga/examples/dictionary/edict/edict_import.sh +14 -3
  104. data/vendor/local/share/groonga/examples/dictionary/eijiro/eijiro_import.sh +3 -1
  105. data/vendor/local/share/groonga/examples/dictionary/gene95/gene_import.sh +19 -3
  106. data/vendor/local/share/groonga/munin/plugins/groonga_cpu_load +0 -0
  107. data/vendor/local/share/groonga/munin/plugins/groonga_cpu_time +0 -0
  108. data/vendor/local/share/groonga/munin/plugins/groonga_disk +0 -0
  109. data/vendor/local/share/groonga/munin/plugins/groonga_memory +0 -0
  110. data/vendor/local/share/groonga/munin/plugins/groonga_n_records +0 -0
  111. data/vendor/local/share/groonga/munin/plugins/groonga_query_performance +0 -0
  112. data/vendor/local/share/groonga/munin/plugins/groonga_status +0 -0
  113. metadata +91 -341
  114. data/html/favicon.xcf +0 -0
  115. data/html/logo.xcf +0 -0
  116. data/lib/1.8/groonga.so +0 -0
  117. data/lib/1.9/groonga.so +0 -0
  118. data/license/GPL +0 -340
  119. data/license/RUBY +0 -59
  120. data/vendor/local/lib/groonga/modules/suggest/suggest.a +0 -0
  121. data/vendor/local/lib/groonga/modules/suggest/suggest.dll +0 -0
  122. data/vendor/local/lib/groonga/modules/suggest/suggest.dll.a +0 -0
  123. data/vendor/local/share/groonga/doc/ja/html/.buildinfo +0 -4
  124. data/vendor/local/share/groonga/doc/ja/html/_sources/characteristic.txt +0 -56
  125. data/vendor/local/share/groonga/doc/ja/html/_sources/commands.txt +0 -10
  126. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/cache_limit.txt +0 -52
  127. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/check.txt +0 -164
  128. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/clearlock.txt +0 -61
  129. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/column_create.txt +0 -93
  130. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/column_list.txt +0 -97
  131. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/column_remove.txt +0 -58
  132. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/define_selector.txt +0 -114
  133. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/defrag.txt +0 -57
  134. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/delete.txt +0 -68
  135. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/dump.txt +0 -62
  136. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/load.txt +0 -98
  137. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/log_level.txt +0 -65
  138. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/log_put.txt +0 -69
  139. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/log_reopen.txt +0 -66
  140. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/quit.txt +0 -38
  141. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/select.txt +0 -247
  142. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/shutdown.txt +0 -38
  143. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/status.txt +0 -59
  144. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/suggest.txt +0 -79
  145. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/table_create.txt +0 -111
  146. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/table_list.txt +0 -87
  147. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/table_remove.txt +0 -50
  148. data/vendor/local/share/groonga/doc/ja/html/_sources/commands/view_add.txt +0 -53
  149. data/vendor/local/share/groonga/doc/ja/html/_sources/commands_not_implemented/add.txt +0 -102
  150. data/vendor/local/share/groonga/doc/ja/html/_sources/commands_not_implemented/get.txt +0 -78
  151. data/vendor/local/share/groonga/doc/ja/html/_sources/commands_not_implemented/set.txt +0 -103
  152. data/vendor/local/share/groonga/doc/ja/html/_sources/developer.txt +0 -10
  153. data/vendor/local/share/groonga/doc/ja/html/_sources/developer/com.txt +0 -18
  154. data/vendor/local/share/groonga/doc/ja/html/_sources/developer/document.txt +0 -38
  155. data/vendor/local/share/groonga/doc/ja/html/_sources/developer/query.txt +0 -212
  156. data/vendor/local/share/groonga/doc/ja/html/_sources/developer/test.txt +0 -114
  157. data/vendor/local/share/groonga/doc/ja/html/_sources/execfile.txt +0 -226
  158. data/vendor/local/share/groonga/doc/ja/html/_sources/expr.txt +0 -43
  159. data/vendor/local/share/groonga/doc/ja/html/_sources/functions.txt +0 -10
  160. data/vendor/local/share/groonga/doc/ja/html/_sources/functions/edit_distance.txt +0 -48
  161. data/vendor/local/share/groonga/doc/ja/html/_sources/functions/geo_distance.txt +0 -51
  162. data/vendor/local/share/groonga/doc/ja/html/_sources/functions/geo_in_circle.txt +0 -54
  163. data/vendor/local/share/groonga/doc/ja/html/_sources/functions/geo_in_rectangle.txt +0 -55
  164. data/vendor/local/share/groonga/doc/ja/html/_sources/functions/now.txt +0 -34
  165. data/vendor/local/share/groonga/doc/ja/html/_sources/functions/rand.txt +0 -41
  166. data/vendor/local/share/groonga/doc/ja/html/_sources/grnslap.txt +0 -64
  167. data/vendor/local/share/groonga/doc/ja/html/_sources/grntest.txt +0 -259
  168. data/vendor/local/share/groonga/doc/ja/html/_sources/http.txt +0 -52
  169. data/vendor/local/share/groonga/doc/ja/html/_sources/index.txt +0 -21
  170. data/vendor/local/share/groonga/doc/ja/html/_sources/install.txt +0 -114
  171. data/vendor/local/share/groonga/doc/ja/html/_sources/news.txt +0 -199
  172. data/vendor/local/share/groonga/doc/ja/html/_sources/process.txt +0 -12
  173. data/vendor/local/share/groonga/doc/ja/html/_sources/pseudo_column.txt +0 -38
  174. data/vendor/local/share/groonga/doc/ja/html/_sources/reference.txt +0 -14
  175. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial.txt +0 -10
  176. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial01.txt +0 -293
  177. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial02.txt +0 -100
  178. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial03.txt +0 -72
  179. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial04.txt +0 -111
  180. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial05.txt +0 -65
  181. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial06.txt +0 -91
  182. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial07.txt +0 -92
  183. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial08.txt +0 -53
  184. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial09.txt +0 -9
  185. data/vendor/local/share/groonga/doc/ja/html/_sources/tutorial/tutorial10.txt +0 -486
  186. data/vendor/local/share/groonga/doc/ja/html/_sources/type.txt +0 -118
  187. data/vendor/local/share/groonga/doc/ja/html/_static/basic.css +0 -509
  188. data/vendor/local/share/groonga/doc/ja/html/_static/default.css +0 -277
  189. data/vendor/local/share/groonga/doc/ja/html/_static/doctools.js +0 -247
  190. data/vendor/local/share/groonga/doc/ja/html/_static/file.png +0 -0
  191. data/vendor/local/share/groonga/doc/ja/html/_static/jquery.js +0 -6240
  192. data/vendor/local/share/groonga/doc/ja/html/_static/minus.png +0 -0
  193. data/vendor/local/share/groonga/doc/ja/html/_static/plus.png +0 -0
  194. data/vendor/local/share/groonga/doc/ja/html/_static/pygments.css +0 -61
  195. data/vendor/local/share/groonga/doc/ja/html/_static/searchtools.js +0 -518
  196. data/vendor/local/share/groonga/doc/ja/html/_static/sidebar.js +0 -147
  197. data/vendor/local/share/groonga/doc/ja/html/_static/underscore.js +0 -16
  198. data/vendor/local/share/groonga/doc/ja/html/characteristic.html +0 -162
  199. data/vendor/local/share/groonga/doc/ja/html/commands.html +0 -139
  200. data/vendor/local/share/groonga/doc/ja/html/commands/cache_limit.html +0 -173
  201. data/vendor/local/share/groonga/doc/ja/html/commands/check.html +0 -285
  202. data/vendor/local/share/groonga/doc/ja/html/commands/clearlock.html +0 -180
  203. data/vendor/local/share/groonga/doc/ja/html/commands/column_create.html +0 -210
  204. data/vendor/local/share/groonga/doc/ja/html/commands/column_list.html +0 -220
  205. data/vendor/local/share/groonga/doc/ja/html/commands/column_remove.html +0 -183
  206. data/vendor/local/share/groonga/doc/ja/html/commands/define_selector.html +0 -221
  207. data/vendor/local/share/groonga/doc/ja/html/commands/defrag.html +0 -177
  208. data/vendor/local/share/groonga/doc/ja/html/commands/delete.html +0 -182
  209. data/vendor/local/share/groonga/doc/ja/html/commands/dump.html +0 -177
  210. data/vendor/local/share/groonga/doc/ja/html/commands/load.html +0 -208
  211. data/vendor/local/share/groonga/doc/ja/html/commands/log_level.html +0 -187
  212. data/vendor/local/share/groonga/doc/ja/html/commands/log_put.html +0 -190
  213. data/vendor/local/share/groonga/doc/ja/html/commands/log_reopen.html +0 -188
  214. data/vendor/local/share/groonga/doc/ja/html/commands/quit.html +0 -156
  215. data/vendor/local/share/groonga/doc/ja/html/commands/select.html +0 -331
  216. data/vendor/local/share/groonga/doc/ja/html/commands/shutdown.html +0 -156
  217. data/vendor/local/share/groonga/doc/ja/html/commands/status.html +0 -179
  218. data/vendor/local/share/groonga/doc/ja/html/commands/suggest.html +0 -191
  219. data/vendor/local/share/groonga/doc/ja/html/commands/table_create.html +0 -222
  220. data/vendor/local/share/groonga/doc/ja/html/commands/table_list.html +0 -202
  221. data/vendor/local/share/groonga/doc/ja/html/commands/table_remove.html +0 -173
  222. data/vendor/local/share/groonga/doc/ja/html/commands/view_add.html +0 -175
  223. data/vendor/local/share/groonga/doc/ja/html/commands_not_implemented/add.html +0 -180
  224. data/vendor/local/share/groonga/doc/ja/html/commands_not_implemented/get.html +0 -161
  225. data/vendor/local/share/groonga/doc/ja/html/commands_not_implemented/set.html +0 -182
  226. data/vendor/local/share/groonga/doc/ja/html/developer.html +0 -118
  227. data/vendor/local/share/groonga/doc/ja/html/developer/com.html +0 -136
  228. data/vendor/local/share/groonga/doc/ja/html/developer/document.html +0 -159
  229. data/vendor/local/share/groonga/doc/ja/html/developer/query.html +0 -336
  230. data/vendor/local/share/groonga/doc/ja/html/developer/test.html +0 -220
  231. data/vendor/local/share/groonga/doc/ja/html/execfile.html +0 -370
  232. data/vendor/local/share/groonga/doc/ja/html/expr.html +0 -157
  233. data/vendor/local/share/groonga/doc/ja/html/functions.html +0 -122
  234. data/vendor/local/share/groonga/doc/ja/html/functions/edit_distance.html +0 -162
  235. data/vendor/local/share/groonga/doc/ja/html/functions/geo_distance.html +0 -170
  236. data/vendor/local/share/groonga/doc/ja/html/functions/geo_in_circle.html +0 -173
  237. data/vendor/local/share/groonga/doc/ja/html/functions/geo_in_rectangle.html +0 -172
  238. data/vendor/local/share/groonga/doc/ja/html/functions/now.html +0 -152
  239. data/vendor/local/share/groonga/doc/ja/html/functions/rand.html +0 -159
  240. data/vendor/local/share/groonga/doc/ja/html/genindex.html +0 -227
  241. data/vendor/local/share/groonga/doc/ja/html/grnslap.html +0 -183
  242. data/vendor/local/share/groonga/doc/ja/html/grntest.html +0 -368
  243. data/vendor/local/share/groonga/doc/ja/html/http.html +0 -163
  244. data/vendor/local/share/groonga/doc/ja/html/index.html +0 -291
  245. data/vendor/local/share/groonga/doc/ja/html/install.html +0 -228
  246. data/vendor/local/share/groonga/doc/ja/html/news.html +0 -310
  247. data/vendor/local/share/groonga/doc/ja/html/objects.inv +0 -0
  248. data/vendor/local/share/groonga/doc/ja/html/process.html +0 -120
  249. data/vendor/local/share/groonga/doc/ja/html/pseudo_column.html +0 -147
  250. data/vendor/local/share/groonga/doc/ja/html/reference.html +0 -174
  251. data/vendor/local/share/groonga/doc/ja/html/search.html +0 -96
  252. data/vendor/local/share/groonga/doc/ja/html/searchindex.js +0 -1
  253. data/vendor/local/share/groonga/doc/ja/html/tutorial.html +0 -172
  254. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial01.html +0 -388
  255. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial02.html +0 -214
  256. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial03.html +0 -183
  257. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial04.html +0 -212
  258. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial05.html +0 -169
  259. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial06.html +0 -209
  260. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial07.html +0 -212
  261. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial08.html +0 -139
  262. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial09.html +0 -114
  263. data/vendor/local/share/groonga/doc/ja/html/tutorial/tutorial10.html +0 -458
  264. data/vendor/local/share/groonga/doc/ja/html/type.html +0 -217
  265. data/vendor/local/share/groonga/doc/ja/source/__init__.py +0 -0
  266. data/vendor/local/share/groonga/doc/ja/source/characteristic.txt +0 -56
  267. data/vendor/local/share/groonga/doc/ja/source/commands.txt +0 -10
  268. data/vendor/local/share/groonga/doc/ja/source/commands/cache_limit.txt +0 -52
  269. data/vendor/local/share/groonga/doc/ja/source/commands/check.txt +0 -164
  270. data/vendor/local/share/groonga/doc/ja/source/commands/clearlock.txt +0 -61
  271. data/vendor/local/share/groonga/doc/ja/source/commands/column_create.txt +0 -93
  272. data/vendor/local/share/groonga/doc/ja/source/commands/column_list.txt +0 -97
  273. data/vendor/local/share/groonga/doc/ja/source/commands/column_remove.txt +0 -58
  274. data/vendor/local/share/groonga/doc/ja/source/commands/define_selector.txt +0 -114
  275. data/vendor/local/share/groonga/doc/ja/source/commands/defrag.txt +0 -57
  276. data/vendor/local/share/groonga/doc/ja/source/commands/delete.txt +0 -68
  277. data/vendor/local/share/groonga/doc/ja/source/commands/dump.txt +0 -62
  278. data/vendor/local/share/groonga/doc/ja/source/commands/load.txt +0 -98
  279. data/vendor/local/share/groonga/doc/ja/source/commands/log_level.txt +0 -65
  280. data/vendor/local/share/groonga/doc/ja/source/commands/log_put.txt +0 -69
  281. data/vendor/local/share/groonga/doc/ja/source/commands/log_reopen.txt +0 -66
  282. data/vendor/local/share/groonga/doc/ja/source/commands/quit.txt +0 -38
  283. data/vendor/local/share/groonga/doc/ja/source/commands/select.txt +0 -247
  284. data/vendor/local/share/groonga/doc/ja/source/commands/shutdown.txt +0 -38
  285. data/vendor/local/share/groonga/doc/ja/source/commands/status.txt +0 -59
  286. data/vendor/local/share/groonga/doc/ja/source/commands/table_create.txt +0 -111
  287. data/vendor/local/share/groonga/doc/ja/source/commands/table_list.txt +0 -87
  288. data/vendor/local/share/groonga/doc/ja/source/commands/table_remove.txt +0 -50
  289. data/vendor/local/share/groonga/doc/ja/source/commands/view_add.txt +0 -53
  290. data/vendor/local/share/groonga/doc/ja/source/commands_not_implemented/add.txt +0 -102
  291. data/vendor/local/share/groonga/doc/ja/source/commands_not_implemented/get.txt +0 -78
  292. data/vendor/local/share/groonga/doc/ja/source/commands_not_implemented/set.txt +0 -103
  293. data/vendor/local/share/groonga/doc/ja/source/conf.py +0 -265
  294. data/vendor/local/share/groonga/doc/ja/source/developer.txt +0 -10
  295. data/vendor/local/share/groonga/doc/ja/source/developer/com.txt +0 -18
  296. data/vendor/local/share/groonga/doc/ja/source/developer/document.txt +0 -38
  297. data/vendor/local/share/groonga/doc/ja/source/developer/query.txt +0 -212
  298. data/vendor/local/share/groonga/doc/ja/source/developer/test.txt +0 -114
  299. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-1.log +0 -6
  300. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-10.log +0 -5
  301. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-11.log +0 -5
  302. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-12.log +0 -5
  303. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-13.log +0 -5
  304. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-14.log +0 -9
  305. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-15.log +0 -5
  306. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-16.log +0 -5
  307. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-17.log +0 -5
  308. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-2.log +0 -5
  309. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-3.log +0 -5
  310. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-4.log +0 -7
  311. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-5.log +0 -5
  312. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-6.log +0 -5
  313. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-7.log +0 -16
  314. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-8.log +0 -5
  315. data/vendor/local/share/groonga/doc/ja/source/example/tutorial01-9.log +0 -5
  316. data/vendor/local/share/groonga/doc/ja/source/example/tutorial02-1.log +0 -8
  317. data/vendor/local/share/groonga/doc/ja/source/example/tutorial02-2.log +0 -6
  318. data/vendor/local/share/groonga/doc/ja/source/example/tutorial02-3.log +0 -12
  319. data/vendor/local/share/groonga/doc/ja/source/example/tutorial03-1.log +0 -18
  320. data/vendor/local/share/groonga/doc/ja/source/example/tutorial03-2.log +0 -10
  321. data/vendor/local/share/groonga/doc/ja/source/example/tutorial03-3.log +0 -10
  322. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-1.log +0 -5
  323. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-2.log +0 -7
  324. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-3.log +0 -7
  325. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-4.log +0 -13
  326. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-5.log +0 -5
  327. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-6.log +0 -5
  328. data/vendor/local/share/groonga/doc/ja/source/example/tutorial04-7.log +0 -5
  329. data/vendor/local/share/groonga/doc/ja/source/example/tutorial05-1.log +0 -24
  330. data/vendor/local/share/groonga/doc/ja/source/example/tutorial05-2.log +0 -5
  331. data/vendor/local/share/groonga/doc/ja/source/example/tutorial05-3.log +0 -5
  332. data/vendor/local/share/groonga/doc/ja/source/example/tutorial05-4.log +0 -5
  333. data/vendor/local/share/groonga/doc/ja/source/example/tutorial05-5.log +0 -5
  334. data/vendor/local/share/groonga/doc/ja/source/example/tutorial05-6.log +0 -5
  335. data/vendor/local/share/groonga/doc/ja/source/example/tutorial06-1.log +0 -25
  336. data/vendor/local/share/groonga/doc/ja/source/example/tutorial06-2.log +0 -9
  337. data/vendor/local/share/groonga/doc/ja/source/example/tutorial06-3.log +0 -21
  338. data/vendor/local/share/groonga/doc/ja/source/example/tutorial06-4.log +0 -7
  339. data/vendor/local/share/groonga/doc/ja/source/example/tutorial06-5.log +0 -5
  340. data/vendor/local/share/groonga/doc/ja/source/example/tutorial07-1.log +0 -22
  341. data/vendor/local/share/groonga/doc/ja/source/example/tutorial07-2.log +0 -9
  342. data/vendor/local/share/groonga/doc/ja/source/example/tutorial07-3.log +0 -20
  343. data/vendor/local/share/groonga/doc/ja/source/example/tutorial07-4.log +0 -9
  344. data/vendor/local/share/groonga/doc/ja/source/example/tutorial08-1.log +0 -14
  345. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-1.log +0 -5
  346. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-10.log +0 -5
  347. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-2.log +0 -5
  348. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-3.log +0 -5
  349. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-4.log +0 -5
  350. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-5.log +0 -5
  351. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-6.log +0 -5
  352. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-7.log +0 -5
  353. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-8.log +0 -5
  354. data/vendor/local/share/groonga/doc/ja/source/example/tutorial10-9.log +0 -5
  355. data/vendor/local/share/groonga/doc/ja/source/execfile.txt +0 -226
  356. data/vendor/local/share/groonga/doc/ja/source/expr.txt +0 -43
  357. data/vendor/local/share/groonga/doc/ja/source/functions.txt +0 -10
  358. data/vendor/local/share/groonga/doc/ja/source/functions/edit_distance.txt +0 -48
  359. data/vendor/local/share/groonga/doc/ja/source/functions/geo_distance.txt +0 -51
  360. data/vendor/local/share/groonga/doc/ja/source/functions/geo_in_circle.txt +0 -54
  361. data/vendor/local/share/groonga/doc/ja/source/functions/geo_in_rectangle.txt +0 -55
  362. data/vendor/local/share/groonga/doc/ja/source/functions/now.txt +0 -34
  363. data/vendor/local/share/groonga/doc/ja/source/functions/rand.txt +0 -41
  364. data/vendor/local/share/groonga/doc/ja/source/grnslap.txt +0 -64
  365. data/vendor/local/share/groonga/doc/ja/source/grntest.txt +0 -259
  366. data/vendor/local/share/groonga/doc/ja/source/http.txt +0 -52
  367. data/vendor/local/share/groonga/doc/ja/source/index.txt +0 -21
  368. data/vendor/local/share/groonga/doc/ja/source/install.txt +0 -114
  369. data/vendor/local/share/groonga/doc/ja/source/news.txt +0 -199
  370. data/vendor/local/share/groonga/doc/ja/source/process.txt +0 -12
  371. data/vendor/local/share/groonga/doc/ja/source/pseudo_column.txt +0 -38
  372. data/vendor/local/share/groonga/doc/ja/source/rdoc.py +0 -762
  373. data/vendor/local/share/groonga/doc/ja/source/reference.txt +0 -14
  374. data/vendor/local/share/groonga/doc/ja/source/tutorial.txt +0 -10
  375. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial01.txt +0 -293
  376. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial02.txt +0 -100
  377. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial03.txt +0 -72
  378. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial04.txt +0 -111
  379. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial05.txt +0 -65
  380. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial06.txt +0 -91
  381. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial07.txt +0 -92
  382. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial08.txt +0 -53
  383. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial09.txt +0 -9
  384. data/vendor/local/share/groonga/doc/ja/source/tutorial/tutorial10.txt +0 -486
  385. data/vendor/local/share/groonga/doc/ja/source/type.txt +0 -118
  386. data/vendor/local/share/groonga/doc/ja/source/update_execution_example.py +0 -113
  387. data/vendor/local/share/man/man1/groonga.1 +0 -5498
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
+ # Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -39,7 +39,7 @@ module Groonga
39
39
  end
40
40
 
41
41
  def build(&block)
42
- expression = Expression.new(:name => @name)
42
+ expression = Expression.new(:name => @name, :context => @table.context)
43
43
  variable = expression.define_variable(:domain => @table)
44
44
  build_expression(expression, variable, &block)
45
45
  end
@@ -212,13 +212,25 @@ module Groonga
212
212
  SubExpressionBuilder.new(query, options)
213
213
  end
214
214
 
215
+ def prefix_search(other)
216
+ PrefixSearchExpressionBuilder.new(self, normalize(other))
217
+ end
218
+
219
+ def suffix_search(other)
220
+ SuffixSearchExpressionBuilder.new(self, normalize(other))
221
+ end
222
+
215
223
  private
216
224
  def normalize(other)
217
- if @range.is_a?(Groonga::Table) and other.is_a?(Integer)
218
- Groonga::Record.new(@range, other)
219
- else
220
- other
225
+ if @range.is_a?(Groonga::Table)
226
+ if other.respond_to?(:record_id)
227
+ id = other.record_id
228
+ else
229
+ id = other
230
+ end
231
+ return Groonga::Record.new(@range, id) if id.is_a?(Integer)
221
232
  end
233
+ other
222
234
  end
223
235
 
224
236
  def method_missing(name, *args, &block)
@@ -359,6 +371,18 @@ module Groonga
359
371
  expression.parse(@query, @options)
360
372
  end
361
373
  end
374
+
375
+ class PrefixSearchExpressionBuilder < BinaryExpressionBuilder # :nodoc:
376
+ def initialize(column_value_builder, value)
377
+ super(Groonga::Operation::PREFIX, column_value_builder, value)
378
+ end
379
+ end
380
+
381
+ class SuffixSearchExpressionBuilder < BinaryExpressionBuilder # :nodoc:
382
+ def initialize(column_value_builder, value)
383
+ super(Groonga::Operation::SUFFIX, column_value_builder, value)
384
+ end
385
+ end
362
386
  end
363
387
 
364
388
  class RecordExpressionBuilder # :nodoc:
@@ -414,6 +438,18 @@ module Groonga
414
438
  MatchTargetExpressionBuilder.new(build_match_target(&block))
415
439
  end
416
440
 
441
+ def index(name)
442
+ object = @table.context[name]
443
+ if object.nil?
444
+ raise ArgumentError, "unknown index column: <#{name}>"
445
+ end
446
+ if object.range != @table
447
+ raise ArgumentError,
448
+ "differenct index column: <#{name}>: #{object.inspect}"
449
+ end
450
+ column_expression_builder(object, name)
451
+ end
452
+
417
453
  private
418
454
  def build_match_target(&block)
419
455
  sub_builder = MatchTargetRecordExpressionBuilder.new(@table, nil)
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
+ # Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -21,8 +21,6 @@ module Groonga
21
21
  class Record
22
22
  # レコードが所属するテーブル
23
23
  attr_reader :table
24
- # レコードのID
25
- attr_reader :id
26
24
  # _table_の_id_に対応するレコードを作成する。_values_には各
27
25
  # カラムに設定する値を以下のような形式で指定する。
28
26
  #
@@ -104,15 +102,22 @@ module Groonga
104
102
  column(column_name).prepend(@id, value)
105
103
  end
106
104
 
105
+ # call-seq:
106
+ # record.support_key? -> true/false
107
+ #
108
+ # _record_が所属するテーブルで主キーを使える場合は+true+
109
+ # を返し、使えない場合は+false+を返す。
110
+ def support_key?
111
+ @table.support_key?
112
+ end
113
+
107
114
  # call-seq:
108
115
  # record.have_column?(name) -> true/false
109
116
  #
110
117
  # 名前が_name_のカラムがレコードの所属するテーブルで定義され
111
118
  # ているなら+true+を返す。
112
119
  def have_column?(name)
113
- column(name).is_a?(Groonga::Column)
114
- rescue Groonga::NoSuchColumn
115
- false
120
+ not @table.column(normalize_column_name(name)).nil?
116
121
  end
117
122
 
118
123
  # call-seq:
@@ -120,7 +125,36 @@ module Groonga
120
125
  #
121
126
  # 名前が_name_のカラムが参照カラムであるなら+true+を返す。
122
127
  def reference_column?(name)
123
- column(name).range.is_a?(Groonga::Table)
128
+ column(name).reference?
129
+ end
130
+
131
+ # call-seq:
132
+ # record.index_column?(name) -> true/false
133
+ #
134
+ # 名前が_name_のカラムが索引カラム
135
+ # (Groonga::IndexColumn)であるなら+true+を返す。
136
+ def index_column?(name)
137
+ column(name).index?
138
+ end
139
+
140
+ # call-seq:
141
+ # record.vector_column?(name) -> true/false
142
+ #
143
+ # 名前が_name_のカラムの値がベクターであるなら+true+を返す。
144
+ #
145
+ # @since: 1.0.5
146
+ def vector_column?(name)
147
+ column(name).vector?
148
+ end
149
+
150
+ # call-seq:
151
+ # record.scalar_column?(name) -> true/false
152
+ #
153
+ # 名前が_name_のカラムの値がスカラーであるなら+true+を返す。
154
+ #
155
+ # @since: 1.0.5
156
+ def scalar_column?(name)
157
+ column(name).scalar?
124
158
  end
125
159
 
126
160
  # call-seq:
@@ -141,20 +175,44 @@ module Groonga
141
175
  # _record_が所属するテーブルがGroonga:::Arrayの場合は常
142
176
  # に+nil+を返す。
143
177
  def key
144
- if @table.is_a?(Groonga::Array)
178
+ if support_key?
179
+ @key ||= @table.key(@id)
180
+ else
145
181
  nil
182
+ end
183
+ end
184
+
185
+ # call-seq:
186
+ # record.record_id -> IDまたは主キー
187
+ #
188
+ # レコードを一意に識別するための情報を返す。
189
+ #
190
+ # _record_が所属するテーブルがGroonga:::Arrayの場合はID
191
+ # を返し、それ以外の場合は主キーを返す。
192
+ def record_id
193
+ if support_key?
194
+ key
146
195
  else
147
- @key ||= @table.key(@id)
196
+ id
148
197
  end
149
198
  end
150
199
 
200
+ # call-seq:
201
+ # record.record_raw_id -> ID
202
+ #
203
+ # レコードのIDを返す。
204
+ def record_raw_id
205
+ @id
206
+ end
207
+ alias_method :id, :record_raw_id
208
+
151
209
  # call-seq:
152
210
  # record.score -> スコア値
153
211
  #
154
212
  # レコードのスコア値を返す。検索結果として生成されたテーブル
155
213
  # のみに定義される。
156
214
  def score
157
- self["._score"]
215
+ self["_score"]
158
216
  end
159
217
 
160
218
  # call-seq:
@@ -163,10 +221,10 @@ module Groonga
163
221
  # 主キーの値が同一であったレコードの件数を返す。検索結果とし
164
222
  # て生成されたテーブルのみに定義される。
165
223
  #
166
- # Groonga::Record#support_sub_recordsでこの値を利用でき
224
+ # Groonga::Record#support_sub_records?でこの値を利用でき
167
225
  # るかがわかる。
168
226
  def n_sub_records
169
- self["._nsubrecs"]
227
+ self["_nsubrecs"]
170
228
  end
171
229
 
172
230
  # call-seq:
@@ -228,8 +286,7 @@ module Groonga
228
286
  # たこのレコードのカラムの値のハッシュを返す。
229
287
  def attributes
230
288
  attributes = {"id" => id}
231
- _key = key
232
- attributes["key"] = _key if _key
289
+ attributes["key"] = key if support_key?
233
290
  table_name = @table.name
234
291
  columns.each do |column|
235
292
  next if column.is_a?(Groonga::IndexColumn)
@@ -298,6 +355,14 @@ module Groonga
298
355
  @table.locked?(options.merge(:id => @id))
299
356
  end
300
357
 
358
+ # call-seq:
359
+ # record.valid_id? -> true/false
360
+ #
361
+ # レコードが持つIDが有効なIDであれば+true+を返す。
362
+ def valid_id?
363
+ @table.exist?(@id)
364
+ end
365
+
301
366
  def methods(include_inherited=true) # :nodoc:
302
367
  _methods = super
303
368
  return _methods unless include_inherited
@@ -314,8 +379,12 @@ module Groonga
314
379
  end
315
380
 
316
381
  private
382
+ def normalize_column_name(name)
383
+ name.to_s
384
+ end
385
+
317
386
  def column(name) # :nodoc:
318
- _column = @table.column(name.to_s)
387
+ _column = @table.column(normalize_column_name(name))
319
388
  raise NoSuchColumn, "column(#{name.inspect}) is nil" if _column.nil?
320
389
  _column
321
390
  end
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
- # Copyright (C) 2009-2010 Kouhei Sutou <kou@clear-code.com>
3
+ # Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -15,6 +15,7 @@
15
15
  # License along with this library; if not, write to the Free Software
16
16
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
 
18
+ require 'fileutils'
18
19
 
19
20
  module Groonga
20
21
 
@@ -80,12 +81,22 @@ module Groonga
80
81
  end
81
82
  end
82
83
 
84
+ # 未知のインデックス対象テーブルを指定したときに発生する。
85
+ class UnknownIndexTargetTable < Error
86
+ attr_reader :table
87
+ def initialize(table)
88
+ @table = table
89
+ super("unknown index target table: <#{@table.inspect}>")
90
+ end
91
+ end
92
+
83
93
  # 未知のインデックス対象を指定したときに発生する。
84
94
  class UnknownIndexTarget < Error
85
- attr_reader :target_name
86
- def initialize(target_name)
87
- @target_name = target_name
88
- super("unknown index target: <#{@target_name}>")
95
+ attr_reader :table, :targets
96
+ def initialize(table, targets)
97
+ @table = table
98
+ @targets = targets
99
+ super("unknown index target: <#{@table.inspect}>: <#{@targets.inspect}>")
89
100
  end
90
101
  end
91
102
 
@@ -96,7 +107,7 @@ module Groonga
96
107
  @options = options
97
108
  @unknown_keys = unknown_keys
98
109
  @available_keys = available_keys
99
- message = "unknown keys are specified: #{u@nknown_keys.inspect}"
110
+ message = "unknown keys are specified: #{@unknown_keys.inspect}"
100
111
  message << ": available keys: #{@available_keys.inspect}"
101
112
  message << ": options: #{@options.inspect}"
102
113
  super(message)
@@ -114,6 +125,18 @@ module Groonga
114
125
  end
115
126
  end
116
127
 
128
+ # 参照先のテーブルを推測できないときに発生する。
129
+ class UnguessableReferenceTable < Error
130
+ attr_reader :name, :tried_table_names
131
+ def initialize(name, tried_table_names)
132
+ @name = name
133
+ @tried_table_names = tried_table_names
134
+ super("failed to guess referenced table name " +
135
+ "for reference column: #{@name.inspect}: " +
136
+ "tried table names: #{@tried_table_names.inspect}")
137
+ end
138
+ end
139
+
117
140
  class << self
118
141
 
119
142
  # call-seq:
@@ -349,6 +372,20 @@ module Groonga
349
372
  end
350
373
  end
351
374
 
375
+ # call-seq:
376
+ # Groonga::Schema.remove_column(table_name, column_name)
377
+ #
378
+ # 以下と同様:
379
+ #
380
+ # Groonga::Schema.change_table(table_name) do |table|
381
+ # table.remove_column(column_name)
382
+ # end
383
+ def remove_column(table_name, column_name)
384
+ change_table(table_name) do |table|
385
+ table.remove_column(column_name)
386
+ end
387
+ end
388
+
352
389
  # スキーマの内容を文字列で返す。返された値は
353
390
  # Groonga::Schema.restoreすることによりスキーマ内に組
354
391
  # み込むことができる。
@@ -369,39 +406,78 @@ module Groonga
369
406
  # スキーマ定義時に使用するGroonga::Contextを指定する。
370
407
  # 省略した場合はGroonga::Context.defaultを使用する。
371
408
  def dump(options={})
372
- Dumper.new(options).dump
409
+ options = options.dup
410
+ schema = new(:context => options.delete(:context))
411
+ schema.dump
373
412
  end
374
413
 
375
414
  # Groonga::Schema.dumpで文字列化したスキーマを組み込む。
376
415
  def restore(dumped_text, options={})
377
416
  define(options) do |schema|
378
- schema.load(dumped_text)
417
+ schema.restore(dumped_text)
379
418
  end
380
419
  end
381
420
 
421
+ NORMALIZE_TYPE_TABLE = {
422
+ "short_text" => "ShortText",
423
+ "string" => "ShortText",
424
+ "text" => "Text",
425
+ "binary" => "LongText",
426
+ "long_text" => "LongText",
427
+ "int" => "Int32",
428
+ "integer" => "Int32",
429
+ "int32" => "Int32",
430
+ "integer32" => "Int32",
431
+ "decimal" => "Int64",
432
+ "int64" => "Int64",
433
+ "integer64" => "Int64",
434
+ "uint" => "UInt32",
435
+ "unsigned_integer" => "UInt32",
436
+ "uint32" => "UInt32",
437
+ "unsigned_integer32" => "UInt32",
438
+ "uint64" => "UInt64",
439
+ "unsigned_integer64" => "UInt64",
440
+ "float" => "Float",
441
+ "datetime" => "Time",
442
+ "timestamp" => "Time",
443
+ "time" => "Time",
444
+ "date" => "Time",
445
+ "boolean" => "Bool",
446
+ "unigram" => "TokenUnigram",
447
+ "token_unigram" => "TokenUnigram",
448
+ "bigram" => "TokenBigram",
449
+ "token_bigram" => "TokenBigram",
450
+ "bigram_split_symbol" => "TokenBigramSplitSymbol",
451
+ "token_bigram_split_symbol" => "TokenBigramSplitSymbol",
452
+ "bigram_split_symbol_alpha" => "TokenBigramSplitSymbolAlpha",
453
+ "token_bigram_split_symbol_alpha" => "TokenBigramSplitSymbolAlpha",
454
+ "bigram_split_symbol_alpha_digit" => "TokenBigramSplitSymbolAlphaDigit",
455
+ "token_bigram_split_symbol_alpha_digit" =>
456
+ "TokenBigramSplitSymbolAlphaDigit",
457
+ "bigram_ignore_blank" => "TokenBigramIgnoreBlank",
458
+ "token_bigram_ignore_blank" => "TokenBigramIgnoreBlank",
459
+ "bigram_ignore_blank_split_symbol" =>
460
+ "TokenBigramIgnoreBlankSplitSymbol",
461
+ "token_bigram_ignore_blank_split_symbol" =>
462
+ "TokenBigramIgnoreBlankSplitSymbol",
463
+ "bigram_ignore_blank_split_symbol_alpha" =>
464
+ "TokenBigramIgnoreBlankSplitSymbolAlpha",
465
+ "token_bigram_ignore_blank_split_symbol_alpha" =>
466
+ "TokenBigramIgnoreBlankSplitSymbolAlpha",
467
+ "bigram_ignore_blank_split_symbol_alpha_digit" =>
468
+ "TokenBigramIgnoreBlankSplitSymbolAlphaDigit",
469
+ "token_bigram_ignore_blank_split_symbol_alpha_digit" =>
470
+ "TokenBigramIgnoreBlankSplitSymbolAlphaDigit",
471
+ "trigram" => "TokenTrigram",
472
+ "token_trigram" => "TokenTrigram",
473
+ "mecab" => "TokenMecab",
474
+ "token_mecab"=> "TokenMecab",
475
+ }
382
476
  def normalize_type(type) # :nodoc:
383
477
  return type if type.nil?
384
478
  return type if type.is_a?(Groonga::Object)
385
- case type.to_s
386
- when "string"
387
- "ShortText"
388
- when "text"
389
- "Text"
390
- when "int", "integer"
391
- "Int32"
392
- when "float"
393
- "Float"
394
- when "decimal"
395
- "Int64"
396
- when "datetime", "timestamp", "time", "date"
397
- "Time"
398
- when "binary"
399
- "LongText"
400
- when "boolean"
401
- "Bool"
402
- else
403
- type
404
- end
479
+ type = type.to_s if type.is_a?(Symbol)
480
+ NORMALIZE_TYPE_TABLE[type] || type
405
481
  end
406
482
  end
407
483
 
@@ -414,6 +490,7 @@ module Groonga
414
490
  # 省略した場合はGroonga::Context.defaultを使用する。
415
491
  def initialize(options={})
416
492
  @options = (options || {}).dup
493
+ @options[:context] ||= Groonga::Context.default
417
494
  @definitions = []
418
495
  end
419
496
 
@@ -424,13 +501,23 @@ module Groonga
424
501
  end
425
502
  end
426
503
 
427
- # Groonga::Schema.dumpで返されたスキーマの内容を読み込む。
504
+ # Groonga::Schema#dumpで返されたスキーマの内容を読み込む。
428
505
  #
429
506
  # 読み込まれた内容は#defineを呼び出すまでは実行されない
430
507
  # ことに注意すること。
431
- def load(dumped_text)
508
+ def restore(dumped_text)
432
509
  instance_eval(dumped_text)
433
510
  end
511
+ # for backward compatibility.
512
+ # TODO: remove this at the next major release.
513
+ alias_method :load, :restore
514
+
515
+ # スキーマの内容を文字列で返す。返された値は
516
+ # Groonga::Schema#restoreすることによりスキーマ内に組み込むことができる。
517
+ def dump
518
+ dumper = Dumper.new(:context => @options[:context])
519
+ dumper.dump
520
+ end
434
521
 
435
522
  # call-seq:
436
523
  # schema.create_table(name, options={}) {|table| ...}
@@ -516,7 +603,7 @@ module Groonga
516
603
  # 登録される。
517
604
  def create_table(name, options={})
518
605
  definition = TableDefinition.new(name, @options.merge(options || {}))
519
- yield(definition)
606
+ yield(definition) if block_given?
520
607
  @definitions << definition
521
608
  end
522
609
 
@@ -624,10 +711,47 @@ module Groonga
624
711
  @definitions << definition
625
712
  end
626
713
 
714
+ # call-seq:
715
+ # schema.remove_column(table_name, column_name)
716
+ #
717
+ # 以下と同様:
718
+ #
719
+ # schema.change_table(table_name) do |table|
720
+ # table.remove_column(column_name)
721
+ # end
722
+ def remove_column(table_name, column_name)
723
+ change_table(table_name) do |table|
724
+ table.remove_column(column_name)
725
+ end
726
+ end
727
+
728
+ def context # :nodoc:
729
+ @options[:context] || Groonga::Context.default
730
+ end
731
+
732
+ module Path # :nodoc:
733
+ def tables_directory_path(database)
734
+ "#{database.path}.tables"
735
+ end
736
+
737
+ def columns_directory_path(table)
738
+ "#{table.path}.columns"
739
+ end
740
+
741
+ def rmdir_if_dir_exists(dir)
742
+ begin
743
+ Dir.rmdir(dir)
744
+ rescue Errno::ENOENT
745
+ end
746
+ end
747
+ end
748
+
627
749
  # スキーマ定義時にGroonga::Schema.create_tableや
628
750
  # Groonga::Schema#create_tableからブロックに渡されてくる
629
751
  # オブジェクト
630
752
  class TableDefinition
753
+ include Path
754
+
631
755
  # テーブルの名前
632
756
  attr_reader :name
633
757
 
@@ -708,9 +832,9 @@ module Groonga
708
832
  self
709
833
  end
710
834
 
711
- # 名前が_name_のカラムを削除する。
835
+ # 名前が_name_のカラムを削除します。
712
836
  #
713
- # _options_に指定可能な値はない(TODO _options_は不要?)。
837
+ # _options_に指定可能な値はありません(TODO _options_は不要?)。
714
838
  #
715
839
  def remove_column(name, options={})
716
840
  definition = self[name, ColumnRemoveDefinition]
@@ -725,9 +849,11 @@ module Groonga
725
849
  # call-seq:
726
850
  # table.index(target_column_full_name, options={})
727
851
  # table.index(target_table, target_column, options={})
852
+ # table.index(target_table, target_column1, target_column2, ..., options={})
728
853
  #
729
- # _target_table_の_target_column_を対象とするインデッ
730
- # クスカラムを作成する。
854
+ # _target_table_の_target_column_を対象とするインデック
855
+ # スカラムを作成します。複数のカラムを指定することもで
856
+ # きます。
731
857
  #
732
858
  # _target_column_full_name_で指定するときはテーブル名
733
859
  # とカラム名を"."でつなげます。例えば、「Users」テーブ
@@ -753,31 +879,71 @@ module Groonga
753
879
  # した場合は自動的にパスが付加される。
754
880
  #
755
881
  # [+:with_section+]
756
- # 転置索引にsection(段落情報)を合わせて格納する。
882
+ # +true+を指定すると転置索引にsection(段落情報)を合
883
+ # わせて格納する。未指定または+nil+を指定した場合、
884
+ # 複数のカラムを指定すると自動的に有効になる。
757
885
  #
758
886
  # [+:with_weight+]
759
- # 転置索引にweight情報を合わせて格納する。
887
+ # +true+を指定すると転置索引にweight情報を合わせて格
888
+ # 納する。
760
889
  #
761
890
  # [+:with_position+]
762
- # 転置索引に出現位置情報を合わせて格納する。
891
+ # +true+を指定すると転置索引に出現位置情報を合わせて
892
+ # 格納する。未指定または+nil+を指定した場合、テーブ
893
+ # ルがN-gram系のトークナイザーを利用している場合は自
894
+ # 動的に有効になる。
763
895
  def index(target_table_or_target_column_full_name, *args)
764
- if args.size > 2
765
- n_args = args.size + 1
766
- raise ArgumentError, "wrong number of arguments (#{n_args} for 2 or 3)"
896
+ key, target_table, target_columns, options =
897
+ parse_index_argument(target_table_or_target_column_full_name, *args)
898
+
899
+ name = options.delete(:name)
900
+ definition = self[key, IndexColumnDefinition]
901
+ if definition.nil?
902
+ definition = IndexColumnDefinition.new(name, options)
903
+ update_definition(key, IndexColumnDefinition, definition)
767
904
  end
768
- options = nil
769
- options = args.pop if args.last.is_a?(::Hash)
770
- if args.empty?
771
- target_column_full_name = target_table_or_target_column_full_name
772
- if target_column_full_name.is_a?(Groonga::Column)
773
- target_column_full_name = target_column_full_name.name
774
- end
775
- target_table, target_column = target_column_full_name.split(/\./, 2)
776
- else
777
- target_table = target_table_or_target_column_full_name
778
- target_column = args.pop
905
+ definition.target_table = target_table
906
+ definition.target_columns = target_columns
907
+ definition.options.merge!(column_options.merge(options))
908
+ self
909
+ end
910
+
911
+ # call-seq:
912
+ # table.remove_index(target_column_full_name, options={})
913
+ # table.remove_index(target_table, target_column, options={})
914
+ # table.remove_index(target_table, target_column1, target_column2, ..., options={})
915
+ #
916
+ # _target_table_の_target_column_を対象とするインデッ
917
+ # クスカラムを削除します。
918
+ #
919
+ # _target_column_full_name_で指定するときはテーブル名
920
+ # とカラム名を"."でつなげます。例えば、「Users」テーブ
921
+ # ルの「name」カラムのインデックスカラムを削除する場合
922
+ # はこうなります。
923
+ #
924
+ # table.remove_index("Users.name")
925
+ #
926
+ # _options_に指定可能な値は以下の通り。
927
+ #
928
+ # [+:name+]
929
+ # インデックスカラムのカラム名を任意に指定する。
930
+ def remove_index(target_table_or_target_column_full_name, *args)
931
+ key, target_table, target_columns, options =
932
+ parse_index_argument(target_table_or_target_column_full_name, *args)
933
+
934
+ name = options.delete(:name)
935
+ name ||= lambda do |context|
936
+ IndexColumnDefinition.column_name(context,
937
+ target_table,
938
+ target_columns)
939
+ end
940
+ definition = self[key, ColumnRemoveDefinition]
941
+ if definition.nil?
942
+ definition = ColumnRemoveDefinition.new(name, options)
943
+ update_definition(key, ColumnRemoveDefinition, definition)
779
944
  end
780
- define_index(target_table, target_column, options || {})
945
+ definition.options.merge!(options)
946
+ self
781
947
  end
782
948
 
783
949
  # 名前が_name_の32bit符号付き整数のカラムを作成する。
@@ -836,6 +1002,14 @@ module Groonga
836
1002
  column(name, "Time", options)
837
1003
  end
838
1004
 
1005
+ # 以下と同様:
1006
+ # table.time("updated_at")
1007
+ # table.time("created_at")
1008
+ def timestamps(options={})
1009
+ time("created_at", options)
1010
+ time("updated_at", options)
1011
+ end
1012
+
839
1013
  # 名前が_name_の4Kbyte以下の文字列を格納できるカラムを
840
1014
  # 作成する。
841
1015
  #
@@ -867,9 +1041,13 @@ module Groonga
867
1041
  # 名前が_name_で_table_のレコードIDを格納する参照カラ
868
1042
  # ムを作成する。
869
1043
  #
1044
+ # _table_が省略された場合は_name_の複数形が使われる。
1045
+ # 例えば、_name_が"user"な場合は_table_は"users"になる。
1046
+ #
870
1047
  # _options_に指定可能な値は
871
1048
  # Groonga::Schema::TableDefinition#columnを参照。
872
- def reference(name, table, options={})
1049
+ def reference(name, table=nil, options={})
1050
+ table ||= lambda {|context| guess_table_name(context, name)}
873
1051
  column(name, table, options)
874
1052
  end
875
1053
 
@@ -894,8 +1072,8 @@ module Groonga
894
1072
  end
895
1073
 
896
1074
  private
897
- def update_definition(name, definition_class, definition) # :nodoc:
898
- old_definition = self[name, definition_class]
1075
+ def update_definition(key, definition_class, definition) # :nodoc:
1076
+ old_definition = self[key, definition_class]
899
1077
  if old_definition
900
1078
  index = @definitions.index(old_definition)
901
1079
  @definitions[index] = definition
@@ -934,14 +1112,14 @@ module Groonga
934
1112
  def create_options # :nodoc:
935
1113
  common = {
936
1114
  :name => @name,
937
- :path => @options[:path],
1115
+ :path => path,
938
1116
  :persistent => persistent?,
939
1117
  :value_type => @options[:value_type],
940
1118
  :context => context,
941
1119
  :sub_records => @options[:sub_records],
942
1120
  }
943
1121
  key_support_table_common = {
944
- :key_type => Schema.normalize_type(@options[:key_type]),
1122
+ :key_type => normalize_key_type(@options[:key_type] || "ShortText"),
945
1123
  :key_normalize => @options[:key_normalize],
946
1124
  :default_tokenizer => @options[:default_tokenizer],
947
1125
  }
@@ -958,6 +1136,14 @@ module Groonga
958
1136
  end
959
1137
  end
960
1138
 
1139
+ def path
1140
+ user_path = @options[:path]
1141
+ return user_path if user_path
1142
+ tables_dir = tables_directory_path(context.database)
1143
+ FileUtils.mkdir_p(tables_dir)
1144
+ File.join(tables_dir, @name)
1145
+ end
1146
+
961
1147
  def column_options # :nodoc:
962
1148
  {:persistent => persistent?}
963
1149
  end
@@ -966,19 +1152,26 @@ module Groonga
966
1152
  @options[:persistent].nil? ? true : @options[:persistent]
967
1153
  end
968
1154
 
969
- def define_index(target_table, target_column, options)
970
- name = options.delete(:name)
971
- name ||= "#{target_table}_#{target_column}".gsub(/\./, "_")
972
-
973
- definition = self[name, IndexColumnDefinition]
974
- if definition.nil?
975
- definition = IndexColumnDefinition.new(name, options)
976
- update_definition(name, IndexColumnDefinition, definition)
1155
+ def parse_index_argument(target_table_or_target_column_full_name, *args)
1156
+ options = nil
1157
+ options = args.pop if args.last.is_a?(::Hash)
1158
+ if args.empty?
1159
+ target_column_full_name = target_table_or_target_column_full_name
1160
+ if target_column_full_name.is_a?(Groonga::Column)
1161
+ target_column_full_name = target_column_full_name.name
1162
+ end
1163
+ target_table, target_column = target_column_full_name.split(/\./, 2)
1164
+ target_columns = [target_column]
1165
+ key = [target_table, target_columns]
1166
+ else
1167
+ target_table_name = target_table_or_target_column_full_name
1168
+ target_table = lambda do |context|
1169
+ guess_table_name(context, target_table_name)
1170
+ end
1171
+ target_columns = args
1172
+ key = [target_table_name, target_columns]
977
1173
  end
978
- definition.target_table = target_table
979
- definition.target_column = target_column
980
- definition.options.merge!(column_options.merge(options))
981
- self
1174
+ [key, target_table, target_columns, options || {}]
982
1175
  end
983
1176
 
984
1177
  def same_table?(table, options)
@@ -987,12 +1180,15 @@ module Groonga
987
1180
  sub_records = options[:sub_records]
988
1181
  sub_records = false if sub_records.nil?
989
1182
  return false unless table.support_sub_records? == sub_records
1183
+ path = options[:path]
1184
+ return false if path and table.path != path
990
1185
 
991
1186
  case table
992
1187
  when Groonga::Array
993
1188
  true
994
1189
  when Groonga::Hash, Groonga::PatriciaTrie
995
- return false unless table.domain == resolve_name(options[:key_type])
1190
+ key_type = normalize_key_type(options[:key_type])
1191
+ return false unless table.domain == resolve_name(key_type)
996
1192
  default_tokenizer = resolve_name(options[:default_tokenizer])
997
1193
  return false unless table.default_tokenizer == default_tokenizer
998
1194
  key_normalize = options[:key_normalize]
@@ -1009,26 +1205,57 @@ module Groonga
1009
1205
  end
1010
1206
  end
1011
1207
 
1208
+ def normalize_key_type(key_type)
1209
+ Schema.normalize_type(key_type || "ShortText")
1210
+ end
1211
+
1012
1212
  def resolve_name(type)
1013
- if type.nil?
1014
- nil
1015
- elsif type.is_a?(String)
1213
+ if type.is_a?(String)
1016
1214
  context[type]
1017
1215
  else
1018
1216
  type
1019
1217
  end
1020
1218
  end
1219
+
1220
+ def guess_table_name(context, name)
1221
+ original_name = name
1222
+ name = name.to_s
1223
+ candidate_names = [name]
1224
+ if name.respond_to?(:pluralize)
1225
+ pluralized_name = name.pluralize
1226
+ else
1227
+ pluralized_name = "#{name}s"
1228
+ end
1229
+ candidate_names << pluralized_name
1230
+ if pluralized_name.respond_to?(:camelize)
1231
+ candidate_names << pluralized_name.camelize
1232
+ else
1233
+ candidate_names << pluralized_name.split(/_/).collect do |word|
1234
+ word.capitalize
1235
+ end.join
1236
+ end
1237
+ candidate_names.each do |table_name|
1238
+ return table_name if context[table_name]
1239
+ end
1240
+ raise UnguessableReferenceTable.new(original_name, candidate_names)
1241
+ end
1021
1242
  end
1022
1243
 
1023
1244
  class TableRemoveDefinition # :nodoc:
1245
+ include Path
1246
+
1024
1247
  def initialize(name, options={})
1025
1248
  @name = name
1026
1249
  @options = options
1027
1250
  end
1028
1251
 
1029
1252
  def define
1030
- context = @options[:context] || Groonga::Context.default
1031
- context[@name].remove
1253
+ context = @options[:context]
1254
+ table = context[@name]
1255
+ dir = columns_directory_path(table)
1256
+ result = table.remove
1257
+ rmdir_if_dir_exists(dir)
1258
+ result
1032
1259
  end
1033
1260
  end
1034
1261
 
@@ -1119,6 +1346,8 @@ module Groonga
1119
1346
  end
1120
1347
 
1121
1348
  class ColumnDefinition # :nodoc:
1349
+ include Path
1350
+
1122
1351
  attr_accessor :name, :type
1123
1352
  attr_reader :options
1124
1353
 
@@ -1130,26 +1359,51 @@ module Groonga
1130
1359
  end
1131
1360
 
1132
1361
  def define(table_definition, table)
1362
+ context = table_definition.context
1133
1363
  column = table.column(@name)
1364
+ options = define_options(context, table)
1134
1365
  if column
1135
- return column if same_column?(table_definition, column)
1136
- if @options.delete(:force)
1366
+ return column if same_column?(context, column)
1367
+ if @options[:force]
1137
1368
  column.remove
1138
1369
  else
1139
- options = @options.merge(:type => @type)
1140
1370
  raise ColumnCreationWithDifferentOptions.new(column, options)
1141
1371
  end
1142
1372
  end
1143
1373
  table.define_column(@name,
1144
- Schema.normalize_type(@type),
1145
- @options)
1374
+ normalize_type(context),
1375
+ options)
1146
1376
  end
1147
1377
 
1148
1378
  private
1149
- def same_column?(table_definition, column)
1150
- context = table_definition.context
1379
+ def normalize_type(context)
1380
+ if @type.respond_to?(:call)
1381
+ resolved_type = @type.call(context)
1382
+ else
1383
+ resolved_type = @type
1384
+ end
1385
+ Schema.normalize_type(resolved_type)
1386
+ end
1387
+
1388
+ def same_column?(context, column)
1151
1389
  # TODO: should check column type and other options.
1152
- column.range == context[Schema.normalize_type(@type)]
1390
+ column.range == context[normalize_type(context)]
1391
+ end
1392
+
1393
+ def define_options(context, table)
1394
+ {
1395
+ :path => path(context, table),
1396
+ :type => @options[:type],
1397
+ :compress => @options[:compress],
1398
+ }
1399
+ end
1400
+
1401
+ def path(context, table)
1402
+ user_path = @options[:path]
1403
+ return user_path if user_path
1404
+ columns_dir = columns_directory_path(table)
1405
+ FileUtils.mkdir_p(columns_dir)
1406
+ File.join(columns_dir, @name)
1153
1407
  end
1154
1408
  end
1155
1409
 
@@ -1164,12 +1418,35 @@ module Groonga
1164
1418
  end
1165
1419
 
1166
1420
  def define(table_definition, table)
1167
- table.column(@name).remove
1421
+ if @name.respond_to?(:call)
1422
+ name = @name.call(table_definition.context)
1423
+ else
1424
+ name = @name
1425
+ end
1426
+ table.column(name).remove
1168
1427
  end
1169
1428
  end
1170
1429
 
1171
1430
  class IndexColumnDefinition # :nodoc:
1172
- attr_accessor :name, :target_table, :target_column
1431
+ include Path
1432
+
1433
+ class << self
1434
+ def column_name(context, target_table, target_columns)
1435
+ target_table = resolve(context, target_table)
1436
+ "#{target_table.name}_#{target_columns.join('_')}"
1437
+ end
1438
+
1439
+ def resolve(context, object)
1440
+ return object if object.is_a?(Groonga::Object)
1441
+ if object.respond_to?(:call)
1442
+ object = object.call(context)
1443
+ end
1444
+ return nil if object.nil?
1445
+ context[object]
1446
+ end
1447
+ end
1448
+
1449
+ attr_accessor :name, :target_table, :target_columns
1173
1450
  attr_reader :options
1174
1451
 
1175
1452
  def initialize(name, options={})
@@ -1177,48 +1454,83 @@ module Groonga
1177
1454
  @name = @name.to_s if @name.is_a?(Symbol)
1178
1455
  @options = (options || {}).dup
1179
1456
  @target_table = nil
1180
- @target_column = nil
1457
+ @target_columns = nil
1181
1458
  end
1182
1459
 
1183
1460
  def define(table_definition, table)
1184
- target_name = "#{@target_table}.#{@target_column}"
1185
- target_table = table_definition.context[@target_table]
1186
- if target_table.nil? or
1187
- !(@target_column == "_key" or
1188
- target_table.have_column?(@target_column))
1189
- raise UnknownIndexTarget.new(target_name)
1461
+ context = table_definition.context
1462
+ target_table = resolve_target_table(context)
1463
+ if target_table.nil?
1464
+ raise UnknownIndexTargetTable.new(@target_table)
1465
+ end
1466
+ nonexistent_columns = nonexistent_columns(target_table)
1467
+ unless nonexistent_columns.empty?
1468
+ raise UnknownIndexTarget.new(target_table, nonexistent_columns)
1190
1469
  end
1191
- index = table.column(@name)
1470
+ name = @name || self.class.column_name(context,
1471
+ target_table,
1472
+ @target_columns)
1473
+ index = table.column(name)
1192
1474
  if index
1193
- return index if same_index?(table_definition, index)
1194
- if @options.delete(:force)
1475
+ return index if same_index?(context, index, target_table)
1476
+ if @options[:force]
1195
1477
  index.remove
1196
1478
  else
1197
1479
  options = @options.merge(:type => :index,
1198
- :target_name => target_name)
1480
+ :target_table => target_table,
1481
+ :target_columns => @target_columns)
1199
1482
  raise ColumnCreationWithDifferentOptions.new(index, options)
1200
1483
  end
1201
1484
  end
1202
- index = table.define_index_column(@name,
1203
- @target_table,
1204
- @options)
1205
- index.source = target_table.column(@target_column)
1485
+ index = table.define_index_column(name,
1486
+ target_table,
1487
+ define_options(context, table, name))
1488
+ index.sources = @target_columns.collect do |column|
1489
+ target_table.column(column)
1490
+ end
1206
1491
  index
1207
1492
  end
1208
1493
 
1209
1494
  private
1210
- def same_index?(table_definition, index)
1211
- context = table_definition.context
1495
+ def same_index?(context, index, target_table)
1212
1496
  # TODO: should check column type and other options.
1213
- return false if index.range.name != @target_table
1497
+ range = index.range
1498
+ return false if range != target_table
1214
1499
  source_names = index.sources.collect do |source|
1215
- if source == index
1216
- "#{index.range.name}._key"
1500
+ if source == range
1501
+ "_key"
1217
1502
  else
1218
- source.name
1503
+ source.local_name
1219
1504
  end
1220
1505
  end
1221
- source_names == ["#{@target_table}.#{@target_column}"]
1506
+ source_names.sort == @target_columns.sort
1507
+ end
1508
+
1509
+ def nonexistent_columns(target_table)
1510
+ @target_columns.reject do |column|
1511
+ column == "_key" or target_table.have_column?(column)
1512
+ end
1513
+ end
1514
+
1515
+ def resolve_target_table(context)
1516
+ self.class.resolve(context, @target_table)
1517
+ end
1518
+
1519
+ def define_options(context, table, name)
1520
+ {
1521
+ :path => path(context, table, name),
1522
+ :with_section => @options[:with_section],
1523
+ :with_weight => @options[:with_weight],
1524
+ :with_position => @options[:with_position],
1525
+ }
1526
+ end
1527
+
1528
+ def path(context, table, name)
1529
+ user_path = @options[:path]
1530
+ return user_path if user_path
1531
+ columns_dir = "#{table.path}.columns"
1532
+ FileUtils.mkdir_p(columns_dir)
1533
+ File.join(columns_dir, name)
1222
1534
  end
1223
1535
  end
1224
1536
 
@@ -1232,35 +1544,51 @@ module Groonga
1232
1544
  database = context.database
1233
1545
  return nil if database.nil?
1234
1546
 
1547
+ header + dump_schema(database) + footer
1548
+ end
1549
+
1550
+ def dump_schema(database)
1551
+ index_columns = []
1235
1552
  reference_columns = []
1236
1553
  definitions = []
1237
1554
  database.each do |object|
1238
1555
  next unless object.is_a?(Groonga::Table)
1239
- schema = "create_table(#{object.name.inspect}) do |table|\n"
1240
- object.columns.sort_by {|column| column.local_name}.each do |column|
1241
- if column.range.is_a?(Groonga::Table)
1242
- reference_columns << column
1556
+ table = object
1557
+ schema = create_table_header(table)
1558
+ table.columns.sort_by {|column| column.local_name}.each do |column|
1559
+ if column.is_a?(Groonga::IndexColumn)
1560
+ index_columns << column
1243
1561
  else
1244
- type = column_method(column)
1245
- name = column.local_name
1246
- schema << " table.#{type}(#{name.inspect})\n"
1562
+ if column.range.is_a?(Groonga::Table)
1563
+ reference_columns << column
1564
+ else
1565
+ schema << define_column(table, column)
1566
+ end
1247
1567
  end
1248
1568
  end
1249
- schema << "end"
1569
+ schema << create_table_footer(table)
1250
1570
  definitions << schema
1251
1571
  end
1252
1572
 
1253
1573
  reference_columns.group_by do |column|
1254
1574
  column.table
1255
1575
  end.each do |table, columns|
1256
- schema = "change_table(#{table.name.inspect}) do |table|\n"
1576
+ schema = change_table_header(table)
1257
1577
  columns.each do |column|
1258
- name = column.local_name
1259
- reference = column.range
1260
- schema << " table.reference(#{name.inspect}, " +
1261
- "#{reference.name.inspect})\n"
1578
+ schema << define_reference_column(table, column)
1262
1579
  end
1263
- schema << "end"
1580
+ schema << change_table_footer(table)
1581
+ definitions << schema
1582
+ end
1583
+
1584
+ index_columns.group_by do |column|
1585
+ column.table
1586
+ end.each do |table, columns|
1587
+ schema = change_table_header(table)
1588
+ columns.each do |column|
1589
+ schema << define_index_column(table, column)
1590
+ end
1591
+ schema << change_table_footer(table)
1264
1592
  definitions << schema
1265
1593
  end
1266
1594
 
@@ -1272,6 +1600,80 @@ module Groonga
1272
1600
  end
1273
1601
 
1274
1602
  private
1603
+ def header
1604
+ ""
1605
+ end
1606
+
1607
+ def footer
1608
+ ""
1609
+ end
1610
+
1611
+ def create_table_header(table)
1612
+ parameters = []
1613
+ unless table.is_a?(Groonga::Array)
1614
+ case table
1615
+ when Groonga::Hash
1616
+ parameters << ":type => :hash"
1617
+ when Groonga::PatriciaTrie
1618
+ parameters << ":type => :patricia_trie"
1619
+ end
1620
+ if table.domain
1621
+ parameters << ":key_type => #{table.domain.name.dump}"
1622
+ if table.normalize_key?
1623
+ parameters << ":key_normalize => true"
1624
+ end
1625
+ end
1626
+ default_tokenizer = table.default_tokenizer
1627
+ if default_tokenizer
1628
+ parameters << ":default_tokenizer => #{default_tokenizer.name.dump}"
1629
+ end
1630
+ end
1631
+ parameters << ":force => true"
1632
+ parameters.unshift("")
1633
+ parameters = parameters.join(",\n ")
1634
+ "create_table(#{table.name.dump}#{parameters}) do |table|\n"
1635
+ end
1636
+
1637
+ def create_table_footer(table)
1638
+ "end"
1639
+ end
1640
+
1641
+ def change_table_header(table)
1642
+ "change_table(#{table.name.inspect}) do |table|\n"
1643
+ end
1644
+
1645
+ def change_table_footer(table)
1646
+ "end"
1647
+ end
1648
+
1649
+ def define_column(table, column)
1650
+ type = column_method(column)
1651
+ name = column.local_name
1652
+ " table.#{type}(#{name.inspect})\n"
1653
+ end
1654
+
1655
+ def define_reference_column(table, column)
1656
+ name = column.local_name
1657
+ reference = column.range
1658
+ " table.reference(#{name.dump}, #{reference.name.dump})\n"
1659
+ end
1660
+
1661
+ def define_index_column(table, column)
1662
+ target_table_name = column.range.name
1663
+ sources = column.sources
1664
+ source_names = sources.collect do |source|
1665
+ if source.is_a?(table.class)
1666
+ "_key".dump
1667
+ else
1668
+ source.local_name.dump
1669
+ end
1670
+ end.join(", ")
1671
+ arguments = [target_table_name.dump,
1672
+ sources.size == 1 ? source_names : "[#{source_names}]",
1673
+ ":name => #{column.local_name.dump}"]
1674
+ " table.index(#{arguments.join(', ')})\n"
1675
+ end
1676
+
1275
1677
  def column_method(column)
1276
1678
  range = column.range
1277
1679
  case range.name