strokedb 0.0.2.1 → 0.0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +18 -20
- data/bench.html +4001 -0
- data/bin/strokedb +14 -0
- data/examples/movies.rb +105 -0
- data/examples/movies2.rb +97 -0
- data/examples/strokewiki/README +28 -0
- data/examples/strokewiki/view/edit.xhtml +27 -0
- data/examples/strokewiki/view/new.xhtml +26 -0
- data/examples/strokewiki/view/pages.xhtml +27 -0
- data/examples/strokewiki/view/show.xhtml +40 -0
- data/examples/strokewiki/view/versions.xhtml +25 -0
- data/examples/strokewiki/wiki.rb +106 -0
- data/examples/todo.rb +92 -0
- data/lib/strokedb.rb +85 -0
- data/lib/{config → strokedb}/config.rb +14 -9
- data/lib/strokedb/console.rb +87 -0
- data/lib/strokedb/core_ext.rb +10 -0
- data/lib/{util/ext → strokedb/core_ext}/blank.rb +1 -1
- data/lib/{util/ext → strokedb/core_ext}/enumerable.rb +0 -0
- data/lib/{util/ext → strokedb/core_ext}/fixnum.rb +0 -0
- data/lib/strokedb/core_ext/float.rb +4 -0
- data/lib/{util/ext → strokedb/core_ext}/hash.rb +0 -0
- data/lib/strokedb/core_ext/infinity.rb +33 -0
- data/lib/strokedb/core_ext/kernel.rb +41 -0
- data/lib/strokedb/core_ext/object.rb +16 -0
- data/lib/{util/ext → strokedb/core_ext}/string.rb +28 -1
- data/lib/strokedb/core_ext/symbol.rb +13 -0
- data/lib/strokedb/data_structures.rb +5 -0
- data/lib/strokedb/data_structures/chunked_skiplist.rb +123 -0
- data/lib/{data_structures → strokedb/data_structures}/inverted_list.rb +0 -0
- data/lib/{data_structures → strokedb/data_structures}/point_query.rb +0 -0
- data/lib/strokedb/data_structures/simple_skiplist.rb +350 -0
- data/lib/{data_structures → strokedb/data_structures}/skiplist.rb +1 -1
- data/lib/{document → strokedb}/document.rb +180 -71
- data/lib/{document → strokedb/document}/callback.rb +0 -0
- data/lib/{document → strokedb/document}/delete.rb +2 -2
- data/lib/strokedb/document/dsl.rb +4 -0
- data/lib/{document → strokedb/document/dsl}/associations.rb +0 -0
- data/lib/{document → strokedb/document/dsl}/coercions.rb +0 -0
- data/lib/strokedb/document/dsl/meta_dsl.rb +7 -0
- data/lib/{document → strokedb/document/dsl}/validations.rb +26 -21
- data/lib/{document → strokedb/document/dsl}/virtualize.rb +0 -0
- data/lib/{document → strokedb/document}/meta.rb +92 -29
- data/lib/{document → strokedb/document}/slot.rb +17 -5
- data/lib/{document → strokedb/document}/util.rb +0 -0
- data/lib/{document → strokedb/document}/versions.rb +2 -2
- data/lib/strokedb/index.rb +2 -0
- data/lib/strokedb/nsurl.rb +24 -0
- data/lib/strokedb/store.rb +149 -0
- data/lib/strokedb/stores.rb +6 -0
- data/lib/{stores → strokedb/stores}/chainable_storage.rb +20 -14
- data/lib/strokedb/stores/file_storage.rb +118 -0
- data/lib/{stores/inverted_list_index → strokedb/stores}/inverted_list_file_storage.rb +50 -0
- data/lib/strokedb/stores/memory_storage.rb +80 -0
- data/lib/{stores → strokedb/stores}/remote_store.rb +10 -4
- data/lib/strokedb/sync.rb +4 -0
- data/lib/{sync → strokedb/sync}/chain_sync.rb +0 -0
- data/lib/{sync → strokedb/sync}/diff.rb +12 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/array.rb +1 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/default.rb +0 -0
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/hash.rb +1 -1
- data/lib/{sync/stroke_diff → strokedb/sync/diff}/string.rb +1 -1
- data/lib/{sync → strokedb/sync}/lamport_timestamp.rb +0 -0
- data/lib/{sync → strokedb/sync}/store_sync.rb +15 -7
- data/lib/strokedb/transaction.rb +78 -0
- data/lib/{util → strokedb}/util.rb +14 -7
- data/lib/strokedb/util/attach_dsl.rb +29 -0
- data/lib/{util → strokedb/util}/blankslate.rb +0 -0
- data/lib/strokedb/util/class_optimization.rb +93 -0
- data/lib/{util → strokedb/util}/inflect.rb +0 -0
- data/lib/strokedb/util/java_util.rb +13 -0
- data/lib/{util → strokedb/util}/lazy_array.rb +0 -0
- data/lib/{util → strokedb/util}/lazy_mapping_array.rb +4 -0
- data/lib/{util → strokedb/util}/lazy_mapping_hash.rb +0 -0
- data/lib/{util → strokedb/util}/serialization.rb +21 -0
- data/lib/strokedb/util/uuid.rb +159 -0
- data/lib/{util → strokedb/util}/xml.rb +0 -0
- data/lib/{view → strokedb}/view.rb +2 -2
- data/lib/strokedb/volumes.rb +5 -0
- data/lib/strokedb/volumes/archive_volume.rb +165 -0
- data/lib/strokedb/volumes/block_volume.rb +169 -0
- data/lib/strokedb/volumes/distributed_pointer.rb +43 -0
- data/lib/strokedb/volumes/fixed_length_skiplist_volume.rb +109 -0
- data/lib/strokedb/volumes/map_volume.rb +268 -0
- data/meta/MANIFEST +175 -0
- data/script/console +2 -70
- data/spec/integration/remote_store_spec.rb +70 -0
- data/spec/integration/search_spec.rb +76 -0
- data/spec/integration/spec_helper.rb +1 -0
- data/spec/lib/spec_helper.rb +1 -0
- data/spec/lib/strokedb/config_spec.rb +250 -0
- data/spec/lib/strokedb/core_ext/blank_spec.rb +20 -0
- data/spec/lib/strokedb/core_ext/extract_spec.rb +42 -0
- data/spec/lib/strokedb/core_ext/float_spec.rb +62 -0
- data/spec/lib/strokedb/core_ext/infinity_spec.rb +40 -0
- data/spec/lib/strokedb/core_ext/spec_helper.rb +1 -0
- data/spec/lib/strokedb/core_ext/string_spec.rb +25 -0
- data/spec/lib/strokedb/core_ext/symbol_spec.rb +8 -0
- data/spec/lib/strokedb/data_structures/chunked_skiplist_spec.rb +144 -0
- data/spec/lib/strokedb/data_structures/inverted_list_spec.rb +172 -0
- data/spec/lib/strokedb/data_structures/simple_skiplist_spec.rb +200 -0
- data/spec/lib/strokedb/data_structures/skiplist_spec.rb +253 -0
- data/spec/lib/strokedb/data_structures/spec_helper.rb +1 -0
- data/spec/lib/strokedb/document/associations_spec.rb +319 -0
- data/spec/lib/strokedb/document/callbacks_spec.rb +134 -0
- data/spec/lib/strokedb/document/coercions_spec.rb +110 -0
- data/spec/lib/strokedb/document/document_spec.rb +1063 -0
- data/spec/lib/strokedb/document/meta_meta_spec.rb +30 -0
- data/spec/lib/strokedb/document/meta_spec.rb +435 -0
- data/spec/lib/strokedb/document/metaslot_spec.rb +43 -0
- data/spec/lib/strokedb/document/slot_spec.rb +130 -0
- data/spec/lib/strokedb/document/spec_helper.rb +1 -0
- data/spec/lib/strokedb/document/validations_spec.rb +1081 -0
- data/spec/lib/strokedb/document/virtualize_spec.rb +80 -0
- data/spec/lib/strokedb/nsurl_spec.rb +73 -0
- data/spec/lib/strokedb/spec_helper.rb +1 -0
- data/spec/lib/strokedb/stores/chained_storages_spec.rb +116 -0
- data/spec/lib/strokedb/stores/spec_helper.rb +1 -0
- data/spec/lib/strokedb/stores/store_spec.rb +201 -0
- data/spec/lib/strokedb/stores/transaction_spec.rb +107 -0
- data/spec/lib/strokedb/sync/chain_sync_spec.rb +43 -0
- data/spec/lib/strokedb/sync/diff_spec.rb +111 -0
- data/spec/lib/strokedb/sync/lamport_timestamp_spec.rb +174 -0
- data/spec/lib/strokedb/sync/slot_diff_spec.rb +164 -0
- data/spec/lib/strokedb/sync/spec_helper.rb +1 -0
- data/spec/lib/strokedb/sync/store_sync_spec.rb +181 -0
- data/spec/lib/strokedb/sync/stroke_diff/array_spec.rb +97 -0
- data/spec/lib/strokedb/sync/stroke_diff/complex_spec.rb +58 -0
- data/spec/lib/strokedb/sync/stroke_diff/hash_spec.rb +144 -0
- data/spec/lib/strokedb/sync/stroke_diff/scalar_spec.rb +23 -0
- data/spec/lib/strokedb/sync/stroke_diff/spec_helper.rb +25 -0
- data/spec/lib/strokedb/sync/stroke_diff/string_spec.rb +61 -0
- data/spec/lib/strokedb/util/attach_dsl_spec.rb +45 -0
- data/spec/lib/strokedb/util/inflect_spec.rb +14 -0
- data/spec/lib/strokedb/util/lazy_array_spec.rb +157 -0
- data/spec/lib/strokedb/util/lazy_mapping_array_spec.rb +174 -0
- data/spec/lib/strokedb/util/lazy_mapping_hash_spec.rb +92 -0
- data/spec/lib/strokedb/util/spec_helper.rb +1 -0
- data/spec/lib/strokedb/util/uuid_spec.rb +46 -0
- data/spec/lib/strokedb/view_spec.rb +228 -0
- data/spec/lib/strokedb/volumes/archive_volume_spec.rb +105 -0
- data/spec/lib/strokedb/volumes/block_volume_spec.rb +100 -0
- data/spec/lib/strokedb/volumes/distributed_pointer_spec.rb +14 -0
- data/spec/lib/strokedb/volumes/fixed_length_skiplist_volume_spec.rb +177 -0
- data/spec/lib/strokedb/volumes/map_volume_spec.rb +172 -0
- data/spec/lib/strokedb/volumes/spec_helper.rb +1 -0
- data/spec/regression/docref_spec.rb +94 -0
- data/spec/regression/meta_spec.rb +23 -0
- data/spec/regression/spec_helper.rb +1 -0
- data/spec/regression/sync_spec.rb +36 -0
- data/spec/spec.opts +7 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/temp/storages/TIMESTAMP +1 -0
- data/spec/temp/storages/UUID +1 -0
- data/spec/temp/storages/database-sync/TIMESTAMP +1 -0
- data/spec/temp/storages/database-sync/UUID +1 -0
- data/spec/temp/storages/database-sync/config +1 -0
- data/spec/temp/storages/database-sync/file/LAST +1 -0
- data/spec/temp/storages/database-sync/file/bd/f6/bdf675e5-8a7b-494e-97f2-f74a14ccd95d.av +0 -0
- data/spec/temp/storages/database-sync/file/uindex.wal +0 -0
- data/spec/temp/storages/database-sync/inverted_list_file/INVERTED_INDEX +1 -0
- data/spec/temp/storages/inverted_list_storage/INVERTED_INDEX +0 -0
- data/strokedb.gemspec +120 -0
- data/task/benchmark.task +9 -0
- data/task/ditz.task +30 -0
- data/task/echoe.rb +17 -0
- data/task/rcov.task +50 -0
- data/task/rdoc.task +10 -0
- data/task/rspec.task +0 -0
- data/vendor/java_inline.rb +106 -0
- data/vendor/rbmodexcl/mrimodexcl.rb +82 -0
- data/vendor/rbmodexcl/rbmodexcl.rb +5 -0
- data/vendor/rbmodexcl/rbxmodexcl.rb +48 -0
- data/vendor/rbmodexcl/spec/unextend_spec.rb +50 -0
- data/vendor/rbmodexcl/spec/uninclude_spec.rb +26 -0
- metadata +271 -79
- data/CONTRIBUTORS +0 -7
- data/CREDITS +0 -13
- data/bin/sdbc +0 -2
- data/lib/init.rb +0 -57
- data/lib/stores/inverted_list_index/inverted_list_index.rb +0 -49
- data/lib/stores/skiplist_store/chunk.rb +0 -119
- data/lib/stores/skiplist_store/chunk_storage.rb +0 -21
- data/lib/stores/skiplist_store/file_chunk_storage.rb +0 -44
- data/lib/stores/skiplist_store/memory_chunk_storage.rb +0 -37
- data/lib/stores/skiplist_store/skiplist_store.rb +0 -217
- data/lib/stores/store.rb +0 -5
- data/lib/sync/stroke_diff/stroke_diff.rb +0 -9
- data/lib/util/ext/object.rb +0 -8
- data/lib/util/java_util.rb +0 -9
- data/lib/util/trigger_partition.rb +0 -136
- data/strokedb.rb +0 -75
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "LazyMappingHash instance" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@lash = LazyMappingHash.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should have class Hash" do
|
10
|
+
@lash.class.should == Hash
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be inherited from Hash" do
|
14
|
+
@lash.class.ancestors.first.should == Hash
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should match case expressions" do
|
18
|
+
@lash.should be_a_kind_of(Hash)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "LazyMappingHash instance with block specified" do
|
23
|
+
before(:each) do
|
24
|
+
@original = Hash[1,2,3,4,5,6]
|
25
|
+
@decoder = proc {|k| k.is_a?(Hash) && k[:struct] || k }
|
26
|
+
@encoder = proc {|k| {:struct => k} }
|
27
|
+
|
28
|
+
@lash = LazyMappingHash.new(@original).map_with(&@encoder).unmap_with(&@decoder)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should call mapping proc on #keys" do
|
32
|
+
@lash.keys.should == @original.keys.map {|k| @encoder.call(k)}
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should call mapping proc on #values" do
|
36
|
+
@lash.values.should == @original.values.map {|k| @encoder.call(k)}
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should call unmapping proc on #[key]=" do
|
40
|
+
@lash[1] = { :struct => :x }
|
41
|
+
Hash[@lash][1].should == :x
|
42
|
+
@lash[{:struct => :x}] = 1
|
43
|
+
Hash[@lash][:x].should == 1
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should call mapping proc on #[key]" do
|
47
|
+
@lash[1].should == @encoder.call(@original[1])
|
48
|
+
@lash[2].should == @encoder.call(@original[2])
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should call mapping proc on #[mapped_key]" do
|
52
|
+
@lash[@encoder.call(1)].should == @encoder.call(@original[1])
|
53
|
+
@lash[@encoder.call(2)].should == @encoder.call(@original[2])
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should yield mapped key/value in #each block" do
|
57
|
+
orig_kv = []
|
58
|
+
lash_kv = []
|
59
|
+
@original.each do |k, v|
|
60
|
+
orig_kv << [@encoder.call(k), @encoder.call(v)]
|
61
|
+
end
|
62
|
+
@lash.each do |k, v|
|
63
|
+
lash_kv << [k,v]
|
64
|
+
end
|
65
|
+
orig_kv.should == lash_kv
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should yield mapped key/value in #map block" do
|
69
|
+
orig_kv = @original.map do |k, v|
|
70
|
+
[@encoder.call(k), @encoder.call(v)]
|
71
|
+
end
|
72
|
+
lash_kv = @lash.map do |k, v|
|
73
|
+
[k, v]
|
74
|
+
end
|
75
|
+
orig_kv.should == lash_kv
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should yield mapped key/value in #zip block (lash.zip(original))" do
|
79
|
+
orig_kv = []
|
80
|
+
lash_kv = []
|
81
|
+
@original.zip(@original) do |kv1, kv2|
|
82
|
+
orig_kv << [kv1.map{|e| @encoder.call(e)}, kv2]
|
83
|
+
end
|
84
|
+
@lash.zip(@original) do |kv1, kv2|
|
85
|
+
lash_kv << [kv1, kv2]
|
86
|
+
end
|
87
|
+
orig_kv.should == lash_kv
|
88
|
+
end
|
89
|
+
|
90
|
+
# TODO: zip support
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "String UUID" do
|
4
|
+
it "should have specific format" do
|
5
|
+
1000.times do
|
6
|
+
uuid = Util::random_uuid
|
7
|
+
uuid.should =~ /^#{UUID_RE}$/
|
8
|
+
end
|
9
|
+
end
|
10
|
+
it "should be converted to raw string" do
|
11
|
+
"00000000-0000-0000-0000-000000000010".to_raw_uuid.should == "\x00"*15 + "\x10"
|
12
|
+
"ffffffff-ffff-ffff-ffff-ffffffffffff".to_raw_uuid.should == "\xff"*16
|
13
|
+
"00000000-0000-0000-ffff-ffffffffffff".to_raw_uuid.should == "\x00"*8 + "\xff"*8
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "Raw UUID" do
|
18
|
+
it "should have specific format" do
|
19
|
+
1000.times do
|
20
|
+
uuid = Util::random_uuid_raw
|
21
|
+
uuid.should be_an_instance_of(String)
|
22
|
+
uuid.size.should == 16
|
23
|
+
end
|
24
|
+
end
|
25
|
+
it "should be converted to formatted string" do
|
26
|
+
("\x00"*15 + "\x10").to_formatted_uuid.should == "00000000-0000-0000-0000-000000000010"
|
27
|
+
("\xff"*16).to_formatted_uuid.should == "ffffffff-ffff-ffff-ffff-ffffffffffff"
|
28
|
+
("\x00"*8 + "\xff"*8).to_formatted_uuid.should == "00000000-0000-0000-ffff-ffffffffffff"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "UUID String conversion" do
|
33
|
+
it "should convert raw to formatted and back" do
|
34
|
+
1000.times do
|
35
|
+
raw = Util::random_uuid_raw
|
36
|
+
raw.to_formatted_uuid.to_raw_uuid.should == raw
|
37
|
+
end
|
38
|
+
end
|
39
|
+
it "should convert formatted to raw and back" do
|
40
|
+
1000.times do
|
41
|
+
fmt = Util::random_uuid
|
42
|
+
fmt.to_raw_uuid.to_formatted_uuid.should == fmt
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe "View without map_with and reduce_with blocks" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
setup_default_store
|
7
|
+
setup_index
|
8
|
+
@view = View.new(:name => "without block")
|
9
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return all documents plus Meta and View" do
|
13
|
+
@documents = []
|
14
|
+
10.times do |i|
|
15
|
+
@documents << Document.create!(:i => i)
|
16
|
+
end
|
17
|
+
@view.emit.to_a.sort_by {|doc| doc.uuid}.should == (@documents + [Meta.document,View.document,ViewCut.document]).sort_by {|doc| doc.uuid}
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "View with map_with (without extra arguments)" do
|
23
|
+
|
24
|
+
before(:each) do
|
25
|
+
setup_default_store
|
26
|
+
setup_index
|
27
|
+
@view = View.new(:name => "with map_with (without extra arguments)").map_with {|doc| doc.slotnames.include?('i') ? doc : nil}
|
28
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should return all documents plus three nils" do
|
32
|
+
@documents = []
|
33
|
+
10.times do |i|
|
34
|
+
@documents << Document.create!(:i => i)
|
35
|
+
end
|
36
|
+
@view.emit.to_a.sort_by {|doc| doc.nil? ? "0" : doc.uuid}.should == (@documents + [nil,nil,nil]).sort_by {|doc| doc.nil? ? "0" : doc.uuid}
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "View with map_with (with extra arguments)" do
|
42
|
+
|
43
|
+
before(:each) do
|
44
|
+
setup_default_store
|
45
|
+
setup_index
|
46
|
+
@view = View.new(:name => "with map_with (with extra arguments)").map_with {|doc,slotname| doc.slotnames.include?(slotname.to_s) ? doc : nil}
|
47
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should return all documents plus three nils" do
|
51
|
+
@documents = []
|
52
|
+
10.times do |i|
|
53
|
+
@documents << Document.create!(:i => i)
|
54
|
+
end
|
55
|
+
@view.emit(:i).to_a.sort_by {|doc| doc.nil? ? "0" : doc.uuid}.should == (@documents + [nil,nil,nil]).sort_by {|doc| doc.nil? ? "0" : doc.uuid}
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "View with map_with and reduce_with" do
|
61
|
+
|
62
|
+
before(:each) do
|
63
|
+
setup_default_store
|
64
|
+
setup_index
|
65
|
+
@view = View.new(:name => "with map_with and reduce_with").map_with {|doc| doc.slotnames.include?('i') ? doc : nil}.reduce_with{|doc| !doc.nil? }
|
66
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should return all documents" do
|
70
|
+
@documents = []
|
71
|
+
10.times do |i|
|
72
|
+
@documents << Document.create!(:i => i)
|
73
|
+
end
|
74
|
+
@view.emit.to_a.sort_by {|doc| doc.uuid}.should == @documents.sort_by {|doc| doc.uuid}
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "View with reduce_with" do
|
80
|
+
|
81
|
+
before(:each) do
|
82
|
+
setup_default_store
|
83
|
+
setup_index
|
84
|
+
@view = View.new(:name => "with reduce_with").reduce_with{|doc| doc.slotnames.include?('i') }
|
85
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should return all documents" do
|
89
|
+
@documents = []
|
90
|
+
10.times do |i|
|
91
|
+
@documents << Document.create!(:i => i)
|
92
|
+
end
|
93
|
+
@view.emit.to_a.sort_by {|doc| doc.uuid}.should == @documents.sort_by {|doc| doc.uuid}
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "View with reduce_with (with extra arguments)" do
|
99
|
+
|
100
|
+
before(:each) do
|
101
|
+
setup_default_store
|
102
|
+
setup_index
|
103
|
+
@view = View.new(:name => "with reduce_with (with extra arguments)").reduce_with {|doc,slotname| doc.slotnames.include?(slotname.to_s) }
|
104
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should return all documents plus two nils" do
|
108
|
+
@documents = []
|
109
|
+
10.times do |i|
|
110
|
+
@documents << Document.create!(:i => i)
|
111
|
+
end
|
112
|
+
@view.emit(:i).to_a.sort_by {|doc| doc.uuid}.should == @documents.sort_by {|doc| doc.uuid}
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "View" do
|
118
|
+
|
119
|
+
before(:each) do
|
120
|
+
setup_default_store
|
121
|
+
setup_index
|
122
|
+
@view = View.new(:name => "incremental view").reduce_with{|doc| doc.slotnames.include?('i') }
|
123
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should make documents VersionedDocuments" do
|
127
|
+
@documents = []
|
128
|
+
10.times do |i|
|
129
|
+
@documents << Document.create!(:i => i)
|
130
|
+
end
|
131
|
+
@view.emit.to_a.each {|d| d.should be_a_kind_of(VersionedDocument)}
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should be able to return new documents incrementally" do
|
135
|
+
@documents = []
|
136
|
+
10.times do |i|
|
137
|
+
@documents << Document.create!(:i => i)
|
138
|
+
end
|
139
|
+
cut = @view.emit
|
140
|
+
@documents = []
|
141
|
+
10.times do |i|
|
142
|
+
@documents << Document.create!(:i => i+100)
|
143
|
+
end
|
144
|
+
a = cut.emit.to_a
|
145
|
+
a.sort_by {|doc| doc.uuid }.should == @documents.sort_by {|doc| doc.uuid }
|
146
|
+
a.each {|d| d.should be_a_kind_of(VersionedDocument)} # make sure next emit produces VersionedDocuments as well
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should be able to return new document heads incrementally" do
|
150
|
+
@documents = []
|
151
|
+
10.times do |i|
|
152
|
+
@documents << Document.create!(:i => i)
|
153
|
+
end
|
154
|
+
cut = @view.emit
|
155
|
+
new_docs = @documents.map {|doc| doc.new_slot = "new"; doc.save!}
|
156
|
+
a = cut.emit.to_a
|
157
|
+
a.sort_by {|doc| doc.uuid }.should == new_docs.sort_by {|doc| doc.uuid }
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should be able to return new document versions incrementally if told so" do
|
161
|
+
@documents = []
|
162
|
+
10.times do |i|
|
163
|
+
@documents << Document.create!(:i => i)
|
164
|
+
end
|
165
|
+
cut = @view.emit
|
166
|
+
@view.include_versions = true
|
167
|
+
@view.save!
|
168
|
+
new_docs = @documents.map {|doc| doc.new_slot = "new"; doc.save!}
|
169
|
+
docs = @documents.map {|doc| doc.reload }
|
170
|
+
a = cut.emit.to_a
|
171
|
+
a.sort_by {|doc| doc.uuid }.should == (new_docs+docs).sort_by {|doc| doc.uuid }
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "Newly created View" do
|
177
|
+
|
178
|
+
before(:each) do
|
179
|
+
setup_default_store
|
180
|
+
setup_index
|
181
|
+
@view = View.new
|
182
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should reference first cut as last cut when it is saved" do
|
186
|
+
cut = @view.emit
|
187
|
+
cut.save!
|
188
|
+
@view.last_cut.should == cut
|
189
|
+
end
|
190
|
+
|
191
|
+
it "save view on first cut save" do
|
192
|
+
cut = @view.emit
|
193
|
+
cut.save!
|
194
|
+
@view.should_not be_new
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
describe "View with cut(s) available" do
|
200
|
+
|
201
|
+
before(:each) do
|
202
|
+
setup_default_store
|
203
|
+
setup_index
|
204
|
+
@view = View.new
|
205
|
+
ViewCut.document # this is to ensure that ViewCut document is created prior to emitting more data in cuts
|
206
|
+
@cut = @view.emit
|
207
|
+
@cut.save!
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should refer to newly emitted cut as last cut (when it is saved)" do
|
211
|
+
new_cut = @cut.emit
|
212
|
+
@view.reload.last_cut.should == @cut
|
213
|
+
new_cut.save!
|
214
|
+
@view.reload.last_cut.should == new_cut
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should not refer to newly emitted cut as last cut (when it is saved) if this cut isn't really last" do
|
218
|
+
new_cut = @cut.emit
|
219
|
+
new_cut.save!
|
220
|
+
@view.reload.last_cut.should == new_cut
|
221
|
+
another_cut = @cut.emit
|
222
|
+
another_cut.save!
|
223
|
+
@view.reload.last_cut.should == new_cut.reload # we are reloading new_cut to let it have DocRefs instead of loaded documents
|
224
|
+
# just for the sake of this comparison
|
225
|
+
# However TODO: investigate this
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe ArchiveVolume, "initialization" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
FileUtils.rm_rf TEMP_STORAGES + '/archive_volume_spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
@path = TEMP_STORAGES + '/archive_volume_spec'
|
11
|
+
@size = 64*1024
|
12
|
+
@options = {:size => @size, :path => @path}
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should go well with raw uuid" do
|
16
|
+
raw_uuid = Util.random_uuid_raw
|
17
|
+
ArchiveVolume.new(@options.merge(:uuid => raw_uuid)).uuid.should == raw_uuid.to_formatted_uuid
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should go well with formatted uuid" do
|
21
|
+
uuid = Util.random_uuid
|
22
|
+
ArchiveVolume.new(@options.merge(:uuid => uuid)).uuid.should == uuid
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should generate new UUID if none given" do
|
26
|
+
ArchiveVolume.new(@options).uuid.should match(/#{UUID_RE}/)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ArchiveVolume do
|
33
|
+
|
34
|
+
before(:all) do
|
35
|
+
FileUtils.rm_rf TEMP_STORAGES + '/archive_volume_spec'
|
36
|
+
end
|
37
|
+
|
38
|
+
before(:each) do
|
39
|
+
@path = TEMP_STORAGES + '/archive_volume_spec'
|
40
|
+
@raw_uuid = Util.random_uuid_raw
|
41
|
+
@size = 64*1024
|
42
|
+
@options = {:uuid => @raw_uuid, :size => @size, :path => @path}
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be created with given size" do
|
46
|
+
dv = ArchiveVolume.new(@options)
|
47
|
+
fname = dv.file_path
|
48
|
+
File.should be_exist(fname)
|
49
|
+
File.size(fname).should == @size
|
50
|
+
File.open(fname){|f| f.read }[4..-1].should == "\x00"*(@size-4)
|
51
|
+
dv.delete!
|
52
|
+
File.should_not be_exist(fname)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should write some data and return its position" do
|
56
|
+
dv = ArchiveVolume.new(@options)
|
57
|
+
tail = dv.tail
|
58
|
+
tail.should == 4
|
59
|
+
prefix = 4
|
60
|
+
|
61
|
+
p1 = dv.insert("7 bytes")
|
62
|
+
p1.should == 0 + tail
|
63
|
+
p2 = dv.insert("13 more bytes")
|
64
|
+
p2.should == 7 + prefix + tail
|
65
|
+
p3 = dv.insert("1")
|
66
|
+
p3.should == 20 + prefix*2 + tail
|
67
|
+
dv.close!
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should read & write data" do
|
71
|
+
dv = ArchiveVolume.new(@options)
|
72
|
+
p1 = dv.insert("7 bytes")
|
73
|
+
p2 = dv.insert("13 more bytes")
|
74
|
+
p3 = dv.insert("1")
|
75
|
+
|
76
|
+
dv.read(p2).should == "13 more bytes"
|
77
|
+
dv.read(p1).should == "7 bytes"
|
78
|
+
dv.read(p3).should == "1"
|
79
|
+
|
80
|
+
p4 = dv.insert("")
|
81
|
+
|
82
|
+
dv.read(p2).should == "13 more bytes"
|
83
|
+
dv.read(p1).should == "7 bytes"
|
84
|
+
dv.read(p3).should == "1"
|
85
|
+
dv.read(p4).should == ""
|
86
|
+
|
87
|
+
dv.close!
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should raise exception if file is closed" do
|
91
|
+
dv = ArchiveVolume.new(@options)
|
92
|
+
dv.close!
|
93
|
+
|
94
|
+
lambda { dv.read(4) }.should raise_error(ArchiveVolume::VolumeClosedException)
|
95
|
+
lambda { dv.insert("data") }.should raise_error(ArchiveVolume::VolumeClosedException)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should raise exception if capacity is exceeded" do
|
99
|
+
dv = ArchiveVolume.new(@options)
|
100
|
+
# Since ArchiveVolume maintains some system information like header and record size
|
101
|
+
# record size of file size will exceed volume's capacity
|
102
|
+
lambda { dv.insert(" "*@size) }.should raise_error(ArchiveVolume::VolumeCapacityExceeded)
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|