# 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