Это кажется странным способом моделирования данных, но вы можете использовать CQEngine с этой моделью, если хотите.
(Во-первых, CQEngine не будет использовать имена столбцов, поэтому вы можете удалить это поле.)
Для этого вам нужно определить виртуальный атрибут CQEngine для каждого из индексов в списке значений.
Каждый атрибут должен быть объявлен с типом данных, который будет храниться в этом столбце / индексе, и должен иметь возможность приводить объект с этим индексом в вашем списке значений к соответствующему типу данных (String
, Double
, Integer
и т. Д.).
Допустим, у вашего Record
есть столбец с именем 'цена' , который имеет тип Double
и хранится с индексом 5
в списке значений. Вы можете определить атрибут, который читает его следующим образом:
public static final Attribute<Record, Double> PRICE =
attribute("PRICE", record -> ((Double) record.values.get(5));
Если это звучит сложно, то это потому, что такой способ моделирования данных делает вещи немного сложнее :) Обычно легче работать с моделью данных, которая использует систему типов Java (чего нет в вашей модели). Таким образом, вам нужно будет программно самостоятельно отслеживать типы данных и т. Д. Каждого поля.
CQEngine сам по себе будет нормально работать с этой моделью, потому что в конце дня атрибутам CQEngine не нужно читать поля , атрибуты - это просто функции, которые запрограммированы для получения значений.
Есть куча вещей, не охваченных выше. Например, могут ли ваши значения быть нулевыми? (если это так, вы должны использовать nullable атрибутов, как описано в CQEngine docs . Или, возможно, каждый из ваших Record
объектов имеет разные наборы столбцов? (если так вы можете создавать атрибуты «на лету», когда сталкиваетесь с новым столбцом, но вам, вероятно, следует кэшировать атрибуты, которые вы где-то создали).
Надеюсь, это поможет,
Найл (автор CQEngine)