rroonga 2.0.0-x86-mingw32 → 2.0.1-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. data/Rakefile +3 -2
  2. data/ext/groonga/rb-grn-expression.c +4 -3
  3. data/ext/groonga/rb-grn-object.c +13 -0
  4. data/ext/groonga/rb-grn-snippet.c +32 -126
  5. data/ext/groonga/rb-grn.h +14 -11
  6. data/lib/1.8/groonga.so +0 -0
  7. data/lib/1.9/groonga.so +0 -0
  8. data/rroonga-build.rb +1 -1
  9. data/vendor/local/bin/{grntest.exe → groonga-benchmark.exe} +0 -0
  10. data/vendor/local/bin/groonga.exe +0 -0
  11. data/vendor/local/bin/libgroonga-0.dll +0 -0
  12. data/vendor/local/bin/libmecab-1.dll +0 -0
  13. data/vendor/local/bin/libmsgpack-3.dll +0 -0
  14. data/vendor/local/bin/libmsgpackc-2.dll +0 -0
  15. data/vendor/local/bin/mecab.exe +0 -0
  16. data/vendor/local/include/groonga/groonga/plugin.h +1 -1
  17. data/vendor/local/include/groonga/groonga.h +10 -3
  18. data/vendor/local/lib/groonga/plugins/suggest/suggest.a +0 -0
  19. data/vendor/local/lib/groonga/plugins/suggest/suggest.dll +0 -0
  20. data/vendor/local/lib/groonga/plugins/suggest/suggest.dll.a +0 -0
  21. data/vendor/local/lib/groonga/plugins/tokenizers/mecab.a +0 -0
  22. data/vendor/local/lib/groonga/plugins/tokenizers/mecab.dll +0 -0
  23. data/vendor/local/lib/groonga/plugins/tokenizers/mecab.dll.a +0 -0
  24. data/vendor/local/lib/libgroonga.a +0 -0
  25. data/vendor/local/lib/libgroonga.dll.a +0 -0
  26. data/vendor/local/lib/libmecab.a +0 -0
  27. data/vendor/local/lib/libmecab.dll.a +0 -0
  28. data/vendor/local/lib/libmsgpack.a +0 -0
  29. data/vendor/local/lib/libmsgpack.dll.a +0 -0
  30. data/vendor/local/lib/libmsgpackc.a +0 -0
  31. data/vendor/local/lib/libmsgpackc.dll.a +0 -0
  32. data/vendor/local/lib/pkgconfig/groonga.pc +2 -2
  33. data/vendor/local/libexec/mecab/mecab-cost-train.exe +0 -0
  34. data/vendor/local/libexec/mecab/mecab-dict-gen.exe +0 -0
  35. data/vendor/local/libexec/mecab/mecab-dict-index.exe +0 -0
  36. data/vendor/local/libexec/mecab/mecab-system-eval.exe +0 -0
  37. data/vendor/local/libexec/mecab/mecab-test-gen.exe +0 -0
  38. data/vendor/local/share/doc/groonga/en/html/.buildinfo +1 -1
  39. data/vendor/local/share/doc/groonga/en/html/_sources/commands/suggest.txt +19 -0
  40. data/vendor/local/share/doc/groonga/en/html/_sources/community.txt +2 -2
  41. data/vendor/local/share/doc/groonga/en/html/_sources/install.txt +72 -8
  42. data/vendor/local/share/doc/groonga/en/html/_sources/news.txt +45 -1
  43. data/vendor/local/share/doc/groonga/en/html/_sources/tutorial/data.txt +112 -33
  44. data/vendor/local/share/doc/groonga/en/html/_sources/tutorial/introduction.txt +109 -99
  45. data/vendor/local/share/doc/groonga/en/html/_sources/tutorial/network.txt +76 -40
  46. data/vendor/local/share/doc/groonga/en/html/_sources/type.txt +30 -21
  47. data/vendor/local/share/doc/groonga/en/html/_static/favicon.ico +0 -0
  48. data/vendor/local/share/doc/groonga/en/html/_static/groonga.css +309 -101
  49. data/vendor/local/share/doc/groonga/en/html/_static/jquery.js +4 -154
  50. data/vendor/local/share/doc/groonga/en/html/_static/logo.png +0 -0
  51. data/vendor/local/share/doc/groonga/en/html/_static/navigation-bar.png +0 -0
  52. data/vendor/local/share/doc/groonga/en/html/_static/underscore.js +29 -21
  53. data/vendor/local/share/doc/groonga/en/html/characteristic.html +1 -1
  54. data/vendor/local/share/doc/groonga/en/html/command_version.html +1 -1
  55. data/vendor/local/share/doc/groonga/en/html/commands/cache_limit.html +1 -1
  56. data/vendor/local/share/doc/groonga/en/html/commands/check.html +1 -1
  57. data/vendor/local/share/doc/groonga/en/html/commands/clearlock.html +1 -1
  58. data/vendor/local/share/doc/groonga/en/html/commands/column_create.html +1 -1
  59. data/vendor/local/share/doc/groonga/en/html/commands/column_list.html +1 -1
  60. data/vendor/local/share/doc/groonga/en/html/commands/column_remove.html +1 -1
  61. data/vendor/local/share/doc/groonga/en/html/commands/define_selector.html +1 -1
  62. data/vendor/local/share/doc/groonga/en/html/commands/defrag.html +1 -1
  63. data/vendor/local/share/doc/groonga/en/html/commands/delete.html +1 -1
  64. data/vendor/local/share/doc/groonga/en/html/commands/dump.html +1 -1
  65. data/vendor/local/share/doc/groonga/en/html/commands/load.html +1 -1
  66. data/vendor/local/share/doc/groonga/en/html/commands/log_level.html +1 -1
  67. data/vendor/local/share/doc/groonga/en/html/commands/log_put.html +1 -1
  68. data/vendor/local/share/doc/groonga/en/html/commands/log_reopen.html +1 -1
  69. data/vendor/local/share/doc/groonga/en/html/commands/quit.html +1 -1
  70. data/vendor/local/share/doc/groonga/en/html/commands/select.html +1 -1
  71. data/vendor/local/share/doc/groonga/en/html/commands/shutdown.html +1 -1
  72. data/vendor/local/share/doc/groonga/en/html/commands/status.html +1 -1
  73. data/vendor/local/share/doc/groonga/en/html/commands/suggest.html +21 -1
  74. data/vendor/local/share/doc/groonga/en/html/commands/table_create.html +1 -1
  75. data/vendor/local/share/doc/groonga/en/html/commands/table_list.html +1 -1
  76. data/vendor/local/share/doc/groonga/en/html/commands/table_remove.html +1 -1
  77. data/vendor/local/share/doc/groonga/en/html/commands/view_add.html +1 -1
  78. data/vendor/local/share/doc/groonga/en/html/commands.html +1 -1
  79. data/vendor/local/share/doc/groonga/en/html/community.html +3 -3
  80. data/vendor/local/share/doc/groonga/en/html/contribution/development/com.html +1 -1
  81. data/vendor/local/share/doc/groonga/en/html/contribution/development/document.html +1 -1
  82. data/vendor/local/share/doc/groonga/en/html/contribution/development/query.html +1 -1
  83. data/vendor/local/share/doc/groonga/en/html/contribution/development/test.html +1 -1
  84. data/vendor/local/share/doc/groonga/en/html/contribution/development.html +1 -1
  85. data/vendor/local/share/doc/groonga/en/html/contribution/documentation/c-api.html +1 -1
  86. data/vendor/local/share/doc/groonga/en/html/contribution/documentation/i18n.html +1 -1
  87. data/vendor/local/share/doc/groonga/en/html/contribution/documentation.html +1 -1
  88. data/vendor/local/share/doc/groonga/en/html/contribution/report.html +1 -1
  89. data/vendor/local/share/doc/groonga/en/html/contribution.html +1 -1
  90. data/vendor/local/share/doc/groonga/en/html/executables/grnslap.html +1 -1
  91. data/vendor/local/share/doc/groonga/en/html/executables/grntest.html +1 -1
  92. data/vendor/local/share/doc/groonga/en/html/executables/groonga-http.html +1 -1
  93. data/vendor/local/share/doc/groonga/en/html/executables/groonga-suggest-create-dataset.html +1 -1
  94. data/vendor/local/share/doc/groonga/en/html/executables/groonga.html +1 -1
  95. data/vendor/local/share/doc/groonga/en/html/executables.html +1 -1
  96. data/vendor/local/share/doc/groonga/en/html/expr.html +1 -1
  97. data/vendor/local/share/doc/groonga/en/html/functions/edit_distance.html +1 -1
  98. data/vendor/local/share/doc/groonga/en/html/functions/geo_distance.html +1 -1
  99. data/vendor/local/share/doc/groonga/en/html/functions/geo_in_circle.html +1 -1
  100. data/vendor/local/share/doc/groonga/en/html/functions/geo_in_rectangle.html +1 -1
  101. data/vendor/local/share/doc/groonga/en/html/functions/now.html +1 -1
  102. data/vendor/local/share/doc/groonga/en/html/functions/rand.html +1 -1
  103. data/vendor/local/share/doc/groonga/en/html/functions.html +1 -1
  104. data/vendor/local/share/doc/groonga/en/html/genindex.html +1 -1
  105. data/vendor/local/share/doc/groonga/en/html/geolocation_search.html +1 -1
  106. data/vendor/local/share/doc/groonga/en/html/index.html +25 -18
  107. data/vendor/local/share/doc/groonga/en/html/indexing.html +1 -1
  108. data/vendor/local/share/doc/groonga/en/html/install.html +59 -9
  109. data/vendor/local/share/doc/groonga/en/html/limitations.html +1 -1
  110. data/vendor/local/share/doc/groonga/en/html/log.html +1 -1
  111. data/vendor/local/share/doc/groonga/en/html/news/0.x.html +1 -1
  112. data/vendor/local/share/doc/groonga/en/html/news/1.0.x.html +1 -1
  113. data/vendor/local/share/doc/groonga/en/html/news/1.1.x.html +1 -1
  114. data/vendor/local/share/doc/groonga/en/html/news/1.2.x.html +1 -1
  115. data/vendor/local/share/doc/groonga/en/html/news/senna.html +1 -1
  116. data/vendor/local/share/doc/groonga/en/html/news.html +66 -15
  117. data/vendor/local/share/doc/groonga/en/html/objects.inv +0 -0
  118. data/vendor/local/share/doc/groonga/en/html/output.html +1 -1
  119. data/vendor/local/share/doc/groonga/en/html/pseudo_column.html +1 -1
  120. data/vendor/local/share/doc/groonga/en/html/reference.html +1 -1
  121. data/vendor/local/share/doc/groonga/en/html/search.html +1 -1
  122. data/vendor/local/share/doc/groonga/en/html/searchindex.js +1 -1
  123. data/vendor/local/share/doc/groonga/en/html/spec/search.html +1 -1
  124. data/vendor/local/share/doc/groonga/en/html/spec.html +1 -1
  125. data/vendor/local/share/doc/groonga/en/html/suggest/completion.html +1 -1
  126. data/vendor/local/share/doc/groonga/en/html/suggest/correction.html +1 -1
  127. data/vendor/local/share/doc/groonga/en/html/suggest/introduction.html +1 -1
  128. data/vendor/local/share/doc/groonga/en/html/suggest/suggestion.html +1 -1
  129. data/vendor/local/share/doc/groonga/en/html/suggest/tutorial.html +1 -1
  130. data/vendor/local/share/doc/groonga/en/html/suggest.html +1 -1
  131. data/vendor/local/share/doc/groonga/en/html/troubleshooting/different_results_with_the_same_keyword.html +1 -1
  132. data/vendor/local/share/doc/groonga/en/html/troubleshooting.html +1 -1
  133. data/vendor/local/share/doc/groonga/en/html/tutorial/data.html +141 -53
  134. data/vendor/local/share/doc/groonga/en/html/tutorial/drilldown.html +1 -1
  135. data/vendor/local/share/doc/groonga/en/html/tutorial/index.html +1 -1
  136. data/vendor/local/share/doc/groonga/en/html/tutorial/introduction.html +112 -106
  137. data/vendor/local/share/doc/groonga/en/html/tutorial/lexicon.html +1 -1
  138. data/vendor/local/share/doc/groonga/en/html/tutorial/match_columns.html +1 -1
  139. data/vendor/local/share/doc/groonga/en/html/tutorial/micro_blog.html +2 -2
  140. data/vendor/local/share/doc/groonga/en/html/tutorial/network.html +92 -58
  141. data/vendor/local/share/doc/groonga/en/html/tutorial/patricia_trie.html +1 -1
  142. data/vendor/local/share/doc/groonga/en/html/tutorial/query_expansion.html +1 -1
  143. data/vendor/local/share/doc/groonga/en/html/tutorial/search.html +5 -5
  144. data/vendor/local/share/doc/groonga/en/html/tutorial.html +21 -14
  145. data/vendor/local/share/doc/groonga/en/html/type.html +30 -22
  146. data/vendor/local/share/doc/groonga/ja/html/.buildinfo +1 -1
  147. data/vendor/local/share/doc/groonga/ja/html/_sources/commands/suggest.txt +19 -0
  148. data/vendor/local/share/doc/groonga/ja/html/_sources/community.txt +2 -2
  149. data/vendor/local/share/doc/groonga/ja/html/_sources/install.txt +72 -8
  150. data/vendor/local/share/doc/groonga/ja/html/_sources/news.txt +45 -1
  151. data/vendor/local/share/doc/groonga/ja/html/_sources/tutorial/data.txt +112 -33
  152. data/vendor/local/share/doc/groonga/ja/html/_sources/tutorial/introduction.txt +109 -99
  153. data/vendor/local/share/doc/groonga/ja/html/_sources/tutorial/network.txt +76 -40
  154. data/vendor/local/share/doc/groonga/ja/html/_sources/type.txt +30 -21
  155. data/vendor/local/share/doc/groonga/ja/html/_static/favicon.ico +0 -0
  156. data/vendor/local/share/doc/groonga/ja/html/_static/groonga.css +309 -101
  157. data/vendor/local/share/doc/groonga/ja/html/_static/jquery.js +4 -154
  158. data/vendor/local/share/doc/groonga/ja/html/_static/logo.png +0 -0
  159. data/vendor/local/share/doc/groonga/ja/html/_static/navigation-bar.png +0 -0
  160. data/vendor/local/share/doc/groonga/ja/html/_static/underscore.js +29 -21
  161. data/vendor/local/share/doc/groonga/ja/html/characteristic.html +1 -1
  162. data/vendor/local/share/doc/groonga/ja/html/command_version.html +1 -1
  163. data/vendor/local/share/doc/groonga/ja/html/commands/cache_limit.html +1 -1
  164. data/vendor/local/share/doc/groonga/ja/html/commands/check.html +1 -1
  165. data/vendor/local/share/doc/groonga/ja/html/commands/clearlock.html +1 -1
  166. data/vendor/local/share/doc/groonga/ja/html/commands/column_create.html +1 -1
  167. data/vendor/local/share/doc/groonga/ja/html/commands/column_list.html +1 -1
  168. data/vendor/local/share/doc/groonga/ja/html/commands/column_remove.html +1 -1
  169. data/vendor/local/share/doc/groonga/ja/html/commands/define_selector.html +1 -1
  170. data/vendor/local/share/doc/groonga/ja/html/commands/defrag.html +1 -1
  171. data/vendor/local/share/doc/groonga/ja/html/commands/delete.html +1 -1
  172. data/vendor/local/share/doc/groonga/ja/html/commands/dump.html +1 -1
  173. data/vendor/local/share/doc/groonga/ja/html/commands/load.html +1 -1
  174. data/vendor/local/share/doc/groonga/ja/html/commands/log_level.html +1 -1
  175. data/vendor/local/share/doc/groonga/ja/html/commands/log_put.html +1 -1
  176. data/vendor/local/share/doc/groonga/ja/html/commands/log_reopen.html +1 -1
  177. data/vendor/local/share/doc/groonga/ja/html/commands/quit.html +1 -1
  178. data/vendor/local/share/doc/groonga/ja/html/commands/select.html +1 -1
  179. data/vendor/local/share/doc/groonga/ja/html/commands/shutdown.html +1 -1
  180. data/vendor/local/share/doc/groonga/ja/html/commands/status.html +1 -1
  181. data/vendor/local/share/doc/groonga/ja/html/commands/suggest.html +19 -1
  182. data/vendor/local/share/doc/groonga/ja/html/commands/table_create.html +1 -1
  183. data/vendor/local/share/doc/groonga/ja/html/commands/table_list.html +1 -1
  184. data/vendor/local/share/doc/groonga/ja/html/commands/table_remove.html +1 -1
  185. data/vendor/local/share/doc/groonga/ja/html/commands/view_add.html +1 -1
  186. data/vendor/local/share/doc/groonga/ja/html/commands.html +1 -1
  187. data/vendor/local/share/doc/groonga/ja/html/community.html +3 -3
  188. data/vendor/local/share/doc/groonga/ja/html/contribution/development/com.html +1 -1
  189. data/vendor/local/share/doc/groonga/ja/html/contribution/development/document.html +1 -1
  190. data/vendor/local/share/doc/groonga/ja/html/contribution/development/query.html +1 -1
  191. data/vendor/local/share/doc/groonga/ja/html/contribution/development/test.html +1 -1
  192. data/vendor/local/share/doc/groonga/ja/html/contribution/development.html +1 -1
  193. data/vendor/local/share/doc/groonga/ja/html/contribution/documentation/c-api.html +1 -1
  194. data/vendor/local/share/doc/groonga/ja/html/contribution/documentation/i18n.html +1 -1
  195. data/vendor/local/share/doc/groonga/ja/html/contribution/documentation.html +1 -1
  196. data/vendor/local/share/doc/groonga/ja/html/contribution/report.html +1 -1
  197. data/vendor/local/share/doc/groonga/ja/html/contribution.html +1 -1
  198. data/vendor/local/share/doc/groonga/ja/html/executables/grnslap.html +1 -1
  199. data/vendor/local/share/doc/groonga/ja/html/executables/grntest.html +1 -1
  200. data/vendor/local/share/doc/groonga/ja/html/executables/groonga-http.html +1 -1
  201. data/vendor/local/share/doc/groonga/ja/html/executables/groonga-suggest-create-dataset.html +1 -1
  202. data/vendor/local/share/doc/groonga/ja/html/executables/groonga.html +1 -1
  203. data/vendor/local/share/doc/groonga/ja/html/executables.html +1 -1
  204. data/vendor/local/share/doc/groonga/ja/html/expr.html +1 -1
  205. data/vendor/local/share/doc/groonga/ja/html/functions/edit_distance.html +1 -1
  206. data/vendor/local/share/doc/groonga/ja/html/functions/geo_distance.html +1 -1
  207. data/vendor/local/share/doc/groonga/ja/html/functions/geo_in_circle.html +1 -1
  208. data/vendor/local/share/doc/groonga/ja/html/functions/geo_in_rectangle.html +1 -1
  209. data/vendor/local/share/doc/groonga/ja/html/functions/now.html +1 -1
  210. data/vendor/local/share/doc/groonga/ja/html/functions/rand.html +1 -1
  211. data/vendor/local/share/doc/groonga/ja/html/functions.html +1 -1
  212. data/vendor/local/share/doc/groonga/ja/html/genindex.html +1 -1
  213. data/vendor/local/share/doc/groonga/ja/html/geolocation_search.html +1 -1
  214. data/vendor/local/share/doc/groonga/ja/html/index.html +25 -18
  215. data/vendor/local/share/doc/groonga/ja/html/indexing.html +1 -1
  216. data/vendor/local/share/doc/groonga/ja/html/install.html +72 -22
  217. data/vendor/local/share/doc/groonga/ja/html/limitations.html +1 -1
  218. data/vendor/local/share/doc/groonga/ja/html/log.html +1 -1
  219. data/vendor/local/share/doc/groonga/ja/html/news/0.x.html +1 -1
  220. data/vendor/local/share/doc/groonga/ja/html/news/1.0.x.html +1 -1
  221. data/vendor/local/share/doc/groonga/ja/html/news/1.1.x.html +1 -1
  222. data/vendor/local/share/doc/groonga/ja/html/news/1.2.x.html +1 -1
  223. data/vendor/local/share/doc/groonga/ja/html/news/senna.html +1 -1
  224. data/vendor/local/share/doc/groonga/ja/html/news.html +60 -14
  225. data/vendor/local/share/doc/groonga/ja/html/objects.inv +0 -0
  226. data/vendor/local/share/doc/groonga/ja/html/output.html +1 -1
  227. data/vendor/local/share/doc/groonga/ja/html/pseudo_column.html +1 -1
  228. data/vendor/local/share/doc/groonga/ja/html/reference.html +1 -1
  229. data/vendor/local/share/doc/groonga/ja/html/search.html +1 -1
  230. data/vendor/local/share/doc/groonga/ja/html/searchindex.js +1 -1
  231. data/vendor/local/share/doc/groonga/ja/html/spec/search.html +1 -1
  232. data/vendor/local/share/doc/groonga/ja/html/spec.html +1 -1
  233. data/vendor/local/share/doc/groonga/ja/html/suggest/completion.html +1 -1
  234. data/vendor/local/share/doc/groonga/ja/html/suggest/correction.html +1 -1
  235. data/vendor/local/share/doc/groonga/ja/html/suggest/introduction.html +1 -1
  236. data/vendor/local/share/doc/groonga/ja/html/suggest/suggestion.html +1 -1
  237. data/vendor/local/share/doc/groonga/ja/html/suggest/tutorial.html +1 -1
  238. data/vendor/local/share/doc/groonga/ja/html/suggest.html +1 -1
  239. data/vendor/local/share/doc/groonga/ja/html/troubleshooting/different_results_with_the_same_keyword.html +1 -1
  240. data/vendor/local/share/doc/groonga/ja/html/troubleshooting.html +1 -1
  241. data/vendor/local/share/doc/groonga/ja/html/tutorial/data.html +141 -53
  242. data/vendor/local/share/doc/groonga/ja/html/tutorial/drilldown.html +1 -1
  243. data/vendor/local/share/doc/groonga/ja/html/tutorial/index.html +1 -1
  244. data/vendor/local/share/doc/groonga/ja/html/tutorial/introduction.html +108 -102
  245. data/vendor/local/share/doc/groonga/ja/html/tutorial/lexicon.html +1 -1
  246. data/vendor/local/share/doc/groonga/ja/html/tutorial/match_columns.html +1 -1
  247. data/vendor/local/share/doc/groonga/ja/html/tutorial/micro_blog.html +2 -2
  248. data/vendor/local/share/doc/groonga/ja/html/tutorial/network.html +92 -55
  249. data/vendor/local/share/doc/groonga/ja/html/tutorial/patricia_trie.html +1 -1
  250. data/vendor/local/share/doc/groonga/ja/html/tutorial/query_expansion.html +1 -1
  251. data/vendor/local/share/doc/groonga/ja/html/tutorial/search.html +5 -5
  252. data/vendor/local/share/doc/groonga/ja/html/tutorial.html +21 -14
  253. data/vendor/local/share/doc/groonga/ja/html/type.html +30 -22
  254. data/vendor/local/share/doc/groonga/source/commands/suggest.txt +19 -0
  255. data/vendor/local/share/doc/groonga/source/community.txt +2 -2
  256. data/vendor/local/share/doc/groonga/source/example/tutorial/data-1.log +2 -15
  257. data/vendor/local/share/doc/groonga/source/example/tutorial/data-2.log +11 -7
  258. data/vendor/local/share/doc/groonga/source/example/tutorial/data-3.log +13 -7
  259. data/vendor/local/share/doc/groonga/source/example/tutorial/data-4.log +13 -0
  260. data/vendor/local/share/doc/groonga/source/example/tutorial/data-5.log +13 -0
  261. data/vendor/local/share/doc/groonga/source/example/tutorial/data-6.log +13 -0
  262. data/vendor/local/share/doc/groonga/source/example/tutorial/data-7.log +10 -0
  263. data/vendor/local/share/doc/groonga/source/example/tutorial/data-8.log +10 -0
  264. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-1.log +0 -2
  265. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-10.log +2 -2
  266. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-11.log +2 -2
  267. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-12.log +2 -2
  268. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-13.log +2 -2
  269. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-14.log +2 -6
  270. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-15.log +6 -2
  271. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-16.log +2 -2
  272. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-17.log +2 -2
  273. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-18.log +5 -0
  274. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-2.log +3 -2
  275. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-3.log +2 -2
  276. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-4.log +1 -3
  277. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-5.log +4 -2
  278. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-6.log +13 -2
  279. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-7.log +2 -13
  280. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-8.log +2 -2
  281. data/vendor/local/share/doc/groonga/source/example/tutorial/introduction-9.log +2 -2
  282. data/vendor/local/share/doc/groonga/source/example/tutorial/network-1.log +1 -1
  283. data/vendor/local/share/doc/groonga/source/example/tutorial/network-3.log +6 -6
  284. data/vendor/local/share/doc/groonga/source/install.txt +72 -8
  285. data/vendor/local/share/doc/groonga/source/news.txt +45 -1
  286. data/vendor/local/share/doc/groonga/source/tutorial/data.txt +112 -33
  287. data/vendor/local/share/doc/groonga/source/tutorial/introduction.txt +109 -99
  288. data/vendor/local/share/doc/groonga/source/tutorial/network.txt +76 -40
  289. data/vendor/local/share/doc/groonga/source/type.txt +30 -21
  290. data/vendor/local/share/groonga/html/admin/css/admin.css +1 -1
  291. data/vendor/local/share/groonga/html/admin/favicon.ico +0 -0
  292. data/vendor/local/share/groonga/html/admin/favicon.png +0 -0
  293. data/vendor/local/share/groonga/html/admin/favicon.svg +107 -547
  294. data/vendor/local/share/groonga/html/admin/images/groonga.png +0 -0
  295. data/vendor/local/share/groonga/html/admin/index.html +1 -1
  296. data/vendor/local/share/groonga/images/logo/groonga-icon-foreground-white.png +0 -0
  297. data/vendor/local/share/groonga/images/logo/groonga-icon-foreground-white.svg +118 -0
  298. data/vendor/local/share/groonga/images/logo/groonga-icon-full-size.png +0 -0
  299. data/vendor/local/share/groonga/images/logo/groonga-icon-full-size.svg +97 -0
  300. data/vendor/local/share/groonga/images/logo/groonga-icon.png +0 -0
  301. data/vendor/local/share/groonga/images/logo/groonga-icon.svg +93 -0
  302. data/vendor/local/share/groonga/images/logo/groonga-logo-foreground-white.png +0 -0
  303. data/vendor/local/share/groonga/images/logo/groonga-logo-foreground-white.svg +108 -0
  304. data/vendor/local/share/groonga/images/logo/groonga-logo.png +0 -0
  305. data/vendor/local/share/groonga/images/logo/groonga-logo.svg +118 -0
  306. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-bar-foreground-white.png +0 -0
  307. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-bar-foreground-white.svg +170 -0
  308. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-bar.png +0 -0
  309. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-bar.svg +186 -0
  310. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-foreground-white.png +0 -0
  311. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-foreground-white.svg +183 -0
  312. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-large.png +0 -0
  313. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner-large.svg +179 -0
  314. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner.png +0 -0
  315. data/vendor/local/share/groonga/images/logo/groonga-powered-by-banner.svg +201 -0
  316. data/vendor/local/share/groonga/images/logo/mroonga-icon-foreground-white.png +0 -0
  317. data/vendor/local/share/groonga/images/logo/mroonga-icon-foreground-white.svg +106 -0
  318. data/vendor/local/share/groonga/images/logo/mroonga-icon-full-size.png +0 -0
  319. data/vendor/local/share/groonga/images/logo/mroonga-icon-full-size.svg +97 -0
  320. data/vendor/local/share/groonga/images/logo/mroonga-icon.png +0 -0
  321. data/vendor/local/share/groonga/images/logo/mroonga-icon.svg +93 -0
  322. data/vendor/local/share/groonga/images/logo/mroonga-logo-foreground-white.png +0 -0
  323. data/vendor/local/share/groonga/images/logo/mroonga-logo-foreground-white.svg +122 -0
  324. data/vendor/local/share/groonga/images/logo/mroonga-logo.png +0 -0
  325. data/vendor/local/share/groonga/images/logo/mroonga-logo.svg +106 -0
  326. data/vendor/local/share/groonga/images/logo/nroonga-icon-foreground-white.png +0 -0
  327. data/vendor/local/share/groonga/images/logo/nroonga-icon-foreground-white.svg +106 -0
  328. data/vendor/local/share/groonga/images/logo/nroonga-icon-full-size.png +0 -0
  329. data/vendor/local/share/groonga/images/logo/nroonga-icon-full-size.svg +107 -0
  330. data/vendor/local/share/groonga/images/logo/nroonga-icon.png +0 -0
  331. data/vendor/local/share/groonga/images/logo/nroonga-icon.svg +93 -0
  332. data/vendor/local/share/groonga/images/logo/nroonga-logo-foreground-white.png +0 -0
  333. data/vendor/local/share/groonga/images/logo/nroonga-logo-foreground-white.svg +122 -0
  334. data/vendor/local/share/groonga/images/logo/nroonga-logo.png +0 -0
  335. data/vendor/local/share/groonga/images/logo/nroonga-logo.svg +117 -0
  336. data/vendor/local/share/groonga/images/logo/rroonga-icon-foreground-white.png +0 -0
  337. data/vendor/local/share/groonga/images/logo/rroonga-icon-foreground-white.svg +106 -0
  338. data/vendor/local/share/groonga/images/logo/rroonga-icon-full-size.png +0 -0
  339. data/vendor/local/share/groonga/images/logo/rroonga-icon-full-size.svg +107 -0
  340. data/vendor/local/share/groonga/images/logo/rroonga-icon.png +0 -0
  341. data/vendor/local/share/groonga/images/logo/rroonga-icon.svg +93 -0
  342. data/vendor/local/share/groonga/images/logo/rroonga-logo-foreground-white.png +0 -0
  343. data/vendor/local/share/groonga/images/logo/rroonga-logo-foreground-white.svg +122 -0
  344. data/vendor/local/share/groonga/images/logo/rroonga-logo.png +0 -0
  345. data/vendor/local/share/groonga/images/logo/rroonga-logo.svg +117 -0
  346. data/vendor/local/share/man/ja/man1/groonga.1 +510 -214
  347. data/vendor/local/share/man/man1/groonga.1 +510 -211
  348. metadata +62 -15
  349. data/vendor/local/bin/groonga-query-log-analyzer +0 -1419
  350. data/vendor/local/share/doc/groonga/en/html/_static/default.css +0 -278
  351. data/vendor/local/share/doc/groonga/en/html/_static/footer-bar.png +0 -0
  352. data/vendor/local/share/doc/groonga/en/html/_static/menu-header.png +0 -0
  353. data/vendor/local/share/doc/groonga/en/html/_static/sidebar.js +0 -151
  354. data/vendor/local/share/doc/groonga/ja/html/_static/default.css +0 -278
  355. data/vendor/local/share/doc/groonga/ja/html/_static/footer-bar.png +0 -0
  356. data/vendor/local/share/doc/groonga/ja/html/_static/menu-header.png +0 -0
  357. data/vendor/local/share/doc/groonga/ja/html/_static/sidebar.js +0 -151
