2018-01-18 03:14:13 +01:00
|
|
|
// Matrix Construct
|
|
|
|
//
|
|
|
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
|
|
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
2018-02-04 03:22:01 +01:00
|
|
|
// copyright notice and this permission notice is present in all copies. The
|
|
|
|
// full license for this software is available in the LICENSE file.
|
2017-09-08 11:02:47 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
#define HAVE_IRCD_DB_INDEX_H
|
|
|
|
|
|
|
|
namespace ircd::db
|
|
|
|
{
|
2019-06-11 21:55:14 +02:00
|
|
|
struct domain;
|
2017-09-08 11:02:47 +02:00
|
|
|
}
|
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
/// An domain is a glorified column; the database descriptor for this column
|
|
|
|
/// must specify a prefix-extractor otherwise this domain just behaves like
|
|
|
|
/// a regular key/value column. domain is used to create iterable domains of
|
2017-09-28 03:24:55 +02:00
|
|
|
/// a column which all share the same key-prefix.
|
|
|
|
///
|
2019-06-11 21:55:14 +02:00
|
|
|
/// The domain allows a concatenation of two strings to form a key. This con-
|
2017-09-28 03:24:55 +02:00
|
|
|
/// catenated key is still unique for the column as a whole and is stored as
|
|
|
|
/// the full concatenation -- however, as stated above the prefix function must
|
|
|
|
/// be aware of how such a concatenation can be separated back into two
|
|
|
|
/// strings.
|
|
|
|
///
|
2019-06-11 21:55:14 +02:00
|
|
|
/// db::domain allows the user to query for either just the first string, or
|
2017-09-28 03:24:55 +02:00
|
|
|
/// the whole concatenation. In either case, the resulting iterator can move
|
|
|
|
/// only around the keys and values within the domain of that first string.
|
|
|
|
/// The iterator presents the user with it.first = second string only, thereby
|
|
|
|
/// hiding the prefix allowing for easier iteration of the domain.
|
|
|
|
///
|
2019-06-11 21:55:14 +02:00
|
|
|
/// domain is not good at reverse iteration due to limitations in RocksDB. Thus
|
2017-09-28 03:24:55 +02:00
|
|
|
/// it's better to just flip the comparator function for the column.
|
|
|
|
///
|
2019-06-11 21:55:14 +02:00
|
|
|
struct ircd::db::domain
|
2017-09-08 11:02:47 +02:00
|
|
|
:column
|
|
|
|
{
|
2017-09-22 12:31:44 +02:00
|
|
|
struct const_iterator_base;
|
2017-09-08 11:02:47 +02:00
|
|
|
struct const_iterator;
|
2017-09-22 12:31:44 +02:00
|
|
|
struct const_reverse_iterator;
|
2017-09-08 11:02:47 +02:00
|
|
|
|
|
|
|
using iterator_type = const_iterator;
|
|
|
|
using const_iterator_type = const_iterator;
|
|
|
|
|
2017-09-22 05:08:11 +02:00
|
|
|
static const gopts applied_opts;
|
|
|
|
|
2017-09-22 12:31:44 +02:00
|
|
|
const_iterator end(const string_view &key, gopts = {});
|
|
|
|
const_iterator begin(const string_view &key, gopts = {});
|
|
|
|
const_reverse_iterator rend(const string_view &key, gopts = {});
|
|
|
|
const_reverse_iterator rbegin(const string_view &key, gopts = {});
|
2017-09-08 11:02:47 +02:00
|
|
|
|
|
|
|
using column::column;
|
|
|
|
};
|
|
|
|
|
2019-02-16 22:25:18 +01:00
|
|
|
namespace ircd::db
|
|
|
|
{
|
2019-06-11 21:55:14 +02:00
|
|
|
bool seek(domain::const_iterator_base &, const string_view &);
|
|
|
|
bool seek(domain::const_iterator_base &, const pos &);
|
2019-02-16 22:25:18 +01:00
|
|
|
}
|
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
struct ircd::db::domain::const_iterator_base
|
2017-09-22 12:31:44 +02:00
|
|
|
:ircd::db::column::const_iterator_base
|
2017-09-08 11:02:47 +02:00
|
|
|
{
|
2019-06-11 21:55:14 +02:00
|
|
|
friend class domain;
|
2017-09-22 05:08:11 +02:00
|
|
|
|
2017-09-08 11:02:47 +02:00
|
|
|
const value_type &operator*() const;
|
|
|
|
const value_type *operator->() const;
|
|
|
|
|
2017-09-22 12:31:44 +02:00
|
|
|
using column::const_iterator_base::const_iterator_base;
|
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
friend bool seek(domain::const_iterator_base &, const string_view &);
|
|
|
|
friend bool seek(domain::const_iterator_base &, const pos &);
|
2017-09-22 12:31:44 +02:00
|
|
|
};
|
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
struct ircd::db::domain::const_iterator
|
|
|
|
:ircd::db::domain::const_iterator_base
|
2017-09-22 12:31:44 +02:00
|
|
|
{
|
2019-06-11 21:55:14 +02:00
|
|
|
friend class domain;
|
2017-09-22 12:31:44 +02:00
|
|
|
|
2017-09-22 05:08:11 +02:00
|
|
|
const_iterator &operator++();
|
|
|
|
const_iterator &operator--();
|
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
using domain::const_iterator_base::const_iterator_base;
|
2017-09-22 12:31:44 +02:00
|
|
|
};
|
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
struct ircd::db::domain::const_reverse_iterator
|
|
|
|
:ircd::db::domain::const_iterator_base
|
2017-09-22 12:31:44 +02:00
|
|
|
{
|
2019-06-11 21:55:14 +02:00
|
|
|
friend class domain;
|
2017-09-22 12:31:44 +02:00
|
|
|
|
|
|
|
const_reverse_iterator &operator++();
|
|
|
|
const_reverse_iterator &operator--();
|
2017-09-22 05:08:11 +02:00
|
|
|
|
2019-06-11 21:55:14 +02:00
|
|
|
using domain::const_iterator_base::const_iterator_base;
|
2017-09-08 11:02:47 +02:00
|
|
|
};
|
2020-09-22 03:45:08 +02:00
|
|
|
|
|
|
|
inline const ircd::db::domain::const_iterator_base::value_type *
|
|
|
|
ircd::db::domain::const_iterator_base::operator->()
|
|
|
|
const
|
|
|
|
{
|
|
|
|
return &this->operator*();
|
|
|
|
}
|