visual_query 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +59 -0
  4. data/Rakefile +23 -0
  5. data/app/assets/images/visual_query/ajax-loader.gif +0 -0
  6. data/app/assets/javascripts/visual_query/index.js +288 -0
  7. data/app/assets/stylesheets/visual_query/visual_query.css +161 -0
  8. data/app/controllers/queries_controller.rb +157 -0
  9. data/app/helpers/application_helper.rb +5 -0
  10. data/app/helpers/queries_helper.rb +43 -0
  11. data/app/views/queries/_columns.html.erb +5 -0
  12. data/app/views/queries/_command.html.erb +5 -0
  13. data/app/views/queries/_command_results_browser.html.erb +1 -0
  14. data/app/views/queries/_command_save.html.erb +1 -0
  15. data/app/views/queries/_commands_results.html.erb +2 -0
  16. data/app/views/queries/_filter.html.erb +6 -0
  17. data/app/views/queries/_list_all_relations.html.erb +8 -0
  18. data/app/views/queries/_list_joinable_relations.html.erb +10 -0
  19. data/app/views/queries/_list_relation.html.erb +8 -0
  20. data/app/views/queries/_name.html.erb +8 -0
  21. data/app/views/queries/_results.html.erb +14 -0
  22. data/app/views/queries/_results_column_filter.html.erb +3 -0
  23. data/app/views/queries/_results_column_hide.html.erb +3 -0
  24. data/app/views/queries/_results_column_human_name.html.erb +8 -0
  25. data/app/views/queries/_results_empty.html.erb +3 -0
  26. data/app/views/queries/_sort.html.erb +12 -0
  27. data/app/views/queries/_sort_condition.html.erb +18 -0
  28. data/app/views/queries/_url_root.html.erb +1 -0
  29. data/app/views/queries/_warning_large_result_set.html.erb +12 -0
  30. data/app/views/queries/filters/_boolean.html.erb +6 -0
  31. data/app/views/queries/filters/_date.html.erb +17 -0
  32. data/app/views/queries/filters/_datetime.html.erb +1 -0
  33. data/app/views/queries/filters/_decimal.html.erb +1 -0
  34. data/app/views/queries/filters/_integer.html.erb +1 -0
  35. data/app/views/queries/filters/_numeric.html.erb +6 -0
  36. data/app/views/queries/filters/_string.html.erb +1 -0
  37. data/app/views/queries/filters/_text.html.erb +6 -0
  38. data/app/views/queries/index.html.erb +39 -0
  39. data/app/views/queries/new.html.erb +27 -0
  40. data/app/views/queries/not_found.html.erb +1 -0
  41. data/app/views/queries/show.html.erb +40 -0
  42. data/app/views/queries/sql_form.html.erb +16 -0
  43. data/config/initializers/visual_query.rb +11 -0
  44. data/config/routes.rb +26 -0
  45. data/db/migrate/20130927090319_create_visual_query_schema.rb +9 -0
  46. data/db/migrate/20130927090400_create_visual_query_metadata_table.rb +16 -0
  47. data/lib/tasks/visual_query_tasks.rake +12 -0
  48. data/lib/tutuf/visual_query.rb +6 -0
  49. data/lib/tutuf/visual_query/base.rb +268 -0
  50. data/lib/tutuf/visual_query/common.rb +58 -0
  51. data/lib/tutuf/visual_query/metadata.rb +35 -0
  52. data/lib/tutuf/visual_query/single.rb +111 -0
  53. data/lib/tutuf/visual_query/sql.rb +20 -0
  54. data/lib/visual_query.rb +4 -0
  55. data/lib/visual_query/engine.rb +4 -0
  56. data/lib/visual_query/version.rb +3 -0
  57. data/test/dummy/README.rdoc +261 -0
  58. data/test/dummy/Rakefile +7 -0
  59. data/test/dummy/app/assets/javascripts/application.js +15 -0
  60. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  61. data/test/dummy/app/controllers/application_controller.rb +3 -0
  62. data/test/dummy/app/helpers/application_helper.rb +2 -0
  63. data/test/dummy/app/models/account.rb +3 -0
  64. data/test/dummy/app/models/address.rb +3 -0
  65. data/test/dummy/app/models/category.rb +3 -0
  66. data/test/dummy/app/models/composite_pk.rb +3 -0
  67. data/test/dummy/app/models/customer.rb +4 -0
  68. data/test/dummy/app/models/order.rb +4 -0
  69. data/test/dummy/app/models/person.rb +4 -0
  70. data/test/dummy/app/models/post.rb +3 -0
  71. data/test/dummy/app/models/product.rb +4 -0
  72. data/test/dummy/app/models/product_in.rb +3 -0
  73. data/test/dummy/app/models/product_out.rb +3 -0
  74. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  75. data/test/dummy/config.ru +4 -0
  76. data/test/dummy/config/application.rb +53 -0
  77. data/test/dummy/config/boot.rb +10 -0
  78. data/test/dummy/config/database.yml +12 -0
  79. data/test/dummy/config/environment.rb +5 -0
  80. data/test/dummy/config/environments/development.rb +29 -0
  81. data/test/dummy/config/environments/production.rb +65 -0
  82. data/test/dummy/config/environments/test.rb +33 -0
  83. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  84. data/test/dummy/config/initializers/inflections.rb +15 -0
  85. data/test/dummy/config/initializers/mime_types.rb +5 -0
  86. data/test/dummy/config/initializers/secret_token.rb +7 -0
  87. data/test/dummy/config/initializers/session_store.rb +8 -0
  88. data/test/dummy/config/initializers/visual_query.rb +1 -0
  89. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  90. data/test/dummy/config/locales/en.yml +5 -0
  91. data/test/dummy/config/routes.rb +3 -0
  92. data/test/dummy/db/migrate/20130927112446_create_tables.rb +77 -0
  93. data/test/dummy/db/structure.sql +651 -0
  94. data/test/dummy/log/development.log +1548 -0
  95. data/test/dummy/log/test.log +36575 -0
  96. data/test/dummy/public/404.html +26 -0
  97. data/test/dummy/public/422.html +26 -0
  98. data/test/dummy/public/500.html +25 -0
  99. data/test/dummy/public/favicon.ico +0 -0
  100. data/test/dummy/script/rails +6 -0
  101. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/-h/-hj2e_RSTanfbfrP0tso5Q7actRM6_clE5hetFlQ2y8.cache +1 -0
  102. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/3B/3B_zqoNDfkO8wvAME66zxm9KzQaeDVSjnH0qC08yufM.cache +1 -0
  103. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/5g/5g7dhxVp4YbZmFw_-T3aU2oYq2Z9Jgtps0CKneXYSS0.cache +2 -0
  104. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/6-/6-CtZO6uG0yfwU8-098Sdy2wnfO0W6DbFu6B6DKYuiw.cache +1 -0
  105. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/8k/8kFIVN4cTS9KCQt_UIF5s_rcY-bMYlQpM489D98hvP4.cache +1 -0
  106. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Au/AukU7t3xLnyCh7qW4u45q9YFmjVcYujmIFbnaOhF4Mo.cache +1 -0
  107. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Bm/Bmsq0vYQqlrtfq5s-W8kcfLvwcsPT_6_5XxXt9J_QOw.cache +1 -0
  108. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/CQ/CQLNg7a2TsUWgc7JXjDkjseMig_dPVm6AvqO2IWk5zg.cache +0 -0
  109. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/FX/FX9ZXN3HEHR5hPzvxW8rakWEt2ot4IPJyDB67O7KPZk.cache +2 -0
  110. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Hv/HvOStITEkFHlcJCgaDnND6wzPw4dMmdAdZB1Xm6JfSA.cache +0 -0
  111. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/NW/NWCtuFzfIgixavqY71NIAa4ajbsXxRuiLNjceHgQ24M.cache +2 -0
  112. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Ta/TaG641Ow168nkagg10mh6zuWS8RwWuawpHuMGakCVjU.cache +0 -0
  113. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/VN/VNCapNKJLeponthNeFJhaBYs92UBT3P8PugENHP0474.cache +2 -0
  114. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/VR/VRi0Hz7tc62H5Of9XVjyAk7vSNmMr8xeYowo6lSBnZg.cache +2 -0
  115. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Vg/Vgl_u6t3BvczgGi_ZJlyyo7xYSe-GgEshLofx-3QorI.cache +1 -0
  116. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Vq/VqGJMF3Cpvp3fw2IEIkE2tzdFo_OdcEmxN58BQwbVDY.cache +0 -0
  117. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/W6/W6DnXCIMHJ2i5hUkEiNeDLroWxW3VU18nq292n5jlts.cache +0 -0
  118. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Z7/Z7fH8ST-O3GMnDUKvtKHHTSObfH2Nbs0J1QS79i80yE.cache +0 -0
  119. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Zh/ZhrmuPgfbHthzikN8QSHR0Q0bLtSYS1Bzl9HauWeDfU.cache +0 -0
  120. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/bY/bYzYCY_bAGQGVGMbcxtKIhUYrgDQhmQVTmK50JrMNb8.cache +0 -0
  121. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/eT/eTmCDSnc2m9ER5Cn85g84xyTkVLWKLbbwPFQo8eUAIg.cache +0 -0
  122. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/h-/h-taE7cHlbq76GUb5kHenjih_y66mO0w0lIZs7vY-0s.cache +1 -0
  123. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ji/jikmiWyu-cXN_ZJ4hgLc3kuCAY-QJY2jmPeXS4_9vZY.cache +0 -0
  124. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/kC/kCijps52gsNlkYgT2Qzdz9UcSaxhcMGNfNL7MIiWk54.cache +1 -0
  125. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/kQ/kQt-OsUDJg_sl1be-FqJ6Vhw4XVguw9_msZEwXP0Nh0.cache +0 -0
  126. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/nd/ndbe-ZZWBqU5gLx5nxauCFvv963Zm3xqVEwVYQ7X_X8.cache +1 -0
  127. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache +0 -0
  128. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/sm/sm7AdmddDYbFx4-eo_y_kaZspanmc-jiJeM8j2DXX5k.cache +1 -0
  129. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ux/uxPH9lLOW42lEQxJXnBizEObZReD8qkz6Eb6fdS6Ur4.cache +1 -0
  130. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/wn/wn0ayyM-chRdwEPI11SLkFT-7G2-GcOX8UIIC2kOWLY.cache +1 -0
  131. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache +0 -0
  132. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/xK/xKo0PfDcZuMh8oO-6Gr4j4S8eR2qUNY9Gau4kAxKIH0.cache +1 -0
  133. data/test/fixtures/accounts.yml +4 -0
  134. data/test/fixtures/categories.yml +3 -0
  135. data/test/fixtures/categories_posts.yml +3 -0
  136. data/test/fixtures/people.yml +8 -0
  137. data/test/fixtures/posts.yml +8 -0
  138. data/test/fixtures/product_ins.yml +15 -0
  139. data/test/fixtures/product_outs.yml +5 -0
  140. data/test/fixtures/products.yml +6 -0
  141. data/test/fixtures/saved_queries.rb +7 -0
  142. data/test/functional/queries_controller_test.rb +267 -0
  143. data/test/functional/routes_test.rb +111 -0
  144. data/test/integration/navigation_test.rb +10 -0
  145. data/test/test_helper.rb +15 -0
  146. data/test/unit/metadata_test.rb +10 -0
  147. data/test/unit/sql_test.rb +37 -0
  148. data/test/unit/visual_query_test.rb +648 -0
  149. metadata +381 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1 @@
