motion-yapper 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (296) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.travis.yml +2 -0
  4. data/Gemfile +1 -0
  5. data/README.md +1 -1
  6. data/Rakefile +1 -1
  7. data/lib/motion-yapper.rb +1 -0
  8. data/lib/yapper.rb +3 -5
  9. data/lib/yapper/config.rb +2 -0
  10. data/lib/yapper/db.rb +105 -40
  11. data/lib/yapper/document.rb +7 -4
  12. data/lib/yapper/document/callbacks.rb +0 -7
  13. data/lib/yapper/document/{persistance.rb → persistence.rb} +27 -21
  14. data/lib/yapper/document/relation.rb +29 -22
  15. data/lib/yapper/document/selection.rb +122 -54
  16. data/lib/yapper/extensions.rb +12 -24
  17. data/lib/yapper/settings.rb +43 -0
  18. data/lib/yapper/timestamps.rb +2 -0
  19. data/lib/yapper/version.rb +1 -1
  20. data/{yapper.gemspec → motion-yapper.gemspec} +0 -0
  21. data/spec/integration/{where_spec.rb → criteria_spec.rb} +78 -10
  22. data/spec/integration/db_spec.rb +70 -0
  23. data/spec/integration/defaults_spec.rb +37 -0
  24. data/spec/integration/extensions_spec.rb +14 -0
  25. data/spec/integration/{persistance_spec.rb → persistence_spec.rb} +0 -0
  26. data/spec/integration/relation_spec.rb +4 -4
  27. data/vendor/Podfile.lock +9 -11
  28. data/vendor/Pods/.build/libPods-CocoaLumberjack.a +0 -0
  29. data/vendor/Pods/.build/libPods-NSData+MD5Digest.a +0 -0
  30. data/vendor/Pods/.build/libPods-YapDatabase.a +0 -0
  31. data/vendor/Pods/.build/libPods.a +0 -0
  32. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDASLLogger.h +4 -4
  33. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDAbstractDatabaseLogger.h +14 -14
  34. data/vendor/Pods/{CocoaLumberjack/Lumberjack/Extensions/ContextFilterLogFormatter.h → BuildHeaders/CocoaLumberjack/DDContextFilterLogFormatter.h} +6 -8
  35. data/vendor/Pods/BuildHeaders/CocoaLumberjack/{DispatchQueueLogFormatter.h → DDDispatchQueueLogFormatter.h} +18 -6
  36. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDFileLogger.h +67 -32
  37. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDLog+LOGV.h +99 -0
  38. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDLog.h +98 -65
  39. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDMultiFormatter.h +30 -0
  40. data/vendor/Pods/BuildHeaders/CocoaLumberjack/DDTTYLogger.h +39 -25
  41. data/vendor/Pods/BuildHeaders/YapDatabase/NSDictionary+YapDatabase.h +8 -0
  42. data/vendor/Pods/BuildHeaders/YapDatabase/YapCache.h +1 -0
  43. data/vendor/Pods/BuildHeaders/YapDatabase/YapCollectionKey.h +3 -0
  44. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabase.h +4 -4
  45. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseConnection.h +21 -19
  46. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseDefaults.h +1 -1
  47. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseExtensionPrivate.h +35 -31
  48. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseFilteredView.h +8 -35
  49. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseFilteredViewPrivate.h +0 -2
  50. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseFilteredViewTransaction.h +17 -17
  51. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseFilteredViewTypes.h +32 -0
  52. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseFullTextSearchPrivate.h +8 -0
  53. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabasePrivate.h +43 -21
  54. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationship.h +35 -0
  55. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipConnection.h +29 -0
  56. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipEdge.h +163 -0
  57. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipEdgePrivate.h +79 -0
  58. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipNode.h +99 -0
  59. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipOptions.h +59 -0
  60. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipPrivate.h +125 -0
  61. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseRelationshipTransaction.h +384 -0
  62. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseSecondaryIndex.h +49 -0
  63. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseSecondaryIndexPrivate.h +10 -0
  64. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseSecondaryIndexSetupPrivate.h +18 -0
  65. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseTransaction.h +131 -21
  66. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseView.h +48 -107
  67. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewChange.h +2 -2
  68. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewConnection.h +1 -0
  69. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewMappings.h +17 -0
  70. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewOptions.h +10 -3
  71. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewPrivate.h +18 -1
  72. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewTransaction.h +75 -24
  73. data/vendor/Pods/BuildHeaders/YapDatabase/YapDatabaseViewTypes.h +99 -0
  74. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDASLLogger.h +4 -4
  75. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDASLLogger.m +51 -50
  76. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDAbstractDatabaseLogger.h +14 -14
  77. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDAbstractDatabaseLogger.m +546 -546
  78. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDFileLogger.h +67 -32
  79. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDFileLogger.m +1093 -907
  80. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDLog+LOGV.h +99 -0
  81. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDLog.h +98 -65
  82. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDLog.m +873 -748
  83. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDTTYLogger.h +39 -25
  84. data/vendor/Pods/CocoaLumberjack/Lumberjack/DDTTYLogger.m +1284 -1243
  85. data/vendor/Pods/{BuildHeaders/CocoaLumberjack/ContextFilterLogFormatter.h → CocoaLumberjack/Lumberjack/Extensions/DDContextFilterLogFormatter.h} +6 -8
  86. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/{ContextFilterLogFormatter.m → DDContextFilterLogFormatter.m} +70 -70
  87. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/{DispatchQueueLogFormatter.h → DDDispatchQueueLogFormatter.h} +18 -6
  88. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/DDDispatchQueueLogFormatter.m +253 -0
  89. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/DDMultiFormatter.h +30 -0
  90. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/DDMultiFormatter.m +127 -0
  91. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/README.txt +1 -1
  92. data/vendor/Pods/CocoaLumberjack/README.markdown +52 -15
  93. data/vendor/Pods/Headers/CocoaLumberjack/DDASLLogger.h +4 -4
  94. data/vendor/Pods/Headers/CocoaLumberjack/DDAbstractDatabaseLogger.h +14 -14
  95. data/vendor/Pods/Headers/CocoaLumberjack/{ContextFilterLogFormatter.h → DDContextFilterLogFormatter.h} +6 -8
  96. data/vendor/Pods/Headers/CocoaLumberjack/{DispatchQueueLogFormatter.h → DDDispatchQueueLogFormatter.h} +18 -6
  97. data/vendor/Pods/Headers/CocoaLumberjack/DDFileLogger.h +67 -32
  98. data/vendor/Pods/Headers/CocoaLumberjack/DDLog+LOGV.h +99 -0
  99. data/vendor/Pods/Headers/CocoaLumberjack/DDLog.h +98 -65
  100. data/vendor/Pods/Headers/CocoaLumberjack/DDMultiFormatter.h +30 -0
  101. data/vendor/Pods/Headers/CocoaLumberjack/DDTTYLogger.h +39 -25
  102. data/vendor/Pods/Headers/YapDatabase/YapCollectionKey.h +3 -0
  103. data/vendor/Pods/Headers/YapDatabase/YapDatabase.h +4 -4
  104. data/vendor/Pods/Headers/YapDatabase/YapDatabaseConnection.h +21 -19
  105. data/vendor/Pods/Headers/YapDatabase/YapDatabaseFilteredView.h +8 -35
  106. data/vendor/Pods/Headers/YapDatabase/YapDatabaseFilteredViewTransaction.h +17 -17
  107. data/vendor/Pods/Headers/YapDatabase/YapDatabaseFilteredViewTypes.h +32 -0
  108. data/vendor/Pods/Headers/YapDatabase/YapDatabaseRelationship.h +35 -0
  109. data/vendor/Pods/Headers/YapDatabase/YapDatabaseRelationshipConnection.h +29 -0
  110. data/vendor/Pods/Headers/YapDatabase/YapDatabaseRelationshipEdge.h +163 -0
  111. data/vendor/Pods/Headers/YapDatabase/YapDatabaseRelationshipNode.h +99 -0
  112. data/vendor/Pods/Headers/YapDatabase/YapDatabaseRelationshipOptions.h +59 -0
  113. data/vendor/Pods/Headers/YapDatabase/YapDatabaseRelationshipTransaction.h +384 -0
  114. data/vendor/Pods/Headers/YapDatabase/YapDatabaseSecondaryIndex.h +49 -0
  115. data/vendor/Pods/Headers/YapDatabase/YapDatabaseTransaction.h +131 -21
  116. data/vendor/Pods/Headers/YapDatabase/YapDatabaseView.h +48 -107
  117. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewChange.h +2 -2
  118. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewConnection.h +1 -0
  119. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewMappings.h +17 -0
  120. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewOptions.h +10 -3
  121. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewTransaction.h +75 -24
  122. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewTypes.h +99 -0
  123. data/vendor/Pods/Headers/____Pods-CocoaLumberjack-prefix.h +2 -0
  124. data/vendor/Pods/Headers/____Pods-environment.h +15 -15
  125. data/vendor/Pods/Manifest.lock +9 -11
  126. data/vendor/Pods/Pods-CocoaLumberjack-Private.xcconfig +1 -1
  127. data/vendor/Pods/Pods-CocoaLumberjack-prefix.pch +2 -0
  128. data/vendor/Pods/Pods-NSData+MD5Digest-Private.xcconfig +1 -1
  129. data/vendor/Pods/Pods-YapDatabase-Private.xcconfig +1 -1
  130. data/vendor/Pods/{Pods-Acknowledgements.markdown → Pods-acknowledgements.markdown} +0 -37
  131. data/vendor/Pods/{Pods-Acknowledgements.plist → Pods-acknowledgements.plist} +0 -45
  132. data/vendor/Pods/Pods-environment.h +15 -15
  133. data/vendor/Pods/Pods.xcconfig +3 -3
  134. data/vendor/Pods/Pods.xcodeproj/project.pbxproj +2426 -3155
  135. data/vendor/Pods/Pods.xcodeproj/xcuserdata/kareemk.xcuserdatad/xcschemes/Pods-CocoaLumberjack.xcscheme +59 -0
  136. data/vendor/Pods/Pods.xcodeproj/xcuserdata/kareemk.xcuserdatad/xcschemes/Pods-NSData+MD5Digest.xcscheme +59 -0
  137. data/vendor/Pods/Pods.xcodeproj/xcuserdata/kareemk.xcuserdatad/xcschemes/Pods-YapDatabase.xcscheme +59 -0
  138. data/vendor/Pods/Pods.xcodeproj/xcuserdata/kareemk.xcuserdatad/xcschemes/Pods.xcscheme +59 -0
  139. data/vendor/Pods/Pods.xcodeproj/xcuserdata/kareemk.xcuserdatad/xcschemes/xcschememanagement.plist +31 -0
  140. data/vendor/Pods/YapDatabase/README.md +3 -1
  141. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FilteredViews/Internal/YapDatabaseFilteredViewPrivate.h +0 -2
  142. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FilteredViews/YapDatabaseFilteredView.h +8 -35
  143. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FilteredViews/YapDatabaseFilteredView.m +25 -41
  144. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FilteredViews/YapDatabaseFilteredViewTransaction.h +17 -17
  145. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FilteredViews/YapDatabaseFilteredViewTransaction.m +403 -134
  146. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FilteredViews/YapDatabaseFilteredViewTypes.h +32 -0
  147. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FullTextSearch/Internal/YapDatabaseFullTextSearchPrivate.h +8 -0
  148. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FullTextSearch/YapDatabaseFullTextSearchConnection.m +8 -8
  149. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/FullTextSearch/YapDatabaseFullTextSearchTransaction.m +113 -62
  150. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Protocol/Internal/YapDatabaseExtensionPrivate.h +35 -31
  151. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Protocol/YapDatabaseExtension.m +25 -0
  152. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Protocol/YapDatabaseExtensionConnection.m +1 -1
  153. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Protocol/YapDatabaseExtensionTransaction.m +25 -1
  154. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/Internal/YapDatabaseRelationshipEdgePrivate.h +79 -0
  155. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/Internal/YapDatabaseRelationshipPrivate.h +125 -0
  156. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationship.h +35 -0
  157. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationship.m +129 -0
  158. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipConnection.h +29 -0
  159. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipConnection.m +802 -0
  160. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipEdge.h +163 -0
  161. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipEdge.m +408 -0
  162. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipNode.h +99 -0
  163. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipOptions.h +59 -0
  164. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipOptions.m +29 -0
  165. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.h +384 -0
  166. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Relationships/YapDatabaseRelationshipTransaction.m +5254 -0
  167. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/Internal/YapDatabaseSecondaryIndexPrivate.h +10 -0
  168. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/Internal/YapDatabaseSecondaryIndexSetupPrivate.h +18 -0
  169. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/YapDatabaseSecondaryIndex.h +49 -0
  170. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/YapDatabaseSecondaryIndex.m +12 -0
  171. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/YapDatabaseSecondaryIndexConnection.m +9 -8
  172. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/YapDatabaseSecondaryIndexSetup.m +62 -1
  173. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/SecondaryIndex/YapDatabaseSecondaryIndexTransaction.m +148 -45
  174. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/Internal/YapDatabaseViewPrivate.h +18 -1
  175. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/Utilities/YapDatabaseViewChange.h +2 -2
  176. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/Utilities/YapDatabaseViewChange.m +15 -9
  177. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/Utilities/YapDatabaseViewMappings.h +17 -0
  178. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/Utilities/YapDatabaseViewMappings.m +211 -64
  179. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseView.h +48 -107
  180. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseView.m +10 -7
  181. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseViewConnection.h +1 -0
  182. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseViewConnection.m +13 -22
  183. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseViewOptions.h +10 -3
  184. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseViewTransaction.h +75 -24
  185. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseViewTransaction.m +725 -244
  186. data/vendor/Pods/YapDatabase/YapDatabase/Extensions/Views/YapDatabaseViewTypes.h +99 -0
  187. data/vendor/Pods/YapDatabase/YapDatabase/Internal/NSDictionary+YapDatabase.h +8 -0
  188. data/vendor/Pods/YapDatabase/YapDatabase/Internal/NSDictionary+YapDatabase.m +19 -0
  189. data/vendor/Pods/YapDatabase/YapDatabase/Internal/YapCache.h +1 -0
  190. data/vendor/Pods/YapDatabase/YapDatabase/Internal/YapCache.m +12 -0
  191. data/vendor/Pods/YapDatabase/YapDatabase/Internal/YapDatabaseDefaults.h +1 -1
  192. data/vendor/Pods/YapDatabase/YapDatabase/Internal/YapDatabaseDefaults.m +3 -3
  193. data/vendor/Pods/YapDatabase/YapDatabase/Internal/YapDatabasePrivate.h +43 -21
  194. data/vendor/Pods/YapDatabase/YapDatabase/Internal/YapNull.m +4 -0
  195. data/vendor/Pods/YapDatabase/YapDatabase/Utilities/YapCollectionKey.h +3 -0
  196. data/vendor/Pods/YapDatabase/YapDatabase/Utilities/YapCollectionKey.m +5 -0
  197. data/vendor/Pods/YapDatabase/YapDatabase/YapDatabase.h +4 -4
  198. data/vendor/Pods/YapDatabase/YapDatabase/YapDatabase.m +84 -93
  199. data/vendor/Pods/YapDatabase/YapDatabase/YapDatabaseConnection.h +21 -19
  200. data/vendor/Pods/YapDatabase/YapDatabase/YapDatabaseConnection.m +381 -209
  201. data/vendor/Pods/YapDatabase/YapDatabase/YapDatabaseTransaction.h +131 -21
  202. data/vendor/Pods/YapDatabase/YapDatabase/YapDatabaseTransaction.m +587 -267
  203. data/vendor/Pods/{Pods.bridgesupport → build-iPhoneSimulator/Pods.bridgesupport} +633 -2557
  204. data/vendor/Pods/build-iPhoneSimulator/libPods.a +0 -0
  205. data/vendor/YapDatabaseRubyMotion/YapDatabaseRubyMotion.bridgesupport +2 -1
  206. data/vendor/YapDatabaseRubyMotion/YapDatabaseRubyMotion.h +2 -1
  207. data/vendor/YapDatabaseRubyMotion/YapDatabaseRubyMotion.m +4 -2
  208. metadata +80 -108
  209. data/Gemfile.lock +0 -63
  210. data/lib/yapper/attachment.rb +0 -48
  211. data/lib/yapper/document/attachment.rb +0 -26
  212. data/lib/yapper/sync.rb +0 -134
  213. data/lib/yapper/sync/data.rb +0 -12
  214. data/lib/yapper/sync/event.rb +0 -194
  215. data/lib/yapper/sync/queue.rb +0 -164
  216. data/spec/integration/all_spec.rb +0 -40
  217. data/spec/integration/sync_spec.rb +0 -42
  218. data/vendor/Pods/AFNetworking/AFNetworking/AFHTTPClient.h +0 -641
  219. data/vendor/Pods/AFNetworking/AFNetworking/AFHTTPClient.m +0 -1396
  220. data/vendor/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h +0 -133
  221. data/vendor/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m +0 -327
  222. data/vendor/Pods/AFNetworking/AFNetworking/AFImageRequestOperation.h +0 -113
  223. data/vendor/Pods/AFNetworking/AFNetworking/AFImageRequestOperation.m +0 -321
  224. data/vendor/Pods/AFNetworking/AFNetworking/AFJSONRequestOperation.h +0 -71
  225. data/vendor/Pods/AFNetworking/AFNetworking/AFJSONRequestOperation.m +0 -150
  226. data/vendor/Pods/AFNetworking/AFNetworking/AFNetworkActivityIndicatorManager.h +0 -75
  227. data/vendor/Pods/AFNetworking/AFNetworking/AFNetworkActivityIndicatorManager.m +0 -157
  228. data/vendor/Pods/AFNetworking/AFNetworking/AFNetworking.h +0 -43
  229. data/vendor/Pods/AFNetworking/AFNetworking/AFPropertyListRequestOperation.h +0 -68
  230. data/vendor/Pods/AFNetworking/AFNetworking/AFPropertyListRequestOperation.m +0 -143
  231. data/vendor/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h +0 -370
  232. data/vendor/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m +0 -848
  233. data/vendor/Pods/AFNetworking/AFNetworking/AFXMLRequestOperation.h +0 -89
  234. data/vendor/Pods/AFNetworking/AFNetworking/AFXMLRequestOperation.m +0 -167
  235. data/vendor/Pods/AFNetworking/AFNetworking/UIImageView+AFNetworking.h +0 -78
  236. data/vendor/Pods/AFNetworking/AFNetworking/UIImageView+AFNetworking.m +0 -191
  237. data/vendor/Pods/AFNetworking/LICENSE +0 -19
  238. data/vendor/Pods/AFNetworking/README.md +0 -208
  239. data/vendor/Pods/BuildHeaders/AFNetworking/AFHTTPClient.h +0 -641
  240. data/vendor/Pods/BuildHeaders/AFNetworking/AFHTTPRequestOperation.h +0 -133
  241. data/vendor/Pods/BuildHeaders/AFNetworking/AFImageRequestOperation.h +0 -113
  242. data/vendor/Pods/BuildHeaders/AFNetworking/AFJSONRequestOperation.h +0 -71
  243. data/vendor/Pods/BuildHeaders/AFNetworking/AFNetworkActivityIndicatorManager.h +0 -75
  244. data/vendor/Pods/BuildHeaders/AFNetworking/AFNetworking.h +0 -43
  245. data/vendor/Pods/BuildHeaders/AFNetworking/AFPropertyListRequestOperation.h +0 -68
  246. data/vendor/Pods/BuildHeaders/AFNetworking/AFURLConnectionOperation.h +0 -370
  247. data/vendor/Pods/BuildHeaders/AFNetworking/AFXMLRequestOperation.h +0 -89
  248. data/vendor/Pods/BuildHeaders/AFNetworking/UIImageView+AFNetworking.h +0 -78
  249. data/vendor/Pods/BuildHeaders/Reachability/Reachability.h +0 -109
  250. data/vendor/Pods/CocoaLumberjack/Lumberjack/Extensions/DispatchQueueLogFormatter.m +0 -251
  251. data/vendor/Pods/Headers/AFNetworking/AFHTTPClient.h +0 -641
  252. data/vendor/Pods/Headers/AFNetworking/AFHTTPRequestOperation.h +0 -133
  253. data/vendor/Pods/Headers/AFNetworking/AFImageRequestOperation.h +0 -113
  254. data/vendor/Pods/Headers/AFNetworking/AFJSONRequestOperation.h +0 -71
  255. data/vendor/Pods/Headers/AFNetworking/AFNetworkActivityIndicatorManager.h +0 -75
  256. data/vendor/Pods/Headers/AFNetworking/AFNetworking.h +0 -43
  257. data/vendor/Pods/Headers/AFNetworking/AFPropertyListRequestOperation.h +0 -68
  258. data/vendor/Pods/Headers/AFNetworking/AFURLConnectionOperation.h +0 -370
  259. data/vendor/Pods/Headers/AFNetworking/AFXMLRequestOperation.h +0 -89
  260. data/vendor/Pods/Headers/AFNetworking/UIImageView+AFNetworking.h +0 -78
  261. data/vendor/Pods/Headers/Reachability/Reachability.h +0 -109
  262. data/vendor/Pods/Headers/YapDatabase/YapCache.h +0 -90
  263. data/vendor/Pods/Headers/YapDatabase/YapDatabaseConnectionState.h +0 -29
  264. data/vendor/Pods/Headers/YapDatabase/YapDatabaseDefaults.h +0 -37
  265. data/vendor/Pods/Headers/YapDatabase/YapDatabaseExtensionPrivate.h +0 -440
  266. data/vendor/Pods/Headers/YapDatabase/YapDatabaseFilteredViewPrivate.h +0 -19
  267. data/vendor/Pods/Headers/YapDatabase/YapDatabaseFullTextSearchPrivate.h +0 -69
  268. data/vendor/Pods/Headers/YapDatabase/YapDatabaseLogging.h +0 -158
  269. data/vendor/Pods/Headers/YapDatabase/YapDatabaseManager.h +0 -17
  270. data/vendor/Pods/Headers/YapDatabase/YapDatabasePrivate.h +0 -424
  271. data/vendor/Pods/Headers/YapDatabase/YapDatabaseSecondaryIndexPrivate.h +0 -73
  272. data/vendor/Pods/Headers/YapDatabase/YapDatabaseStatement.h +0 -13
  273. data/vendor/Pods/Headers/YapDatabase/YapDatabaseString.h +0 -121
  274. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewChangePrivate.h +0 -94
  275. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewMappingsPrivate.h +0 -72
  276. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewPage.h +0 -36
  277. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewPageMetadata.h +0 -27
  278. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewPrivate.h +0 -153
  279. data/vendor/Pods/Headers/YapDatabase/YapDatabaseViewRangeOptionsPrivate.h +0 -17
  280. data/vendor/Pods/Headers/YapDatabase/YapMemoryTable.h +0 -74
  281. data/vendor/Pods/Headers/YapDatabase/YapNull.h +0 -17
  282. data/vendor/Pods/Headers/YapDatabase/YapTouch.h +0 -15
  283. data/vendor/Pods/Headers/____Pods-AFNetworking-prefix.h +0 -17
  284. data/vendor/Pods/Headers/____Pods-Reachability-prefix.h +0 -5
  285. data/vendor/Pods/Pods-AFNetworking-Private.xcconfig +0 -5
  286. data/vendor/Pods/Pods-AFNetworking-dummy.m +0 -5
  287. data/vendor/Pods/Pods-AFNetworking-prefix.pch +0 -17
  288. data/vendor/Pods/Pods-AFNetworking.xcconfig +0 -1
  289. data/vendor/Pods/Pods-Reachability-Private.xcconfig +0 -5
  290. data/vendor/Pods/Pods-Reachability-dummy.m +0 -5
  291. data/vendor/Pods/Pods-Reachability-prefix.pch +0 -5
  292. data/vendor/Pods/Pods-Reachability.xcconfig +0 -1
  293. data/vendor/Pods/Reachability/LICENCE.txt +0 -24
  294. data/vendor/Pods/Reachability/README.md +0 -65
  295. data/vendor/Pods/Reachability/Reachability.h +0 -109
  296. data/vendor/Pods/Reachability/Reachability.m +0 -527
