128 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
| 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
 |