slender_data 0.5.0 → 0.6.0

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 (261) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/slender_data.coffee +14 -0
  3. data/app/assets/javascripts/slender_data/brest_loader.coffee +139 -0
  4. data/app/assets/javascripts/slender_data/cache.coffee +9 -24
  5. data/app/assets/javascripts/slender_data/entry_store.coffee +107 -0
  6. data/app/assets/javascripts/slender_data/loading_indicator.coffee +28 -0
  7. data/app/assets/javascripts/slender_data/loading_tracker.coffee +74 -0
  8. data/app/assets/javascripts/slender_data/parameterizable.coffee +50 -0
  9. data/app/assets/javascripts/slender_data/persistence_manager.coffee +114 -233
  10. data/app/assets/javascripts/slender_data/queries/base_query.coffee +32 -0
  11. data/app/assets/javascripts/slender_data/queries/multi_query.coffee +91 -0
  12. data/app/assets/javascripts/slender_data/queries/single_query.coffee +81 -0
  13. data/app/assets/javascripts/slender_data/query_cache.coffee +87 -0
  14. data/lib/slender_data/version.rb +1 -1
  15. data/spec/dummy/Rakefile +6 -0
  16. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  17. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  18. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  19. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  20. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  21. data/spec/dummy/bin/bundle +3 -0
  22. data/spec/dummy/bin/rails +4 -0
  23. data/spec/dummy/bin/rake +4 -0
  24. data/spec/dummy/config.ru +4 -0
  25. data/spec/dummy/config/application.rb +23 -0
  26. data/spec/dummy/config/boot.rb +5 -0
  27. data/spec/dummy/config/database.yml +25 -0
  28. data/spec/dummy/config/environment.rb +5 -0
  29. data/spec/dummy/config/environments/development.rb +31 -0
  30. data/spec/dummy/config/environments/production.rb +80 -0
  31. data/spec/dummy/config/environments/test.rb +36 -0
  32. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  33. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  34. data/spec/dummy/config/initializers/inflections.rb +16 -0
  35. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  36. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  37. data/spec/dummy/config/initializers/session_store.rb +3 -0
  38. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  39. data/spec/dummy/config/locales/en.yml +23 -0
  40. data/spec/dummy/config/routes.rb +4 -0
  41. data/spec/dummy/db/test.sqlite3 +0 -0
  42. data/spec/dummy/lib/tasks/tasks.rake +13 -0
  43. data/spec/dummy/log/development.log +349013 -0
  44. data/spec/dummy/log/test.log +883 -0
  45. data/spec/dummy/public/404.html +58 -0
  46. data/spec/dummy/public/422.html +58 -0
  47. data/spec/dummy/public/500.html +57 -0
  48. data/spec/dummy/public/favicon.ico +0 -0
  49. data/spec/dummy/spec/javascripts/brest_loader_spec.coffee +314 -0
  50. data/spec/dummy/spec/javascripts/cache_spec.coffee +93 -0
  51. data/spec/dummy/spec/javascripts/entry_store_spec.coffee +315 -0
  52. data/spec/dummy/spec/javascripts/jquery.js +6 -0
  53. data/spec/dummy/spec/javascripts/loading_tracker_spec.coffee +95 -0
  54. data/spec/dummy/spec/javascripts/parameterizable_spec.coffee +138 -0
  55. data/spec/dummy/spec/javascripts/persistence_manager_spec.coffee +659 -0
  56. data/spec/dummy/spec/javascripts/queries/base_query_spec.coffee +41 -0
  57. data/spec/dummy/spec/javascripts/queries/multi_query_spec.coffee +143 -0
  58. data/spec/dummy/spec/javascripts/queries/single_query_spec.coffee +112 -0
  59. data/spec/dummy/spec/javascripts/query_cache_spec.coffee +347 -0
  60. data/spec/dummy/spec/javascripts/sinon-chai.js +109 -0
  61. data/spec/dummy/spec/javascripts/sinon.js +4290 -0
  62. data/spec/dummy/spec/javascripts/spec_helper.coffee +23 -0
  63. data/spec/dummy/tmp/cache/assets/development/sprockets/02dabf70b4ae4a034f349ce89b4831d8 +0 -0
  64. data/spec/dummy/tmp/cache/assets/development/sprockets/031a6c2e3a4e952151301446bd3fc16d +0 -0
  65. data/spec/dummy/tmp/cache/assets/development/sprockets/0373c4e5507b3195c4ad15224d991609 +0 -0
  66. data/spec/dummy/tmp/cache/assets/development/sprockets/05175bd457a57c3ad73ab9a2c8696c9b +0 -0
  67. data/spec/dummy/tmp/cache/assets/development/sprockets/086e89c7529d5063e771b41793bfe311 +0 -0
  68. data/spec/dummy/tmp/cache/assets/development/sprockets/08b36042c3a4a79ebd9cee8ee1b88e6a +0 -0
  69. data/spec/dummy/tmp/cache/assets/development/sprockets/10513fd445754b59bd6001ea6ee727d9 +0 -0
  70. data/spec/dummy/tmp/cache/assets/development/sprockets/124f6816f926ae28ad20cc56425f3c91 +0 -0
  71. data/spec/dummy/tmp/cache/assets/development/sprockets/12ce2414098e368903aeb9923e275ef7 +0 -0
  72. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  73. data/spec/dummy/tmp/cache/assets/development/sprockets/14eca89f8dccac139fd132de35d22628 +0 -0
  74. data/spec/dummy/tmp/cache/assets/development/sprockets/16c8b12ef6dcb486a7b771e43bbcc117 +0 -0
  75. data/spec/dummy/tmp/cache/assets/development/sprockets/19cdfaa89f900500a03507b86afe1231 +0 -0
  76. data/spec/dummy/tmp/cache/assets/development/sprockets/1b3a4d533a743ca2ccfbca0986613995 +0 -0
  77. data/spec/dummy/tmp/cache/assets/development/sprockets/1ca8c5b832302c6c94692d0875a59605 +0 -0
  78. data/spec/dummy/tmp/cache/assets/development/sprockets/2e2576241d2a4969c9277fe85851c92b +0 -0
  79. data/spec/dummy/tmp/cache/assets/development/sprockets/2ec1baba6d6dc634d091b3acf8127cf7 +0 -0
  80. data/spec/dummy/tmp/cache/assets/development/sprockets/2ff315acad8ceec317fd566d792df64f +0 -0
  81. data/spec/dummy/tmp/cache/assets/development/sprockets/311f68c1b9e342ebab4c92c8cb2b5e54 +0 -0
  82. data/spec/dummy/tmp/cache/assets/development/sprockets/324a5040c964d5e8d293564383c49b91 +0 -0
  83. data/spec/dummy/tmp/cache/assets/development/sprockets/3310b5a70d0b220782ab3e87642834e9 +0 -0
  84. data/spec/dummy/tmp/cache/assets/development/sprockets/33ea745e7aa9669831758b7d36db1cb4 +0 -0
  85. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  86. data/spec/dummy/tmp/cache/assets/development/sprockets/3999afdceee7ca8dcf53757221c62d71 +0 -0
  87. data/spec/dummy/tmp/cache/assets/development/sprockets/3ba03b9f1aab60e78424f36e0e6cce6c +0 -0
  88. data/spec/dummy/tmp/cache/assets/development/sprockets/3e9a6ed890157d94f18b480f0079d8e1 +0 -0
  89. data/spec/dummy/tmp/cache/assets/development/sprockets/3ef50ccfe459d5c89ecc79a448586b49 +0 -0
  90. data/spec/dummy/tmp/cache/assets/development/sprockets/46c298dc2ff12ec748c70c017684fc28 +0 -0
  91. data/spec/dummy/tmp/cache/assets/development/sprockets/476318dd8109fbf173335456cabb4128 +0 -0
  92. data/spec/dummy/tmp/cache/assets/development/sprockets/5602ee157ea76a2f44a43739a83b1a6c +0 -0
  93. data/spec/dummy/tmp/cache/assets/development/sprockets/5b390f4782d6b77f5aec7ec56f3ad934 +0 -0
  94. data/spec/dummy/tmp/cache/assets/development/sprockets/5b5a66f4eefc591d284af6535ae474ea +0 -0
  95. data/spec/dummy/tmp/cache/assets/development/sprockets/5c41eeb2e98dc0833647e8547880435e +0 -0
  96. data/spec/dummy/tmp/cache/assets/development/sprockets/5cd2936d626662390288ab4c07ff3957 +0 -0
  97. data/spec/dummy/tmp/cache/assets/development/sprockets/5fd362891a204d492d9fa57ffee6e114 +0 -0
  98. data/spec/dummy/tmp/cache/assets/development/sprockets/643d60abdbcc813c95214920f12f09c3 +0 -0
  99. data/spec/dummy/tmp/cache/assets/development/sprockets/6591bc7545da5a2f5f7dee20b1f110a5 +0 -0
  100. data/spec/dummy/tmp/cache/assets/development/sprockets/6597f36181468ff92ba4284afe001181 +0 -0
  101. data/spec/dummy/tmp/cache/assets/development/sprockets/69b7946c418b75e7ba78f9fc73d3e9b9 +0 -0
  102. data/spec/dummy/tmp/cache/assets/development/sprockets/6c75b81de9afea82a6cbb56749157e3f +0 -0
  103. data/spec/dummy/tmp/cache/assets/development/sprockets/6e4bc63f9308eb5929a77f7607101af1 +0 -0
  104. data/spec/dummy/tmp/cache/assets/development/sprockets/6ee2243cf1cf415b6267b84dd7b8ba77 +0 -0
  105. data/spec/dummy/tmp/cache/assets/development/sprockets/6f8457b4ba418f572891745381a1e0f5 +0 -0
  106. data/spec/dummy/tmp/cache/assets/development/sprockets/6fd5544e52538b06ac40e5b387b020a5 +0 -0
  107. data/spec/dummy/tmp/cache/assets/development/sprockets/6fed8361766f5ae3cbf781986d6945b2 +0 -0
  108. data/spec/dummy/tmp/cache/assets/development/sprockets/70ffa648dbbe0f2431e7f9307b569354 +0 -0
  109. data/spec/dummy/tmp/cache/assets/development/sprockets/731f0bc492f775825f046d500938fc5a +0 -0
  110. data/spec/dummy/tmp/cache/assets/development/sprockets/76153dd2cc3d0c6e584080efb16e872a +0 -0
  111. data/spec/dummy/tmp/cache/assets/development/sprockets/76cd4393e7976d030f4623b8b6b372a0 +0 -0
  112. data/spec/dummy/tmp/cache/assets/development/sprockets/78d5dac5e2f907dd68813ed23a0fd4ac +0 -0
  113. data/spec/dummy/tmp/cache/assets/development/sprockets/7a400f93bfb71a1a11c59b9804adda6d +0 -0
  114. data/spec/dummy/tmp/cache/assets/development/sprockets/7abf5e8d9666225cb1d7881798dbd87a +0 -0
  115. data/spec/dummy/tmp/cache/assets/development/sprockets/7d6f1f3e48f6cc97a9bb4606f8c5a020 +0 -0
  116. data/spec/dummy/tmp/cache/assets/development/sprockets/814ca144649e7dec9e9158b3ec3460f1 +0 -0
  117. data/spec/dummy/tmp/cache/assets/development/sprockets/83de5b2d2c5d49f7737ae1f0316435ec +0 -0
  118. data/spec/dummy/tmp/cache/assets/development/sprockets/84c67faa73fdd082d4bd7f7712cb0499 +0 -0
  119. data/spec/dummy/tmp/cache/assets/development/sprockets/87a6ddc523ccbf2673750499bede3fc9 +0 -0
  120. data/spec/dummy/tmp/cache/assets/development/sprockets/8a90082fa76a7f37dd92a9b9a9b9f593 +0 -0
  121. data/spec/dummy/tmp/cache/assets/development/sprockets/8c5b622a33c6c034ecb4e78f131c5f73 +0 -0
  122. data/spec/dummy/tmp/cache/assets/development/sprockets/8c9851849e82bb9670e56f046df437f9 +0 -0
  123. data/spec/dummy/tmp/cache/assets/development/sprockets/8fc1455d3af69de5da04bf2a2a3f0b74 +0 -0
  124. data/spec/dummy/tmp/cache/assets/development/sprockets/96af98519e5badf206b77c3ecaf86d20 +0 -0
  125. data/spec/dummy/tmp/cache/assets/development/sprockets/98610661915880264fdb51c8f1a14141 +0 -0
  126. data/spec/dummy/tmp/cache/assets/development/sprockets/9a00753cdfb01f357dc39eeada77d0bc +0 -0
  127. data/spec/dummy/tmp/cache/assets/development/sprockets/9ad3db355e00d28ed3faed6dea5b1bff +0 -0
  128. data/spec/dummy/tmp/cache/assets/development/sprockets/9cbb3109d489692fd270c77ffa9d9559 +0 -0
  129. data/spec/dummy/tmp/cache/assets/development/sprockets/a22afac508f5adc12bf48d2f8333b8f7 +0 -0
  130. data/spec/dummy/tmp/cache/assets/development/sprockets/a49d020ee42c78bf7d22a21e8ee3b80f +0 -0
  131. data/spec/dummy/tmp/cache/assets/development/sprockets/a4f4f6c56c368263c0fbcf3f1542aa73 +0 -0
  132. data/spec/dummy/tmp/cache/assets/development/sprockets/a56b8266298c4171918ee403aa1c9e0f +0 -0
  133. data/spec/dummy/tmp/cache/assets/development/sprockets/a73a44bfca198fdf779532b644ec8af5 +0 -0
  134. data/spec/dummy/tmp/cache/assets/development/sprockets/aa4a22da44bd1b7dbdbb18f983d6c09b +0 -0
  135. data/spec/dummy/tmp/cache/assets/development/sprockets/ab0236bf3eac5cd30348c18efce8246b +0 -0
  136. data/spec/dummy/tmp/cache/assets/development/sprockets/abf215c8dc45135a91f4f993514c653f +0 -0
  137. data/spec/dummy/tmp/cache/assets/development/sprockets/ac1b8c30ad00cc489b7ec78bd6e2fc6c +0 -0
  138. data/spec/dummy/tmp/cache/assets/development/sprockets/ae8bd07980ad64ef8e9ac3fe38413c6d +0 -0
  139. data/spec/dummy/tmp/cache/assets/development/sprockets/b1950420978c68074fc6fd81d4320bc0 +0 -0
  140. data/spec/dummy/tmp/cache/assets/development/sprockets/b2d6aa1cb303474ebf3bfc571904ad23 +0 -0
  141. data/spec/dummy/tmp/cache/assets/development/sprockets/b59a10f85562b39fc7dd651965df9cab +0 -0
  142. data/spec/dummy/tmp/cache/assets/development/sprockets/b8d24bca037cf4b0a9e2979c11c8aea8 +0 -0
  143. data/spec/dummy/tmp/cache/assets/development/sprockets/bc2f15f88df08b4265c83133d6107680 +0 -0
  144. data/spec/dummy/tmp/cache/assets/development/sprockets/bd7ddfa86995ff5d259ea37e4a90c51c +0 -0
  145. data/spec/dummy/tmp/cache/assets/development/sprockets/c0515d57887926d6e28a0f87da31ee8e +0 -0
  146. data/spec/dummy/tmp/cache/assets/development/sprockets/c4820232e07d4e298e834c1011a72faa +0 -0
  147. data/spec/dummy/tmp/cache/assets/development/sprockets/c6babc078901541de3f4cb5cc2703bea +0 -0
  148. data/spec/dummy/tmp/cache/assets/development/sprockets/c9635dd5cbd79bdd9c58a89f6ea01595 +0 -0
  149. data/spec/dummy/tmp/cache/assets/development/sprockets/c9962abce37f5a56d5f05afe1edfe1b8 +0 -0
  150. data/spec/dummy/tmp/cache/assets/development/sprockets/cce1f28f0d1f5c2817e6eaf392bac615 +0 -0
  151. data/spec/dummy/tmp/cache/assets/development/sprockets/d37cae0bfdf135e6e71bcd0572bef329 +0 -0
  152. data/spec/dummy/tmp/cache/assets/development/sprockets/d4956056f6f35287a04295df6e52575d +0 -0
  153. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  154. data/spec/dummy/tmp/cache/assets/development/sprockets/dc54acb6b8cd4b84b13f440d57db37b1 +0 -0
  155. data/spec/dummy/tmp/cache/assets/development/sprockets/dd51c50b2d8231175e8da83e8b057120 +0 -0
  156. data/spec/dummy/tmp/cache/assets/development/sprockets/dec2df59b57b3639f89847e50416c924 +0 -0
  157. data/spec/dummy/tmp/cache/assets/development/sprockets/df45b0abc2c323093874639ceb72c012 +0 -0
  158. data/spec/dummy/tmp/cache/assets/development/sprockets/e0393ec0ca968f0d4182c82802da79d5 +0 -0
  159. data/spec/dummy/tmp/cache/assets/development/sprockets/e43bfee690613c316a59f122315314e5 +0 -0
  160. data/spec/dummy/tmp/cache/assets/development/sprockets/ed1d892145be7053348b0ba28c27b427 +0 -0
  161. data/spec/dummy/tmp/cache/assets/development/sprockets/ef2b922f05692ba49eb1f68801786b8e +0 -0
  162. data/spec/dummy/tmp/cache/assets/development/sprockets/efec5fde178e0875317a0d380222545d +0 -0
  163. data/spec/dummy/tmp/cache/assets/development/sprockets/f01906d52258e56e92a230dc3e55805d +0 -0
  164. data/spec/dummy/tmp/cache/assets/development/sprockets/f1b4ffa23205a95782c5c5050359429f +0 -0
  165. data/spec/dummy/tmp/cache/assets/development/sprockets/f2080a87aa027245a444b1486dce7792 +0 -0
  166. data/spec/dummy/tmp/cache/assets/development/sprockets/f37842723e3572ba18f02519dab4ee77 +0 -0
  167. data/spec/dummy/tmp/cache/assets/development/sprockets/f72501aca20f34d765720253853e6105 +0 -0
  168. data/spec/dummy/tmp/cache/assets/development/sprockets/f74306735334107c5d17684f524b65cf +0 -0
  169. data/spec/dummy/tmp/cache/assets/development/sprockets/f89dc49f90e98b448540556861f0173e +0 -0
  170. data/spec/dummy/tmp/cache/assets/development/sprockets/feadb1611975b23f2647e1ac656ad90b +0 -0
  171. data/spec/dummy/tmp/cache/assets/development/sprockets/ff445b9646db9910af486791b285b112 +0 -0
  172. data/spec/dummy/tmp/cache/assets/development/sprockets/ffa1eaa25729d9d4cd7e2fd666868936 +0 -0
  173. data/spec/dummy/tmp/cache/assets/test/sprockets/02dabf70b4ae4a034f349ce89b4831d8 +0 -0
  174. data/spec/dummy/tmp/cache/assets/test/sprockets/031a6c2e3a4e952151301446bd3fc16d +0 -0
  175. data/spec/dummy/tmp/cache/assets/test/sprockets/0373c4e5507b3195c4ad15224d991609 +0 -0
  176. data/spec/dummy/tmp/cache/assets/test/sprockets/05175bd457a57c3ad73ab9a2c8696c9b +0 -0
  177. data/spec/dummy/tmp/cache/assets/test/sprockets/086e89c7529d5063e771b41793bfe311 +0 -0
  178. data/spec/dummy/tmp/cache/assets/test/sprockets/08b36042c3a4a79ebd9cee8ee1b88e6a +0 -0
  179. data/spec/dummy/tmp/cache/assets/test/sprockets/10513fd445754b59bd6001ea6ee727d9 +0 -0
  180. data/spec/dummy/tmp/cache/assets/test/sprockets/124f6816f926ae28ad20cc56425f3c91 +0 -0
  181. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  182. data/spec/dummy/tmp/cache/assets/test/sprockets/14eca89f8dccac139fd132de35d22628 +0 -0
  183. data/spec/dummy/tmp/cache/assets/test/sprockets/16c8b12ef6dcb486a7b771e43bbcc117 +0 -0
  184. data/spec/dummy/tmp/cache/assets/test/sprockets/2b22662f42e9f485aafa6a333faaa256 +0 -0
  185. data/spec/dummy/tmp/cache/assets/test/sprockets/2e2576241d2a4969c9277fe85851c92b +0 -0
  186. data/spec/dummy/tmp/cache/assets/test/sprockets/2ec1baba6d6dc634d091b3acf8127cf7 +0 -0
  187. data/spec/dummy/tmp/cache/assets/test/sprockets/2ff315acad8ceec317fd566d792df64f +0 -0
  188. data/spec/dummy/tmp/cache/assets/test/sprockets/311f68c1b9e342ebab4c92c8cb2b5e54 +0 -0
  189. data/spec/dummy/tmp/cache/assets/test/sprockets/324a5040c964d5e8d293564383c49b91 +0 -0
  190. data/spec/dummy/tmp/cache/assets/test/sprockets/3310b5a70d0b220782ab3e87642834e9 +0 -0
  191. data/spec/dummy/tmp/cache/assets/test/sprockets/33ea745e7aa9669831758b7d36db1cb4 +0 -0
  192. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  193. data/spec/dummy/tmp/cache/assets/test/sprockets/3999afdceee7ca8dcf53757221c62d71 +0 -0
  194. data/spec/dummy/tmp/cache/assets/test/sprockets/3e9a6ed890157d94f18b480f0079d8e1 +0 -0
  195. data/spec/dummy/tmp/cache/assets/test/sprockets/3ef50ccfe459d5c89ecc79a448586b49 +0 -0
  196. data/spec/dummy/tmp/cache/assets/test/sprockets/46c298dc2ff12ec748c70c017684fc28 +0 -0
  197. data/spec/dummy/tmp/cache/assets/test/sprockets/476318dd8109fbf173335456cabb4128 +0 -0
  198. data/spec/dummy/tmp/cache/assets/test/sprockets/5602ee157ea76a2f44a43739a83b1a6c +0 -0
  199. data/spec/dummy/tmp/cache/assets/test/sprockets/5b390f4782d6b77f5aec7ec56f3ad934 +0 -0
  200. data/spec/dummy/tmp/cache/assets/test/sprockets/5b5a66f4eefc591d284af6535ae474ea +0 -0
  201. data/spec/dummy/tmp/cache/assets/test/sprockets/5cd2936d626662390288ab4c07ff3957 +0 -0
  202. data/spec/dummy/tmp/cache/assets/test/sprockets/643d60abdbcc813c95214920f12f09c3 +0 -0
  203. data/spec/dummy/tmp/cache/assets/test/sprockets/6597f36181468ff92ba4284afe001181 +0 -0
  204. data/spec/dummy/tmp/cache/assets/test/sprockets/6c75b81de9afea82a6cbb56749157e3f +0 -0
  205. data/spec/dummy/tmp/cache/assets/test/sprockets/6e4bc63f9308eb5929a77f7607101af1 +0 -0
  206. data/spec/dummy/tmp/cache/assets/test/sprockets/6ee2243cf1cf415b6267b84dd7b8ba77 +0 -0
  207. data/spec/dummy/tmp/cache/assets/test/sprockets/6f8457b4ba418f572891745381a1e0f5 +0 -0
  208. data/spec/dummy/tmp/cache/assets/test/sprockets/6fd5544e52538b06ac40e5b387b020a5 +0 -0
  209. data/spec/dummy/tmp/cache/assets/test/sprockets/6fed8361766f5ae3cbf781986d6945b2 +0 -0
  210. data/spec/dummy/tmp/cache/assets/test/sprockets/70ffa648dbbe0f2431e7f9307b569354 +0 -0
  211. data/spec/dummy/tmp/cache/assets/test/sprockets/76cd4393e7976d030f4623b8b6b372a0 +0 -0
  212. data/spec/dummy/tmp/cache/assets/test/sprockets/7a400f93bfb71a1a11c59b9804adda6d +0 -0
  213. data/spec/dummy/tmp/cache/assets/test/sprockets/7abf5e8d9666225cb1d7881798dbd87a +0 -0
  214. data/spec/dummy/tmp/cache/assets/test/sprockets/7d6f1f3e48f6cc97a9bb4606f8c5a020 +0 -0
  215. data/spec/dummy/tmp/cache/assets/test/sprockets/814ca144649e7dec9e9158b3ec3460f1 +0 -0
  216. data/spec/dummy/tmp/cache/assets/test/sprockets/83de5b2d2c5d49f7737ae1f0316435ec +0 -0
  217. data/spec/dummy/tmp/cache/assets/test/sprockets/873c5252aa4eab7409b712c5e276bad2 +0 -0
  218. data/spec/dummy/tmp/cache/assets/test/sprockets/87a6ddc523ccbf2673750499bede3fc9 +0 -0
  219. data/spec/dummy/tmp/cache/assets/test/sprockets/8a90082fa76a7f37dd92a9b9a9b9f593 +0 -0
  220. data/spec/dummy/tmp/cache/assets/test/sprockets/8c5b622a33c6c034ecb4e78f131c5f73 +0 -0
  221. data/spec/dummy/tmp/cache/assets/test/sprockets/8c9851849e82bb9670e56f046df437f9 +0 -0
  222. data/spec/dummy/tmp/cache/assets/test/sprockets/8fc1455d3af69de5da04bf2a2a3f0b74 +0 -0
  223. data/spec/dummy/tmp/cache/assets/test/sprockets/98610661915880264fdb51c8f1a14141 +0 -0
  224. data/spec/dummy/tmp/cache/assets/test/sprockets/9a00753cdfb01f357dc39eeada77d0bc +0 -0
  225. data/spec/dummy/tmp/cache/assets/test/sprockets/9ad3db355e00d28ed3faed6dea5b1bff +0 -0
  226. data/spec/dummy/tmp/cache/assets/test/sprockets/a22afac508f5adc12bf48d2f8333b8f7 +0 -0
  227. data/spec/dummy/tmp/cache/assets/test/sprockets/a4f4f6c56c368263c0fbcf3f1542aa73 +0 -0
  228. data/spec/dummy/tmp/cache/assets/test/sprockets/a56b8266298c4171918ee403aa1c9e0f +0 -0
  229. data/spec/dummy/tmp/cache/assets/test/sprockets/a73a44bfca198fdf779532b644ec8af5 +0 -0
  230. data/spec/dummy/tmp/cache/assets/test/sprockets/aa4a22da44bd1b7dbdbb18f983d6c09b +0 -0
  231. data/spec/dummy/tmp/cache/assets/test/sprockets/ab0236bf3eac5cd30348c18efce8246b +0 -0
  232. data/spec/dummy/tmp/cache/assets/test/sprockets/ac1b8c30ad00cc489b7ec78bd6e2fc6c +0 -0
  233. data/spec/dummy/tmp/cache/assets/test/sprockets/ae8bd07980ad64ef8e9ac3fe38413c6d +0 -0
  234. data/spec/dummy/tmp/cache/assets/test/sprockets/b1950420978c68074fc6fd81d4320bc0 +0 -0
  235. data/spec/dummy/tmp/cache/assets/test/sprockets/b2d6aa1cb303474ebf3bfc571904ad23 +0 -0
  236. data/spec/dummy/tmp/cache/assets/test/sprockets/b8d24bca037cf4b0a9e2979c11c8aea8 +0 -0
  237. data/spec/dummy/tmp/cache/assets/test/sprockets/bc2f15f88df08b4265c83133d6107680 +0 -0
  238. data/spec/dummy/tmp/cache/assets/test/sprockets/c9962abce37f5a56d5f05afe1edfe1b8 +0 -0
  239. data/spec/dummy/tmp/cache/assets/test/sprockets/cce1f28f0d1f5c2817e6eaf392bac615 +0 -0
  240. data/spec/dummy/tmp/cache/assets/test/sprockets/d37cae0bfdf135e6e71bcd0572bef329 +0 -0
  241. data/spec/dummy/tmp/cache/assets/test/sprockets/d4956056f6f35287a04295df6e52575d +0 -0
  242. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  243. data/spec/dummy/tmp/cache/assets/test/sprockets/dc54acb6b8cd4b84b13f440d57db37b1 +0 -0
  244. data/spec/dummy/tmp/cache/assets/test/sprockets/dd51c50b2d8231175e8da83e8b057120 +0 -0
  245. data/spec/dummy/tmp/cache/assets/test/sprockets/df13b2e8a88a9dcdc4a830fdd8f8d7b8 +0 -0
  246. data/spec/dummy/tmp/cache/assets/test/sprockets/df45b0abc2c323093874639ceb72c012 +0 -0
  247. data/spec/dummy/tmp/cache/assets/test/sprockets/e0393ec0ca968f0d4182c82802da79d5 +0 -0
  248. data/spec/dummy/tmp/cache/assets/test/sprockets/e43bfee690613c316a59f122315314e5 +0 -0
  249. data/spec/dummy/tmp/cache/assets/test/sprockets/ed1d892145be7053348b0ba28c27b427 +0 -0
  250. data/spec/dummy/tmp/cache/assets/test/sprockets/ef2b922f05692ba49eb1f68801786b8e +0 -0
  251. data/spec/dummy/tmp/cache/assets/test/sprockets/f01906d52258e56e92a230dc3e55805d +0 -0
  252. data/spec/dummy/tmp/cache/assets/test/sprockets/f1b4ffa23205a95782c5c5050359429f +0 -0
  253. data/spec/dummy/tmp/cache/assets/test/sprockets/f2080a87aa027245a444b1486dce7792 +0 -0
  254. data/spec/dummy/tmp/cache/assets/test/sprockets/f37842723e3572ba18f02519dab4ee77 +0 -0
  255. data/spec/dummy/tmp/cache/assets/test/sprockets/f72501aca20f34d765720253853e6105 +0 -0
  256. data/spec/dummy/tmp/cache/assets/test/sprockets/feadb1611975b23f2647e1ac656ad90b +0 -0
  257. data/spec/dummy/tmp/cache/assets/test/sprockets/ff445b9646db9910af486791b285b112 +0 -0
  258. metadata +499 -6
  259. data/app/assets/javascripts/slender_data.js +0 -8
  260. data/app/assets/javascripts/slender_data/ajax_loader.coffee +0 -76
  261. data/app/assets/javascripts/slender_data/indexed_cache.coffee +0 -33
