Я пытаюсь создать аналоговый аналог таблицы базы данных с индексами. Я реализовал аккуратный DSL для запроса таблицы, выглядит как этотКак создать индексированную таблицу?
table.select do
age > 44
name == "Adam"
end
и производит кучу экземпляров Condition
класса, как EqCondition
, GteCondition
и т.д. Ну, это легкая часть. Table
проверяет эти условия и выбирает соответствующий индекс для выполнения запроса. Что я застрял в том, какие параметры должны принимать Index#select
? Если он принимает те же параметры, что и метод выбора таблицы, он делает то же самое дважды. Предположим, нам нужно выбрать всех с возрастом больше 25. Сначала класс Table определяет, что существует индекс (age, name), который может быть использован. Затем индекс должен определить, что это запрос диапазона, включающий только часть ключа и выполняющий его соответственно.
Я спрашиваю о некоторых идеях о том, как правильно спроектировать (возможно, какая-то более простая версия того, как это делается в реальных базах данных)?
PS. Это Рубин, но я думаю, что это не актуально. В Java/C# это будет выглядеть как table.select(new GtCondition("age", 44), new EqCondition("name", "Adam"))