Используйте Boost multi_index для комбинированных ключей - PullRequest
1 голос
/ 28 сентября 2019

Как я могу использовать Boost multi_index для объединения трех ключей в одно выражение запроса?Рассмотрим следующую структуру индекса:

struct indexItems {
    uint64_t x; // assume non-unique index
    std::string y; // assume unique within x
    std::string z; // assume unique within y
};

Допустим, я хочу запросить элементы с использованием двоичного оператора AND: x = 1 AND y = "a" AND z = "s".Как я могу это сделать?

Все запросы и вставки будут использовать комбинацию x + y + z для вставки, обновления и удаления элементов из multi_index.Кроме того, мне нужно перебрать y и z, отсортированные по x.

Приведенные мною примеры касаются только отдельных индексов.

1 Ответ

1 голос
/ 28 сентября 2019

Вам на самом деле не нужен multi_index_container для этого.Вы можете сделать это:

inline bool operator<(const indexItems& l, const indexItems& r) {
    return std::tie(l.x, l.y, l.z) < std::tie(r.x, r.y, r.z);
}

inline bool operator==(const indexItems& l, const indexItems& r) {
    return std::tie(l.x, l.y, l.z) == std::tie(r.x, r.y, r.z);
}

std::set<indexItems> items; // or use map with any second type

Теперь у вас есть набор данных, упорядоченный сначала по x, затем по y, затем по z.Для запроса x=1 AND y="a" AND z="s":

items.find(indexItems{1, "a", "s"});

Чтобы перебрать все значения, отсортированные по x (вторично отсортированные по y и z, хотя это на самом деле не требуется, это тоже не повредит):

for (const indexItems& item : items)
    // ...

В качестве бонуса, если вы хотите найти все значения в некотором диапазоне x:

auto it = items.lower_bound(indexItems{100});
auto end = items.upper_bound(indexItems{105});
for (; it != end; ++it)
    // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...