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" cars_lru = SPECDB::Common(Car).new "-3", 5 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 add_cars cars_ram0, 1 add_cars cars_ram1, 1 add_cars cars_ram2, 1 add_cars cars_lru, 1 # Searches should be consistent between all implementations of basic indexes, partitions and tags. # Basic index. 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" uncached_corvet_car.should eq cached_corvet_car uncached_corvet_car.should eq ram_corvet_car uncached_corvet_car.should eq lru_cached_corvet_car 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" ]) ] 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" uncached_red_cars.sort.should eq cached_red_cars.sort uncached_red_cars.sort.should eq ram_red_cars.sort uncached_red_cars.sort.should eq lru_cached_red_cars.sort 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" ]) ] 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" uncached_fast_cars.sort.should eq cached_fast_cars.sort uncached_fast_cars.sort.should eq ram_fast_cars.sort uncached_fast_cars.sort.should eq lru_cached_fast_cars.sort uncached_fast_cars.sort.should eq fast_cars.sort cars_ram0.rm_storage_dir cars_ram1.rm_storage_dir cars_ram2.rm_storage_dir cars_lru.rm_storage_dir end end 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