strokedb 0.0.2.1 → 0.0.2.2

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 (192) hide show
  1. data/README +18 -20
  2. data/bench.html +4001 -0
  3. data/bin/strokedb +14 -0
  4. data/examples/movies.rb +105 -0
  5. data/examples/movies2.rb +97 -0
  6. data/examples/strokewiki/README +28 -0
  7. data/examples/strokewiki/view/edit.xhtml +27 -0
  8. data/examples/strokewiki/view/new.xhtml +26 -0
  9. data/examples/strokewiki/view/pages.xhtml +27 -0
  10. data/examples/strokewiki/view/show.xhtml +40 -0
  11. data/examples/strokewiki/view/versions.xhtml +25 -0
  12. data/examples/strokewiki/wiki.rb +106 -0
  13. data/examples/todo.rb +92 -0
  14. data/lib/strokedb.rb +85 -0
  15. data/lib/{config → strokedb}/config.rb +14 -9
  16. data/lib/strokedb/console.rb +87 -0
  17. data/lib/strokedb/core_ext.rb +10 -0
  18. data/lib/{util/ext → strokedb/core_ext}/blank.rb +1 -1
  19. data/lib/{util/ext → strokedb/core_ext}/enumerable.rb +0 -0
  20. data/lib/{util/ext → strokedb/core_ext}/fixnum.rb +0 -0
  21. data/lib/strokedb/core_ext/float.rb +4 -0
  22. data/lib/{util/ext → strokedb/core_ext}/hash.rb +0 -0
  23. data/lib/strokedb/core_ext/infinity.rb +33 -0
  24. data/lib/strokedb/core_ext/kernel.rb +41 -0
  25. data/lib/strokedb/core_ext/object.rb +16 -0
  26. data/lib/{util/ext → strokedb/core_ext}/string.rb +28 -1
  27. data/lib/strokedb/core_ext/symbol.rb +13 -0
  28. data/lib/strokedb/data_structures.rb +5 -0
  29. data/lib/strokedb/data_structures/chunked_skiplist.rb +123 -0
  30. data/lib/{data_structures → strokedb/data_structures}/inverted_list.rb +0 -0
  31. data/lib/{data_structures → strokedb/data_structures}/point_query.rb +0 -0
  32. data/lib/strokedb/data_structures/simple_skiplist.rb +350 -0
  33. data/lib/{data_structures → strokedb/data_structures}/skiplist.rb +1 -1
  34. data/lib/{document → strokedb}/document.rb +180 -71
  35. data/lib/{document → strokedb/document}/callback.rb +0 -0
  36. data/lib/{document → strokedb/document}/delete.rb +2 -2
  37. data/lib/strokedb/document/dsl.rb +4 -0
  38. data/lib/{document → strokedb/document/dsl}/associations.rb +0 -0
  39. data/lib/{document → strokedb/document/dsl}/coercions.rb +0 -0
  40. data/lib/strokedb/document/dsl/meta_dsl.rb +7 -0
  41. data/lib/{document → strokedb/document/dsl}/validations.rb +26 -21
  42. data/lib/{document → strokedb/document/dsl}/virtualize.rb +0 -0
  43. data/lib/{document → strokedb/document}/meta.rb +92 -29
  44. data/lib/{document → strokedb/document}/slot.rb +17 -5
  45. data/lib/{document → strokedb/document}/util.rb +0 -0
  46. data/lib/{document → strokedb/document}/versions.rb +2 -2
  47. data/lib/strokedb/index.rb +2 -0
  48. data/lib/strokedb/nsurl.rb +24 -0
  49. data/lib/strokedb/store.rb +149 -0
  50. data/lib/strokedb/stores.rb +6 -0
  51. data/lib/{stores → strokedb/stores}/chainable_storage.rb +20 -14
  52. data/lib/strokedb/stores/file_storage.rb +118 -0
  53. data/lib/{stores/inverted_list_index → strokedb/stores}/inverted_list_file_storage.rb +50 -0
  54. data/lib/strokedb/stores/memory_storage.rb +80 -0
  55. data/lib/{stores → strokedb/stores}/remote_store.rb +10 -4
  56. data/lib/strokedb/sync.rb +4 -0
  57. data/lib/{sync → strokedb/sync}/chain_sync.rb +0 -0
  58. data/lib/{sync → strokedb/sync}/diff.rb +12 -1
  59. data/lib/{sync/stroke_diff → strokedb/sync/diff}/array.rb +1 -1
  60. data/lib/{sync/stroke_diff → strokedb/sync/diff}/default.rb +0 -0
  61. data/lib/{sync/stroke_diff → strokedb/sync/diff}/hash.rb +1 -1
  62. data/lib/{sync/stroke_diff → strokedb/sync/diff}/string.rb +1 -1
  63. data/lib/{sync → strokedb/sync}/lamport_timestamp.rb +0 -0
  64. data/lib/{sync → strokedb/sync}/store_sync.rb +15 -7
  65. data/lib/strokedb/transaction.rb +78 -0
  66. data/lib/{util → strokedb}/util.rb +14 -7
  67. data/lib/strokedb/util/attach_dsl.rb +29 -0
  68. data/lib/{util → strokedb/util}/blankslate.rb +0 -0
  69. data/lib/strokedb/util/class_optimization.rb +93 -0
  70. data/lib/{util → strokedb/util}/inflect.rb +0 -0
  71. data/lib/strokedb/util/java_util.rb +13 -0
  72. data/lib/{util → strokedb/util}/lazy_array.rb +0 -0
  73. data/lib/{util → strokedb/util}/lazy_mapping_array.rb +4 -0
  74. data/lib/{util → strokedb/util}/lazy_mapping_hash.rb +0 -0
  75. data/lib/{util → strokedb/util}/serialization.rb +21 -0
  76. data/lib/strokedb/util/uuid.rb +159 -0
  77. data/lib/{util → strokedb/util}/xml.rb +0 -0
  78. data/lib/{view → strokedb}/view.rb +2 -2
  79. data/lib/strokedb/volumes.rb +5 -0
  80. data/lib/strokedb/volumes/archive_volume.rb +165 -0
  81. data/lib/strokedb/volumes/block_volume.rb +169 -0
  82. data/lib/strokedb/volumes/distributed_pointer.rb +43 -0
  83. data/lib/strokedb/volumes/fixed_length_skiplist_volume.rb +109 -0
  84. data/lib/strokedb/volumes/map_volume.rb +268 -0
  85. data/meta/MANIFEST +175 -0
  86. data/script/console +2 -70
  87. data/spec/integration/remote_store_spec.rb +70 -0
  88. data/spec/integration/search_spec.rb +76 -0
  89. data/spec/integration/spec_helper.rb +1 -0
  90. data/spec/lib/spec_helper.rb +1 -0
  91. data/spec/lib/strokedb/config_spec.rb +250 -0
  92. data/spec/lib/strokedb/core_ext/blank_spec.rb +20 -0
  93. data/spec/lib/strokedb/core_ext/extract_spec.rb +42 -0
  94. data/spec/lib/strokedb/core_ext/float_spec.rb +62 -0
  95. data/spec/lib/strokedb/core_ext/infinity_spec.rb +40 -0
  96. data/spec/lib/strokedb/core_ext/spec_helper.rb +1 -0
  97. data/spec/lib/strokedb/core_ext/string_spec.rb +25 -0
  98. data/spec/lib/strokedb/core_ext/symbol_spec.rb +8 -0
  99. data/spec/lib/strokedb/data_structures/chunked_skiplist_spec.rb +144 -0
  100. data/spec/lib/strokedb/data_structures/inverted_list_spec.rb +172 -0
  101. data/spec/lib/strokedb/data_structures/simple_skiplist_spec.rb +200 -0
  102. data/spec/lib/strokedb/data_structures/skiplist_spec.rb +253 -0
  103. data/spec/lib/strokedb/data_structures/spec_helper.rb +1 -0
  104. data/spec/lib/strokedb/document/associations_spec.rb +319 -0
  105. data/spec/lib/strokedb/document/callbacks_spec.rb +134 -0
  106. data/spec/lib/strokedb/document/coercions_spec.rb +110 -0
  107. data/spec/lib/strokedb/document/document_spec.rb +1063 -0
  108. data/spec/lib/strokedb/document/meta_meta_spec.rb +30 -0
  109. data/spec/lib/strokedb/document/meta_spec.rb +435 -0
  110. data/spec/lib/strokedb/document/metaslot_spec.rb +43 -0
  111. data/spec/lib/strokedb/document/slot_spec.rb +130 -0
  112. data/spec/lib/strokedb/document/spec_helper.rb +1 -0
  113. data/spec/lib/strokedb/document/validations_spec.rb +1081 -0
  114. data/spec/lib/strokedb/document/virtualize_spec.rb +80 -0
  115. data/spec/lib/strokedb/nsurl_spec.rb +73 -0
  116. data/spec/lib/strokedb/spec_helper.rb +1 -0
  117. data/spec/lib/strokedb/stores/chained_storages_spec.rb +116 -0
  118. data/spec/lib/strokedb/stores/spec_helper.rb +1 -0
  119. data/spec/lib/strokedb/stores/store_spec.rb +201 -0
  120. data/spec/lib/strokedb/stores/transaction_spec.rb +107 -0
  121. data/spec/lib/strokedb/sync/chain_sync_spec.rb +43 -0
  122. data/spec/lib/strokedb/sync/diff_spec.rb +111 -0
  123. data/spec/lib/strokedb/sync/lamport_timestamp_spec.rb +174 -0
  124. data/spec/lib/strokedb/sync/slot_diff_spec.rb +164 -0
  125. data/spec/lib/strokedb/sync/spec_helper.rb +1 -0
  126. data/spec/lib/strokedb/sync/store_sync_spec.rb +181 -0
  127. data/spec/lib/strokedb/sync/stroke_diff/array_spec.rb +97 -0
  128. data/spec/lib/strokedb/sync/stroke_diff/complex_spec.rb +58 -0
  129. data/spec/lib/strokedb/sync/stroke_diff/hash_spec.rb +144 -0
  130. data/spec/lib/strokedb/sync/stroke_diff/scalar_spec.rb +23 -0
  131. data/spec/lib/strokedb/sync/stroke_diff/spec_helper.rb +25 -0
  132. data/spec/lib/strokedb/sync/stroke_diff/string_spec.rb +61 -0
  133. data/spec/lib/strokedb/util/attach_dsl_spec.rb +45 -0
  134. data/spec/lib/strokedb/util/inflect_spec.rb +14 -0
  135. data/spec/lib/strokedb/util/lazy_array_spec.rb +157 -0
  136. data/spec/lib/strokedb/util/lazy_mapping_array_spec.rb +174 -0
  137. data/spec/lib/strokedb/util/lazy_mapping_hash_spec.rb +92 -0
  138. data/spec/lib/strokedb/util/spec_helper.rb +1 -0
  139. data/spec/lib/strokedb/util/uuid_spec.rb +46 -0
  140. data/spec/lib/strokedb/view_spec.rb +228 -0
  141. data/spec/lib/strokedb/volumes/archive_volume_spec.rb +105 -0
  142. data/spec/lib/strokedb/volumes/block_volume_spec.rb +100 -0
  143. data/spec/lib/strokedb/volumes/distributed_pointer_spec.rb +14 -0
  144. data/spec/lib/strokedb/volumes/fixed_length_skiplist_volume_spec.rb +177 -0
  145. data/spec/lib/strokedb/volumes/map_volume_spec.rb +172 -0
  146. data/spec/lib/strokedb/volumes/spec_helper.rb +1 -0
  147. data/spec/regression/docref_spec.rb +94 -0
  148. data/spec/regression/meta_spec.rb +23 -0
  149. data/spec/regression/spec_helper.rb +1 -0
  150. data/spec/regression/sync_spec.rb +36 -0
  151. data/spec/spec.opts +7 -0
  152. data/spec/spec_helper.rb +37 -0
  153. data/spec/temp/storages/TIMESTAMP +1 -0
  154. data/spec/temp/storages/UUID +1 -0
  155. data/spec/temp/storages/database-sync/TIMESTAMP +1 -0
  156. data/spec/temp/storages/database-sync/UUID +1 -0
  157. data/spec/temp/storages/database-sync/config +1 -0
  158. data/spec/temp/storages/database-sync/file/LAST +1 -0
  159. data/spec/temp/storages/database-sync/file/bd/f6/bdf675e5-8a7b-494e-97f2-f74a14ccd95d.av +0 -0
  160. data/spec/temp/storages/database-sync/file/uindex.wal +0 -0
  161. data/spec/temp/storages/database-sync/inverted_list_file/INVERTED_INDEX +1 -0
  162. data/spec/temp/storages/inverted_list_storage/INVERTED_INDEX +0 -0
  163. data/strokedb.gemspec +120 -0
  164. data/task/benchmark.task +9 -0
  165. data/task/ditz.task +30 -0
  166. data/task/echoe.rb +17 -0
  167. data/task/rcov.task +50 -0
  168. data/task/rdoc.task +10 -0
  169. data/task/rspec.task +0 -0
  170. data/vendor/java_inline.rb +106 -0
  171. data/vendor/rbmodexcl/mrimodexcl.rb +82 -0
  172. data/vendor/rbmodexcl/rbmodexcl.rb +5 -0
  173. data/vendor/rbmodexcl/rbxmodexcl.rb +48 -0
  174. data/vendor/rbmodexcl/spec/unextend_spec.rb +50 -0
  175. data/vendor/rbmodexcl/spec/uninclude_spec.rb +26 -0
  176. metadata +271 -79
  177. data/CONTRIBUTORS +0 -7
  178. data/CREDITS +0 -13
  179. data/bin/sdbc +0 -2
  180. data/lib/init.rb +0 -57
  181. data/lib/stores/inverted_list_index/inverted_list_index.rb +0 -49
  182. data/lib/stores/skiplist_store/chunk.rb +0 -119
  183. data/lib/stores/skiplist_store/chunk_storage.rb +0 -21
  184. data/lib/stores/skiplist_store/file_chunk_storage.rb +0 -44
  185. data/lib/stores/skiplist_store/memory_chunk_storage.rb +0 -37
  186. data/lib/stores/skiplist_store/skiplist_store.rb +0 -217
  187. data/lib/stores/store.rb +0 -5
  188. data/lib/sync/stroke_diff/stroke_diff.rb +0 -9
  189. data/lib/util/ext/object.rb +0 -8
  190. data/lib/util/java_util.rb +0 -9
  191. data/lib/util/trigger_partition.rb +0 -136
  192. data/strokedb.rb +0 -75