@@ -1,271 +1,152 @@
1
- #= require slender_data/ajax_loader
2
- #= require slender_data/indexed_cache
1
+ #= require slender_data/brest_loader
2
+ #= require slender_data/entry_store
3
+ #= require slender_data/query_cache
4
+ #= require slender_data/parameterizable
3
5
  #= require slender_data/tools
4
6
 
5
- # Provides persistence services for data models.
7
+ # Provides server-backed persistence services for JSON data models.
6
8
  #
7
- # This class operates against a standard RESTful data API, whole path is given in params.url.
8
- # In addition to the standard RESTful routes, the data API is expected to support these methods for performance reasons:
9
- # * DELETE /entries: Delete a whole batch of entries at once. The ids of the entries to delete are given as a JSON hash in the body of the request.
10
- # *
9
+ # This class operates against a BRESTful data API.
11
10
  #
12
- # Terminology:
13
- # * "load" methods are high level public API. They try to satisfy the requests from the local cache, and load the data from the server on demand.
14
- # * "get" methods access only the local cache, and return their results synchronously.
15
- # * "fetch" methods encapsulate accessing remote resources.
16
- # * "create" creates a given entry on the server
17
- # * "add" adds the given entry to the clientside cache.
18
- class slender_data.PersistenceManager
11
+ # Operations that act directly on entries, and are always given entries
12
+ # (add_to_cache, create, update) are given the entries directly.
13
+ # Operations that need to look up entries before doing something with them,
14
+ # and don't necessarily need the full entry to do that, (delete, get, load)
15
+ # are given queries.
16
+ class slender_data.PersistenceManager extends slender_data.Parameterizable
19
17
 
