104 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
| # This file contains all the necessary code to perform tests based on the following Car database.
 | |
| 
 | |
| require "json"
 | |
| require "../src/dodb.cr"
 | |
| require "./spec-database.cr"
 | |
| 
 | |
| class Car
 | |
| 	include JSON::Serializable
 | |
| 
 | |
| 	property name     : String # unique to each instance (1-1 relations)
 | |
| 	property color    : String        | DODB::NoIndex # a simple attribute (1-n relations)
 | |
| 	property keywords : Array(String) | DODB::NoIndex # tags about a car, example: "shiny" (n-n relations)
 | |
| 
 | |
| 	def_clone
 | |
| 
 | |
| 	def initialize(@name, @color, @keywords)
 | |
| 	end
 | |
| 	class_getter cars = [
 | |
| 		Car.new("Corvet",    "red",    [ "shiny", "impressive", "fast", "elegant" ]),
 | |
| 		Car.new("SUV",       "red",    [ "solid", "impressive" ]),
 | |
| 		Car.new("Mustang",   "red",    [ "shiny", "impressive", "elegant" ]),
 | |
| 		Car.new("Bullet-GT", "red",    [ "shiny", "impressive", "fast", "elegant" ]),
 | |
| 		Car.new("GTI",       "blue",   [ "average" ]),
 | |
| 		Car.new("Deudeuch",  "violet", [ "dirty", "slow", "only French will understand" ])
 | |
| 	]
 | |
| 
 | |
| 	# Equality is true if every property is identical.
 | |
| 	def ==(other : Car)
 | |
| 		@name == other.name && @color == other.color && @keywords == other.keywords
 | |
| 	end
 | |
| 
 | |
| 	# Equality is true if every property is identical.
 | |
| 	def <=>(other : Car)
 | |
| 		@name <=> other.name
 | |
| 	end
 | |
| end
 | |
| 
 | |
| def ram_indexes(storage : DODB::Storage)
 | |
| 	n = storage.new_RAM_index "name", &.name
 | |
| 	c = storage.new_RAM_partition "color", &.color
 | |
| 	k = storage.new_RAM_tags "keyword", &.keywords
 | |
| 	return n, c, k
 | |
| end
 | |
| 
 | |
| def cached_indexes(storage : DODB::Storage)
 | |
| 	n = storage.new_index "name", &.name
 | |
| 	c = storage.new_partition "color", &.color
 | |
| 	k = storage.new_tags "keyword", &.keywords
 | |
| 	return n, c, k
 | |
| end
 | |
| 
 | |
| def uncached_indexes(storage : DODB::Storage)
 | |
| 	n = storage.new_uncached_index "name", &.name
 | |
| 	c = storage.new_uncached_partition "color", &.color
 | |
| 	k = storage.new_uncached_tags "keyword", &.keywords
 | |
| 	return n, c, k
 | |
| end
 | |
| 
 | |
| # `max_indexes` limits the number of indexes (partitions and tags).
 | |
| # Once the last index (db last_key/5) is above this value, the following
 | |
| # cars won't be tagged nor partitionned.
 | |
| def add_cars(storage : DODB::Storage, nb_iterations : Int32, max_indexes = 5000)
 | |
| 	last_key = ((storage.last_key + 1) / 5).to_i
 | |
| 	i = 0
 | |
| 	car1 = Car.new "Corvet", "red", [ "shiny", "impressive", "fast", "elegant" ]
 | |
| 	car2 = Car.new "Bullet-GT", "blue", [ "shiny", "fast", "expensive" ]
 | |
| 	car3 = Car.new "Deudeuche", "beige", [ "curvy", "sublime" ]
 | |
| 	car4 = Car.new "Ford-5", "red", [ "unknown" ]
 | |
| 	car5 = Car.new "C-MAX", "gray", [ "spacious", "affordable" ]
 | |
| 
 | |
| 	while i < nb_iterations
 | |
| 		car1.name = "Corvet-#{last_key}"
 | |
| 		car2.name = "Bullet-GT-#{last_key}"
 | |
| 		car3.name = "Deudeuche-#{last_key}"
 | |
| 		car4.name = "Ford-5-#{last_key}"
 | |
| 		car5.name = "C-MAX-#{last_key}"
 | |
| 
 | |
| 		last_key += 1
 | |
| 
 | |
| 		if last_key > max_indexes
 | |
| 			car1.color = DODB.no_index
 | |
| 			car2.color = DODB.no_index
 | |
| 			car3.color = DODB.no_index
 | |
| 			car4.color = DODB.no_index
 | |
| 			car5.color = DODB.no_index
 | |
| 
 | |
| 			car1.keywords = DODB.no_index
 | |
| 			car2.keywords = DODB.no_index
 | |
| 			car3.keywords = DODB.no_index
 | |
| 			car4.keywords = DODB.no_index
 | |
| 			car5.keywords = DODB.no_index
 | |
| 		end
 | |
| 
 | |
| 		storage.unsafe_add car1.clone
 | |
| 		storage.unsafe_add car2.clone
 | |
| 		storage.unsafe_add car3.clone
 | |
| 		storage.unsafe_add car4.clone
 | |
| 		storage.unsafe_add car5.clone
 | |
| 
 | |
| 		i += 1
 | |
| 		#STDOUT.write "\radding value #{i}".to_slice
 | |
| 	end
 | |
| 	#puts ""
 | |
| end
 |