@@ -25,6 +25,10 @@
25
25
  static const int ydbLogLevel = YDB_LOG_LEVEL_WARN;
26
26
  #endif
27
27
 
28
+ #define ExtKey_classVersion @"classVersion"
29
+ #define ExtKey_persistent @"persistent"
30
+ #define ExtKey_version_deprecated @"version"
31
+ #define ExtKey_versionTag @"versionTag"
28
32
 
29
33
  /**
30
34
  * The view is tasked with storing ordered arrays of keys.
@@ -35,6 +39,13 @@
35
39
  **/
36
40
  #define YAP_DATABASE_VIEW_MAX_PAGE_SIZE 50
37
41
 
42
+ /**
43
+ * Declare that this class implements YapDatabaseExtensionTransaction_Hooks protocol.
44
+ * This is done privately, as the protocol is internal.
45
+ **/
46
+ @interface YapDatabaseViewTransaction () <YapDatabaseExtensionTransaction_Hooks>
47
+ @end
48
+
38
49
  /**
39
50
  * ARCHITECTURE OVERVIEW:
40
51
  *
@@ -75,6 +86,8 @@
75
86
  - (id)initWithViewConnection:(YapDatabaseViewConnection *)inViewConnection
76
87
  databaseTransaction:(YapDatabaseReadTransaction *)inDatabaseTransaction
77
88
  {
89
+ YDBLogAutoTrace();
90
+
78
91
  if ((self = [super init]))
79
92
  {
80
93
  viewConnection = inViewConnection;
@@ -104,31 +117,63 @@
104
117
  **/