20
18
  constructor: (params) ->
19
+ super params
21
20
 
22
- # Copy of the data as it is on the server.
23
- @server_data = new slender_data.IndexedCache
21
+ # Stores the data objects here on the client,
22
+ # and tracks changes that are made to them here.
23
+ @entry_store = new slender_data.EntryStore params
24
24
 
25
- # Copy of the data as it is on the client.
26
- @client_data = new slender_data.IndexedCache
25
+ # Loads/stores data to/from the server.
26
+ @server_api = new slender_data.BrestLoader params
27
27
 
28
- # The base url on the server. Expected to be a fully RESTful API.
29
- @base_url = params.url
30
28
 
31
- # Name of the 'id' column for models.
32
- @key = params.key or 'id'
29
+ # Adds the given serverside entry to the entry store.
30
+ # Does not update the server.
31
+ # Does not provide an editable version of the data.
32
+ # Call "get" to get one.
33
+ add_to_cache: (entry) ->
34
+ @entry_store.add entry
33
35
 
34
- # Name of the model class (e.g. "user").
35
- @model_name = params.model_name
36
36
 
37
- # For handling parallel requests to the server.
38
- @loader = new slender_data.AjaxLoader { cache: no }
37
+ # Adds the given serverside entries to the entry store.
38
+ add_many_to_cache: (entries) ->
39
+ @entry_store.add_many entries
39
40
 