@@ -0,0 +1,80 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ def setup
4
+ setup_default_store
5
+ setup_index
6
+ Object.send!(:remove_const, 'Foo') if defined? Foo
7
+ Object.send!(:remove_const, 'Bar') if defined? Bar
8
+ end
9
+
10
+ describe "Document slot virtualization" do
11
+ before :each do
12
+ setup
13
+
14
+ Foo = Meta.new do
15
+ virtualizes [ :virtual_slot, :another_slot ]
16
+ end
17
+ end
18
+
19
+ it "should act like a slot" do
20
+ f = Foo.new(:virtual_slot => 123)
21
+ f.virtual_slot.should == 123
22
+ end
23
+
24
+ it "should retain its value after save" do
25
+ f = Foo.new(:virtual_slot => 123, :another_slot => 456)
26
+ f.virtual_slot.should == 123
27
+ f.another_slot.should == 456
28
+ f.save!
29
+ f.virtual_slot.should == 123
30
+ f.another_slot.should == 456
31
+ end
32
+
33
+ it "should not serialize slot value" do
34
+ f = Foo.create!(:virtual_slot => 123)
35
+
36
+ f_copy = Foo.find(f.uuid)
37
+ f_copy.has_slot?("virtual_slot").should_not be_true
38
+ end
39
+
40
+ it "should preserve version after saving document" do
41
+ f = Foo.new(:virtual_slot => 123)
42
+ lambda do
43
+ f.save!
44
+ end.should_not change(f,:version)
45
+ end
46
+
47
+ it "should preserve previous version after saving document" do
48
+ f = Foo.new(:virtual_slot => 123)
49
+ lambda do
50
+ f.save!
51
+ end.should_not change(f,:previous_version)
52
+ end
53
+
54
+ it "should allow to validate the virtual slot" do
55
+ Bar = Meta.new do
56
+ virtualizes :mylovelyslot
57
+ validates_presence_of :mylovelyslot
58
+ end
59
+
60
+ b = Bar.new(:mylovelyslot => 456)
61
+ b.should be_valid
62
+ lambda { b.save! }.should_not raise_error(InvalidDocumentError)
63
+ end
64
+
65
+ it "shouldn't restore virtual slot with :restore set to false" do
66
+ Bar = Meta.new { virtualizes :mylovelyslot, :restore => false }
67
+ b = Bar.new(:mylovelyslot => "abc")
68
+ b.mylovelyslot.should == "abc"
69
+ b.save!
70
+ b.has_slot?(:mylovelyslot).should be_false
71
+ end
72
+
73
+ it "should preserve version after saving document with :restore set to false" do
74
+ Bar = Meta.new { virtualizes :mylovelyslot, :restore => false }
75
+ b = Bar.new(:mylovelyslot => "abc")
76
+ lambda do
77
+ b.save!
78
+ end.should_not change(b,:version)
79
+ end
80
+ end
@@ -0,0 +1,73 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Some", Module do
4
+
5
+ before(:each) do
6
+ @module = Module.new
7
+ Module.reset_nsurls
8
+ end
9
+
10
+ after(:each) do
11
+ Module.reset_nsurls
12
+ end
13
+
14
+ it "should have nil nsurl by default" do
15
+ @module.nsurl.should be_nil
16
+ end
17
+
18
+ it "should be able to change nsurl" do
19
+ @module.nsurl 'http://some.url'
20
+ @module.nsurl.should == 'http://some.url'
21
+ end
22
+
23
+ it "should be findable by nsurl" do
24
+ @module.nsurl 'http://some.url'
25
+ Module.find_by_nsurl(@module.nsurl).should == @module
26
+ end
27
+
28
+ it "should be able to change nsurl to the same value" do
29
+ @module.nsurl 'http://some.url'
30
+ lambda { @module.nsurl 'http://some.url' }.should_not raise_error(ArgumentError)
31
+ end
32
+
33
+ it "should not be able to change nsurl to the value already assigned to some module" do
34
+ @some_module = Module.new
35
+ @some_module.nsurl 'http://some.url'
36
+ lambda { @module.nsurl 'http://some.url' }.should raise_error(ArgumentError)
37
+ end
38
+
39
+ end
40
+
41
+ describe Module do
42
+
43
+
44
+ before(:each) do
45
+ Module.reset_nsurls
46
+ end
47
+
48
+ after(:each) do
49
+ Module.reset_nsurls
50
+ end
51
+
52
+
53
+ it "should have empty nsurl by default" do
54
+ Module.nsurl.should be_empty
55
+ end
56
+
57
+ end
58
+
59
+ describe StrokeDB do
60
+
61
+ before(:each) do
62
+ Module.reset_nsurls
63
+ end
64
+
65
+ after(:each) do
66
+ Module.reset_nsurls
67
+ end
68
+
69
+ it "should have #{STROKEDB_NSURL} nsurl by default" do
70
+ StrokeDB.nsurl.should == STROKEDB_NSURL
71
+ end
72
+
73
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
@@ -0,0 +1,116 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ [ FileStorage, MemoryStorage ].each do |storage|
4
+ describe "Chained chunk storage (#{storage})" do
5
+
6
+ before(:each) do
7
+ @path = TEMP_STORAGES + '/file_chunk_storage_spec'
8
+ FileUtils.rm_rf @path
9
+ @storage = storage.new(:path => @path)
10
+ @storage.clear!
11
+ @store = mock("Store")
12
+ @document = Document.new(@store, 'a' => 1, 'b' => 2)
13
+
14
+ @target_storage = storage.new(:path => "#{@path}_chained")
15
+ @target_storage.clear!
16
+
17
+ @target_storage1 = storage.new(:path => "#{@path}_chained_1")
18
+ @target_storage1.clear!
19
+
20
+ @counter = LTS.zero
21
+ end
22
+
23
+ after(:each) do
24
+ @target_storage.close!
25
+ @target_storage1.close!
26
+ end
27
+
28
+ it "should collect update to target store" do
29
+ @storage.save!(@document,@counter)
30
+ @storage.add_chained_storage!(@target_storage)
31
+ @document1 = Document.new(@store, 'x' => 1, 'y' => 2)
32
+ @storage.save!(@document1,@counter)
33
+ @target_storage.should_receive(:save!).with(@document1,@counter,{},@storage)
34
+ @storage.sync_chained_storage!(@target_storage)
35
+ @storage.sync_chained_storage!(@target_storage)
36
+ end
37
+
38
+
39
+ it "should collect update to multiple target store" do
40
+ @storage.add_chained_storage!(@target_storage)
41
+ @storage.save!(@document,@counter)
42
+ @storage.add_chained_storage!(@target_storage1)
43
+ @document1 = Document.new(@store, 'x' => 1, 'y' => 2)
44
+ @storage.save!(@document1,@counter)
45
+ @target_storage.should_receive(:save!).with(@document,@counter,{},@storage).ordered
46
+ @target_storage.should_receive(:save!).with(@document1,@counter,{},@storage).ordered
47
+ @target_storage1.should_receive(:save!).with(@document1,@counter,{},@storage)
48
+
49
+ @storage.sync_chained_storage!(@target_storage)
50
+ @storage.sync_chained_storage!(@target_storage1)
51
+ end
52
+
53
+ it "should collect update to multiple target store and send them at once" do
54
+ @storage.add_chained_storage!(@target_storage)
55
+ @storage.save!(@document,@counter)
56
+ @storage.add_chained_storage!(@target_storage1)
57
+ @document1 = Document.new(@store,'x' => 1, 'y' => 2)
58
+ @storage.save!(@document1,@counter)
59
+ @target_storage.should_receive(:save!).with(@document,@counter,{},@storage).ordered
60
+ @target_storage.should_receive(:save!).with(@document1,@counter,{},@storage).ordered
61
+ @target_storage1.should_receive(:save!).with(@document1,@counter,{},@storage)
62
+
63
+ @storage.sync_chained_storages!
64
+ end
65
+
66
+ it "should collect multiple update to target store" do
67
+ @storage.save!(@document,@counter)
68
+ @storage.add_chained_storage!(@target_storage)
69
+ @document1 = Document.new(@store, 'x' => 1, 'y' => 2)
70
+ @document2 = Document.new(@store, 'v' => 1, 'z' => 2)
71
+ @storage.save!(@document1,@counter)
72
+ @storage.save!(@document2,@counter)
73
+ @target_storage.should_receive(:save!).with(@document1,@counter,{},@storage).ordered
74
+ @target_storage.should_receive(:save!).with(@document2,@counter,{},@storage).ordered
75
+ @storage.sync_chained_storage!(@target_storage)
76
+ end
77
+
78
+ it "should remove savings sucessfully (current outstanding savings are dropped and new savings are no longer collected)" do
79
+ @storage.save!(@document,@counter)
80
+ @storage.add_chained_storage!(@target_storage)
81
+ @document1 = Document.new(@store,'x' => 1, 'y' => 2)
82
+ @storage.remove_chained_storage!(@target_storage)
83
+ @document2 = Document.new(@store,'v' => 1, 'z' => 2)
84
+ @storage.save!(@document1,@counter)
85
+ @storage.save!(@document2,@counter)
86
+ @storage.sync_chained_storage!(@target_storage)
87
+ end
88
+
89
+ it "should add reverse chaining to target storage when adding chained storage" do
90
+ @target_storage.should_receive(:add_chained_storage!).with(@storage)
91
+ @storage.add_chained_storage!(@target_storage)
92
+ end
93
+
94
+ it "should remove reverse chaining from target storage when removing chained storage" do
95
+ @target_storage.should_receive(:remove_chained_storage!).with(@storage)
96
+ @storage.add_chained_storage!(@target_storage)
97
+ @storage.remove_chained_storage!(@target_storage)
98
+ end
99
+
100
+ it "should not collect savings for target store if these saving where originally from the target store" do
101
+ @storage.add_chained_storage!(@target_storage)
102
+ @storage.save!(@document,@counter)
103
+ @storage.sync_chained_storage!(@target_storage)
104
+ @storage.should_not_receive(:save!).with(@document,@counter,{},@target_storage)
105
+ @target_storage.sync_chained_storage!(@storage)
106
+ end
107
+
108
+ it "should let next storage to sync on sync_chained_storages! as well" do
109
+ @storage.add_chained_storage!(@target_storage)
110
+ @storage.save!(@document,@counter)
111
+ @target_storage.should_receive(:sync_chained_storages!).once
112
+ @storage.sync_chained_storages!
113
+ end
114
+
115
+ end
116
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
@@ -0,0 +1,201 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Store", :shared => true do
4
+
5
+ it "should increment timestamp when storing a document" do
6
+ @document = Document.new :stuff => '...'
7
+ lambda do
8
+ @store.save!(@document)
9
+ end.should change(@store,:timestamp)
10
+ end
11
+
12
+ it "should store a document" do
13
+ @document = Document.new :stuff => '...'
14
+ @store.save!(@document)
15
+ (doc = @store.find(@document.uuid)).should == @document
16
+ doc.should_not be_a_kind_of(VersionedDocument)
17
+ end
18
+
19
+ it "should store VersionedDocument" do
20
+ @document = Document.create! :stuff => '...'
21
+ vd = @document.versions.all.first
22
+ FileUtils.rm_rf TEMP_STORAGES + '/skiplist_store'
23
+ another_cfg = StrokeDB::Config.build :base_path => TEMP_STORAGES + '/skiplist_store'
24
+ another_store = another_cfg.stores[:default]
25
+ another_store.save!(vd)
26
+ another_store.find(vd.uuid,vd.version).should == vd
27
+ another_store.find(vd.uuid).should be_nil
28
+ end
29
+
30
+ it "should be Enumerable" do
31
+ @store.should be_a_kind_of(Enumerable)
32
+ end
33
+
34
+
35
+ end
36
+
37
+ describe "New store" do
38
+
39
+ before(:each) do
40
+ @store = setup_default_store
41
+ end
42
+
43
+ it "should have its own UUID" do
44
+ @store.uuid.should match(/^#{UUID_RE}$/)
45
+ end
46
+
47
+ it "should have 0 timestamp" do
48
+ @store.timestamp.should == LTS.zero(@store.uuid)
49
+ end
50
+
51
+ it "should create corresponding StoreInfo document" do
52
+ @store.document.should be_a_kind_of(StoreInfo)
53
+ @store.document.uuid.should == @store.uuid
54
+ end
55
+
56
+
57
+ it "should return nil as head_version for unexistent document (well there is no documents at all)" do
58
+ @store.head_version(Util.random_uuid).should be_nil
59
+ end
60
+
61
+ it_should_behave_like "Store"
62
+
63
+ end
64
+
65
+
66
+ describe "Non-empty store" do
67
+
68
+ before(:each) do
69
+ @store = setup_default_store
70
+ setup_index
71
+ @documents = []
72
+ 10.times do |i|
73
+ @documents << Document.create!(:stuff => i)
74
+ end
75
+ end
76
+
77
+
78
+ it "should report existing document as such" do
79
+ @store.include?(@documents.first.uuid).should == true
80
+ end
81
+
82
+ it "should report existing versioned document as such" do
83
+ @store.include?(@documents.first.uuid,@documents.first.version).should == true
84
+ end
85
+
86
+ it "should report versioned document that does not exist as such" do
87
+ @store.include?(@documents.first.uuid,'ouch, there is no way such version could be generated').should == false
88
+ end
89
+
90
+ it "should report document that does not exist as such" do
91
+ @store.include?('ouch, there is no way such UUID could be generated').should == false
92
+ end
93
+
94
+ it "should find a document" do
95
+ (doc = @store.find(@documents.first.uuid)).should == @documents.first
96
+ doc.should_not be_a_kind_of(VersionedDocument)
97
+ end
98
+
99
+ it "should find a versioned document" do
100
+ (doc = @store.find(@documents.first.uuid,@documents.first.version)).should == @documents.first
101
+ doc.should be_a_kind_of(VersionedDocument)
102
+ end
103
+
104
+ it "should not find a versioned document with version that does not exist" do
105
+ @store.find(@documents.first.uuid,'absolutely absurd version').should be_nil
106
+ end
107
+
108
+
109
+ it "should iterate over all stored documents" do
110
+ iterated_documents = []
111
+ @store.each do |doc|
112
+ iterated_documents << doc
113
+ end
114
+ iterated_documents.sort_by {|doc| doc.uuid}.should == @documents.sort_by {|doc| doc.uuid}
115
+ end
116
+
117
+ it "should iterate over all stored documents and their versions if told so" do
118
+ iterated_documents = []
119
+ @store.each(:include_versions => true) do |doc|
120
+ iterated_documents << doc
121
+ end
122
+ documents_with_versions = @documents.clone
123
+ @documents.each do |doc|
124
+ doc.versions.all.each do |vd|
125
+ documents_with_versions << vd
126
+ end
127
+ end
128
+ iterated_documents.sort_by {|doc| doc.uuid}.should == documents_with_versions.sort_by {|doc| doc.uuid}
129
+ end
130
+
131
+ it "should iterate over all newly stored documents if told so" do
132
+ timestamp = @store.timestamp.counter
133
+ @new_documents = []
134
+ 10.times do |i|
135
+ @new_documents << Document.create!(:stuff => i)
136
+ end
137
+
138
+ iterated_documents = []
139
+ @store.each(:after_timestamp => timestamp) do |doc|
140
+ iterated_documents << doc
141
+ end
142
+ iterated_documents.sort_by {|doc| doc.uuid}.should == @new_documents.sort_by {|doc| doc.uuid}
143
+ end
144
+
145
+ it "should iterate over all newly stored versions if told so" do
146
+ timestamp = @store.timestamp.counter
147
+ @new_documents = []
148
+ @documents.each_with_index do |document,i|
149
+ document.stuff = i+100
150
+ @new_documents << document.save!
151
+ end
152
+
153
+ iterated_documents = []
154
+ @store.each(:after_timestamp => timestamp, :include_versions => true) do |doc|
155
+ iterated_documents << doc
156
+ end
157
+ iterated_documents.sort_by {|doc| doc.uuid}.should == (@documents + @new_documents).sort_by {|doc| doc.uuid}
158
+ end
159
+
160
+
161
+ it_should_behave_like "Store"
162
+
163
+
164
+ end
165
+
166
+ #
167
+ # describe "[Regression] First chunk cut" do
168
+ #
169
+ #
170
+ # before(:all) do
171
+ # @store = setup_default_store
172
+ # @doc1 = Document.new(@store,:stuff => 123)
173
+ # @doc2 = Document.new(@store,:stuff => 123)
174
+ # @doc3 = Document.new(@store,:stuff => 123)
175
+ # end
176
+ #
177
+ # it "should store a document with big uuid in a first chunk" do
178
+ # $DEBUG_CHEATERS_LEVEL = 2
179
+ # @store.save!(@doc3)
180
+ # @store.find(@doc3.uuid).uuid.should == @doc3.uuid
181
+ # # end
182
+ # # it "should store a document with lower uuid in a first chunk" do
183
+ # $DEBUG_CHEATERS_LEVEL = 2
184
+ # @store.save!(@doc1)
185
+ # @store.find(@doc1.uuid).uuid.should == @doc1.uuid
186
+ # @store.find(@doc3.uuid).uuid.should == @doc3.uuid
187
+ # # end
188
+ # # it "should cut a chunk with a document with medium uuid" do
189
+ # $DEBUG_CHEATERS_LEVEL = 5
190
+ # @store.save!(@doc2)
191
+ # @store.find(@doc1.uuid).uuid.should == @doc1.uuid
192
+ # @store.find(@doc3.uuid).uuid.should == @doc3.uuid
193
+ # @store.find(@doc2.uuid).uuid.should == @doc2.uuid
194
+ # end
195
+ #
196
+ # after(:each) do
197
+ # $DEBUG_CHEATERS_LEVEL = nil
198
+ # end
199
+ # end
200
+
201
+