105
118
  - (BOOL)createIfNeeded
106
119
  {
120
+ YDBLogAutoTrace();
121
+
122
+ int classVersion = YAP_DATABASE_VIEW_CLASS_VERSION;
123
+ BOOL isPersistent = [self isPersistentView];
124
+
125
+ NSString *versionTag = viewConnection->view->versionTag;
126
+
127
+ // Figure out what steps we need to take in order to register the view
128
+
107
129
  BOOL needsCreateTables = NO;
108
130
 
131
+ BOOL oldIsPersistent = NO;
132
+ BOOL hasOldIsPersistent = NO;
133
+
134
+ NSString *oldVersionTag = nil;
135
+
109
136
  // Check classVersion (the internal version number of YapDatabaseView implementation)
110
137
 
111
- int oldClassVersion = [self intValueForExtensionKey:@"classVersion"];
112
- int classVersion = YAP_DATABASE_VIEW_CLASS_VERSION;
138
+ int oldClassVersion = 0;
139
+ BOOL hasOldClassVersion = [self getIntValue:&oldClassVersion forExtensionKey:ExtKey_classVersion];
113
140
 
114
- if (oldClassVersion != classVersion)
141
+ if (!hasOldClassVersion)
142
+ {
143
+ needsCreateTables = YES;
144
+ }
145
+ else if (oldClassVersion != classVersion)
146
+ {
147
+ [self dropTablesForOldClassVersion:oldClassVersion];
115
148
  needsCreateTables = YES;
149
+ }
116
150
 
117
151
  // Check persistence.
118
152
  // Need to properly transition from persistent to non-persistent, and vice-versa.
119
153
 
120
- BOOL oldIsPersistent = NO;
121
- BOOL hasOldIsPersistent = [self getBoolValue:&oldIsPersistent forExtensionKey:@"persistent"];
122
-
123
- BOOL isPersistent = [self isPersistentView];
124
-
125
- if (hasOldIsPersistent && (oldIsPersistent != isPersistent))
154
+ if (!needsCreateTables || hasOldClassVersion)
126
155
  {
127
- [[viewConnection->view class]
128
- dropTablesForRegisteredName:[self registeredName]
129
- withTransaction:(YapDatabaseReadWriteTransaction *)databaseTransaction];
156
+ hasOldIsPersistent = [self getBoolValue:&oldIsPersistent forExtensionKey:ExtKey_persistent];
130
157
 
131
- needsCreateTables = YES;
158
+ if (hasOldIsPersistent && oldIsPersistent && !isPersistent)
159
+ {
160
+ [[viewConnection->view class]
161
+ dropTablesForRegisteredName:[self registeredName]
162
+ withTransaction:(YapDatabaseReadWriteTransaction *)databaseTransaction];
163
+ }
164
+
165
+ if (!hasOldIsPersistent || (oldIsPersistent != isPersistent))
166
+ {
167
+ needsCreateTables = YES;
168
+ }
169
+ else if (!isPersistent)
170
+ {
171
+ // We always have to create & populate the tables for non-persistent views.
172
+ // Even when re-registering from previous app launch.
173
+ needsCreateTables = YES;
174
+
175
+ oldVersionTag = [self stringValueForExtensionKey:ExtKey_versionTag];
176
+ }
132
177
  }
133
178
 
134
179
  // Create or re-populate if needed
@@ -137,36 +182,54 @@
137
182
  {
138
183
  // First time registration
139
184
 
140
- [self dropTablesForOldClassVersion:oldClassVersion];
141
-
142
185
  if (![self createTables]) return NO;
143
186
  if (![self populateView]) return NO;
144
187
 
145
- [self setIntValue:classVersion forExtensionKey:@"classVersion"];
188
+ if (!hasOldClassVersion || (oldClassVersion != classVersion)) {
189
+ [self setIntValue:classVersion forExtensionKey:ExtKey_classVersion];
190
+ }
146
191
 
147
- [self setBoolValue:isPersistent forExtensionKey:@"persistent"];
192
+ if (!hasOldIsPersistent || (oldIsPersistent != isPersistent)) {
193
+ [self setBoolValue:isPersistent forExtensionKey:ExtKey_persistent];
194
+ }
148
195
 
149
- int userSuppliedConfigVersion = viewConnection->view->version;
150
- [self setIntValue:userSuppliedConfigVersion forExtensionKey:@"version"];
196
+ if (![oldVersionTag isEqualToString:versionTag]) {
197
+ [self setStringValue:versionTag forExtensionKey:ExtKey_versionTag];
198
+ }
151
199
  }
152
200
  else
153
201
  {
154
202
  // Check user-supplied config version.
155
203
  // We may need to re-populate the database if the groupingBlock or sortingBlock changed.
156
204
 
157
- int oldVersion = [self intValueForExtensionKey:@"version"];
158
- int newVersion = viewConnection->view->version;
205
+ oldVersionTag = [self stringValueForExtensionKey:ExtKey_versionTag];
159
206
 
160
- if (oldVersion != newVersion)
207
+ BOOL hasOldVersion_deprecated = NO;
208
+ if (oldVersionTag == nil)
161
209
  {
162
- if (![self populateView]) return NO;
210
+ int oldVersion_deprecated = 0;
211
+ hasOldVersion_deprecated = [self getIntValue:&oldVersion_deprecated
212
+ forExtensionKey:ExtKey_version_deprecated];
163
213
 
164
- [self setIntValue:newVersion forExtensionKey:@"version"];
214
+ if (hasOldVersion_deprecated)
215
+ {
216
+ oldVersionTag = [NSString stringWithFormat:@"%d", oldVersion_deprecated];
217
+ }
165
218
  }
166
219
 
167
- if (!hasOldIsPersistent)
220
+ if (![oldVersionTag isEqualToString:versionTag])
221
+ {
222
+ if (![self populateView]) return NO;
223
+
224
+ [self setStringValue:versionTag forExtensionKey:ExtKey_versionTag];
225
+
226
+ if (hasOldVersion_deprecated)
227
+ [self removeValueForExtensionKey:ExtKey_version_deprecated];
228
+ }
229
+ else if (hasOldVersion_deprecated)
168
230
  {
169
- [self setBoolValue:isPersistent forExtensionKey:@"persistent"];
231
+ [self removeValueForExtensionKey:ExtKey_version_deprecated];
232
+ [self setStringValue:versionTag forExtensionKey:ExtKey_versionTag];
170
233
  }
171
234
  }
172
235
 
@@ -184,6 +247,8 @@
184
247
  **/
185
248
  - (BOOL)prepareIfNeeded
186
249
  {
250
+ YDBLogAutoTrace();
251
+
187
252
  if (viewConnection->group_pagesMetadata_dict && viewConnection->pageKey_group_dict)
188
253
  {
189
254
  // Already prepared
@@ -428,6 +493,8 @@
428
493
 
429
494
  - (void)dropTablesForOldClassVersion:(int)oldClassVersion
430
495
  {
496
+ YDBLogAutoTrace();
497
+
431
498
  if (oldClassVersion == 1)
432
499
  {
433
500
  // In version 2, we switched from 'view_name_key' to 'view_name_map'.
@@ -473,6 +540,8 @@
473
540
 
474
541
  - (BOOL)createTables
475
542
  {
543
+ YDBLogAutoTrace();
544
+
476
545
  if ([self isPersistentView])
477
546
  {
478
547
  sqlite3 *db = databaseTransaction->connection->db;
@@ -556,14 +625,19 @@
556
625
 
557
626
  - (BOOL)populateView
558
627
  {
628
+ YDBLogAutoTrace();
629
+
559
630
  // Remove everything from the database
560
631
 
561
632
  [self removeAllRowids];
562
633
 
563
634
  // Initialize ivars
564
635
 
565
- viewConnection->group_pagesMetadata_dict = [[NSMutableDictionary alloc] init];
566
- viewConnection->pageKey_group_dict = [[NSMutableDictionary alloc] init];
636
+ if (viewConnection->group_pagesMetadata_dict == nil)
637
+ viewConnection->group_pagesMetadata_dict = [[NSMutableDictionary alloc] init];
638
+
639
+ if (viewConnection->pageKey_group_dict == nil)
640
+ viewConnection->pageKey_group_dict = [[NSMutableDictionary alloc] init];
567
641
 
568
642
  // Enumerate the existing rows in the database and populate the view
569
643
 
@@ -585,37 +659,47 @@
585
659
  BOOL needsMetadata = groupingNeedsMetadata || sortingNeedsMetadata;
586
660
 
587
661
  NSString *(^getGroup)(NSString *collection, NSString *key, id object, id metadata);
588
- getGroup = ^(NSString *collection, NSString *key, id object, id metadata){
589
-
590
- if (view->groupingBlockType == YapDatabaseViewBlockTypeWithKey)
591
- {
662
+
663
+ if (view->groupingBlockType == YapDatabaseViewBlockTypeWithKey)
664
+ {
665
+ getGroup = ^(NSString *collection, NSString *key, id object, id metadata){
666
+
592
667
  __unsafe_unretained YapDatabaseViewGroupingWithKeyBlock groupingBlock =
593
668
  (YapDatabaseViewGroupingWithKeyBlock)view->groupingBlock;
594
669
 
595
670
  return groupingBlock(collection, key);
596
- }
597
- else if (view->groupingBlockType == YapDatabaseViewBlockTypeWithObject)
598
- {
671
+ };
672
+ }
673
+ else if (view->groupingBlockType == YapDatabaseViewBlockTypeWithObject)
674
+ {
675
+ getGroup = ^(NSString *collection, NSString *key, id object, id metadata){
676
+
599
677
  __unsafe_unretained YapDatabaseViewGroupingWithObjectBlock groupingBlock =
600
678
  (YapDatabaseViewGroupingWithObjectBlock)view->groupingBlock;
601
679
 
602
680
  return groupingBlock(collection, key, object);
603
- }
604
- else if (view->groupingBlockType == YapDatabaseViewBlockTypeWithMetadata)
605
- {
681
+ };
682
+ }
683
+ else if (view->groupingBlockType == YapDatabaseViewBlockTypeWithMetadata)
684
+ {
685
+ getGroup = ^(NSString *collection, NSString *key, id object, id metadata){
686
+
606
687
  __unsafe_unretained YapDatabaseViewGroupingWithMetadataBlock groupingBlock =
607
688
  (YapDatabaseViewGroupingWithMetadataBlock)view->groupingBlock;
608
689
 
609
690
  return groupingBlock(collection, key, metadata);
610
- }
611
- else
612
- {
691
+ };
692
+ }
693
+ else
694
+ {
695
+ getGroup = ^(NSString *collection, NSString *key, id object, id metadata){
696
+
613
697
  __unsafe_unretained YapDatabaseViewGroupingWithRowBlock groupingBlock =
614
698
  (YapDatabaseViewGroupingWithRowBlock)view->groupingBlock;
615
699
 
616
700
  return groupingBlock(collection, key, object, metadata);
617
- }
618
- };
701
+ };
702
+ }
619
703
 
620
704
  int flags = (YapDatabaseViewChangedObject | YapDatabaseViewChangedMetadata);
621
705
 
@@ -861,6 +945,55 @@
861
945
  return YES;
862
946
  }
863
947
 
948
+ - (void)repopulateView
949
+ {
950
+ YDBLogAutoTrace();
951
+
952
+ // Code overview:
953
+ //
954
+ // We could simply run the usual algorithm.
955
+ // That is, enumerate over every item in the database, and run pretty much the same code as
956
+ // in the handleUpdateObject:forCollectionKey:withMetadata:rowid:.
957
+ // However, this causes a potential issue where the sortingBlock will be invoked with items that
958
+ // no longer exist in the given group.
959
+ //
960
+ // Instead we're going to find a way around this.
961
+ // That way the sortingBlock works in a manner we're used to.
962
+ //
963
+ // Here's the algorithm overview:
964
+ //
965
+ // - Insert remove ops for every row & group
966
+ // - Remove all items from the database tables
967
+ // - Flush the group_pagesMetadata_dict (and related ivars)
968
+ // - Set the reset flag (for internal notification creation)
969
+ // - And then run the normal populate routine, with one exceptione handled by the isRepopulate flag.
970
+ //
971
+ // The changeset mechanism will automatically consolidate all changes to the minimum.
972
+
973
+ for (NSString *group in viewConnection->group_pagesMetadata_dict)
974
+ {
975
+ // We must add the changes in reverse order.
976
+ // Either that, or the change index of each item would have to be zero,
977
+ // because a YapDatabaseViewRowChange records the index at the moment the change happens.
978
+
979
+ [self enumerateRowidsInGroup:group
980
+ withOptions:NSEnumerationReverse
981
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
982
+ {
983
+ YapCollectionKey *collectionKey = [databaseTransaction collectionKeyForRowid:rowid];
984
+
985
+ [viewConnection->changes addObject:
986
+ [YapDatabaseViewRowChange deleteKey:collectionKey inGroup:group atIndex:index]];
987
+ }];
988
+
989
+ [viewConnection->changes addObject:[YapDatabaseViewSectionChange deleteGroup:group]];
990
+ }
991
+
992
+ isRepopulate = YES;
993
+ [self populateView];
994
+ isRepopulate = NO;
995
+ }
996
+
864
997
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
865
998
  #pragma mark Accessors
866
999
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1229,7 +1362,7 @@
1229
1362
  // Calculate the offset of the corresponding page within the group.
1230
1363
 
1231
1364
  NSUInteger pageOffset = 0;
1232
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
1365
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
1233
1366
 
1234
1367
  for (YapDatabaseViewPageMetadata *pageMetadata in pagesMetadataForGroup)
1235
1368
  {
@@ -1259,7 +1392,7 @@
1259
1392
 
1260
1393
  - (BOOL)getRowid:(int64_t *)rowidPtr atIndex:(NSUInteger)index inGroup:(NSString *)group
1261
1394
  {
1262
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
1395
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
1263
1396
  NSUInteger pageOffset = 0;
1264
1397
 
1265
1398
  for (YapDatabaseViewPageMetadata *pageMetadata in pagesMetadataForGroup)
@@ -1293,7 +1426,7 @@
1293
1426
  // else
1294
1427
  // return nil;
1295
1428
 
1296
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
1429
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
1297
1430
 
1298
1431
  __block int64_t rowid = 0;
1299
1432
  __block BOOL found = NO;
@@ -1375,7 +1508,7 @@
1375
1508
  // Add change to log
1376
1509
 
1377
1510
  [viewConnection->changes addObject:
1378
- [YapDatabaseViewSectionChange insertGroup:group]];
1511
+ [YapDatabaseViewSectionChange insertGroup:group]];
1379
1512
 
1380
1513
  [viewConnection->changes addObject:
1381
1514
  [YapDatabaseViewRowChange insertKey:collectionKey inGroup:group atIndex:0]];
@@ -1627,62 +1760,54 @@
1627
1760
  __unsafe_unretained YapDatabaseViewSortingWithKeyBlock sortingBlock =
1628
1761
  (YapDatabaseViewSortingWithKeyBlock)view->sortingBlock;
1629
1762
 
1630
- NSString *anotherKey = nil;
1631
- NSString *anotherCollection = nil;
1632
- [databaseTransaction getKey:&anotherKey collection:&anotherCollection forRowid:anotherRowid];
1763
+ YapCollectionKey *another = [databaseTransaction collectionKeyForRowid:anotherRowid];
1633
1764
 
1634
1765
  return sortingBlock(group, collectionKey.collection, collectionKey.key,
1635
- anotherCollection, anotherKey);
1766
+ another.collection, another.key);
1636
1767
  }
1637
1768
  else if (view->sortingBlockType == YapDatabaseViewBlockTypeWithObject)
1638
1769
  {
1639
1770
  __unsafe_unretained YapDatabaseViewSortingWithObjectBlock sortingBlock =
1640
1771
  (YapDatabaseViewSortingWithObjectBlock)view->sortingBlock;
1641
1772
 
1642
- NSString *anotherKey = nil;
1643
- NSString *anotherCollection = nil;
1773
+ YapCollectionKey *another = nil;
1644
1774
  id anotherObject = nil;
1645
- [databaseTransaction getKey:&anotherKey
1646
- collection:&anotherCollection
1647
- object:&anotherObject
1648
- forRowid:anotherRowid];
1775
+ [databaseTransaction getCollectionKey:&another
1776
+ object:&anotherObject
1777
+ forRowid:anotherRowid];
1649
1778
 
1650
1779
  return sortingBlock(group, collectionKey.collection, collectionKey.key, object,
1651
- anotherCollection, anotherKey, anotherObject);
1780
+ another.collection, another.key, anotherObject);
1652
1781
  }
1653
1782
  else if (view->sortingBlockType == YapDatabaseViewBlockTypeWithMetadata)
1654
1783
  {
1655
1784
  __unsafe_unretained YapDatabaseViewSortingWithMetadataBlock sortingBlock =
1656
1785
  (YapDatabaseViewSortingWithMetadataBlock)view->sortingBlock;
1657
1786
 
1658
- NSString *anotherKey = nil;
1659
- NSString *anotherCollection = nil;
1787
+ YapCollectionKey *another = nil;
1660
1788
  id anotherMetadata = nil;
1661
- [databaseTransaction getKey:&anotherKey
1662
- collection:&anotherCollection
1663
- metadata:&anotherMetadata
1664
- forRowid:anotherRowid];
1789
+ [databaseTransaction getCollectionKey:&another
1790
+ metadata:&anotherMetadata
1791
+ forRowid:anotherRowid];
1665
1792
 
1666
1793
  return sortingBlock(group, collectionKey.collection, collectionKey.key, metadata,
1667
- anotherCollection, anotherKey, anotherMetadata);
1794
+ another.collection, another.key, anotherMetadata);
1668
1795
  }
1669
1796
  else
1670
1797
  {
1671
1798
  __unsafe_unretained YapDatabaseViewSortingWithRowBlock sortingBlock =
1672
1799
  (YapDatabaseViewSortingWithRowBlock)view->sortingBlock;
1673
1800
 
1674
- NSString *anotherKey = nil;
1675
- NSString *anotherCollection = nil;
1801
+ YapCollectionKey *another = nil;
1676
1802
  id anotherObject = nil;
1677
1803
  id anotherMetadata = nil;
1678
- [databaseTransaction getKey:&anotherKey
1679
- collection:&anotherCollection
1680
- object:&anotherObject
1681
- metadata:&anotherMetadata
1682
- forRowid:anotherRowid];
1804
+ [databaseTransaction getCollectionKey:&another
1805
+ object:&anotherObject
1806
+ metadata:&anotherMetadata
1807
+ forRowid:anotherRowid];
1683
1808
 
1684
1809
  return sortingBlock(group, collectionKey.collection, collectionKey.key, object, metadata,
1685
- anotherCollection, anotherKey, anotherObject, anotherMetadata);
1810
+ another.collection, another.key, anotherObject, anotherMetadata);
1686
1811
  }
1687
1812
  };
1688
1813
 
@@ -1950,8 +2075,10 @@
1950
2075
 
1951
2076
  // Add change to log
1952
2077
 
2078
+ NSUInteger indexWithinGroup = pageOffset + indexWithinPage;
2079
+
1953
2080
  [viewConnection->changes addObject:
1954
- [YapDatabaseViewRowChange deleteKey:collectionKey inGroup:group atIndex:(pageOffset + indexWithinPage)]];
2081
+ [YapDatabaseViewRowChange deleteKey:collectionKey inGroup:group atIndex:indexWithinGroup]];
1955
2082
 
1956
2083
  [viewConnection->mutatedGroups addObject:group];
1957
2084
 
@@ -2065,7 +2192,7 @@
2065
2192
  numRemoved++;
2066
2193
 
2067
2194
  [viewConnection->changes addObject:
2068
- [YapDatabaseViewRowChange deleteKey:collectionKey inGroup:group atIndex:(pageOffset + i)]];
2195
+ [YapDatabaseViewRowChange deleteKey:collectionKey inGroup:group atIndex:(pageOffset + i)]];
2069
2196
  }