40
41
 
41
- # Adds the given entry to the clientside caches.
42
- # Returns the entry to be used by the client.
43
- add: (entry) ->
44
- @server_data.add entry
45
- client_entry = slender_data.clone_hash entry
46
- @client_data.add client_entry
47
- client_entry
48
-
49
-
50
- # Adds the given data objects to the server cache.
51
- add_all: (entries) ->
52
- @add(entry) for entry in entries
53
-
54
-
55
- # Returns an array containing only the changed objects.
56
- # Each object contains only the changed columns + key column.
57
- changed_objects_columns: (objects) ->
58
- slender_data.tap [], (result) =>
59
- for object in objects
60
- diff = slender_data.object_diff @server_data.get(object[@key]), object
61
- continue if slender_data.object_length(diff) == 0
62
- diff[@key] = object[@key]
63
- result.push(diff)
64
-
65
-
66
- # Returns the URL to access the collection of objects.
67
- collection_url: ->
68
- "#{@base_url}.json"
69
-
70
-
71
- # Creates the given object on the server.
72
- create: (obj, success_callback, error_callback) ->
73
- data = {}
74
- data[@model_name] = obj
75
-
76
- jQuery.ajax
77
- url: @collection_url()
78
- type: 'POST'
79
- data: data
80
- success: (server_response) =>
81
- server_obj = server_response[@model_name]
82
- @server_data.add server_obj
83
- success_callback server_obj
84
- error: (xhr) =>
85
- error_callback(xhr.responseText) if error_callback
86
-
87
-
88
- # TODO: create_many
89
-
90
-
91
- # Deletes the given object from the server.
92
- delete: (obj, success_callback, error_callback) ->
93
- @client_data.remove obj
94
- @server_data.remove obj
95
- jQuery.ajax
96
- url: @entry_url(obj)
97
- type: 'DELETE'
98
- success: ->
99
- success_callback() if success_callback?
100
- error: (xhr) ->
101
- error_callback(xhr.responseText) if error_callback
102
-
103
-
104
- # Deletes the given objects from the server.
105
- delete_many: (object_ids, success_callback, error_callback) ->
106
- @client_data.remove_many object_ids
107
- @server_data.remove_many object_ids
108
- jQuery.ajax
109
- url: @base_url
110
- type: 'DELETE'
111
- data: {ids: object_ids}
112
- success: ->
113
- success_callback() if success_callback?
114
- error: (xhr) ->
115
- error_callback(xhr.responseText) if error_callback
116
-
117
-
118
- # Returns the url to access a single entry.
119
- entry_url: (entry) ->
120
- "#{@base_url}/#{entry[@key]}.json"
121
-
122
-
123
- # Returns the url to access the collection of entries.
124
- entries_url: ->
125
- "#{@base_url}.json"
126
-
127
-
128
- # Fetches the entry with the given key from the server.
129
- # Adds it to the clientside cache.
130
- fetch: (key, success_callback) ->
131
- @loader.get "#{@base_url}/#{key}.json", (server_response) =>
132
- client_entry = @add server_response[@model_name]
133
- success_callback client_entry
134
-
135
-
136
- # Loads all objects from the server.
137
- # Provides the given params as parameters to the GET request.
138
- fetch_many: (data, success_callback, error_callback) ->
139
- data.ids = data.ids.join(' ') if data.ids
140
- jQuery.ajax
141
- url: @collection_url()
142
- cache: no
143
- data: data
144
- success: (data) =>
145
- @add_all data
146
- success_callback(data) if success_callback
147
- error: (xhr) ->
148
- error_callback(xhr.responseText) if error_callback
149
-
42
+ # Creates the described object on the server.
43
+ #
44
+ # Returns nothing. Call "get" to get an editable copy of the object.
45
+ create: (entry, callback) ->
46
+ @server_api.create entry, (server_response) =>
47
+ server_entry = server_response[@entry_name]
48
+ @add_to_cache server_entry
49
+ callback(@get entry: server_entry) if callback
50
+
51
+ # Creates the described objects on the server.
52
+ #
53
+ # Returns nothing. Call "get_many" to get editable copies.
54
+ create_many: (entries, callback) ->
55
+ @server_api.create_many entries, (server_response) =>
56
+ @add_many_to_cache server_response[@entries_name]
57
+ callback() if callback
150
58
 
