Compare commits

...

2 Commits

Author SHA1 Message Date
cf57773a25 More consistent API. 2024-05-09 00:04:15 +02:00
8a96c3302c Spec: less errors. 2024-05-09 00:03:34 +02:00
3 changed files with 21 additions and 12 deletions

View File

@ -4,6 +4,9 @@ require "file_utils"
require "../src/dodb.cr" require "../src/dodb.cr"
require "./test-data.cr" require "./test-data.cr"
def fork_process(&)
Process.new Crystal::System::Process.fork { yield }
end
class DODB::SpecDataBase < DODB::DataBase(Ship) class DODB::SpecDataBase < DODB::DataBase(Ship)
def initialize(storage_ext = "", remove_previous_data = true) def initialize(storage_ext = "", remove_previous_data = true)
@ -223,7 +226,7 @@ describe "DODB::DataBase" do
}.should be_true }.should be_true
end end
db_ships_by_class.get("does-not-exist").should eq [] of Ship db_ships_by_class.get?("does-not-exist").should eq nil
end end
it "removes select elements from partitions" do it "removes select elements from partitions" do
@ -409,7 +412,7 @@ describe "DODB::DataBase" do
processes = [] of Process processes = [] of Process
fork_count.times do |fork_id| fork_count.times do |fork_id|
processes << Process.fork do processes << fork_process do
entries_per_fork.times do |entry_id| entries_per_fork.times do |entry_id|
db << Ship.new("entry-#{fork_id}-#{entry_id}", "???") db << Ship.new("entry-#{fork_id}-#{entry_id}", "???")
end end
@ -430,7 +433,7 @@ describe "DODB::DataBase" do
# First pass, creating data. # First pass, creating data.
processes = [] of Process processes = [] of Process
fork_count.times do |fork_id| fork_count.times do |fork_id|
processes << Process.fork do processes << fork_process do
entries_per_fork.times do |entry_id| entries_per_fork.times do |entry_id|
db << Ship.new("entry-#{fork_id}-#{entry_id}", "???") db << Ship.new("entry-#{fork_id}-#{entry_id}", "???")
end end
@ -441,7 +444,7 @@ describe "DODB::DataBase" do
# Second pass, updating data. # Second pass, updating data.
processes = [] of Process processes = [] of Process
fork_count.times do |fork_id| fork_count.times do |fork_id|
processes << Process.fork do processes << fork_process do
entries_per_fork.times do |entry_id| entries_per_fork.times do |entry_id|
db_entries_by_name.update Ship.new("entry-#{fork_id}-#{entry_id}", "???", tags: ["updated"]) db_entries_by_name.update Ship.new("entry-#{fork_id}-#{entry_id}", "???", tags: ["updated"])
end end
@ -471,7 +474,7 @@ describe "DODB::DataBase" do
processes = [] of Process processes = [] of Process
fork_count.times do |fork_id| fork_count.times do |fork_id|
processes << Process.fork do processes << fork_process do
entries_per_fork.times do |entry_id| entries_per_fork.times do |entry_id|
db_entries_by_name.safe_get "test" do |entry| db_entries_by_name.safe_get "test" do |entry|
entry.klass = (entry.klass.to_i + 1).to_s entry.klass = (entry.klass.to_i + 1).to_s

View File

@ -43,11 +43,10 @@ class DODB::Partition(V) < DODB::Indexer(V)
end end
def get(partition) : Array(V) def get(partition) : Array(V)
r_value = Array(V).new
partition_directory = indexing_directory partition partition_directory = indexing_directory partition
raise MissingEntry.new(@name, partition) unless Dir.exists? partition_directory
return r_value unless Dir.exists? partition_directory r_value = Array(V).new
Dir.each_child partition_directory do |child| Dir.each_child partition_directory do |child|
r_value << @storage[get_key child] r_value << @storage[get_key child]

View File

@ -42,11 +42,10 @@ class DODB::Tags(V) < DODB::Indexer(V)
end end
def get_with_indice(tag : String) : Array(Tuple(V, Int32)) def get_with_indice(tag : String) : Array(Tuple(V, Int32))
r_value = Array(Tuple(V, Int32)).new
tag_directory = indexing_directory tag tag_directory = indexing_directory tag
raise MissingEntry.new(@name, tag) unless Dir.exists? tag_directory
return r_value unless Dir.exists? tag_directory r_value = Array(Tuple(V, Int32)).new
Dir.each_child tag_directory do |child| Dir.each_child tag_directory do |child|
key = get_key child key = get_key child
@ -56,10 +55,18 @@ class DODB::Tags(V) < DODB::Indexer(V)
r_value r_value
end end
# `get_with_indices` gets values with all the tags.
def get_with_indices(keys : Array(String)) : Array(Tuple(V, Int32)) def get_with_indices(keys : Array(String)) : Array(Tuple(V, Int32))
r_value = Array(Tuple(V, Int32)).new r_value = Array(Tuple(V, Int32)).new
return r_value if keys.size < 1
first_key = keys.pop
r_value = get_with_indice(first_key) rescue return [] of Tuple(V, Int32)
keys.each do |tag| keys.each do |tag|
r_value.concat get_with_indice tag values = get_with_indice(tag) rescue return [] of Tuple(V, Int32)
r_value &= values
end end
r_value r_value
end end