2070
2197
  }
2071
2198
 
@@ -2146,10 +2273,12 @@
2146
2273
  [pageTableTransaction removeAllObjects];
2147
2274
  [pageMetadataTableTransaction removeAllObjects];
2148
2275
  }
2149
-
2276
+
2150
2277
  for (NSString *group in viewConnection->group_pagesMetadata_dict)
2151
2278
  {
2152
- [viewConnection->changes addObject:[YapDatabaseViewSectionChange resetGroup:group]];
2279
+ if (!isRepopulate) {
2280
+ [viewConnection->changes addObject:[YapDatabaseViewSectionChange resetGroup:group]];
2281
+ }
2153
2282
  [viewConnection->mutatedGroups addObject:group];
2154
2283
  }
2155
2284
 
@@ -2429,7 +2558,7 @@
2429
2558
  * Extensions may implement it to perform any "cleanup" before the changeset is requested.
2430
2559
  * Remember, the changeset is requested before the commitTransaction method is invoked.
2431
2560
  **/
2432
- - (void)preCommitReadWriteTransaction
2561
+ - (void)prepareChangeset
2433
2562
  {
2434
2563
  YDBLogAutoTrace();
2435
2564
 
@@ -2514,7 +2643,7 @@
2514
2643
  else
2515
2644
  {
2516
2645
  NSString *group = [self groupForPageKey:pageKey];
2517
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
2646
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
2518
2647
 
2519
2648
  for (YapDatabaseViewPageMetadata *pm in pagesMetadataForGroup)
2520
2649
  {
@@ -2865,8 +2994,8 @@
2865
2994
  if (pageMetadata == nil)
2866
2995
  {
2867
2996
  NSString *group = [self groupForPageKey:pageKey];
2868
- NSMutableArray *pagesMetadataForGroup =
2869
- [viewConnection->group_pagesMetadata_dict objectForKey:group];
2997
+ NSArray *pagesMetadataForGroup =
2998
+ [viewConnection->group_pagesMetadata_dict objectForKey:group];
2870
2999
 
2871
3000
  for (YapDatabaseViewPageMetadata *pm in pagesMetadataForGroup)
2872
3001
  {
@@ -2981,8 +3110,7 @@
2981
3110
  * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
2982
3111
  **/
2983
3112
  - (void)handleInsertObject:(id)object
2984
- forKey:(NSString *)key
2985
- inCollection:(NSString *)collection
3113
+ forCollectionKey:(YapCollectionKey *)collectionKey
2986
3114
  withMetadata:(id)metadata
2987
3115
  rowid:(int64_t)rowid
2988
3116
  {
@@ -2990,6 +3118,9 @@
2990
3118
 
2991
3119
  __unsafe_unretained YapDatabaseView *view = viewConnection->view;
2992
3120
 
3121
+ __unsafe_unretained NSString *collection = collectionKey.collection;
3122
+ __unsafe_unretained NSString *key = collectionKey.key;
3123
+
2993
3124
  // Invoke the grouping block to find out if the object should be included in the view.
2994
3125
 
2995
3126
  NSString *group = nil;
@@ -3036,8 +3167,6 @@
3036
3167
  // Add key to view.
3037
3168
  // This was an insert operation, so we know the key wasn't already in the view.
3038
3169
 
3039
- YapCollectionKey *collectionKey = [[YapCollectionKey alloc] initWithCollection:collection key:key];
3040
-
3041
3170
  int flags = (YapDatabaseViewChangedObject | YapDatabaseViewChangedMetadata);
3042
3171
 
3043
3172
  [self insertRowid:rowid
@@ -3055,18 +3184,17 @@
3055
3184
  * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
3056
3185
  **/
3057
3186
  - (void)handleUpdateObject:(id)object
3058
- forKey:(NSString *)key
3059
- inCollection:(NSString *)collection
3187
+ forCollectionKey:(YapCollectionKey *)collectionKey
3060
3188
  withMetadata:(id)metadata
3061
3189
  rowid:(int64_t)rowid
3062
3190
  {
3063
3191
  YDBLogAutoTrace();
3064
3192
 
3065
- NSParameterAssert(key != nil);
3066
- NSParameterAssert(collection != nil);
3067
-
3068
3193
  __unsafe_unretained YapDatabaseView *view = viewConnection->view;
3069
3194
 
3195
+ __unsafe_unretained NSString *collection = collectionKey.collection;
3196
+ __unsafe_unretained NSString *key = collectionKey.key;
3197
+
3070
3198
  // Invoke the grouping block to find out if the object should be included in the view.
3071
3199
 
3072
3200
  NSString *group = nil;
@@ -3103,8 +3231,6 @@
3103
3231
  group = groupingBlock(collection, key, object, metadata);
3104
3232
  }
3105
3233
  }
3106
-
3107
- YapCollectionKey *collectionKey = [[YapCollectionKey alloc] initWithCollection:collection key:key];
3108
3234
 
3109
3235
  if (group == nil)
3110
3236
  {
@@ -3134,16 +3260,167 @@
3134
3260
  * YapDatabase extension hook.
3135
3261
  * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
3136
3262
  **/
3137
- - (void)handleUpdateMetadata:(id)metadata
3138
- forKey:(NSString *)key
3139
- inCollection:(NSString *)collection
3140
- withRowid:(int64_t)rowid
3263
+ - (void)handleReplaceObject:(id)object forCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid
3141
3264
  {
3142
3265
  YDBLogAutoTrace();
3143
3266
 
3144
3267
  __unsafe_unretained YapDatabaseView *view = viewConnection->view;
3145
3268
 
3146
- YapCollectionKey *collectionKey = [[YapCollectionKey alloc] initWithCollection:collection key:key];
3269
+ __unsafe_unretained NSString *collection = collectionKey.collection;
3270
+ __unsafe_unretained NSString *key = collectionKey.key;
3271
+
3272
+ // Invoke the grouping block to find out if the object should be included in the view.
3273
+
3274
+ id metadata = nil;
3275
+ NSString *group = nil;
3276
+
3277
+ if (view->groupingBlockType == YapDatabaseViewBlockTypeWithKey ||
3278
+ view->groupingBlockType == YapDatabaseViewBlockTypeWithMetadata)
3279
+ {
3280
+ // Grouping is based on the key or metadata.
3281
+ // Neither have changed, and thus the group hasn't changed.
3282
+
3283
+ NSString *pageKey = [self pageKeyForRowid:rowid];
3284
+ group = [self groupForPageKey:pageKey];
3285
+
3286
+ if (group == nil)
3287
+ {
3288
+ // Nothing to do.
3289
+ // The key wasn't previously in the view, and still isn't in the view.
3290
+ lastHandledGroup = group;
3291
+ return;
3292
+ }
3293
+
3294
+ if (view->sortingBlockType == YapDatabaseViewBlockTypeWithKey ||
3295
+ view->sortingBlockType == YapDatabaseViewBlockTypeWithMetadata)
3296
+ {
3297
+ // Nothing has moved because the group hasn't changed and
3298
+ // nothing has changed that relates to sorting.
3299
+
3300
+ int flags = YapDatabaseViewChangedObject;
3301
+ NSUInteger existingIndex = [self indexForRowid:rowid inGroup:group withPageKey:pageKey];
3302
+
3303
+ [viewConnection->changes addObject:
3304
+ [YapDatabaseViewRowChange updateKey:collectionKey changes:flags inGroup:group atIndex:existingIndex]];
3305
+ }
3306
+ else
3307
+ {
3308
+ // Sorting is based on the object, which has changed.
3309
+ // So the sort order may possibly have changed.
3310
+
3311
+ // From previous if statement (above) we know:
3312
+ // sortingBlockType is object or row (object+metadata)
3313
+
3314
+ if (view->sortingBlockType == YapDatabaseViewBlockTypeWithRow)
3315
+ {
3316
+ // Need the metadata for the sorting block
3317
+ metadata = [databaseTransaction metadataForCollectionKey:collectionKey withRowid:rowid];
3318
+ }
3319
+
3320
+ int flags = YapDatabaseViewChangedObject;
3321
+
3322
+ [self insertRowid:rowid
3323
+ collectionKey:collectionKey
3324
+ object:object
3325
+ metadata:metadata
3326
+ inGroup:group withChanges:flags isNew:NO];
3327
+ }
3328
+ }
3329
+ else
3330
+ {
3331
+ // Grouping is based on object or row (object+metadata).
3332
+ // Invoke groupingBlock to see what the new group is.
3333
+
3334
+ NSSet *allowedCollections = view->options.allowedCollections;
3335
+
3336
+ if (!allowedCollections || [allowedCollections containsObject:collection])
3337
+ {
3338
+ if (view->groupingBlockType == YapDatabaseViewBlockTypeWithObject)
3339
+ {
3340
+ __unsafe_unretained YapDatabaseViewGroupingWithObjectBlock groupingBlock =
3341
+ (YapDatabaseViewGroupingWithObjectBlock)view->groupingBlock;
3342
+
3343
+ group = groupingBlock(collection, key, object);
3344
+ }
3345
+ else
3346
+ {
3347
+ __unsafe_unretained YapDatabaseViewGroupingWithRowBlock groupingBlock =
3348
+ (YapDatabaseViewGroupingWithRowBlock)view->groupingBlock;
3349
+
3350
+ metadata = [databaseTransaction metadataForCollectionKey:collectionKey withRowid:rowid];
3351
+ group = groupingBlock(collection, key, object, metadata);
3352
+ }
3353
+ }
3354
+
3355
+ if (group == nil)
3356
+ {
3357
+ // The key is not included in the view.
3358
+ // Remove key from view (if needed).
3359
+
3360
+ [self removeRowid:rowid collectionKey:collectionKey];
3361
+ }
3362
+ else
3363
+ {
3364
+ if (view->sortingBlockType == YapDatabaseViewBlockTypeWithKey ||
3365
+ view->sortingBlockType == YapDatabaseViewBlockTypeWithMetadata)
3366
+ {
3367
+ // Sorting is based on the key or metadata, neither of which has changed.
3368
+ // So if the group hasn't changed, then the sort order hasn't changed.
3369
+
3370
+ NSString *existingPageKey = [self pageKeyForRowid:rowid];
3371
+ NSString *existingGroup = [self groupForPageKey:existingPageKey];
3372
+
3373
+ if ([group isEqualToString:existingGroup])
3374
+ {
3375
+ // Nothing left to do.
3376
+ // The group didn't change, and the sort order cannot change (because the object didn't change).
3377
+
3378
+ int flags = YapDatabaseViewChangedObject;
3379
+ NSUInteger existingIndex = [self indexForRowid:rowid inGroup:group withPageKey:existingPageKey];
3380
+
3381
+ [viewConnection->changes addObject:
3382
+ [YapDatabaseViewRowChange updateKey:collectionKey
3383
+ changes:flags
3384
+ inGroup:group
3385
+ atIndex:existingIndex]];
3386
+
3387
+ lastHandledGroup = group;
3388
+ return;
3389
+ }
3390
+ }
3391
+
3392
+ if (metadata == nil && (view->sortingBlockType == YapDatabaseViewBlockTypeWithMetadata ||
3393
+ view->sortingBlockType == YapDatabaseViewBlockTypeWithRow ))
3394
+ {
3395
+ // Need the metadata for the sorting block
3396
+ metadata = [databaseTransaction metadataForCollectionKey:collectionKey withRowid:rowid];
3397
+ }
3398
+
3399
+ int flags = YapDatabaseViewChangedObject;
3400
+
3401
+ [self insertRowid:rowid
3402
+ collectionKey:collectionKey
3403
+ object:object
3404
+ metadata:metadata
3405
+ inGroup:group withChanges:flags isNew:NO];
3406
+ }
3407
+ }
3408
+
3409
+ lastHandledGroup = group;
3410
+ }
3411
+
3412
+ /**
3413
+ * YapDatabase extension hook.
3414
+ * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
3415
+ **/
3416
+ - (void)handleReplaceMetadata:(id)metadata forCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid
3417
+ {
3418
+ YDBLogAutoTrace();
3419
+
3420
+ __unsafe_unretained YapDatabaseView *view = viewConnection->view;
3421
+
3422
+ __unsafe_unretained NSString *collection = collectionKey.collection;
3423
+ __unsafe_unretained NSString *key = collectionKey.key;
3147
3424
 
3148
3425
  // Invoke the grouping block to find out if the object should be included in the view.
3149
3426
 
@@ -3190,7 +3467,7 @@
3190
3467
  if (view->sortingBlockType == YapDatabaseViewBlockTypeWithRow)
3191
3468
  {
3192
3469
  // Need the object for the sorting block
3193
- object = [databaseTransaction objectForKey:key inCollection:collection withRowid:rowid];
3470
+ object = [databaseTransaction objectForCollectionKey:collectionKey withRowid:rowid];
3194
3471
  }
3195
3472
 
3196
3473
  int flags = YapDatabaseViewChangedMetadata;
@@ -3223,7 +3500,7 @@
3223
3500
  __unsafe_unretained YapDatabaseViewGroupingWithRowBlock groupingBlock =
3224
3501
  (YapDatabaseViewGroupingWithRowBlock)view->groupingBlock;
3225
3502
 
3226
- object = [databaseTransaction objectForKey:key inCollection:collection withRowid:rowid];
3503
+ object = [databaseTransaction objectForCollectionKey:collectionKey withRowid:rowid];
3227
3504
  group = groupingBlock(collection, key, object, metadata);
3228
3505
  }
3229
3506
  }
@@ -3269,7 +3546,7 @@
3269
3546
  view->sortingBlockType == YapDatabaseViewBlockTypeWithRow ))
3270
3547
  {
3271
3548
  // Need the object for the sorting block
3272
- object = [databaseTransaction objectForKey:key inCollection:collection withRowid:rowid];
3549
+ object = [databaseTransaction objectForCollectionKey:collectionKey withRowid:rowid];
3273
3550
  }
3274
3551
 
3275
3552
  int flags = YapDatabaseViewChangedMetadata;
@@ -3289,7 +3566,7 @@
3289
3566
  * YapDatabase extension hook.
3290
3567
  * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
3291
3568
  **/
3292
- - (void)handleTouchObjectForKey:(NSString *)key inCollection:(NSString *)collection withRowid:(int64_t)rowid
3569
+ - (void)handleTouchObjectForCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid
3293
3570
  {
3294
3571
  YDBLogAutoTrace();
3295
3572
 
@@ -3301,7 +3578,6 @@
3301
3578
  NSString *group = [self groupForPageKey:pageKey];
3302
3579
  NSUInteger index = [self indexForRowid:rowid inGroup:group withPageKey:pageKey];
3303
3580
 
3304
- YapCollectionKey *collectionKey = [[YapCollectionKey alloc] initWithCollection:collection key:key];
3305
3581
  int flags = (YapDatabaseViewChangedObject | YapDatabaseViewChangedMetadata);
3306
3582
 
3307
3583
  [viewConnection->changes addObject:
@@ -3313,7 +3589,7 @@
3313
3589
  * YapDatabase extension hook.
3314
3590
  * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
3315
3591
  **/
3316
- - (void)handleTouchMetadataForKey:(NSString *)key inCollection:(NSString *)collection withRowid:(int64_t)rowid
3592
+ - (void)handleTouchMetadataForCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid
3317
3593
  {
3318
3594
  YDBLogAutoTrace();
3319
3595
 
@@ -3332,7 +3608,6 @@
3332
3608
  NSString *group = [self groupForPageKey:pageKey];
3333
3609
  NSUInteger index = [self indexForRowid:rowid inGroup:group withPageKey:pageKey];
3334
3610
 
3335
- YapCollectionKey *collectionKey = [[YapCollectionKey alloc] initWithCollection:collection key:key];
3336
3611
  int flags = YapDatabaseViewChangedMetadata;
3337
3612
 
3338
3613
  [viewConnection->changes addObject:
@@ -3345,15 +3620,10 @@
3345
3620
  * YapDatabase extension hook.
3346
3621
  * This method is invoked by a YapDatabaseReadWriteTransaction as a post-operation-hook.
3347
3622
  **/
3348
- - (void)handleRemoveObjectForKey:(NSString *)key inCollection:(NSString *)collection withRowid:(int64_t)rowid
3623
+ - (void)handleRemoveObjectForCollectionKey:(YapCollectionKey *)collectionKey withRowid:(int64_t)rowid
3349
3624
  {
3350
3625
  YDBLogAutoTrace();
3351
3626
 
3352
- NSParameterAssert(key != nil);
3353
- NSParameterAssert(collection != nil);
3354
-
3355
- YapCollectionKey *collectionKey = [[YapCollectionKey alloc] initWithCollection:collection key:key];
3356
-
3357
3627
  [self removeRowid:rowid collectionKey:collectionKey];
3358
3628
  }
3359
3629
 
@@ -3365,8 +3635,6 @@
3365
3635
  {
3366
3636
  YDBLogAutoTrace();
3367
3637
 
3368
- NSParameterAssert(collection != nil);
3369
-
3370
3638
  NSUInteger count = [keys count];
3371
3639
  NSMutableDictionary *keyMappings = [NSMutableDictionary dictionaryWithCapacity:count];
3372
3640
 
@@ -3479,20 +3747,18 @@
3479
3747
  int64_t rowid = 0;
3480
3748
  if ([self getRowid:&rowid atIndex:index inGroup:group])
3481
3749
  {
3482
- NSString *collection = nil;
3483
- NSString *key = nil;
3484
- BOOL found = [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
3485
-
3486
- if (collectionPtr) *collectionPtr = collection;
3487
- if (keyPtr) *keyPtr = key;
3488
- return found;
3489
- }
3490
- else
3491
- {
3492
- if (collectionPtr) *collectionPtr = nil;
3493
- if (keyPtr) *keyPtr = nil;
3494
- return NO;
3750
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
3751
+ if (ck)
3752
+ {
3753
+ if (collectionPtr) *collectionPtr = ck.collection;
3754
+ if (keyPtr) *keyPtr = ck.key;
3755
+ return YES;
3756
+ }
3495
3757
  }
3758
+
3759
+ if (collectionPtr) *collectionPtr = nil;
3760
+ if (keyPtr) *keyPtr = nil;
3761
+ return NO;
3496
3762
  }
3497
3763
 
3498
3764
  - (BOOL)getFirstKey:(NSString **)keyPtr collection:(NSString **)collectionPtr inGroup:(NSString *)group
@@ -3505,20 +3771,18 @@
3505
3771
  int64_t rowid = 0;
3506
3772
  if ([self getLastRowid:&rowid inGroup:group])
3507
3773
  {
3508
- NSString *collection = nil;
3509
- NSString *key = nil;
3510
- BOOL found = [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
3511
-
3512
- if (collectionPtr) *collectionPtr = collection;
3513
- if (keyPtr) *keyPtr = key;
3514
- return found;
3515
- }
3516
- else
3517
- {
3518
- if (collectionPtr) *collectionPtr = nil;
3519
- if (keyPtr) *keyPtr = nil;
3520
- return NO;
3774
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
3775
+ if (ck)
3776
+ {
3777
+ if (collectionPtr) *collectionPtr = ck.collection;
3778
+ if (keyPtr) *keyPtr = ck.key;
3779
+ return YES;
3780
+ }
3521
3781
  }
3782
+
3783
+ if (collectionPtr) *collectionPtr = nil;
3784
+ if (keyPtr) *keyPtr = nil;
3785
+ return NO;
3522
3786
  }
3523
3787
 
3524
3788
  - (NSString *)collectionAtIndex:(NSUInteger)index inGroup:(NSString *)group
@@ -3591,7 +3855,7 @@
3591
3855
  // Calculate the offset of the corresponding page within the group.
3592
3856
 
3593
3857
  NSUInteger pageOffset = 0;
3594
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3858
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3595
3859
 
3596
3860
  for (YapDatabaseViewPageMetadata *pageMetadata in pagesMetadataForGroup)
3597
3861
  {
@@ -3645,7 +3909,7 @@
3645
3909
  return NSMakeRange(NSNotFound, 0);
3646
3910
  }
3647
3911
 
3648
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3912
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3649
3913
  NSUInteger count = 0;
3650
3914
 
3651
3915
  for (YapDatabaseViewPageMetadata *pageMetadata in pagesMetadataForGroup)
@@ -3683,48 +3947,43 @@
3683
3947
  __unsafe_unretained YapDatabaseViewFindWithKeyBlock findBlock =
3684
3948
  (YapDatabaseViewFindWithKeyBlock)block;
3685
3949
 
3686
- NSString *key = nil;
3687
- NSString *collection = nil;
3688
- [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
3950
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
3689
3951
 
3690
- return findBlock(collection, key);
3952
+ return findBlock(ck.collection, ck.key);
3691
3953
  }
3692
3954
  else if (blockType == YapDatabaseViewBlockTypeWithObject)
3693
3955
  {
3694
3956
  __unsafe_unretained YapDatabaseViewFindWithObjectBlock findBlock =
3695
3957
  (YapDatabaseViewFindWithObjectBlock)block;
3696
3958
 
3697
- NSString *key = nil;
3698
- NSString *collection = nil;
3959
+ YapCollectionKey *ck = nil;
3699
3960
  id object = nil;
3700
- [databaseTransaction getKey:&key collection:&collection object:&object forRowid:rowid];
3961
+ [databaseTransaction getCollectionKey:&ck object:&object forRowid:rowid];
3701
3962
 
3702
- return findBlock(collection, key, object);
3963
+ return findBlock(ck.collection, ck.key, object);
3703
3964
  }
3704
3965
  else if (blockType == YapDatabaseViewBlockTypeWithMetadata)
3705
3966
  {
3706
3967
  __unsafe_unretained YapDatabaseViewFindWithMetadataBlock findBlock =
3707
3968
  (YapDatabaseViewFindWithMetadataBlock)block;
3708
3969
 
3709
- NSString *key = nil;
3710
- NSString *collection = nil;
3970
+ YapCollectionKey *ck = nil;
3711
3971
  id metadata = nil;
3712
- [databaseTransaction getKey:&key collection:&collection metadata:&metadata forRowid:rowid];
3972
+ [databaseTransaction getCollectionKey:&ck metadata:&metadata forRowid:rowid];
3713
3973
 
3714
- return findBlock(collection, key, metadata);
3974
+ return findBlock(ck.collection, ck.key, metadata);
3715
3975
  }
3716
3976
  else
3717
3977
  {
3718
3978
  __unsafe_unretained YapDatabaseViewFindWithRowBlock findBlock =
3719
3979
  (YapDatabaseViewFindWithRowBlock)block;
3720
3980
 
3721
- NSString *key = nil;
3722
- NSString *collection = nil;
3981
+ YapCollectionKey *ck = nil;
3723
3982
  id object = nil;
3724
3983
  id metadata = nil;
3725
- [databaseTransaction getKey:&key collection:&collection object:&object metadata:&metadata forRowid:rowid];
3984
+ [databaseTransaction getCollectionKey:&ck object:&object metadata:&metadata forRowid:rowid];
3726
3985
 
3727
- return findBlock(collection, key, object, metadata);
3986
+ return findBlock(ck.collection, ck.key, object, metadata);
3728
3987
  }
3729
3988
  };
3730
3989
 
@@ -3815,11 +4074,9 @@
3815
4074
 
3816
4075
  [self enumerateRowidsInGroup:group usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
3817
4076
 
3818
- NSString *key = nil;
3819
- NSString *collection = nil;
3820
- [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
4077
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
3821
4078
 
3822
- block(collection, key, index, stop);
4079
+ block(ck.collection, ck.key, index, stop);
3823
4080
  }];
3824
4081
  }
3825
4082
 
@@ -3831,11 +4088,9 @@
3831
4088
 
3832
4089
  [self enumerateRowidsInGroup:group withOptions:options usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
3833
4090
 
3834
- NSString *key = nil;
3835
- NSString *collection = nil;
3836
- [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
4091
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
3837
4092
 
3838
- block(collection, key, index, stop);
4093
+ block(ck.collection, ck.key, index, stop);
3839
4094
  }];
3840
4095
  }
3841
4096
 
@@ -3849,13 +4104,11 @@
3849
4104
  [self enumerateRowidsInGroup:group
3850
4105
  withOptions:options
3851
4106
  range:range
3852
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
3853
-
3854
- NSString *key = nil;
3855
- NSString *collection = nil;
3856
- [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
4107
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4108
+ {
4109
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
3857
4110
 
3858
- block(collection, key, index, stop);
4111
+ block(ck.collection, ck.key, index, stop);
3859
4112
  }];
3860
4113
  }
3861
4114
 
@@ -3873,7 +4126,7 @@
3873
4126
  __block BOOL stop = NO;
3874
4127
 
3875
4128
  NSUInteger pageOffset = 0;
3876
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
4129
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3877
4130
 
3878
4131
  for (YapDatabaseViewPageMetadata *pageMetadata in pagesMetadataForGroup)
3879
4132
  {
@@ -3918,11 +4171,11 @@
3918
4171
  else
3919
4172
  index = [self numberOfKeysInGroup:group] - 1;
3920
4173
 
3921
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
4174
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3922
4175
 
3923
4176
  [pagesMetadataForGroup enumerateObjectsWithOptions:options
3924
- usingBlock:^(id pageMetadataObj, NSUInteger outerIdx, BOOL *outerStop){
3925
-
4177
+ usingBlock:^(id pageMetadataObj, NSUInteger outerIdx, BOOL *outerStop)
4178
+ {
3926
4179
  __unsafe_unretained YapDatabaseViewPageMetadata *pageMetadata =
3927
4180
  (YapDatabaseViewPageMetadata *)pageMetadataObj;
3928
4181
 
@@ -3958,7 +4211,7 @@
3958
4211
 
3959
4212
  NSEnumerationOptions options = (inOptions & NSEnumerationReverse); // We only support NSEnumerationReverse
3960
4213
 
3961
- NSMutableArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
4214
+ NSArray *pagesMetadataForGroup = [viewConnection->group_pagesMetadata_dict objectForKey:group];
3962
4215
 
3963
4216
  // Helper block to fetch the pageOffset for some page.
3964
4217
 
@@ -3985,8 +4238,8 @@
3985
4238
  __block NSUInteger keysLeft = range.length;
3986
4239
 
3987
4240
  [pagesMetadataForGroup enumerateObjectsWithOptions:options
3988
- usingBlock:^(id pageMetadataObj, NSUInteger pageIndex, BOOL *outerStop){
3989
-
4241
+ usingBlock:^(id pageMetadataObj, NSUInteger pageIndex, BOOL *outerStop)
4242
+ {
3990
4243
  __unsafe_unretained YapDatabaseViewPageMetadata *pageMetadata =
3991
4244
  (YapDatabaseViewPageMetadata *)pageMetadataObj;
3992
4245
 
@@ -4201,6 +4454,82 @@
4201
4454
  }
4202
4455
  }
4203
4456
 
4457
+ /**
4458
+ * This method allows you to change the groupingBlock and/or sortingBlock on-the-fly.
4459
+ *
4460
+ * Note: You must pass a different versionTag, or this method does nothing.
4461
+ **/
4462
+ - (void)setGroupingBlock:(YapDatabaseViewGroupingBlock)inGroupingBlock
4463
+ groupingBlockType:(YapDatabaseViewBlockType)inGroupingBlockType
4464
+ sortingBlock:(YapDatabaseViewSortingBlock)inSortingBlock
4465
+ sortingBlockType:(YapDatabaseViewBlockType)inSortingBlockType
4466
+ versionTag:(NSString *)inVersionTag
4467
+ {
4468
+ YDBLogAutoTrace();
4469
+
4470
+ NSAssert(inGroupingBlock != NULL, @"Invalid grouping block");
4471
+ NSAssert(inSortingBlock != NULL, @"Invalid grouping block");
4472
+
4473
+ NSAssert(inGroupingBlockType == YapDatabaseViewBlockTypeWithKey ||
4474
+ inGroupingBlockType == YapDatabaseViewBlockTypeWithObject ||
4475
+ inGroupingBlockType == YapDatabaseViewBlockTypeWithMetadata ||
4476
+ inGroupingBlockType == YapDatabaseViewBlockTypeWithRow,
4477
+ @"Invalid grouping block type");
4478
+
4479
+ NSAssert(inSortingBlockType == YapDatabaseViewBlockTypeWithKey ||
4480
+ inSortingBlockType == YapDatabaseViewBlockTypeWithObject ||
4481
+ inSortingBlockType == YapDatabaseViewBlockTypeWithMetadata ||
4482
+ inSortingBlockType == YapDatabaseViewBlockTypeWithRow,
4483
+ @"Invalid sorting block type");
4484
+
4485
+ if (!databaseTransaction->isReadWriteTransaction)
4486
+ {
4487
+ YDBLogWarn(@"%@ - Method only allowed in readWrite transaction", THIS_METHOD);
4488
+ return;
4489
+ }
4490
+
4491
+ NSString *newVersionTag = inVersionTag ? [inVersionTag copy] : @"";
4492
+
4493
+ __unsafe_unretained YapDatabaseView *view = viewConnection->view;
4494
+
4495
+ if ([view->versionTag isEqualToString:newVersionTag])
4496
+ {
4497
+ YDBLogWarn(@"%@ - versionTag didn't change, so not updating view", THIS_METHOD);
4498
+ return;
4499
+ }
4500
+
4501
+ view->groupingBlock = inGroupingBlock;
4502
+ view->groupingBlockType = inGroupingBlockType;
4503
+ view->sortingBlock = inSortingBlock;
4504
+ view->sortingBlockType = inSortingBlockType;
4505
+
4506
+ view->versionTag = newVersionTag;
4507
+
4508
+ [self repopulateView];
4509
+ [self setStringValue:newVersionTag forExtensionKey:ExtKey_versionTag];
4510
+
4511
+ // Notify any extensions dependent upon this one that we repopulated.
4512
+
4513
+ NSString *registeredName = [self registeredName];
4514
+ NSDictionary *extensionDependencies = databaseTransaction->connection->extensionDependencies;
4515
+
4516
+ [extensionDependencies enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
4517
+
4518
+ __unsafe_unretained NSString *extName = (NSString *)key;
4519
+ __unsafe_unretained NSSet *extDependencies = (NSSet *)obj;
4520
+
4521
+ if ([extDependencies containsObject:registeredName])
4522
+ {
4523
+ YapDatabaseExtensionTransaction *extTransaction = [databaseTransaction ext:extName];
4524
+
4525
+ if ([extTransaction respondsToSelector:@selector(viewDidRepopulate:)])
4526
+ {
4527
+ [(id <YapDatabaseViewDependency>)extTransaction viewDidRepopulate:registeredName];
4528
+ }
4529
+ }
4530
+ }];
4531
+ }
4532
+
4204
4533
  @end
4205
4534
 
4206
4535
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -4219,11 +4548,9 @@
4219
4548
  // So it's likely faster to fetch just the key first.
4220
4549
  // And if the cache misses then we're still using a fetch based on the rowid.
4221
4550
 
4222
- NSString *key = nil;
4223
- NSString *collection = nil;
4224
- [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
4551
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
4225
4552
 
4226
- return [databaseTransaction objectForKey:key inCollection:collection withRowid:rowid];
4553
+ return [databaseTransaction objectForCollectionKey:ck withRowid:rowid];
4227
4554
  }
4228
4555
  else
4229
4556
  {
@@ -4247,11 +4574,9 @@
4247
4574
  // So it's likely faster to fetch just the key first.
4248
4575
  // And if the cache misses then we're still using a fetch based on the rowid.
4249
4576
 
4250
- NSString *key = nil;
4251
- NSString *collection = nil;
4252
- [databaseTransaction getKey:&key collection:&collection forRowid:rowid];
4577
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
4253
4578
 
4254
- return [databaseTransaction objectForKey:key inCollection:collection withRowid:rowid];
4579
+ return [databaseTransaction objectForCollectionKey:ck withRowid:rowid];
4255
4580
  }
4256
4581
  else
4257
4582
  {
@@ -4272,12 +4597,11 @@
4272
4597
 
4273
4598
  [self enumerateRowidsInGroup:group usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4274
4599
 
4275
- NSString *key = nil;
4276
- NSString *collection = nil;
4600
+ YapCollectionKey *ck = nil;
4277
4601
  id metadata = nil;
4278
- [databaseTransaction getKey:&key collection:&collection metadata:&metadata forRowid:rowid];
4602
+ [databaseTransaction getCollectionKey:&ck metadata:&metadata forRowid:rowid];
4279
4603
 
4280
- block(collection, key, metadata, index, stop);
4604
+ block(ck.collection, ck.key, metadata, index, stop);
4281
4605
  }];
4282
4606
  }
4283
4607
 
@@ -4290,14 +4614,13 @@
4290
4614
 
4291
4615
  [self enumerateRowidsInGroup:group
4292
4616
  withOptions:options
4293
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4294
-
4295
- NSString *key = nil;
4296
- NSString *collection = nil;
4617
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4618
+ {
4619
+ YapCollectionKey *ck = nil;
4297
4620
  id metadata = nil;
4298
- [databaseTransaction getKey:&key collection:&collection metadata:&metadata forRowid:rowid];
4621
+ [databaseTransaction getCollectionKey:&ck metadata:&metadata forRowid:rowid];
4299
4622
 
4300
- block(collection, key, metadata, index, stop);
4623
+ block(ck.collection, ck.key, metadata, index, stop);
4301
4624
  }];
4302
4625
  }
4303
4626
 
@@ -4312,14 +4635,13 @@
4312
4635
  [self enumerateRowidsInGroup:group
4313
4636
  withOptions:options
4314
4637
  range:range
4315
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4316
-
4317
- NSString *key = nil;
4318
- NSString *collection = nil;
4638
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4639
+ {
4640
+ YapCollectionKey *ck = nil;
4319
4641
  id metadata = nil;
4320
- [databaseTransaction getKey:&key collection:&collection metadata:&metadata forRowid:rowid];
4642
+ [databaseTransaction getCollectionKey:&ck metadata:&metadata forRowid:rowid];
4321
4643
 
4322
- block(collection, key, metadata, index, stop);
4644
+ block(ck.collection, ck.key, metadata, index, stop);
4323
4645
  }];
4324
4646
  }
4325
4647
 
@@ -4336,12 +4658,11 @@
4336
4658
 
4337
4659
  [self enumerateRowidsInGroup:group usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4338
4660
 
4339
- NSString *key = nil;
4340
- NSString *collection = nil;
4661
+ YapCollectionKey *ck = nil;
4341
4662
  id object = nil;
4342
- [databaseTransaction getKey:&key collection:&collection object:&object forRowid:rowid];
4663
+ [databaseTransaction getCollectionKey:&ck object:&object forRowid:rowid];
4343
4664
 
4344
- block(collection, key, object, index, stop);
4665
+ block(ck.collection, ck.key, object, index, stop);
4345
4666
  }];
4346
4667
  }
4347
4668
 
@@ -4354,14 +4675,13 @@
4354
4675
 
4355
4676
  [self enumerateRowidsInGroup:group
4356
4677
  withOptions:options
4357
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4358
-
4359
- NSString *key = nil;
4360
- NSString *collection = nil;
4678
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4679
+ {
4680
+ YapCollectionKey *ck = nil;
4361
4681
  id object = nil;
4362
- [databaseTransaction getKey:&key collection:&collection object:&object forRowid:rowid];
4682
+ [databaseTransaction getCollectionKey:&ck object:&object forRowid:rowid];
4363
4683
 
4364
- block(collection, key, object, index, stop);
4684
+ block(ck.collection, ck.key, object, index, stop);
4365
4685
  }];
4366
4686
  }
4367
4687
 
@@ -4376,14 +4696,13 @@
4376
4696
  [self enumerateRowidsInGroup:group
4377
4697
  withOptions:options
4378
4698
  range:range
4379
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4380
-
4381
- NSString *key = nil;
4382
- NSString *collection = nil;
4699
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4700
+ {
4701
+ YapCollectionKey *ck = nil;
4383
4702
  id object = nil;
4384
- [databaseTransaction getKey:&key collection:&collection object:&object forRowid:rowid];
4703
+ [databaseTransaction getCollectionKey:&ck object:&object forRowid:rowid];
4385
4704
 
4386
- block(collection, key, object, index, stop);
4705
+ block(ck.collection, ck.key, object, index, stop);
4387
4706
  }];
4388
4707
  }
4389
4708
 
@@ -4395,13 +4714,12 @@
4395
4714
 
4396
4715
  [self enumerateRowidsInGroup:group usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4397
4716
 
4398
- NSString *key = nil;
4399
- NSString *collection = nil;
4717
+ YapCollectionKey *ck = nil;
4400
4718
  id object = nil;
4401
4719
  id metadata = nil;
4402
- [databaseTransaction getKey:&key collection:&collection object:&object metadata:&metadata forRowid:rowid];
4720
+ [databaseTransaction getCollectionKey:&ck object:&object metadata:&metadata forRowid:rowid];
4403
4721
 
4404
- block(collection, key, object, metadata, index, stop);
4722
+ block(ck.collection, ck.key, object, metadata, index, stop);
4405
4723
  }];
4406
4724
  }
4407
4725
 
@@ -4414,15 +4732,14 @@
4414
4732
 
4415
4733
  [self enumerateRowidsInGroup:group
4416
4734
  withOptions:options
4417
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4418
-
4419
- NSString *key = nil;
4420
- NSString *collection = nil;
4735
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4736
+ {
4737
+ YapCollectionKey *ck = nil;
4421
4738
  id object = nil;
4422
4739
  id metadata = nil;
4423
- [databaseTransaction getKey:&key collection:&collection object:&object metadata:&metadata forRowid:rowid];
4424
-
4425
- block(collection, key, object, metadata, index, stop);
4740
+ [databaseTransaction getCollectionKey:&ck object:&object metadata:&metadata forRowid:rowid];
4741
+
4742
+ block(ck.collection, ck.key, object, metadata, index, stop);
4426
4743
  }];
4427
4744
  }