151
- # Returns the cached object with the given key, if one exists in the cache.
152
- # Returns undefined if no object with this key exists in the cache.
153
- get: (key) =>
154
59
 
155
- # Try to use client_data cache.
156
- client_obj = @client_data.get key
157
- return client_obj if client_obj
60
+ # Deletes the described entry from the server.
61
+ delete: (query, callback) ->
62
+ query = query
63
+ @server_api.delete query, (server_response) =>
64
+ @entry_store.delete server_response
65
+ callback(server_response) if callback
158
66
 
159
- # No data in client cache --> try to use server cache.
160
- server_obj = @server_data.get key
161
- if server_obj
162
- client_obj = slender_data.clone_hash server_obj
163
- @client_data.add client_obj
164
- return client_obj
165
67
 
166
- # Object not found in client or server cache.
167
- undefined
68
+ # Deletes the described entries from the server.
69
+ delete_many: (multi_query, callback) ->
70
+ @server_api.delete_many multi_query, (server_response) =>
71
+ @entry_store.delete_many server_response
72
+ callback(server_response) if callback
168
73
 
169
74
 
170
- # Returns all entries that are in the cache,
171
- # and the ids of all entries that are not cached.
172
- get_many: (ids) ->
173
- entries = []
174
- missing_ids = []
175
- for id in ids
176
- if (entry = @get id)
177
- entries.push entry
178
- else
179
- missing_ids.push id
180
- [entries, missing_ids]
75
+ # Synchronously returns the described entry from the cache,
76
+ # or undefined if there is no cached entry.
77
+ # Does not query the server.
78
+ get: (query) =>
79
+ @entry_store.get query
181
80
 
