2024-06-01 02:15:11 +02:00
|
|
|
require "spec"
|
|
|
|
require "./db-cars.cr"
|
|
|
|
|
|
|
|
corvet0 = Car.new "Corvet-0", "red", [ "shiny", "impressive", "fast", "elegant" ]
|
|
|
|
|
|
|
|
describe "uncached, cached and ram indexes" do
|
|
|
|
it "RAM DB - add items, add indexes, search, reindex, search" do
|
|
|
|
|
|
|
|
cars_ram0 = SPECDB::RAMOnly(Car).new "-0"
|
|
|
|
cars_ram1 = SPECDB::RAMOnly(Car).new "-1"
|
|
|
|
cars_ram2 = SPECDB::RAMOnly(Car).new "-2"
|
|
|
|
|
|
|
|
add_cars cars_ram0, 1
|
|
|
|
add_cars cars_ram1, 1
|
|
|
|
add_cars cars_ram2, 1
|
|
|
|
|
|
|
|
uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = uncached_indexes cars_ram0
|
|
|
|
cached_searchby_name, cached_searchby_color, cached_searchby_keywords = cached_indexes cars_ram1
|
|
|
|
ram_searchby_name, ram_searchby_color, ram_searchby_keywords = ram_indexes cars_ram2
|
|
|
|
|
|
|
|
uncached_searchby_name.get?("Corvet-0").should be_nil
|
|
|
|
cached_searchby_name.get?("Corvet-0").should be_nil
|
|
|
|
ram_searchby_name.get?("Corvet-0").should be_nil
|
|
|
|
|
|
|
|
cars_ram0.reindex_everything!
|
|
|
|
cars_ram1.reindex_everything!
|
|
|
|
cars_ram2.reindex_everything!
|
|
|
|
|
|
|
|
# Get the value even if not written on the disk since the index was written on the disk.
|
|
|
|
# The value is retrieved by the database, the index only reads its key in the database.
|
|
|
|
uncached_searchby_name.get?("Corvet-0").should eq corvet0
|
|
|
|
|
|
|
|
# Both cached and RAM indexes can retrieve the value since they store the key.
|
|
|
|
cached_searchby_name.get?("Corvet-0").should eq corvet0
|
|
|
|
ram_searchby_name.get?("Corvet-0").should eq corvet0
|
|
|
|
|
|
|
|
cars_ram0.rm_storage_dir
|
|
|
|
cars_ram1.rm_storage_dir
|
|
|
|
cars_ram2.rm_storage_dir
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "tracking inconsistencies between implementations" do
|
|
|
|
it "index - partitions - tags" do
|
|
|
|
cars_ram0 = SPECDB::RAMOnly(Car).new "-0"
|
|
|
|
cars_ram1 = SPECDB::RAMOnly(Car).new "-1"
|
|
|
|
cars_ram2 = SPECDB::RAMOnly(Car).new "-2"
|
2024-12-13 23:31:25 +01:00
|
|
|
cars_lru = SPECDB::Common(Car).new "-3", 5
|
2024-06-01 02:15:11 +02:00
|
|
|
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = uncached_indexes cars_ram0
|
|
|
|
cached_searchby_name, cached_searchby_color, cached_searchby_keywords = cached_indexes cars_ram1
|
|
|
|
ram_searchby_name, ram_searchby_color, ram_searchby_keywords = ram_indexes cars_ram2
|
|
|
|
lru_cached_searchby_name, lru_cached_searchby_color, lru_cached_searchby_keywords = cached_indexes cars_lru
|
2024-06-01 02:15:11 +02:00
|
|
|
|
|
|
|
add_cars cars_ram0, 1
|
|
|
|
add_cars cars_ram1, 1
|
|
|
|
add_cars cars_ram2, 1
|
2024-12-13 23:31:25 +01:00
|
|
|
add_cars cars_lru, 1
|
2024-06-01 02:15:11 +02:00
|
|
|
|
|
|
|
# Searches should be consistent between all implementations of basic indexes, partitions and tags.
|
|
|
|
|
|
|
|
# Basic index.
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_corvet_car = uncached_searchby_name.get? "Corvet-0"
|
|
|
|
cached_corvet_car = cached_searchby_name.get? "Corvet-0"
|
|
|
|
ram_corvet_car = ram_searchby_name.get? "Corvet-0"
|
|
|
|
lru_cached_corvet_car = lru_cached_searchby_name.get? "Corvet-0"
|
2024-06-01 02:15:11 +02:00
|
|
|
uncached_corvet_car.should eq cached_corvet_car
|
|
|
|
uncached_corvet_car.should eq ram_corvet_car
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_corvet_car.should eq lru_cached_corvet_car
|
2024-06-01 02:15:11 +02:00
|
|
|
uncached_corvet_car.should eq corvet0
|
|
|
|
|
|
|
|
# Partitions.
|
|
|
|
red_cars = [ Car.new("Corvet-0", "red", [ "shiny", "impressive", "fast", "elegant" ]),
|
|
|
|
Car.new("Ford-5-0", "red", [ "unknown" ])
|
|
|
|
]
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_red_cars = uncached_searchby_color.get? "red"
|
|
|
|
cached_red_cars = cached_searchby_color.get? "red"
|
|
|
|
ram_red_cars = ram_searchby_color.get? "red"
|
|
|
|
lru_cached_red_cars = lru_cached_searchby_color.get? "red"
|
2024-06-01 02:15:11 +02:00
|
|
|
uncached_red_cars.sort.should eq cached_red_cars.sort
|
|
|
|
uncached_red_cars.sort.should eq ram_red_cars.sort
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_red_cars.sort.should eq lru_cached_red_cars.sort
|
2024-06-01 02:15:11 +02:00
|
|
|
uncached_red_cars.sort.should eq red_cars.sort
|
|
|
|
|
|
|
|
# Tags.
|
|
|
|
fast_cars = [ Car.new("Corvet-0", "red", [ "shiny", "impressive", "fast", "elegant" ]),
|
|
|
|
Car.new("Bullet-GT-0", "blue", [ "shiny", "fast", "expensive" ])
|
|
|
|
]
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_fast_cars = uncached_searchby_keywords.get? "fast"
|
|
|
|
cached_fast_cars = cached_searchby_keywords.get? "fast"
|
|
|
|
ram_fast_cars = ram_searchby_keywords.get? "fast"
|
|
|
|
lru_cached_fast_cars = lru_cached_searchby_keywords.get? "fast"
|
2024-06-01 02:15:11 +02:00
|
|
|
uncached_fast_cars.sort.should eq cached_fast_cars.sort
|
|
|
|
uncached_fast_cars.sort.should eq ram_fast_cars.sort
|
2024-12-13 23:31:25 +01:00
|
|
|
uncached_fast_cars.sort.should eq lru_cached_fast_cars.sort
|
2024-06-01 02:15:11 +02:00
|
|
|
uncached_fast_cars.sort.should eq fast_cars.sort
|
|
|
|
|
|
|
|
cars_ram0.rm_storage_dir
|
|
|
|
cars_ram1.rm_storage_dir
|
|
|
|
cars_ram2.rm_storage_dir
|
2024-12-13 23:31:25 +01:00
|
|
|
cars_lru.rm_storage_dir
|
2024-06-01 02:15:11 +02:00
|
|
|
end
|
|
|
|
end
|
2024-06-02 01:37:30 +02:00
|
|
|
|
|
|
|
describe "Errors" do
|
|
|
|
it "Removing an entry which doesn't exist" do
|
|
|
|
db = SPECDB::RAMOnly(Car).new
|
|
|
|
searchby_name, searchby_color, searchby_keywords = uncached_indexes db
|
|
|
|
|
|
|
|
searchby_name.delete?( "doesn't exist").should be_nil # Should not throw an exception.
|
|
|
|
searchby_color.delete?( "doesn't exist").should be_nil # Should not throw an exception.
|
|
|
|
searchby_keywords.delete?("doesn't exist").should be_nil # Should not throw an exception.
|
|
|
|
|
|
|
|
expect_raises DODB::MissingEntry do
|
|
|
|
searchby_name.delete "doesn't exist"
|
|
|
|
end
|
|
|
|
|
|
|
|
expect_raises DODB::MissingEntry do
|
|
|
|
searchby_color.delete "doesn't exist"
|
|
|
|
end
|
|
|
|
|
|
|
|
expect_raises DODB::MissingEntry do
|
|
|
|
searchby_keywords.delete "doesn't exist"
|
|
|
|
end
|
|
|
|
|
|
|
|
db.rm_storage_dir
|
|
|
|
end
|
|
|
|
end
|