4428
4745
 
@@ -4437,15 +4754,14 @@
4437
4754
  [self enumerateRowidsInGroup:group
4438
4755
  withOptions:options
4439
4756
  range:range
4440
- usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop) {
4441
-
4442
- NSString *key = nil;
4443
- NSString *collection = nil;
4757
+ usingBlock:^(int64_t rowid, NSUInteger index, BOOL *stop)
4758
+ {
4759
+ YapCollectionKey *ck = nil;
4444
4760
  id object = nil;
4445
4761
  id metadata = nil;
4446
- [databaseTransaction getKey:&key collection:&collection object:&object metadata:&metadata forRowid:rowid];
4762
+ [databaseTransaction getCollectionKey:&ck object:&object metadata:&metadata forRowid:rowid];
4447
4763
 
4448
- block(collection, key, object, metadata, index, stop);
4764
+ block(ck.collection, ck.key, object, metadata, index, stop);
4449
4765
  }];
4450
4766
  }
4451
4767
 
@@ -4457,6 +4773,43 @@
4457
4773
 
4458
4774
  @implementation YapDatabaseViewTransaction (Mappings)
4459
4775
 
4776
+ /**
4777
+ * Performance boost.
4778
+ * If the object isn't in the cache, having the rowid makes for a faster fetch from sqlite.
4779
+ **/
4780
+ - (BOOL)getRowid:(int64_t *)rowidPtr
4781
+ collectionKey:(YapCollectionKey **)collectionKeyPtr
4782
+ forRow:(NSUInteger)row
4783
+ inSection:(NSUInteger)section
4784
+ withMappings:(YapDatabaseViewMappings *)mappings
4785
+ {
4786
+ if (mappings)
4787
+ {
4788
+ NSString *group = nil;
4789
+ NSUInteger index = 0;
4790
+
4791
+ if ([mappings getGroup:&group index:&index forRow:row inSection:section])
4792
+ {
4793
+ int64_t rowid = 0;
4794
+ if ([self getRowid:&rowid atIndex:index inGroup:group])
4795
+ {
4796
+ if (collectionKeyPtr)
4797
+ {
4798
+ YapCollectionKey *ck = [databaseTransaction collectionKeyForRowid:rowid];
4799
+ *collectionKeyPtr = ck;
4800
+ }
4801
+
4802
+ if (rowidPtr) *rowidPtr = rowid;
4803
+ return YES;
4804
+ }
4805
+ }
4806
+ }
4807
+
4808
+ if (rowidPtr) *rowidPtr = 0;
4809
+ if (collectionKeyPtr) *collectionKeyPtr = nil;
4810
+ return NO;
4811
+ }
4812
+
4460
4813
  /**
4461
4814
  * Gets the key & collection at the given indexPath, assuming the given mappings are being used.
4462
4815
  * Returns NO if the indexPath is invalid, or the mappings aren't initialized.
@@ -4467,20 +4820,124 @@
4467
4820
  atIndexPath:(NSIndexPath *)indexPath
4468
4821
  withMappings:(YapDatabaseViewMappings *)mappings
4469
4822
  {
4470
- if (indexPath && mappings)
4823
+ if (indexPath == nil)
4471
4824
  {
4472
- NSString *group = nil;
4473
- NSUInteger index = 0;
4825
+ if (keyPtr) *keyPtr = nil;
4826
+ if (collectionPtr) *collectionPtr = nil;
4474
4827
 
4475
- if ([mappings getGroup:&group index:&index forIndexPath:indexPath])
4476
- {
4477
- return [self getKey:keyPtr collection:collectionPtr atIndex:index inGroup:group];
4478
- }
4828
+ return NO;
4479
4829
  }
4480
4830
 
4481
- if (keyPtr) *keyPtr = nil;
4482
- if (collectionPtr) *collectionPtr = nil;
4483
- return NO;
4831
+ #if TARGET_OS_IPHONE
4832
+ NSUInteger section = indexPath.section;
4833
+ NSUInteger row = indexPath.row;
4834
+ #else
4835
+ NSUInteger section = [indexPath indexAtPosition:0];
4836
+ NSUInteger row = [indexPath indexAtPosition:1];
4837
+ #endif
4838
+
4839
+ YapCollectionKey *ck = nil;
4840
+ BOOL result = [self getRowid:NULL
4841
+ collectionKey:&ck
4842
+ forRow:row
4843
+ inSection:section
4844
+ withMappings:mappings];
4845
+
4846
+ if (keyPtr) *keyPtr = ck.key;
4847
+ if (collectionPtr) *collectionPtr = ck.collection;
4848
+
4849
+ return result;
4850
+ }
4851
+
4852
+ /**
4853
+ * Gets the key & collection at the given row & section, assuming the given mappings are being used.
4854
+ * Returns NO if the row or section is invalid, or the mappings aren't initialized.
4855
+ * Otherwise returns YES, and sets the key & collection ptr (both optional).
4856
+ **/
4857
+ - (BOOL)getKey:(NSString **)keyPtr
4858
+ collection:(NSString **)collectionPtr
4859
+ forRow:(NSUInteger)row
4860
+ inSection:(NSUInteger)section
4861
+ withMappings:(YapDatabaseViewMappings *)mappings
4862
+ {
4863
+ YapCollectionKey *ck = nil;
4864
+ BOOL result = [self getRowid:NULL
4865
+ collectionKey:&ck
4866
+ forRow:row
4867
+ inSection:section
4868
+ withMappings:mappings];
4869
+
4870
+ if (keyPtr) *keyPtr = ck.key;
4871
+ if (collectionPtr) *collectionPtr = ck.collection;
4872
+
4873
+ return result;
4874
+ }
4875
+
4876
+ /**
4877
+ * Gets the object at the given indexPath, assuming the given mappings are being used.
4878
+ *
4879
+ * Equivalent to invoking:
4880
+ *
4881
+ * NSString *collection, *key;
4882
+ * if ([[transaction ext:@"myView"] getKey:&key collection:&collection atIndexPath:indexPath withMappings:mappings]) {
4883
+ * object = [transaction objectForKey:key inCollection:collection];
4884
+ * }
4885
+ **/
4886
+ - (id)objectAtIndexPath:(NSIndexPath *)indexPath withMappings:(YapDatabaseViewMappings *)mappings
4887
+ {
4888
+ if (indexPath == nil)
4889
+ {
4890
+ return nil;
4891
+ }
4892
+
4893
+ #if TARGET_OS_IPHONE
4894
+ NSUInteger section = indexPath.section;
4895
+ NSUInteger row = indexPath.row;
4896
+ #else
4897
+ NSUInteger section = [indexPath indexAtPosition:0];
4898
+ NSUInteger row = [indexPath indexAtPosition:1];
4899
+ #endif
4900
+
4901
+ id object = nil;
4902
+
4903
+ int64_t rowid = 0;
4904
+ YapCollectionKey *ck = nil;
4905
+
4906
+ if ([self getRowid:&rowid collectionKey:&ck forRow:row inSection:section withMappings:mappings])
4907
+ {
4908
+ object = [databaseTransaction objectForCollectionKey:ck withRowid:rowid];
4909
+ }
4910
+
4911
+ return object;
4912
+ }
4913
+
4914
+ /**
4915
+ * Gets the object at the given indexPath, assuming the given mappings are being used.
4916
+ *
4917
+ * Equivalent to invoking:
4918
+ *
4919
+ * NSString *collection, *key;
4920
+ * if ([[transaction ext:@"view"] getKey:&key
4921
+ * collection:&collection
4922
+ * forRow:row
4923
+ * inSection:section
4924
+ * withMappings:mappings]) {
4925
+ * object = [transaction objectForKey:key inCollection:collection];
4926
+ * }
4927
+ **/
4928
+ - (id)objectAtRow:(NSUInteger)row inSection:(NSUInteger)section withMappings:(YapDatabaseViewMappings *)mappings
4929
+ {
4930
+ id object = nil;
4931
+
4932
+ int64_t rowid = 0;
4933
+ YapCollectionKey *ck = nil;
4934
+
4935
+ if ([self getRowid:&rowid collectionKey:&ck forRow:row inSection:section withMappings:mappings])
4936
+ {
4937
+ object = [databaseTransaction objectForCollectionKey:ck withRowid:rowid];
4938
+ }
4939
+
4940
+ return object;
4484
4941
  }