182
81
 
183
- # Returns the entry with the given key.
184
- load: (key, success_callback) ->
82
+ # Synchronously returns all described entries that are found in the cache,
83
+ # and a MultiQuery for the entries that are not there.
84
+ get_many: (multi_query) ->
85
+ @entry_store.get_many multi_query
185
86
 
186
- # Try to load from cache.
187
- return success_callback(entry) if entry = @get key
188
87
 
189
- # No data on client --> load from server.
190
- @fetch key, success_callback
88
+ # Returns the described entry from any available data source.
89
+ load: (query, callback) ->
90
+ query = @_querify_single query
91
+ if (entry = @get query)
92
+ callback entry
93
+ else
94
+ @server_api.read query, (server_response) =>
95
+ @add_to_cache server_response[@entry_name]
96
+ callback @get(server_response)
191
97
 
192
98
 
193
- # Loads all entries with the given ids.
194
- load_many: (ids, success_callback) ->
195
- [cached_entries, missing_ids] = @get_many ids
196
- if missing_ids.length == 0
99
+ # Loads all described entries from any available data source.
100
+ load_many: (multi_query, callback) ->
101
+ cache_result = @get_many multi_query
102
+ if cache_result.missing.empty()
197
103
  # All requested entries found in cache --> return them immediately.