1
+ "%��)��~&�mP�C?��EF@ �'���|k��
@@ -0,0 +1 @@
1
+ I"}app/assets/stylesheets/application.css?type=text/css&id=f148d8afadb92da0af9005e87642010f1aae01cf5774638c8b321a5d199093ff:ET
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{I"environment-version:ETTI"environment-paths;TTI"Lprocessors:type=application/javascript&file_type=application/javascript;TTI"8file-digest://app/assets/javascripts/application.js;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"jfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js;TTI"nfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js;TTI")file-digest://app/assets/javascripts;TTI"0file-digest://app/assets/javascripts/jquery;TTI")file-digest://app/assets/stylesheets;TTI"0file-digest://app/assets/stylesheets/jquery;TTI"[file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images;TTI"bfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery;TTI"4file-digest://app/assets/javascripts/jquery_ujs;TTI"4file-digest://app/assets/stylesheets/jquery_ujs;TTI"ffile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs;TT
@@ -0,0 +1 @@
1
+ I"�app/assets/stylesheets/application.css?type=text/css&pipeline=self&id=cca9e3d5c9de2173e8388506a4fa0180e0810cca096d5531d0897b4eb23e428b:ET
@@ -0,0 +1 @@
1
+ "%>��.��l�;T��_2��IT���Ɣc�ḩ
@@ -0,0 +1 @@
1
+ "%����-�!JaN��F�����D7�Zx2�����
@@ -0,0 +1 @@
1
+ "%|�<�i�Xc�0�ګ��r�.Cn���WJ�
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{ I"environment-version:ETTI"environment-paths;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"nfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js;TT
@@ -0,0 +1,2 @@
1
+ "%~�n��Um�lr�+� Mp��
2
+ ���4v����
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{I"environment-version:ETTI"environment-paths;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"8file-digest://app/assets/javascripts/application.js;TTI")file-digest://app/assets/javascripts;TTI"0file-digest://app/assets/javascripts/jquery;TTI")file-digest://app/assets/stylesheets;TTI"0file-digest://app/assets/stylesheets/jquery;TTI"[file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images;TTI"bfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery;TTI"`file-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts;TTI"gfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery;TTI"jfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js;TTI"4file-digest://app/assets/javascripts/jquery_ujs;TTI"4file-digest://app/assets/stylesheets/jquery_ujs;TTI"ffile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/images/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/javascripts/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-ui-rails-6.0.1/app/assets/stylesheets/jquery_ujs;TTI"kfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs;TTI"nfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js;TT
@@ -0,0 +1,2 @@
1
+ [o:Set:
2
+ @hash{ I"environment-version:ETTI"environment-paths;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"jfile-digest:///Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js;TT
@@ -0,0 +1 @@
1
+ I"}app/assets/stylesheets/application.css?type=text/css&id=82ab063fe50c0b6714393730e7315c2b0c929b84fe0496dc8a7cc5d6a0d47c8e:ET
@@ -0,0 +1 @@
1
+ "%��}�������J�d���p�A,#G�� �j��
@@ -0,0 +1 @@
1
+ I"�app/assets/javascripts/application.js?type=application/javascript&id=e6228cacc04b0de6587d4ce0cdbe9bd721af5a46edfd9d45a4ffdc0437e2e65a:ET
@@ -0,0 +1 @@
1
+ I"�/Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery_ujs.js?type=application/javascript&pipeline=self&id=3915e85e8d1d17531a18c82fab63477f8cd2e481c3fa2a400eb259ea826aa43c:ET
@@ -0,0 +1 @@
1
+ I"�app/assets/stylesheets/application.css?type=text/css&pipeline=self&id=7df53d3bd13a8e722b91346d8202c7dea6c80d890c4bb7cbdea5e676d8a55c7a:ET
@@ -0,0 +1 @@
1
+ I"�/Users/sava/.gem/ruby/2.2.6/gems/jquery-rails-3.1.4/vendor/assets/javascripts/jquery.js?type=application/javascript&pipeline=self&id=dbb44a3b0785197032e8bc9422d997334df7ae48354459660586bfecfeaf2147:ET
@@ -0,0 +1 @@
1
+ I"�app/assets/javascripts/application.js?type=application/javascript&pipeline=self&id=f7d72495b8bb6480c8f19d818ccd0df33855f7c90fa185b80371187a677f1585:ET
@@ -0,0 +1 @@
1
+ "%��Rm�v�S3.��O�L���ڹc�ƕq�=_j�
@@ -0,0 +1,4 @@
1
+ john:
2
+ id: 1
3
+ name: jat
4
+ person_id: 1
@@ -0,0 +1,3 @@
1
+ first:
2
+ id: 1
3
+ name: first
@@ -0,0 +1,3 @@
1
+ first:
2
+ category_id: 1
3
+ post_id: 1
@@ -0,0 +1,8 @@
1
+ john:
2
+ id: 1
3
+ name: John Atanasoff
4
+ age: 34
5
+ cyrillic:
6
+ id: 2
7
+ name: Джон Атанасов
8
+ age: 34
@@ -0,0 +1,8 @@
1
+ first:
2
+ id: 1
3
+ title: "First post!"
4
+ body: "Wankers like first post"
5
+ with_non_windows_1251_chars:
6
+ id: 2
7
+ title: "Màmìta Español"
8
+ body: ""
@@ -0,0 +1,15 @@
1
+ red_pencil:
2
+ id: 1
3
+ product_id: 1
4
+ quantity: 23
5
+ buy_price: 7
6
+ blue_pencil:
7
+ id: 2
8
+ product_id: 1
9
+ quantity: 14
10
+ buy_price: 10
11
+ bottle_700_ml:
12
+ id: 3
13
+ product_id: 2
14
+ quantity: 67
15
+ buy_price: 25
@@ -0,0 +1,5 @@
1
+ red_pencil:
2
+ id: 1
3
+ product_id: 1
4
+ quantity: 45
5
+ sale_price: 10
@@ -0,0 +1,6 @@
1
+ pencil:
2
+ id: 1
3
+ name: pencil
4
+ bottle:
5
+ id: 2
6
+ name: bottle
@@ -0,0 +1,7 @@
1
+ raise "Can't save first fixture query" unless Tutuf::VisualQuery::Base.new('columns' => [{'rel_name' => "people", 'col_name' => "age", 'save_name' => "people:age"}],
2
+ 'all_columns' => [{'rel_name' => "people", 'col_name' => "age", 'save_name' => "people:age"}],
3
+ 'relations' => [{'rel_name'=>"people", 'row' => 0}],
4
+ 'rows' => [0],
5
+ 'query' => {'name' => "first"},
6
+ 'action' => "create").save
7
+ raise "Can't save SQL fixture query" unless Tutuf::VisualQuery::Base.new('sql' => "SELECT AVG(age) AS average_age FROM people", 'query' => {'name' => "raw_sql"}).save
@@ -0,0 +1,267 @@
1
+ # encoding: utf-8
2
+ require File.dirname(__FILE__) + '/../test_helper'
3
+
4
+ class QueriesControllerTest < ActionController::TestCase
5
+ def setup
6
+ super
7
+ @routes = VisualQuery::Engine.routes
8
+ end
9
+
10
+ def test_index_with_saved_queries
11
+ get :index
12
+ assert_response :success
13
+ assert_template 'index'
14
+ end
15
+
16
+ def test_index_with_no_saved_queries
17
+ Tutuf::VisualQuery::Base.expects(:find_all).returns([])
18
+ get :index
19
+ assert_response :success
20
+ assert_template 'index'
21
+ end
22
+
23
+ def test_show_visually_created
24
+ get :show, :name => "first"
25
+ assert_response :success
26
+ assert_template 'show'
27
+ end
28
+
29
+ def test_show_created_with_raw_sql
30
+ get :show, :name => "raw_sql"
31
+ assert_response :success
32
+ assert_template 'show'
33
+ end
34
+
35
+ def test_show_for_nonexisting_name
36
+ get :show, :name => "nonexisting query"
37
+ assert_response 404
38
+ end
39
+
40
+ def test_new
41
+ Tutuf::VisualQuery::Base.stubs(:klasses).returns([Customer])
42
+ get :new
43
+ assert_response :success
44
+ assert_template 'new'
45
+ end
46
+
47
+ def test_list_joinable
48
+ get :list_joinable, :klass => "Customer"
49
+ assert_response :success
50
+ end
51
+
52
+ def test_join_data
53
+ get :join_data, :klass => "Person"
54
+ assert_response :success
55
+ # TODO: output is JSON, how to test it???
56
+ end
57
+
58
+ def test_columns
59
+ get :columns, :klass => "Person"
60
+ assert_response :success
61
+ assert_select ".columns", 1 do
62
+ assert_select ".column", Person.columns.size
63
+ end
64
+ end
65
+
66
+ def test_filter_with_nonblank_schema
67
+ get :filter, :schema => Tutuf::VisualQuery::Base.schema, :rel_name => "first", :col_name => "people:age"
68
+ assert_response :success
69
+ assert_template "_filter"
70
+ end
71
+
72
+ def test_filter_with_blank_schema
73
+ get :filter, :schema => "", :rel_name => "people", :col_name => "age"
74
+ assert_response :success
75
+ end
76
+
77
+ def test_filter_boolean
78
+ get :filter, :schema => "", :rel_name => "customers", :col_name => "vip"
79
+ assert_response :success
80
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 1
81
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='customers']", 1
82
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='vip']", 1
83
+ assert_select ".filter_condition", 1 do
84
+ assert_select "input[name='filters[][op]'][value='='][type='text'][readonly='readonly']", 1
85
+ assert_select "select[name='filters[][val]']", 1
86
+ end
87
+ end
88
+
89
+ def test_filter_date
90
+ get :filter, :schema => "", :rel_name => "customers", :col_name => "created_at"
91
+ assert_response :success
92
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 2
93
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='customers']", 2
94
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='created_at']", 2
95
+ assert_select ".filter_condition", 2 do
96
+ assert_select "input[name='filters[][op]'][type='hidden'][value='&gt;=']", 1
97
+ assert_select "input[name='filters[][op]'][type='hidden'][value='&lt;=']", 1
98
+ assert_select "input[name='filters[][val]'][type='text']", 2
99
+ end
100
+ end
101
+
102
+ def test_filter_numeric
103
+ get :filter, :schema => "", :rel_name => "people", :col_name => "age"
104
+ assert_response :success
105
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 1
106
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='people']", 1
107
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='age']", 1
108
+ assert_select ".filter_condition", 1 do
109
+ assert_select "select[name='filters[][op]']", 1
110
+ assert_select "input[name='filters[][val]']", 1
111
+ end
112
+ end
113
+
114
+ def test_filter_string
115
+ get :filter, :schema => "", :rel_name => "people", :col_name => "name"
116
+ assert_response :success
117
+ assert_select "input[name='filters[][schema]'][type='hidden'][value='public']", 1
118
+ assert_select "input[name='filters[][rel_name]'][type='hidden'][value='people']", 1
119
+ assert_select "input[name='filters[][col_name]'][type='hidden'][value='name']", 1
120
+ assert_select ".filter_condition", 1 do
121
+ assert_select "select[name='filters[][op]']", 1
122
+ assert_select "input[name='filters[][val]']", 1
123
+ end
124
+ end
125
+
126
+ def test_remove_filter
127
+ get :remove_filter, :schema => "", :rel_name => "people", :col_name => "age"
128
+ assert_response :success
129
+ end
130
+
131
+ def common_params
132
+ cols = [{:rel_name => "people", :col_name => "age", :save_name => "people:age"}]
133
+ {:name => '',
134
+ :columns => cols,
135
+ :all_columns => cols,
136
+ :relations => ["people"]}
137
+ end
138
+
139
+ def test_results_csv_non_empty_result_set
140
+ get :results, common_params.merge(:csv => "csv")
141
+ assert_response :success
142
+ assert_equal "text/csv; charset=utf-8; header=present", @response.content_type
143
+ assert @response.headers["Content-Disposition"].match(/^attachment; filename=".+?"$/)
144
+ end
145
+
146
+ def test_results_csv_empty_result_set
147
+ get :results, common_params.merge(:csv => "csv",
148
+ :filters => [ { :rel_name => 'people',
149
+ :col_name => 'age',
150
+ :op => '<',
151
+ :val => '0' } ] )
152
+ assert_response :success
153
+ assert_equal "text/csv; charset=utf-8; header=present", @response.content_type
154
+ assert @response.headers["Content-Disposition"].match(/^attachment; filename=".+?"$/)
155
+ end
156
+
157
+ def test_results_json
158
+ @request.accept = 'application/json'
159
+ get :results, common_params
160
+ assert_response :success
161
+ assert_equal "application/json", @response.content_type
162
+ end
163
+
164
+ def test_results_html_empty_result_set
165
+ Tutuf::VisualQuery::Base.any_instance.expects(:results).returns([])
166
+ get :results, common_params
167
+ assert_response :not_found
168
+ assert_template "_results_empty"
169
+ end
170
+
171
+ def test_results_html_not_large_result_set
172
+ get :results, common_params
173
+ assert_response :success
174
+ assert_template "_results"
175
+ end
176
+
177
+ def test_results_html_large_result_set
178
+ Tutuf::VisualQuery::Base.any_instance.expects(:"large_result_set?").returns(true)
179
+ Tutuf::VisualQuery::Base.any_instance.expects(:results).returns([["age"],["18"]])
180
+
181
+ get :results, common_params
182
+ assert_response :success
183
+ assert_template "_warning_large_result_set"
184
+ end
185
+
186
+ def test_results_hidden_columns_html
187
+ cols = [{:rel_name => "people", :col_name => "name"},
188
+ {:rel_name => "people", :col_name => "age"}]
189
+ get :results,
190
+ :name => '',
191
+ :columns => cols,
192
+ :all_columns => [{:rel_name => "people", :col_name => "id"}] + cols,
193
+ :relations => ["people"]
194
+ assert_response :success
195
+ assert_template "_results"
196
+ end
197
+
198
+ def test_create_invalid
199
+ post :create, common_params, use_route: :visual_query
200
+ assert_response 409
201
+ assert_select ".field_with_errors"
202
+ assert_select ".formError"
203
+ end
204
+
205
+ def test_create_valid
206
+ post :create, common_params.merge({:query=>{:name=>"new query"}})
207
+ assert_response :success
208
+ get :show, :name => "new query"
209
+ assert_response :success
210
+ assert_select "th.relation_column:first-child input[value='people:age'][name='columns[][col_name]']"
211
+ assert_select "th.relation_column:first-child input[value='new query'][name='columns[][rel_name]']"
212
+ assert_select "th.relation_column:first-child input[value='people:age'][name='all_columns[][col_name]']"
213
+ assert_select "th.relation_column:first-child input[value='new query'][name='all_columns[][rel_name]']"
214
+ end
215
+
216
+ def test_destroy_successfully
217
+ delete :destroy, :name => "first"
218
+ assert_response :redirect
219
+ # comparison with root_path fails in Rails 3.2
220
+ assert_redirected_to "/admin/queries/"
221
+ end
222
+
223
+ def test_destroy_unsuccessfully
224
+ Tutuf::VisualQuery::Base.any_instance.expects(:destroy).returns(false)
225
+ delete :destroy, :name => "first"
226
+ assert_response :success
227
+ assert_template "index"
228
+ end
229
+
230
+ def test_new_sql
231
+ get :new_sql
232
+ assert_response :success
233
+ assert_template :sql_form
234
+ assert_select 'input[name=?]', 'query[name]'
235
+ end
236
+
237
+ def test_edit_sql
238
+ get :edit_sql, :name => "raw_sql"
239
+ assert_response :success
240
+ assert_template :sql_form
241
+ assert_select 'input[name=?]', 'query[name]', false
242
+ end
243
+
244
+ def test_update_sql_valid
245
+ put :update_sql, :name => 'first', :sql => "SELECT MAX(age) AS max_age FROM people"
246
+ assert_response :success
247
+ end
248
+
249
+ def test_update_sql_invalid
250
+ put :update_sql, :name => 'first', :sql => "SELECT a FROM "
251
+ assert_response :unprocessable_entity
252
+ end
253
+
254
+ def test_results_sql_valid
255
+ get :results,
256
+ :name => '',
257
+ :sql => "SELECT MAX(age) AS max_age FROM people"
258
+ assert_response :success
259
+ end
260
+
261
+ def test_results_sql_invalid
262
+ get :results,
263
+ :name => '',
264
+ :sql => "SELECT a FROM"
265
+ assert_response :unprocessable_entity
266
+ end
267
+ end