4485
4942
 
4486
4943
  /**
@@ -4502,4 +4959,28 @@
4502
4959
  return nil;
4503
4960
  }
4504
4961
 
4962
+ /**
4963
+ * Fetches the row & section for the given {collection, key} tuple, assuming the given mappings are being used.
4964
+ * Returns NO if the {collection, key} tuple isn't included in the view + mappings.
4965
+ * Otherwise returns YES, and sets the row & section (both optional).
4966
+ **/
4967
+ - (BOOL)getRow:(NSUInteger *)rowPtr
4968
+ section:(NSUInteger *)sectionPtr
4969
+ forKey:(NSString *)key
4970
+ inCollection:(NSString *)collection
4971
+ withMappings:(YapDatabaseViewMappings *)mappings
4972
+ {
4973
+ NSString *group = nil;
4974
+ NSUInteger index = 0;
4975
+
4976
+ if ([self getGroup:&group index:&index forKey:key inCollection:collection])
4977
+ {
4978
+ return [mappings getRow:rowPtr section:sectionPtr forIndex:index inGroup:group];
4979
+ }
4980
+
4981
+ if (rowPtr) *rowPtr = 0;
4982
+ if (sectionPtr) *sectionPtr = 0;
4983
+ return NO;
4984
+ }
4985
+
4505
4986
  @end