@@ -1,1419 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require 'English'
4
- require 'optparse'
5
- require 'cgi'
6
- require 'thread'
7
- require 'shellwords'
8
- require 'time'
9
- require 'erb'
10
-
11
- # For ruby 1.8.5 on CentOS 5.6.
12
- class String
13
- unless method_defined?(:start_with?)
14
- def start_with?(string)
15
- /\A#{Regexp.escape(string)}/ =~ self
16
- end
17
- end
18
- end
19
-
20
- class Array
21
- unless method_defined?(:each_slice)
22
- def each_slice(n)
23
- sub_elements = []
24
- each do |element|
25
- sub_elements << element
26
- if sub_elements.size == n
27
- yield(sub_elements)
28
- sub_elements = []
29
- end
30
- end
31
- yield(sub_elements) unless sub_elements.empty?
32
- end
33
- end
34
- end
35
-
36
- class GroongaQueryLogAnalyzer
37
- class Error < StandardError
38
- end
39
-
40
- class UnsupportedReporter < Error
41
- end
42
-
43
- def initialize
44
- setup_options
45
- end
46
-
47
- def run(argv=nil)
48
- log_paths = @option_parser.parse!(argv || ARGV)
49
-
50
- stream = @options[:stream]
51
- dynamic_sort = @options[:dynamic_sort]
52
- statistics = SizedStatistics.new
53
- statistics.apply_options(@options)
54
- parser = QueryLogParser.new
55
- if stream
56
- streamer = Streamer.new(create_reporter(statistics))
57
- streamer.start
58
- process_statistic = lambda do |statistic|
59
- streamer << statistic
60
- end
61
- elsif dynamic_sort
62
- process_statistic = lambda do |statistic|
63
- statistics << statistic
64
- end
65
- else
66
- full_statistics = []
67
- process_statistic = lambda do |statistic|
68
- full_statistics << statistic
69
- end
70
- end
71
- if log_paths.empty?
72
- parser.parse(ARGF, &process_statistic)
73
- else
74
- log_paths.each do |log_path|
75
- File.open(log_path) do |log|
76
- parser.parse(log, &process_statistic)
77
- end
78
- end
79
- end
80
- if stream
81
- streamer.finish
82
- return
83
- end
84
- statistics.replace(full_statistics) unless dynamic_sort
85
-
86
- reporter = create_reporter(statistics)
87
- reporter.apply_options(@options)
88
- reporter.report
89
- end
90
-
91
- private
92
- def setup_options
93
- @options = {}
94
- @options[:n_entries] = 10
95
- @options[:order] = "-elapsed"
96
- @options[:color] = :auto
97
- @options[:output] = "-"
98
- @options[:slow_operation_threshold] = 0.1
99
- @options[:slow_response_threshold] = 0.2
100
- @options[:reporter] = "console"
101
- @options[:dynamic_sort] = true
102
- @options[:stream] = false
103
- @options[:report_summary] = true
104
-
105
- @option_parser = OptionParser.new do |parser|
106
- parser.banner += " LOG1 ..."
107
-
108
- parser.on("-n", "--n-entries=N",
109
- Integer,
110
- "Show top N entries",
111
- "(#{@options[:n_entries]})") do |n|
112
- @options[:n_entries] = n
113
- end
114
-
115
- available_orders = ["elapsed", "-elapsed", "start-time", "-start-time"]
116
- parser.on("--order=ORDER",
117
- available_orders,
118
- "Sort by ORDER",
119
- "available values: [#{available_orders.join(', ')}]",
120
- "(#{@options[:order]})") do |order|
121
- @options[:order] = order
122
- end
123
-
124
- color_options = [
125
- [:auto, :auto],
126
- ["-", false],
127
- ["no", false],
128
- ["false", false],
129
- ["+", true],
130
- ["yes", true],
131
- ["true", true],
132
- ]
133
- parser.on("--[no-]color=[auto]",
134
- color_options,
135
- "Enable color output",
136
- "(#{@options[:color]})") do |color|
137
- if color.nil?
138
- @options[:color] = true
139
- else
140
- @options[:color] = color
141
- end
142
- end
143
-
144
- parser.on("--output=PATH",
145
- "Output to PATH.",
146
- "'-' PATH means standard output.",
147
- "(#{@options[:output]})") do |output|
148
- @options[:output] = output
149
- end
150
-
151
- parser.on("--slow-operation-threshold=THRESHOLD",
152
- Float,
153
- "Use THRESHOLD seconds to detect slow operations.",
154
- "(#{@options[:slow_operation_threshold]})") do |threshold|
155
- @options[:slow_operation_threshold] = threshold
156
- end
157
-
158
- parser.on("--slow-response-threshold=THRESHOLD",
159
- Float,
160
- "Use THRESHOLD seconds to detect slow operations.",
161
- "(#{@options[:sloq_response_threshold]})") do |threshold|
162
- @options[:sloq_response_threshold] = threshold
163
- end
164
-
165
- available_reporters = ["console", "json", "html"]
166
- parser.on("--reporter=REPORTER",
167
- available_reporters,
168
- "Reports statistics by REPORTER.",
169
- "available values: [#{available_reporters.join(', ')}]",
170
- "(#{@options[:reporter]})") do |reporter|
171
- @options[:reporter] = reporter
172
- end
173
-
174
- parser.on("--[no-]dynamic-sort",
175
- "Sorts dynamically.",
176
- "Memory and CPU usage reduced for large query log.",
177
- "(#{@options[:dynamic_sort]})") do |sort|
178
- @options[:dynamic_sort] = sort
179
- end
180
-
181
- parser.on("--[no-]stream",
182
- "Outputs analyzed query on the fly.",
183
- "NOTE: --n-entries and --order are ignored.",
184
- "(#{@options[:stream]})") do |stream|
185
- @options[:stream] = stream
186
- end
187
-
188
- parser.on("--[no-]report-summary",
189
- "Reports summary at the end.",
190
- "(#{@options[:report_summary]})") do |report_summary|
191
- @options[:report_summary] = report_summary
192
- end
193
- end
194
-
195
- def create_reporter(statistics)
196
- case @options[:reporter]
197
- when "json"
198
- require 'json'
199
- JSONQueryLogReporter.new(statistics)
200
- when "html"
201
- HTMLQueryLogReporter.new(statistics)
202
- else
203
- ConsoleQueryLogReporter.new(statistics)
204
- end
205
- end
206
-
207
- def create_stream_reporter
208
- case @options[:reporter]
209
- when "json"
210
- require 'json'
211
- StreamJSONQueryLogReporter.new
212
- when "html"
213
- raise UnsupportedReporter, "HTML reporter doesn't support --stream."
214
- else
215
- StreamConsoleQueryLogReporter.new
216
- end
217
- end
218
- end
219
-
220
- class Command
221
- class << self
222
- @@registered_commands = {}
223
- def register(name, klass)
224
- @@registered_commands[name] = klass
225
- end
226
-
227
- def parse(input)
228
- if input.start_with?("/d/")
229
- parse_uri_path(input)
230
- else
231
- parse_command_line(input)
232
- end
233
- end
234
-
235
- private
236
- def parse_uri_path(path)
237
- name, parameters_string = path.split(/\?/, 2)
238
- parameters = {}
239
- parameters_string.split(/&/).each do |parameter_string|
240
- key, value = parameter_string.split(/\=/, 2)
241
- parameters[key] = CGI.unescape(value)
242
- end
243
- name = name.gsub(/\A\/d\//, '')
244
- name, output_type = name.split(/\./, 2)
245
- parameters["output_type"] = output_type if output_type
246
- command_class = @@registered_commands[name] || self
247
- command_class.new(name, parameters)
248
- end
249
-
250
- def parse_command_line(command_line)
251
- name, *options = Shellwords.shellwords(command_line)
252
- parameters = {}
253
- options.each_slice(2) do |key, value|
254
- parameters[key.gsub(/\A--/, '')] = value
255
- end
256
- command_class = @@registered_commands[name] || self
257
- command_class.new(name, parameters)
258
- end
259
- end
260
-
261
- attr_reader :name, :parameters
262
- def initialize(name, parameters)
263
- @name = name
264
- @parameters = parameters
265
- end
266
-
267
- def ==(other)
268
- other.is_a?(self.class) and
269
- @name == other.name and
270
- @parameters == other.parameters
271
- end
272
- end
273
-
274
- class SelectCommand < Command
275
- register("select", self)
276
-
277
- def sortby
278
- @parameters["sortby"]
279
- end
280
-
281
- def scorer
282
- @parameters["scorer"]
283
- end
284
-
285
- def query
286
- @parameters["query"]
287
- end
288
-
289
- def filter
290
- @parameters["filter"]
291
- end
292
-
293
- def conditions
294
- @conditions ||= filter.split(/(?:&&|&!|\|\|)/).collect do |condition|
295
- condition = condition.strip
296
- condition = condition.gsub(/\A[\s\(]*/, '')
297
- condition = condition.gsub(/[\s\)]*\z/, '') unless /\(/ =~ condition
298
- condition
299
- end
300
- end
301
-
302
- def drilldowns
303
- @drilldowns ||= (@parameters["drilldown"] || "").split(/\s*,\s*/)
304
- end
305
-
306
- def output_columns
307
- @parameters["output_columns"]
308
- end
309
- end
310
-
311
- class Statistic
312
- attr_reader :context_id, :start_time, :raw_command
313
- attr_reader :elapsed, :return_code
314
- attr_accessor :slow_operation_threshold, :slow_response_threshold
315
- def initialize(context_id)
316
- @context_id = context_id
317
- @start_time = nil
318
- @command = nil
319
- @raw_command = nil
320
- @operations = []
321
- @elapsed = nil
322
- @return_code = 0
323
- @slow_operation_threshold = 0.1
324
- @slow_response_threshold = 0.2
325
- end
326
-
327
- def start(start_time, command)
328
- @start_time = start_time
329
- @raw_command = command
330
- end
331
-
332
- def finish(elapsed, return_code)
333
- @elapsed = elapsed
334
- @return_code = return_code
335
- end
336
-
337
- def command
338
- @command ||= Command.parse(@raw_command)
339
- end
340
-
341
- def elapsed_in_seconds
342
- nano_seconds_to_seconds(@elapsed)
343
- end
344
-
345
- def last_time
346
- @start_time + elapsed_in_seconds
347
- end
348
-
349
- def slow?
350
- elapsed_in_seconds >= @slow_response_threshold
351
- end
352
-
353
- def each_operation
354
- previous_elapsed = 0
355
- ensure_parse_command
356
- operation_context_context = {
357
- :filter_index => 0,
358
- :drilldown_index => 0,
359
- }
360
- @operations.each_with_index do |operation, i|
361
- relative_elapsed = operation[:elapsed] - previous_elapsed
362
- relative_elapsed_in_seconds = nano_seconds_to_seconds(relative_elapsed)
363
- previous_elapsed = operation[:elapsed]
364
- parsed_operation = {
365
- :i => i,
366
- :elapsed => operation[:elapsed],
367
- :elapsed_in_seconds => nano_seconds_to_seconds(operation[:elapsed]),
368
- :relative_elapsed => relative_elapsed,
369
- :relative_elapsed_in_seconds => relative_elapsed_in_seconds,
370
- :name => operation[:name],
371
- :context => operation_context(operation[:name],
372
- operation_context_context),
373
- :n_records => operation[:n_records],
374
- :slow? => slow_operation?(relative_elapsed_in_seconds),
375
- }
376
- yield parsed_operation
377
- end
378
- end
379
-
380
- def add_operation(operation)
381
- @operations << operation
382
- end
383
-
384
- def operations
385
- _operations = []
386
- each_operation do |operation|
387
- _operations << operation
388
- end
389
- _operations
390
- end
391
-
392
- def select_command?
393
- command.name == "select"
394
- end
395
-
396
- private
397
- def nano_seconds_to_seconds(nano_seconds)
398
- nano_seconds / 1000.0 / 1000.0 / 1000.0
399
- end
400
-
401
- def operation_context(label, context)
402
- case label
403
- when "filter"
404
- if @select_command.query and context[:query_used].nil?
405
- context[:query_used] = true
406
- "query: #{@select_command.query}"
407
- else
408
- index = context[:filter_index]
409
- context[:filter_index] += 1
410
- @select_command.conditions[index]
411
- end
412
- when "sort"
413
- @select_command.sortby
414
- when "score"
415
- @select_command.scorer
416
- when "output"
417
- @select_command.output_columns
418
- when "drilldown"
419
- index = context[:drilldown_index]
420
- context[:drilldown_index] += 1
421
- @select_command.drilldowns[index]
422
- else
423
- nil
424
- end
425
- end
426
-
427
- def ensure_parse_command
428
- return unless select_command?
429
- @select_command = SelectCommand.parse(@raw_command)
430
- end
431
-
432
- def slow_operation?(elapsed)
433
- elapsed >= @slow_operation_threshold
434
- end
435
- end
436
-
437
- class SizedGroupedOperations < Array
438
- def initialize
439
- @max_size = 10
440
- @sorter = create_sorter
441
- end
442
-
443
- def apply_options(options)
444
- @max_size = options[:n_entries]
445
- end
446
-
447
- def each
448
- i = 0
449
- super do |grouped_operation|
450
- break if i >= @max_size
451
- i += 1
452
- yield(grouped_operation)
453
- end
454
- end
455
-
456
- def <<(operation)
457
- each do |grouped_operation|
458
- if grouped_operation[:name] == operation[:name] and
459
- grouped_operation[:context] == operation[:context]
460
- elapsed = operation[:relative_elapsed_in_seconds]
461
- grouped_operation[:total_elapsed] += elapsed
462
- grouped_operation[:n_operations] += 1
463
- replace(sort_by(&@sorter))
464
- return self
465
- end
466
- end
467
-
468
- grouped_operation = {
469
- :name => operation[:name],
470
- :context => operation[:context],
471
- :n_operations => 1,
472
- :total_elapsed => operation[:relative_elapsed_in_seconds],
473
- }
474
- buffer_size = @max_size * 100
475
- if size < buffer_size
476
- super(grouped_operation)
477
- replace(sort_by(&@sorter))
478
- else
479
- if @sorter.call(grouped_operation) < @sorter.call(last)
480
- super(grouped_operation)
481
- sorted_operations = sort_by(&@sorter)
482
- sorted_operations.pop
483
- replace(sorted_operations)
484
- end
485
- end
486
- self
487
- end
488
-
489
- private
490
- def create_sorter
491
- lambda do |grouped_operation|
492
- -grouped_operation[:total_elapsed]
493
- end
494
- end
495
- end
496
-
497
- class SizedStatistics < Array
498
- attr_reader :n_responses, :n_slow_responses, :n_slow_operations
499
- attr_reader :slow_operations, :total_elapsed
500
- attr_reader :start_time, :last_time
501
- attr_accessor :slow_operation_threshold, :slow_response_threshold
502
- def initialize
503
- @max_size = 10
504
- self.order = "-elapsed"
505
- @slow_operation_threshold = 0.1
506
- @slow_response_threshold = 0.2
507
- @start_time = nil
508
- @last_time = nil
509
- @n_responses = 0
510
- @n_slow_responses = 0
511
- @n_slow_operations = 0
512
- @slow_operations = SizedGroupedOperations.new
513
- @total_elapsed = 0
514
- @collect_slow_statistics = true
515
- end
516
-
517
- def order=(new_order)
518
- @order = new_order
519
- @sorter = create_sorter
520
- end
521
-
522
- def apply_options(options)
523
- @max_size = options[:n_entries] || @max_size
524
- self.order = options[:order] || @order
525
- @slow_operation_threshold =
526
- options[:slow_operation_threshold] || @slow_operation_threshold
527
- @slow_response_threshold =
528
- options[:slow_response_threshold] || @slow_response_threshold
529
- unless options[:report_summary].nil?
530
- @collect_slow_statistics = options[:report_summary]
531
- end
532
- @slow_operations.apply_options(options)
533
- end
534
-
535
- def <<(statistic)
536
- update_statistic(statistic)
537
- if size < @max_size
538
- super(statistic)
539
- replace(self)
540
- else
541
- if @sorter.call(statistic) < @sorter.call(last)
542
- super(statistic)
543
- replace(self)
544
- end
545
- end
546
- self
547
- end
548
-
549
- def replace(other)
550
- sorted_other = other.sort_by(&@sorter)
551
- if sorted_other.size > @max_size
552
- super(sorted_other[0, @max_size])
553
- else
554
- super(sorted_other)
555
- end
556
- end
557
-
558
- def responses_per_second
559
- _period = period
560
- if _period.zero?
561
- 0
562
- else
563
- @n_responses.to_f / _period
564
- end
565
- end
566
-
567
- def slow_response_ratio
568
- if @n_responses.zero?
569
- 0
570
- else
571
- (@n_slow_responses.to_f / @n_responses) * 100
572
- end
573
- end
574
-
575
- def period
576
- if @start_time and @last_time
577
- @last_time - @start_time
578
- else
579
- 0
580
- end
581
- end
582
-
583
- def each_slow_operation
584
- @slow_operations.each do |grouped_operation|
585
- total_elapsed = grouped_operation[:total_elapsed]
586
- n_operations = grouped_operation[:n_operations]
587
- ratios = {
588
- :total_elapsed_ratio => total_elapsed / @total_elapsed * 100,
589
- :n_operations_ratio => n_operations / @n_slow_operations.to_f * 100,
590
- }
591
- yield(grouped_operation.merge(ratios))
592
- end
593
- end
594
-
595
- private
596
- def create_sorter
597
- case @order
598
- when "-elapsed"
599
- lambda do |statistic|
600
- -statistic.elapsed
601
- end
602
- when "elapsed"
603
- lambda do |statistic|
604
- statistic.elapsed
605
- end
606
- when "-start-time"
607
- lambda do |statistic|
608
- -statistic.start_time
609
- end
610
- else
611
- lambda do |statistic|
612
- statistic.start_time
613
- end
614
- end
615
- end
616
-
617
- def update_statistic(statistic)
618
- statistic.slow_response_threshold = @slow_response_threshold
619
- statistic.slow_operation_threshold = @slow_operation_threshold
620
- @start_time ||= statistic.start_time
621
- @start_time = [@start_time, statistic.start_time].min
622
- @last_time ||= statistic.last_time
623
- @last_time = [@last_time, statistic.last_time].max
624
- @n_responses += 1
625
- @total_elapsed += statistic.elapsed_in_seconds
626
- return unless @collect_slow_statistics
627
- if statistic.slow?
628
- @n_slow_responses += 1
629
- if statistic.select_command?
630
- statistic.each_operation do |operation|
631
- next unless operation[:slow?]
632
- @n_slow_operations += 1
633
- @slow_operations << operation
634
- end
635
- end
636
- end
637
- end
638
- end
639
-
640
- class QueryLogParser
641
- def initialize
642
- @mutex = Mutex.new
643
- end
644
-
645
- def parse(input, &block)
646
- current_statistics = {}
647
- input.each_line do |line|
648
- case line
649
- when /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)\.(\d+)\|(.+?)\|([>:<])/
650
- year, month, day, hour, minutes, seconds, micro_seconds =
651
- $1, $2, $3, $4, $5, $6, $7
652
- context_id = $8
653
- type = $9
654
- rest = $POSTMATCH.strip
655
- time_stamp = Time.local(year, month, day, hour, minutes, seconds,
656
- micro_seconds)
657
- parse_line(current_statistics,
658
- time_stamp, context_id, type, rest, &block)
659
- end
660
- end
661
- end
662
-
663
- private
664
- def parse_line(current_statistics,
665
- time_stamp, context_id, type, rest, &block)
666
- case type
667
- when ">"
668
- statistic = Statistic.new(context_id)
669
- statistic.start(time_stamp, rest)
670
- current_statistics[context_id] = statistic
671
- when ":"
672
- return unless /\A(\d+) (.+)\((\d+)\)/ =~ rest
673
- elapsed = $1
674
- name = $2
675
- n_records = $3.to_i
676
- statistic = current_statistics[context_id]
677
- return if statistic.nil?
678
- statistic.add_operation(:name => name,
679
- :elapsed => elapsed.to_i,
680
- :n_records => n_records)
681
- when "<"
682
- return unless /\A(\d+) rc=(\d+)/ =~ rest
683
- elapsed = $1
684
- return_code = $2
685
- statistic = current_statistics.delete(context_id)
686
- return if statistic.nil?
687
- statistic.finish(elapsed.to_i, return_code.to_i)
688
- block.call(statistic)
689
- end
690
- end
691
- end
692
-
693
- class Streamer
694
- def initialize(reporter)
695
- @reporter = reporter
696
- end
697
-
698
- def start
699
- @reporter.start
700
- end
701
-
702
- def <<(statistic)
703
- @reporter.report_statistic(statistic)
704
- end
705
-
706
- def finish
707
- @reporter.finish
708
- end
709
- end
710
-
711
- class QueryLogReporter
712
- include Enumerable
713
-
714
- attr_reader :output
715
- def initialize(statistics)
716
- @statistics = statistics
717
- @report_summary = true
718
- @output = $stdout
719
- end
720
-
721
- def apply_options(options)
722
- self.output = options[:output] || @output
723
- unless options[:report_summary].nil?
724
- @report_summary = options[:report_summary]
725
- end
726
- end
727
-
728
- def output=(output)
729
- @output = output
730
- @output = $stdout if @output == "-"
731
- end
732
-
733
- def each
734
- @statistics.each do |statistic|
735
- yield statistic
736
- end
737
- end
738
-
739
- def report
740
- setup do
741
- report_summary if @report_summary
742
- report_statistics
743
- end
744
- end
745
-
746
- def report_statistics
747
- each do |statistic|
748
- report_statistic(statistic)
749
- end
750
- end
751
-
752
- private
753
- def setup
754
- setup_output do
755
- start
756
- yield
757
- finish
758
- end
759
- end
760
-
761
- def setup_output
762
- original_output = @output
763
- if @output.is_a?(String)
764
- File.open(@output, "w") do |output|
765
- @output = output
766
- yield(@output)
767
- end
768
- else
769
- yield(@output)
770
- end
771
- ensure
772
- @output = original_output
773
- end
774
-
775
- def write(*args)
776
- @output.write(*args)
777
- end
778
-
779
- def format_time(time)
780
- if time.nil?
781
- "NaN"
782
- else
783
- time.strftime("%Y-%m-%d %H:%M:%S.%u")
784
- end
785
- end
786
- end
787
-
788
- class ConsoleQueryLogReporter < QueryLogReporter
789
- class Color
790
- NAMES = ["black", "red", "green", "yellow",
791
- "blue", "magenta", "cyan", "white"]
792
-
793
- attr_reader :name
794
- def initialize(name, options={})
795
- @name = name
796
- @foreground = options[:foreground]
797
- @foreground = true if @foreground.nil?
798
- @intensity = options[:intensity]
799
- @bold = options[:bold]
800
- @italic = options[:italic]
801
- @underline = options[:underline]
802
- end
803
-
804
- def foreground?
805
- @foreground
806
- end
807
-
808
- def intensity?
809
- @intensity
810
- end
811
-
812
- def bold?
813
- @bold
814
- end
815
-
816
- def italic?
817
- @italic
818
- end
819
-
820
- def underline?
821
- @underline
822
- end
823
-
824
- def ==(other)
825
- self.class === other and
826
- [name, foreground?, intensity?,
827
- bold?, italic?, underline?] ==
828
- [other.name, other.foreground?, other.intensity?,
829
- other.bold?, other.italic?, other.underline?]
830
- end
831
-
832
- def sequence
833
- sequence = []
834
- if @name == "none"
835
- elsif @name == "reset"
836
- sequence << "0"
837
- else
838
- foreground_parameter = foreground? ? 3 : 4
839
- foreground_parameter += 6 if intensity?
840
- sequence << "#{foreground_parameter}#{NAMES.index(@name)}"
841
- end
842
- sequence << "1" if bold?
843
- sequence << "3" if italic?
844
- sequence << "4" if underline?
845
- sequence
846
- end
847
-
848
- def escape_sequence
849
- "\e[#{sequence.join(';')}m"
850
- end
851
-
852
- def +(other)
853
- MixColor.new([self, other])
854
- end
855
- end
856
-
857
- class MixColor
858
- attr_reader :colors
859
- def initialize(colors)
860
- @colors = colors
861
- end
862
-
863
- def sequence
864
- @colors.inject([]) do |result, color|
865
- result + color.sequence
866
- end
867
- end
868
-
869
- def escape_sequence
870
- "\e[#{sequence.join(';')}m"
871
- end
872
-
873
- def +(other)
874
- self.class.new([self, other])
875
- end
876
-
877
- def ==(other)
878
- self.class === other and colors == other.colors
879
- end
880
- end
881
-
882
- def initialize(statistics)
883
- super
884
- @color = :auto
885
- @reset_color = Color.new("reset")
886
- @color_schema = {
887
- :elapsed => {:foreground => :white, :background => :green},
888
- :time => {:foreground => :white, :background => :cyan},
889
- :slow => {:foreground => :white, :background => :red},
890
- }
891
- end
892
-
893
- def apply_options(options)
894
- super
895
- @color = options[:color] || @color
896
- end
897
-
898
- def report_statistics
899
- write("\n")
900
- write("Slow Queries:\n")
901
- super
902
- end
903
-
904
- def report_statistic(statistic)
905
- @index += 1
906
- write("%*d) %s" % [@digit, @index, format_heading(statistic)])
907
- report_parameters(statistic)
908
- report_operations(statistic)
909
- end
910
-
911
- def start
912
- @index = 0
913
- if @statistics.size.zero?
914
- @digit = 1
915
- else
916
- @digit = Math.log10(@statistics.size).truncate + 1
917
- end
918
- end
919
-
920
- def finish
921
- end
922
-
923
- private
924
- def setup
925
- super do
926
- setup_color do
927
- yield
928
- end
929
- end
930
- end
931
-
932
- def report_summary
933
- write("Summary:\n")
934
- write(" Threshold:\n")
935
- write(" slow response : #{@statistics.slow_response_threshold}\n")
936
- write(" slow operation : #{@statistics.slow_operation_threshold}\n")
937
- write(" # of responses : #{@statistics.n_responses}\n")
938
- write(" # of slow responses : #{@statistics.n_slow_responses}\n")
939
- write(" responses/sec : #{@statistics.responses_per_second}\n")
940
- write(" start time : #{format_time(@statistics.start_time)}\n")
941
- write(" last time : #{format_time(@statistics.last_time)}\n")
942
- write(" period(sec) : #{@statistics.period}\n")
943
- slow_response_ratio = @statistics.slow_response_ratio
944
- write(" slow response ratio : %5.3f%%\n" % slow_response_ratio)
945
- write(" total response time : #{@statistics.total_elapsed}\n")
946
- report_slow_operations
947
- end
948
-
949
- def report_slow_operations
950
- write(" Slow Operations:\n")
951
- total_elapsed_digit = nil
952
- total_elapsed_decimal_digit = 6
953
- n_operations_digit = nil
954
- @statistics.each_slow_operation do |grouped_operation|
955
- total_elapsed = grouped_operation[:total_elapsed]
956
- total_elapsed_digit ||= Math.log10(total_elapsed).truncate + 1
957
- n_operations = grouped_operation[:n_operations]
958
- n_operations_digit ||= Math.log10(n_operations).truncate + 1
959
- parameters = [total_elapsed_digit + 1 + total_elapsed_decimal_digit,
960
- total_elapsed_decimal_digit,
961
- total_elapsed,
962
- grouped_operation[:total_elapsed_ratio],
963
- n_operations_digit,
964
- n_operations,
965
- grouped_operation[:n_operations_ratio],
966
- grouped_operation[:name],
967
- grouped_operation[:context]]
968
- write(" [%*.*f](%5.2f%%) [%*d](%5.2f%%) %9s: %s\n" % parameters)
969
- end
970
- end
971
-
972
- def report_parameters(statistic)
973
- command = statistic.command
974
- write(" name: <#{command.name}>\n")
975
- write(" parameters:\n")
976
- command.parameters.each do |key, value|
977
- write(" <#{key}>: <#{value}>\n")
978
- end
979
- end
980
-
981
- def report_operations(statistic)
982
- statistic.each_operation do |operation|
983
- relative_elapsed_in_seconds = operation[:relative_elapsed_in_seconds]
984
- formatted_elapsed = "%8.8f" % relative_elapsed_in_seconds
985
- if operation[:slow?]
986
- formatted_elapsed = colorize(formatted_elapsed, :slow)
987
- end
988
- operation_report = " %2d) %s: %10s" % [operation[:i] + 1,
989
- formatted_elapsed,
990
- operation[:name]]
991
- if operation[:n_records]
992
- operation_report << "(%6d)" % operation[:n_records]
993
- else
994
- operation_report << "(%6s)" % ""
995
- end
996
- context = operation[:context]
997
- if context
998
- context = colorize(context, :slow) if operation[:slow?]
999
- operation_report << " " << context
1000
- end
1001
- write("#{operation_report}\n")
1002
- end
1003
- write("\n")
1004
- end
1005
-
1006
- def guess_color_availability(output)
1007
- return false unless output.tty?
1008
- case ENV["TERM"]
1009
- when /term(?:-color)?\z/, "screen"
1010
- true
1011
- else
1012
- return true if ENV["EMACS"] == "t"
1013
- false
1014
- end
1015
- end
1016
-
1017
- def setup_color
1018
- color = @color
1019
- @color = guess_color_availability(@output) if @color == :auto
1020
- yield
1021
- ensure
1022
- @color = color
1023
- end
1024
-
1025
- def format_heading(statistic)
1026
- formatted_elapsed = colorize("%8.8f" % statistic.elapsed_in_seconds,
1027
- :elapsed)
1028
- "[%s-%s (%s)](%d): %s" % [format_time(statistic.start_time),
1029
- format_time(statistic.last_time),
1030
- formatted_elapsed,
1031
- statistic.return_code,
1032
- statistic.raw_command]
1033
- end
1034
-
1035
- def format_time(time)
1036
- colorize(super, :time)
1037
- end
1038
-
1039
- def colorize(text, schema_name)
1040
- return text unless @color
1041
- options = @color_schema[schema_name]
1042
- color = Color.new("none")
1043
- if options[:foreground]
1044
- color += Color.new(options[:foreground].to_s, :bold => true)
1045
- end
1046
- if options[:background]
1047
- color += Color.new(options[:background].to_s, :foreground => false)
1048
- end
1049
- "%s%s%s" % [color.escape_sequence, text, @reset_color.escape_sequence]
1050
- end
1051
- end
1052
-
1053
- class JSONQueryLogReporter < QueryLogReporter
1054
- def report_statistic(statistic)
1055
- write(",") if @index > 0
1056
- write("\n")
1057
- write(format_statistic(statistic))
1058
- @index += 1
1059
- end
1060
-
1061
- def start
1062
- @index = 0
1063
- write("[")
1064
- end
1065
-
1066
- def finish
1067
- write("\n")
1068
- write("]\n")
1069
- end
1070
-
1071
- def report_summary
1072
- # TODO
1073
- end
1074
-
1075
- private
1076
- def format_statistic(statistic)
1077
- data = {
1078
- "start_time" => statistic.start_time.to_i,
1079
- "last_time" => statistic.last_time.to_i,
1080
- "elapsed" => statistic.elapsed_in_seconds,
1081
- "return_code" => statistic.return_code,
1082
- }
1083
- command = statistic.command
1084
- parameters = command.parameters.collect do |key, value|
1085
- {"key" => key, "value" => value}
1086
- end
1087
- data["command"] = {
1088
- "raw" => statistic.raw_command,
1089
- "name" => command.name,
1090
- "parameters" => parameters,
1091
- }
1092
- operations = []
1093
- statistic.each_operation do |operation|
1094
- operation_data = {}
1095
- operation_data["name"] = operation[:name]
1096
- operation_data["relative_elapsed"] = operation[:relative_elapsed_in_seconds]
1097
- operation_data["context"] = operation[:context]
1098
- operations << operation_data
1099
- end
1100
- data["operations"] = operations
1101
- JSON.generate(data)
1102
- end
1103
- end
1104
-
1105
- class HTMLQueryLogReporter < QueryLogReporter
1106
- include ERB::Util
1107
-
1108
- def report_statistic(statistic)
1109
- write(",") if @index > 0
1110
- write("\n")
1111
- write(format_statistic(statistic))
1112
- @index += 1
1113
- end
1114
-
1115
- def start
1116
- write(header)
1117
- end
1118
-
1119
- def finish
1120
- write(footer)
1121
- end
1122
-
1123
- def report_summary
1124
- summary_html = erb(<<-EOH, __LINE__ + 1, binding)
1125
- <h2>Summary</h2>
1126
- <div class="summary">
1127
- <%= analyze_parameters %>
1128
- <%= metrics %>
1129
- <%= slow_operations %>
1130
- </div>
1131
- EOH
1132
- write(summary_html)
1133
- end
1134
-
1135
- def report_statistics
1136
- write(statistics_header)
1137
- super
1138
- write(statistics_footer)
1139
- end
1140
-
1141
- def report_statistic(statistic)
1142
- command = statistic.command
1143
- statistic_html = erb(<<-EOH, __LINE__ + 1, binding)
1144
- <div class="statistic-heading">
1145
- <h3>Command</h3>
1146
- <div class="metrics">
1147
- [<%= format_time(statistic.start_time) %>
1148
- -
1149
- <%= format_time(statistic.last_time) %>
1150
- (<%= format_elapsed(statistic.elapsed_in_seconds,
1151
- :slow? => statistic.slow?) %>)]
1152
- (<%= span({:class => "return-code"}, h(statistic.return_code)) %>)
1153
- </div>
1154
- <%= div({:class => "raw-command"}, h(statistic.raw_command)) %>
1155
- </div>
1156
- <div class="statistic-parameters">
1157
- <h3>Parameters</h3>
1158
- <dl>
1159
- <dt>name</dt>
1160
- <dd><%= h(command.name) %></dd>
1161
- <% command.parameters.each do |key, value| %>
1162
- <dt><%= h(key) %></dt>
1163
- <dd><%= h(value) %></dd>
1164
- <% end %>
1165
- </dl>
1166
- </div>
1167
- <div class="statistic-operations">
1168
- <h3>Operations</h3>
1169
- <ol>
1170
- <% statistic.each_operation do |operation| %>
1171
- <li>
1172
- <%= format_elapsed(operation[:relative_elapsed_in_seconds],
1173
- :slow? => operation[:slow?]) %>:
1174
- <%= span({:class => "name"}, h(operation[:name])) %>:
1175
- <%= span({:class => "context"}, h(operation[:context])) %>
1176
- </li>
1177
- <% end %>
1178
- </ol>
1179
- </div>
1180
- EOH
1181
- write(statistic_html)
1182
- end
1183
-
1184
- private
1185
- def erb(content, line, _binding=nil)
1186
- _erb = ERB.new(content, nil, "<>")
1187
- eval(_erb.src, _binding || binding, __FILE__, line)
1188
- end
1189
-
1190
- def header
1191
- erb(<<-EOH, __LINE__ + 1)
1192
- <html>
1193
- <head>
1194
- <title>groonga query analyzer</title>
1195
- <style>
1196
- table,
1197
- table tr,
1198
- table tr th,
1199
- table tr td
1200
- {
1201
- border: 1px solid black;
1202
- }
1203
-
1204
- span.slow
1205
- {
1206
- color: red;
1207
- }
1208
-
1209
- div.parameters
1210
- {
1211
- float: left;
1212
- padding: 2em;
1213
- }
1214
-
1215
- div.parameters h3
1216
- {
1217
- text-align: center;
1218
- }
1219
-
1220
- div.parameters table
1221
- {
1222
- margin-right: auto;
1223
- margin-left: auto;
1224
- }
1225
-
1226
- div.statistics
1227
- {
1228
- clear: both;
1229
- }
1230
-
1231
- td.elapsed,
1232
- td.ratio,
1233
- td.n
1234
- {
1235
- text-align: right;
1236
- }
1237
-
1238
- td.name
1239
- {
1240
- text-align: center;
1241
- }
1242
- </style>
1243
- </head>
1244
- <body>
1245
- <h1>groonga query analyzer</h1>
1246
- EOH
1247
- end
1248
-
1249
- def footer
1250
- erb(<<-EOH, __LINE__ + 1)
1251
- </body>
1252
- </html>
1253
- EOH
1254
- end
1255
-
1256
- def statistics_header
1257
- erb(<<-EOH, __LINE__ + 1)
1258
- <h2>Slow Queries</h2>
1259
- <div>
1260
- EOH
1261
- end
1262
-
1263
- def statistics_footer
1264
- erb(<<-EOH, __LINE__ + 1)
1265
- </div>
1266
- EOH
1267
- end
1268
-
1269
- def analyze_parameters
1270
- erb(<<-EOH, __LINE__ + 1)
1271
- <div class="parameters">
1272
- <h3>Analyze Parameters</h3>
1273
- <table>
1274
- <tr><th>Name</th><th>Value</th></tr>
1275
- <tr>
1276
- <th>Slow response threshold</th>
1277
- <td><%= h(@statistics.slow_response_threshold) %>sec</td>
1278
- </tr>
1279
- <tr>
1280
- <th>Slow operation threshold</th>
1281
- <td><%= h(@statistics.slow_operation_threshold) %>sec</td>
1282
- </tr>
1283
- </table>
1284
- </div>
1285
- EOH
1286
- end
1287
-
1288
- def metrics
1289
- erb(<<-EOH, __LINE__ + 1)
1290
- <div class="parameters">
1291
- <h3>Metrics</h3>
1292
- <table>
1293
- <tr><th>Name</th><th>Value</th></tr>
1294
- <tr>
1295
- <th># of responses</th>
1296
- <td><%= h(@statistics.n_responses) %></td>
1297
- </tr>
1298
- <tr>
1299
- <th># of slow responses</th>
1300
- <td><%= h(@statistics.n_slow_responses) %></td>
1301
- </tr>
1302
- <tr>
1303
- <th>responses/sec</th>
1304
- <td><%= h(@statistics.responses_per_second) %></td>
1305
- </tr>
1306
- <tr>
1307
- <th>start time</th>
1308
- <td><%= format_time(@statistics.start_time) %></td>
1309
- </tr>
1310
- <tr>
1311
- <th>last time</th>
1312
- <td><%= format_time(@statistics.last_time) %></td>
1313
- </tr>
1314
- <tr>
1315
- <th>period</th>
1316
- <td><%= h(@statistics.period) %>sec</td>
1317
- </tr>
1318
- <tr>
1319
- <th>slow response ratio</th>
1320
- <td><%= h(@statistics.slow_response_ratio) %>%</td>
1321
- </tr>
1322
- <tr>
1323
- <th>total response time</th>
1324
- <td><%= h(@statistics.total_elapsed) %>sec</td>
1325
- </tr>
1326
- </table>
1327
- </div>
1328
- EOH
1329
- end
1330
-
1331
- def slow_operations
1332
- erb(<<-EOH, __LINE__ + 1)
1333
- <div class="statistics">
1334
- <h3>Slow Operations</h3>
1335
- <table class="slow-operations">
1336
- <tr>
1337
- <th>total elapsed(sec)</th>
1338
- <th>total elapsed(%)</th>
1339
- <th># of operations</th>
1340
- <th># of operations(%)</th>
1341
- <th>operation name</th>
1342
- <th>context</th>
1343
- </tr>
1344
- <% @statistics.each_slow_operation do |grouped_operation| %>
1345
- <tr>
1346
- <td class="elapsed">
1347
- <%= format_elapsed(grouped_operation[:total_elapsed]) %>
1348
- </td>
1349
- <td class="ratio">
1350
- <%= format_ratio(grouped_operation[:total_elapsed_ratio]) %>
1351
- </td>
1352
- <td class="n">
1353
- <%= h(grouped_operation[:n_operations]) %>
1354
- </td>
1355
- <td class="ratio">
1356
- <%= format_ratio(grouped_operation[:n_operations_ratio]) %>
1357
- </td>
1358
- <td class="name"><%= h(grouped_operation[:name]) %></td>
1359
- <td class="context">
1360
- <%= format_context(grouped_operation[:context]) %>
1361
- </td>
1362
- </tr>
1363
- <% end %>
1364
- </table>
1365
- </div>
1366
- EOH
1367
- end
1368
-
1369
- def format_time(time)
1370
- span({:class => "time"}, h(super))
1371
- end
1372
-
1373
- def format_elapsed(elapsed, options={})
1374
- formatted_elapsed = span({:class => "elapsed"}, h("%8.8f" % elapsed))
1375
- if options[:slow?]
1376
- formatted_elapsed = span({:class => "slow"}, formatted_elapsed)
1377
- end
1378
- formatted_elapsed
1379
- end
1380
-
1381
- def format_ratio(ratio)
1382
- h("%5.2f%%" % ratio)
1383
- end
1384
-
1385
- def format_context(context)
1386
- h(context).gsub(/,/, ",<wbr />")
1387
- end
1388
-
1389
- def tag(name, attributes, content)
1390
- html = "<#{name}"
1391
- html_attributes = attributes.collect do |key, value|
1392
- "#{h(key)}=\"#{h(value)}\""
1393
- end
1394
- html << " #{html_attributes.join(' ')}" unless attributes.empty?
1395
- html << ">"
1396
- html << content
1397
- html << "</#{name}>"
1398
- html
1399
- end
1400
-
1401
- def span(attributes, content)
1402
- tag("span", attributes, content)
1403
- end
1404
-
1405
- def div(attributes, content)
1406
- tag("div", attributes, content)
1407
- end
1408
- end
1409
- end
1410
-
1411
- if __FILE__ == $0
1412
- analyzer = GroongaQueryLogAnalyzer.new
1413
- begin
1414
- analyzer.run
1415
- rescue GroongaQueryLogAnalyzer::Error
1416
- $stderr.puts($!.message)
1417
- exit(false)
1418
- end
1419
- end