105 lines
3.2 KiB
Crystal
105 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
|