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.
- 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
data/script/console
CHANGED
|
@@ -1,70 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
$:.unshift File.dirname(__FILE__)
|
|
4
|
-
|
|
5
|
-
require 'irb'
|
|
6
|
-
require 'pp'
|
|
7
|
-
require "strokedb"
|
|
8
|
-
include StrokeDB
|
|
9
|
-
|
|
10
|
-
Doc = Document
|
|
11
|
-
|
|
12
|
-
def save!
|
|
13
|
-
StrokeDB.default_store.chunk_storage.sync_chained_storages!
|
|
14
|
-
true
|
|
15
|
-
"Database has been saved."
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def build_config
|
|
19
|
-
StrokeDB::Config.build :default => true, :base_path => '.console.strokedb'
|
|
20
|
-
true
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def clear!
|
|
24
|
-
FileUtils.rm_rf '.console.strokedb'
|
|
25
|
-
build_config
|
|
26
|
-
"Database has been wiped out."
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def find(*args)
|
|
30
|
-
StrokeDB.default_store.find(*args)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def store
|
|
34
|
-
StrokeDB.default_store
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def h(*args)
|
|
38
|
-
puts %{
|
|
39
|
-
Commands:
|
|
40
|
-
|
|
41
|
-
clear! -- Clear the database (will erase all data in console's store)
|
|
42
|
-
save! -- Save database (if you will quit without it, your changes will not be recorded)
|
|
43
|
-
find <uuid> -- Find document by UUID (example: find "a4430ff1-6cb4-4428-a292-7ab8b77de467")
|
|
44
|
-
|
|
45
|
-
Aliases:
|
|
46
|
-
|
|
47
|
-
Doc -- StrokeDB::Document
|
|
48
|
-
store -- current store
|
|
49
|
-
}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def reload!
|
|
53
|
-
silence_warnings do
|
|
54
|
-
load "strokedb.rb"
|
|
55
|
-
end
|
|
56
|
-
"Classes reloaded."
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
if ARGV.last.is_a?(String) && File.exists?(ARGV.last+'/config')
|
|
60
|
-
StrokeDB::Config.load(ARGV.last+'/config',true)
|
|
61
|
-
puts "# loading #{ARGV.last}"
|
|
62
|
-
ARGV.pop
|
|
63
|
-
else
|
|
64
|
-
build_config
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
puts "StrokeDB #{StrokeDB::VERSION} Console"
|
|
68
|
-
puts "Type 'h' for help"
|
|
69
|
-
|
|
70
|
-
IRB.start
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
bin/strokedb $*
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
|
2
|
+
=begin
|
|
3
|
+
class RemoteStoreContext
|
|
4
|
+
def initialize(store)
|
|
5
|
+
@user = Meta.new store, :name => "User"
|
|
6
|
+
end
|
|
7
|
+
def create_user(*args)
|
|
8
|
+
@user.create!(*args)
|
|
9
|
+
end
|
|
10
|
+
def find_users
|
|
11
|
+
@user.find
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class ClientScenario < RemoteStoreContext
|
|
16
|
+
def initialize
|
|
17
|
+
@store = StrokeDB::RemoteStore::Client.new('127.0.0.1', 4440)
|
|
18
|
+
super(@store)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class ServerScenario < RemoteStoreContext
|
|
23
|
+
def initialize
|
|
24
|
+
StrokeDB::Config.build :default => true, :base_path => '../temp/storages/drb_store'
|
|
25
|
+
StrokeDB.default_store.remote_server("0.0.0.0", 4540).start
|
|
26
|
+
super(StrokeDB.default_store)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
Thread.abort_on_exception = true
|
|
30
|
+
server_thread = Thread.new{ Thread.current['s'] = ServerScenario.new }
|
|
31
|
+
client_thread = Thread.new{ Thread.current['s'] = ClientScenario.new }
|
|
32
|
+
|
|
33
|
+
sleep 2
|
|
34
|
+
p server_thread['s'].create_user(:name => "server guy")
|
|
35
|
+
exit!
|
|
36
|
+
|
|
37
|
+
describe "Database operations thru remote_store" do
|
|
38
|
+
|
|
39
|
+
it "should work perfectly" do
|
|
40
|
+
# Start scenarios
|
|
41
|
+
client = $client
|
|
42
|
+
server = $server
|
|
43
|
+
|
|
44
|
+
# 1. Store document on a server
|
|
45
|
+
server.create_user(:name => "server guy").name.should == 'server guy'
|
|
46
|
+
server.find_users.size.should == 1
|
|
47
|
+
server.find_users[0].name.should == 'server guy'
|
|
48
|
+
|
|
49
|
+
# 2. Find server's documents in a client
|
|
50
|
+
client.find_users.size.should == 1
|
|
51
|
+
server.find_users[0].name.should == 'server guy'
|
|
52
|
+
|
|
53
|
+
# 3. Store document on a client
|
|
54
|
+
client.create_user(:name => "client guy").name.should == 'client guy'
|
|
55
|
+
|
|
56
|
+
# 4. Find all the documents on a server
|
|
57
|
+
server.find_users.size.should == 2
|
|
58
|
+
server.find_users[0].name.should == 'server guy'
|
|
59
|
+
server.find_users[1].name.should == 'client guy'
|
|
60
|
+
|
|
61
|
+
# 5. Find all documents in a client
|
|
62
|
+
client.find_users.size.should == 2
|
|
63
|
+
client.find_users[0].name.should == 'server guy'
|
|
64
|
+
client.find_users[1].name.should == 'client guy'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
=end
|
|
70
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Database search" do
|
|
4
|
+
|
|
5
|
+
before(:all) do
|
|
6
|
+
@path = File.dirname(__FILE__) + "/../temp/storages/database_search"
|
|
7
|
+
FileUtils.rm_rf @path
|
|
8
|
+
@f_storage = FileStorage.new(:path => @path + "/storage")
|
|
9
|
+
@f_storage.clear!
|
|
10
|
+
@index_storage = InvertedListFileStorage.new(:path => @path+"/index")
|
|
11
|
+
@index_storage.clear!
|
|
12
|
+
@index = InvertedListIndex.new(@index_storage)
|
|
13
|
+
@index2 = InvertedListIndex.new(@index_storage)
|
|
14
|
+
|
|
15
|
+
@f_store = Store.new(:storage => @f_storage, :index => @index, :path => @path + '/store')
|
|
16
|
+
@index.document_store = @f_store
|
|
17
|
+
@index2.document_store = @f_store
|
|
18
|
+
|
|
19
|
+
@profile_meta = Document.create!(@f_store, :name => 'Profile',
|
|
20
|
+
:non_indexable_slots => [ :bio, :version, :previous_version ])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Leave for investigation
|
|
24
|
+
# after(:all) do
|
|
25
|
+
# FileUtils.rm_rf @path
|
|
26
|
+
# end
|
|
27
|
+
|
|
28
|
+
it "should add new doc" do
|
|
29
|
+
doc = Document.create!(@f_store, :name => "Oleg", :state => 'Russia', :age => 21, :meta => @profile_meta)
|
|
30
|
+
doc.uuid.should_not be_nil
|
|
31
|
+
@oleg_uuid = doc.uuid
|
|
32
|
+
results = @index.find(:name => "Oleg")
|
|
33
|
+
results.should_not be_empty
|
|
34
|
+
results[0].uuid.should == @oleg_uuid
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should find doc in a separate index instance" do
|
|
38
|
+
results = @index2.find(:name => "Oleg", :meta => @profile_meta)
|
|
39
|
+
results.should_not be_empty
|
|
40
|
+
results[0]["name"].should == "Oleg"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should store & find several docs" do
|
|
44
|
+
doc = Document.create!(@f_store, :name => "Yurii", :state => 'Ukraine', :meta => @profile_meta)
|
|
45
|
+
doc.save!
|
|
46
|
+
@yura_uuid = doc.uuid
|
|
47
|
+
results = @index.find(:name => "Yurii")
|
|
48
|
+
results.should_not be_empty
|
|
49
|
+
results[0].uuid.should == @yura_uuid
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should find all profiles" do
|
|
53
|
+
results = @index.find(:meta => @profile_meta)
|
|
54
|
+
results.should_not be_empty
|
|
55
|
+
results.map{|e| e.uuid}.to_set == [ @yura_uuid, @oleg_uuid ].to_set
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should find all profiles from Ukraine" do
|
|
59
|
+
results = @index.find(:meta => @profile_meta, :state => 'Ukraine')
|
|
60
|
+
results.should_not be_empty
|
|
61
|
+
results.map{|e| e.uuid}.to_set == [ @yura_uuid ].to_set
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should remove info from index" do
|
|
65
|
+
results = @index.find(:name => 'Oleg')
|
|
66
|
+
oleg = results[0]
|
|
67
|
+
oleg[:name] = 'Oleganza'
|
|
68
|
+
oleg.save!
|
|
69
|
+
results = @index.find(:name => 'Oleg')
|
|
70
|
+
results.should be_empty
|
|
71
|
+
results = @index.find(:name => 'Oleganza')
|
|
72
|
+
results[0].uuid.should == oleg.uuid
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Config" do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
@config = StrokeDB::Config.new
|
|
7
|
+
@root_path = TEMP_STORAGES + '/config/'
|
|
8
|
+
@paths = []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should be the default config if desired" do
|
|
12
|
+
@config = StrokeDB::Config.new(true)
|
|
13
|
+
::StrokeDB.default_config.should == @config
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should have no storages or indexes on creation" do
|
|
17
|
+
@config.storages.should be_empty
|
|
18
|
+
@config.indexes.should be_empty
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should add known storages without specific parameters" do
|
|
22
|
+
@config.add_storage :mem, :memory
|
|
23
|
+
@config.storages[:mem].should be_an_instance_of(MemoryStorage)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should add known storages with specific parameters" do
|
|
27
|
+
@paths << (@root_path + "file_storage")
|
|
28
|
+
@config.add_storage :fs, :file, :path => @paths.last
|
|
29
|
+
@config.storages[:fs].should be_an_instance_of(FileStorage)
|
|
30
|
+
@config.storages[:fs].path.should == @paths.last
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should raise the correct exception when adding an unknown storage" do
|
|
34
|
+
lambda { @config.add_storage :unknown, :unknown_storage_type }.should raise_error(StrokeDB::UnknownStorageTypeError)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should raise an exception on chain with insufficient storages" do
|
|
38
|
+
lambda { @config.chain }.should raise_error
|
|
39
|
+
@config.add_storage :mem, :memory
|
|
40
|
+
lambda { @config.chain :mem }.should raise_error
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should raise an exception on chain with undefined storages" do
|
|
44
|
+
lambda { @config.chain :not_here }.should raise_error
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should chain storages together" do
|
|
48
|
+
@paths << (@root_path + "file_storage_chain")
|
|
49
|
+
@config.add_storage :mem1, :memory
|
|
50
|
+
@config.add_storage :mem2, :memory
|
|
51
|
+
@config.add_storage :mem3, :memory
|
|
52
|
+
@config.add_storage :fs, :file, :path => @paths.last
|
|
53
|
+
@config.chain :mem1, :mem2, :fs
|
|
54
|
+
@config.chain :mem2, :mem3
|
|
55
|
+
@config.storages[:mem1].should have_chained_storage(@config.storages[:mem2])
|
|
56
|
+
@config.storages[:mem2].should have_chained_storage(@config.storages[:fs])
|
|
57
|
+
@config.storages[:fs].should have_chained_storage(@config.storages[:mem2])
|
|
58
|
+
@config.storages[:mem2].should have_chained_storage(@config.storages[:mem1])
|
|
59
|
+
@config.storages[:mem1].should_not have_chained_storage(@config.storages[:mem1])
|
|
60
|
+
@config.storages[:mem2].should_not have_chained_storage(@config.storages[:mem2])
|
|
61
|
+
@config.storages[:fs].should_not have_chained_storage(@config.storages[:fs])
|
|
62
|
+
@config.storages[:mem1].should_not have_chained_storage(@config.storages[:fs])
|
|
63
|
+
@config.storages[:fs].should_not have_chained_storage(@config.storages[:mem1])
|
|
64
|
+
@config.storages[:mem2].should have_chained_storage(@config.storages[:mem3])
|
|
65
|
+
@config.storages[:mem3].should have_chained_storage(@config.storages[:mem2])
|
|
66
|
+
@config.storages[:mem1].should_not have_chained_storage(@config.storages[:mem3])
|
|
67
|
+
@config.storages[:fs].should_not have_chained_storage(@config.storages[:mem3])
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should add an index" do
|
|
71
|
+
@paths << (@root_path + "file_storage_index")
|
|
72
|
+
@config.add_storage :fs, :file, :path => @paths.last
|
|
73
|
+
@paths << (@root_path + "inverted_list_file_index")
|
|
74
|
+
@config.add_storage :idx_st, :inverted_list_file, :path => @paths.last
|
|
75
|
+
@config.add_index :idx, :inverted_list, :idx_st
|
|
76
|
+
@config.indexes[:idx].should be_an_instance_of(InvertedListIndex)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should raise the correct exception when adding an unknown index" do
|
|
80
|
+
lambda { @config.add_index :unknown, :unknown_index_type, :idx_st }.should raise_error(StrokeDB::UnknownIndexTypeError)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "should add a store" do
|
|
84
|
+
@paths << (@root_path + "file_storage")
|
|
85
|
+
@config.add_storage :fs, :file, :path => @paths.last
|
|
86
|
+
@config.add_store :store, nil, :storage => :fs, :cut_level => 4, :path => @paths.last
|
|
87
|
+
@config.stores[:store].should be_an_instance_of(Store)
|
|
88
|
+
@config.stores[:store].storage.should == @config.storages[:fs]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should add a default store with default index" do
|
|
92
|
+
@paths << (@root_path + "file_storage_default_index")
|
|
93
|
+
@config.add_storage :fs, :file, :path => @paths.last
|
|
94
|
+
@paths << (@root_path + "inverted_list_file_default_index")
|
|
95
|
+
@config.add_storage :index_storage, :inverted_list_file, :path => @paths.last
|
|
96
|
+
@config.add_index :default, :inverted_list, :index_storage
|
|
97
|
+
@config.add_store :default, nil, :storage => :fs, :cut_level => 4, :path => @paths.last
|
|
98
|
+
@config.stores[:default].should be_an_instance_of(Store)
|
|
99
|
+
@config.indexes[:default].document_store.should == @config.stores[:default]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
after(:each) do
|
|
103
|
+
@paths.each {|path| FileUtils.rm_rf path}
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe "Config builder" do
|
|
109
|
+
|
|
110
|
+
before(:each) do
|
|
111
|
+
@base_path = TEMP_STORAGES + '/cfg_builder'
|
|
112
|
+
FileUtils.rm_rf @base_path
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
after(:each) do
|
|
116
|
+
FileUtils.rm_rf @base_path
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should make config default if told so" do
|
|
120
|
+
config = StrokeDB::Config.build :default => true, :base_path => @base_path
|
|
121
|
+
StrokeDB.default_config.should == config
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "should not make config default if told so" do
|
|
125
|
+
config = StrokeDB::Config.build :base_path => @base_path
|
|
126
|
+
StrokeDB.default_config.should_not == config
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should use Store by default" do
|
|
130
|
+
config = StrokeDB::Config.build :base_path => @base_path
|
|
131
|
+
config.stores[:default].should be_a_kind_of(Store)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "should use specified store if told so" do
|
|
135
|
+
StrokeDB.send!(:remove_const,'SomeFunnyStore') if defined?(SomeFunnyStore)
|
|
136
|
+
StrokeDB::SomeFunnyStore = Class.new(Store)
|
|
137
|
+
config = StrokeDB::Config.build :store => :some_funny, :base_path => @base_path
|
|
138
|
+
config.stores[:default].should be_a_kind_of(SomeFunnyStore)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "should add storages as he is told to" do
|
|
142
|
+
StrokeDB.send!(:remove_const,'Chunk1Storage') if defined?(Chunk1Storage)
|
|
143
|
+
StrokeDB.send!(:remove_const,'Chunk2Storage') if defined?(Chunk2Storage)
|
|
144
|
+
StrokeDB::Chunk1Storage = Class.new(MemoryStorage)
|
|
145
|
+
StrokeDB::Chunk2Storage = Class.new(MemoryStorage)
|
|
146
|
+
config = StrokeDB::Config.build :storages => [:chunk_1,:chunk_2], :base_path => @base_path
|
|
147
|
+
config.storages[:chunk_1].should be_a_kind_of(Chunk1Storage)
|
|
148
|
+
config.storages[:chunk_2].should be_a_kind_of(Chunk2Storage)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should initialize all storages with base_path+storage_name" do
|
|
152
|
+
StrokeDB.send!(:remove_const,'Chunk1Storage') if defined?(Chunk1Storage)
|
|
153
|
+
StrokeDB.send!(:remove_const,'Chunk2Storage') if defined?(Chunk2Storage)
|
|
154
|
+
StrokeDB::Chunk1Storage = Class.new(MemoryStorage)
|
|
155
|
+
StrokeDB::Chunk2Storage = Class.new(MemoryStorage)
|
|
156
|
+
Chunk1Storage.should_receive(:new).with(:path => @base_path + '/chunk_1').and_return(MemoryStorage.new)
|
|
157
|
+
Chunk2Storage.should_receive(:new).with(:path => @base_path + '/chunk_2').and_return(MemoryStorage.new)
|
|
158
|
+
config = StrokeDB::Config.build :storages => [:chunk_1,:chunk_2], :base_path => @base_path
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "should add :memory and :file by default" do
|
|
162
|
+
config = StrokeDB::Config.build :base_path => @base_path
|
|
163
|
+
config.storages[:memory].should be_a_kind_of(MemoryStorage)
|
|
164
|
+
config.storages[:file].should be_a_kind_of(FileStorage)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "should chain given storages sequentially" do
|
|
168
|
+
StrokeDB.send!(:remove_const,'Chunk1Storage') if defined?(Chunk1Storage)
|
|
169
|
+
StrokeDB.send!(:remove_const,'Chunk2Storage') if defined?(Chunk2Storage)
|
|
170
|
+
StrokeDB.send!(:remove_const,'Chunk3Storage') if defined?(Chunk3Storage)
|
|
171
|
+
StrokeDB::Chunk1Storage = Class.new(MemoryStorage)
|
|
172
|
+
StrokeDB::Chunk2Storage = Class.new(MemoryStorage)
|
|
173
|
+
StrokeDB::Chunk3Storage = Class.new(MemoryStorage)
|
|
174
|
+
config = StrokeDB::Config.build :storages => [:chunk_1,:chunk_2,:chunk_3], :base_path => @base_path
|
|
175
|
+
config.storages[:chunk_1].should have_chained_storage(config[:chunk_2])
|
|
176
|
+
config.storages[:chunk_2].should have_chained_storage(config[:chunk_1])
|
|
177
|
+
config.storages[:chunk_3].should have_chained_storage(config[:chunk_2])
|
|
178
|
+
config.storages[:chunk_2].should have_chained_storage(config[:chunk_3])
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "should set authoritative sources for storages sequentially" do
|
|
182
|
+
StrokeDB.send!(:remove_const,'Chunk1Storage') if defined?(Chunk1Storage)
|
|
183
|
+
StrokeDB.send!(:remove_const,'Chunk2Storage') if defined?(Chunk2Storage)
|
|
184
|
+
StrokeDB.send!(:remove_const,'Chunk3Storage') if defined?(Chunk3Storage)
|
|
185
|
+
StrokeDB::Chunk1Storage = Class.new(MemoryStorage)
|
|
186
|
+
StrokeDB::Chunk2Storage = Class.new(MemoryStorage)
|
|
187
|
+
StrokeDB::Chunk3Storage = Class.new(MemoryStorage)
|
|
188
|
+
config = StrokeDB::Config.build :storages => [:chunk_1,:chunk_2,:chunk_3], :base_path => @base_path
|
|
189
|
+
config.storages[:chunk_1].authoritative_source.should == config[:chunk_2]
|
|
190
|
+
config.storages[:chunk_2].authoritative_source.should == config[:chunk_3]
|
|
191
|
+
config.storages[:chunk_3].authoritative_source.should be_nil
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it "should use InvertedListIndex by default" do
|
|
195
|
+
config = StrokeDB::Config.build :base_path => @base_path
|
|
196
|
+
config.indexes[:default].should be_a_kind_of(InvertedListIndex)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "should use specific index if told so by default" do
|
|
200
|
+
StrokeDB.send!(:remove_const,'SomeFunnyIndex') if defined?(SomeFunnyIndex)
|
|
201
|
+
StrokeDB::SomeFunnyIndex = Class.new(InvertedListIndex)
|
|
202
|
+
config = StrokeDB::Config.build :index => :some_funny, :base_path => @base_path
|
|
203
|
+
config.indexes[:default].should be_a_kind_of(SomeFunnyIndex)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "should use InvertedListFileStorage index storage by default" do
|
|
207
|
+
config = StrokeDB::Config.build :base_path => @base_path
|
|
208
|
+
config.storages[:inverted_list_file].should be_a_kind_of(InvertedListFileStorage)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it "should use specific index storage if told so" do
|
|
212
|
+
StrokeDB.send!(:remove_const,'SomeFunnyIndexStorage') if defined?(SomeFunnyIndexStorage)
|
|
213
|
+
StrokeDB::SomeFunnyIndexStorage = Class.new(InvertedListFileStorage)
|
|
214
|
+
config = StrokeDB::Config.build :index_storages => [:some_funny_index], :base_path => @base_path
|
|
215
|
+
config.storages[:some_funny_index].should be_a_kind_of(SomeFunnyIndexStorage)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
it "should initialize index storage with base_path+storage_name" do
|
|
219
|
+
StrokeDB.send!(:remove_const,'SomeFunnyIndexStorage') if defined?(SomeFunnyIndexStorage)
|
|
220
|
+
StrokeDB::SomeFunnyIndexStorage = Class.new(InvertedListFileStorage)
|
|
221
|
+
index_storage = StrokeDB::SomeFunnyIndexStorage.new(:path => @base_path + '/some_funny_index')
|
|
222
|
+
SomeFunnyIndexStorage.should_receive(:new).with(:path => @base_path + '/some_funny_index').and_return(index_storage)
|
|
223
|
+
config = StrokeDB::Config.build :index_storages => [:some_funny_index], :base_path => @base_path
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "should dump config in base_path (except 'default' key)" do
|
|
227
|
+
cfg = StrokeDB::Config.build :default => true, :base_path => @base_path
|
|
228
|
+
config = JSON.parse(IO.read(@base_path + '/config'))
|
|
229
|
+
config.should == cfg.build_config
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "should load dumped config" do
|
|
233
|
+
cfg = StrokeDB::Config.build :default => true, :base_path => @base_path
|
|
234
|
+
cfg.storages.values.each {|s| s.close! if s.respond_to?(:close!)}
|
|
235
|
+
config = JSON.parse(IO.read(@base_path + '/config'))
|
|
236
|
+
cfg = StrokeDB::Config.load(@base_path + '/config')
|
|
237
|
+
cfg.build_config.should == config
|
|
238
|
+
cfg.should_not == StrokeDB.default_config
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
it "should load dumped config and make it default if told so" do
|
|
242
|
+
cfg = StrokeDB::Config.build :default => true, :base_path => @base_path
|
|
243
|
+
cfg.storages.values.each {|s| s.close! if s.respond_to?(:close!)}
|
|
244
|
+
config = JSON.parse(IO.read(@base_path + '/config'))
|
|
245
|
+
cfg = StrokeDB::Config.load(@base_path + '/config',true)
|
|
246
|
+
cfg.build_config.should == config
|
|
247
|
+
cfg.should == StrokeDB.default_config
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
end
|