198
- success_callback(cached_entries)
104
+ callback cache_result.found
199
105
  else
200
- # Entries missing --> load them from the server.
201
- @fetch_many missing_ids, (server_snippets) ->
202
- success_callback $.merge(cached_entries, server_snippets)
106
+ # Some entries were not found in the cache --> load them from the server.
107
+ @server_api.read_many cache_result.missing, (server_response) =>
108
+ @add_many_to_cache server_response[@entries_name]
109
+ $.merge cache_result.found, @get_many(server_response).found
110
+ callback cache_result.found
203
111
 
204
112
 
205
- # Saves the given object.
206
- # Does the right thing (create or update) dependent on
207
- # whether the object already has a key parameter.
208
- save: (obj, success_callback, error_callback) ->
209
- if obj[@key]?
210
- @update obj, success_callback, error_callback
211
- else
212
- @create obj, success_callback, error_callback
213
-
113
+ # Merges the entries described by the given ids
114
+ # into a new entry with the given data.
115
+ merge: (old_entry_ids, new_entry_data, callback) ->
116
+ @server_api.merge old_entry_ids, new_entry_data, (server_response) =>
117
+ @entry_store.delete_many ids: old_entry_ids
118
+ @entry_store.add server_response[@entry_name]
119
+ callback @get(server_response)
214
120
 
215
- # TODO: save_many
216
121
 
217
122
  # Updates the given object.
218
123
  #
219
- # The given object must exist on the server already,
220
- # and have a proper value in the key attribute.
221
- update: (obj, success_callback, error_callback) ->
222
-
223
- # Handle updating several objects.
224
- return @update_many(obj, success_callback, error_callback) if $.type(obj) == 'array'
225
-
226
- # Create a new hash, containing only the changed attributes between obj and it's replica in @server_data.
227
- diff_obj = slender_data.object_diff @server_data.get(obj[@key]), obj
228
- if slender_data.object_length(diff_obj) == 0
229
- success_callback obj if success_callback
230
- return
231
-
232
- # Send to server
233
- data = {}
234
- data[@model_name] = diff_obj
235
- jQuery.ajax
236
- url: @entry_url(obj)
237
- type: 'PUT'
238
- data: data
239
- success: (server_response) =>
240
- @client_entry = @add server_response[@model_name]
241
- success_callback @client_entry if success_callback
242
- error: (xhr) ->
243
- error_callback(xhr.responseText) if error_callback
124
+ # The given object must already exist on the server,
125
+ # and have a proper value in the id attribute.
126
+ update: (entry, callback) ->
127
+ if (changes = @entry_store.entry_changes entry)
128
+ # There are changes --> update the server.
129
+ @server_api.update changes, (server_response) =>
130
+ @entry_store.add server_response[@entry_name]
131
+ callback(server_response) if callback
132
+ else
133
+ # No changes --> call the callback directly.
134
+ callback_data = {}
135
+ callback_data[@entry_name] = entry
136
+ callback(callback_data) if callback
244
137
 
245
138
 
246
139
  # Bulk-updates the given objects.
247
- # All the existing objects must exist on the server already,
248
- # and have a value in the key attribute.
249
- update_many: (objects, success_callback, error_callback) ->
250
-
251
- # Find all objects that have been changed on the client.
252
- diff_objects = @changed_objects_columns objects
253
-
254
- # Send to server
255
- data = {}
256
- data["#{@model_name}s"] = diff_objects
257
- jQuery.ajax
258
- url: @entries_url()
259
- type: 'PUT'
260
- data: data
261
- success: (server_response) =>
262
- server_objects = server_response["#{@model_name}s"]
263
- client_objects = (for server_object in server_objects
264
- @server_data.add server_object
265
- client_object = slender_data.clone_hash server_object
266
- @client_data.add client_object
267
- client_object)
268
- success_callback(client_objects) if success_callback
269
- error: (xhr) ->
270
- error_callback(xhr.responseText) if error_callback
140
+ # All the existing objects must already exist on the server,
141
+ # and have a value in the id attribute.
142
+ update_many: (entries, callback) ->
143
+ if (changes = @entry_store.entries_changes entries).length > 0
144
+ # There are changes --> update the server.
145
+ @server_api.update_many changes, (server_response) =>
146
+ @entry_store.add_many server_response[@entries_name]
147
+ callback(server_response) if callback
148
+ else
149
+ callback_data = {}
150
+ callback_data[@entries_name] = entries
151
+ callback(callback_data) if callback
271
152
 
@@ -0,0 +1,32 @@
1
+ #= require slender_data/parameterizable
2
+
3
+
4
+ # Abstract base class for queries.
5
+ class slender_data.BaseQuery extends slender_data.Parameterizable
6
+
7
+ # query_data: a hash containing the data of the query.
8
+ constructor: (query_data, params) ->
9
+ super params
10
+
11
+ # Whether to return only full entries.
12
+ #
13
+ # If false, partial entries are also permitted as results.
14
+ @full = query_data.full
15
+
16
+ # The query that was given in the constructor.
17
+ @given_query = query_data
18
+
19
+
20
+ # Returns the key used in the given query.
21
+ selector_name: ->
22
+ @_selector_name_result or= Object.keys(@given_query)[0]
23
+
24
+
25
+ # Returns the given selector value.
26
+ selector_value: ->
27
+ @given_query[@selector_name()]
28
+
29
+
30
+ # Returns the hash representation of this query.
31
+ to_hash: ->
32
+ @given_query
@@ -0,0 +1,91 @@
1
+ #= require slender_data/queries/base_query
2
+ #= require slender_data/queries/single_query
3
+
4
+
5
+ # Represents a query for multiple entries at once.
6
+ class slender_data.MultiQuery extends slender_data.BaseQuery
7
+
8
+ constructor: (query, params) ->
9
+ super query, params
10
+
11
+ # Cache for the currently known entry ids of this query.
12
+ # If undefined, this value will be calculated later on demand.
13
+ #
14
+ # Don't use this field directly. Use ids() to access it.
15
+ @_ids_value = undefined
16
+
17
+ # Cache for the currently known entries of this query.
18
+ # If undefined, this value will be calculated later on demand.
19
+ #
20
+ # Don't use this field directly. Use entries() to access it.
21
+ @_entries_value = undefined
22
+
23
+ @_store_multi_query query
24
+
25
+ # Allows to access the entries through their domain name,
26
+ # i.e. @users()
27
+ @[@entries_name] = @entries
28
+
29
+ # Allows to access the entry ids through their domain name,
30
+ # i.e. usernames()
31
+ @[@ids_name] = @ids
32
+
33
+
34
+ # Returns whether this multi-query describes no entries.
35
+ empty: ->
36
+ @ids().length is 0
37
+
38
+
39
+ # Returns the corresponding entries for this query.
40
+ entries: ->
41
+ @_entries_value or throw new Error("Cannot provide #{@entries_name} for a #{@ids_name} query")
42
+
43
+
44
+ # Returns the ids for this query.
45
+ ids: ->
46
+ @_ids_value or= (entry[@id_name] for entry in @entries())
47
+
48
+
49
+ # Creates a new MultiQuery with the same configuration as this one,
50
+ # but the given selector value.
51
+ replicate: (new_selector_value) ->
52
+ replica_query = slender_data.clone_hash @given_query
53
+ replica_query[@selector_name()] = new_selector_value
54
+ new @multi_query_class replica_query, @params
55
+
56
+
57
+ # Converts the given multi-key name into the corresponding single key name.
58
+ single_selector_name: ->
59
+ unless @_single_selector_name_result
60
+ if @selector_name() is @entries_name
61
+ @_single_selector_name_result = @entry_name
62
+ else
63
+ @_single_selector_name_result = @selector_name().substring 0, @selector_name().length-1
64
+ @_single_selector_name_result
65
+
66
+
67
+ # Stores the given data.
68
+ _store_multi_query: (multi_query) ->
69
+ switch @selector_name()
70
+ when 'entries'
71
+ @_entries_value = multi_query.entries
72
+ when @entries_name
73
+ @_entries_value = multi_query[@entries_name]
74
+ when 'ids'
75
+ @_ids_value = multi_query.ids
76
+ when @ids_name
77
+ @_ids_value = multi_query[@ids_name]
78
+ else
79
+ throw new Error("Unknown multi-query key name: #{@selector_name()}")
80
+
81
+
82
+ # Converts the given multi-query into an array of single queries.
83
+ transpose: ->
84
+ result = []
85
+ for selector in @selector_value()
86
+ single_query = {}
87
+ single_query[@single_selector_name()] = selector
88
+ single_query.full = yes if @full
89
+ result.push new @single_query_class(single_query, @params)
90
+ result
91
+