mirror of
https://github.com/matrix-construct/construct
synced 2024-10-02 13:48:53 +02:00
ircd::db: Minor reorg; move db::index defs near db::column.
This commit is contained in:
parent
9c63e8e5dd
commit
a63f23fc2d
2 changed files with 190 additions and 190 deletions
|
@ -56,9 +56,9 @@ namespace ircd::db
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "opts.h"
|
#include "opts.h"
|
||||||
#include "column.h"
|
#include "column.h"
|
||||||
|
#include "index.h"
|
||||||
#include "cell.h"
|
#include "cell.h"
|
||||||
#include "row.h"
|
#include "row.h"
|
||||||
#include "index.h"
|
|
||||||
#include "json.h"
|
#include "json.h"
|
||||||
#include "txn.h"
|
#include "txn.h"
|
||||||
#include "stats.h"
|
#include "stats.h"
|
||||||
|
|
378
ircd/db.cc
378
ircd/db.cc
|
@ -4075,195 +4075,6 @@ ircd::db::txn::append::append(txn &t,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// db/index.h
|
|
||||||
//
|
|
||||||
|
|
||||||
const ircd::db::gopts
|
|
||||||
ircd::db::index::applied_opts
|
|
||||||
{
|
|
||||||
{ get::PREFIX }
|
|
||||||
};
|
|
||||||
|
|
||||||
bool
|
|
||||||
ircd::db::seek(index::const_iterator_base &it,
|
|
||||||
const pos &p)
|
|
||||||
{
|
|
||||||
switch(p)
|
|
||||||
{
|
|
||||||
case pos::BACK:
|
|
||||||
{
|
|
||||||
// This is inefficient as per RocksDB's prefix impl. unknown why
|
|
||||||
// a seek to NEXT is still needed after walking back one.
|
|
||||||
while(seek(it, pos::NEXT));
|
|
||||||
if(seek(it, pos::PREV))
|
|
||||||
seek(it, pos::NEXT);
|
|
||||||
|
|
||||||
return bool(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
it.opts |= index::applied_opts;
|
|
||||||
return seek(static_cast<column::const_iterator_base &>(it), p);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
ircd::db::seek(index::const_iterator_base &it,
|
|
||||||
const string_view &p)
|
|
||||||
{
|
|
||||||
it.opts |= index::applied_opts;
|
|
||||||
return seek(static_cast<column::const_iterator_base &>(it), p);
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::db::index::const_iterator
|
|
||||||
ircd::db::index::begin(const string_view &key,
|
|
||||||
gopts opts)
|
|
||||||
{
|
|
||||||
const_iterator ret
|
|
||||||
{
|
|
||||||
c, {}, std::move(opts)
|
|
||||||
};
|
|
||||||
|
|
||||||
seek(ret, key);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::db::index::const_iterator
|
|
||||||
ircd::db::index::end(const string_view &key,
|
|
||||||
gopts opts)
|
|
||||||
{
|
|
||||||
const_iterator ret
|
|
||||||
{
|
|
||||||
c, {}, std::move(opts)
|
|
||||||
};
|
|
||||||
|
|
||||||
if(seek(ret, key))
|
|
||||||
seek(ret, pos::END);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// NOTE: RocksDB says they don't support reverse iteration over a prefix range
|
|
||||||
/// This means we have to forward scan to the end and then walk back! Reverse
|
|
||||||
/// iterations of an index shoud only be used for debugging and statistics! The
|
|
||||||
/// index should be ordered the way it will be primarily accessed using the
|
|
||||||
/// comparator. If it will be accessed in different directions, make another
|
|
||||||
/// index column.
|
|
||||||
ircd::db::index::const_reverse_iterator
|
|
||||||
ircd::db::index::rbegin(const string_view &key,
|
|
||||||
gopts opts)
|
|
||||||
{
|
|
||||||
const_reverse_iterator ret
|
|
||||||
{
|
|
||||||
c, {}, std::move(opts)
|
|
||||||
};
|
|
||||||
|
|
||||||
if(seek(ret, key))
|
|
||||||
seek(ret, pos::BACK);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::db::index::const_reverse_iterator
|
|
||||||
ircd::db::index::rend(const string_view &key,
|
|
||||||
gopts opts)
|
|
||||||
{
|
|
||||||
const_reverse_iterator ret
|
|
||||||
{
|
|
||||||
c, {}, std::move(opts)
|
|
||||||
};
|
|
||||||
|
|
||||||
if(seek(ret, key))
|
|
||||||
seek(ret, pos::END);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// const_iterator
|
|
||||||
//
|
|
||||||
|
|
||||||
ircd::db::index::const_iterator &
|
|
||||||
ircd::db::index::const_iterator::operator--()
|
|
||||||
{
|
|
||||||
if(likely(bool(*this)))
|
|
||||||
seek(*this, pos::PREV);
|
|
||||||
else
|
|
||||||
seek(*this, pos::BACK);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::db::index::const_iterator &
|
|
||||||
ircd::db::index::const_iterator::operator++()
|
|
||||||
{
|
|
||||||
if(likely(bool(*this)))
|
|
||||||
seek(*this, pos::NEXT);
|
|
||||||
else
|
|
||||||
seek(*this, pos::FRONT);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::db::index::const_reverse_iterator &
|
|
||||||
ircd::db::index::const_reverse_iterator::operator--()
|
|
||||||
{
|
|
||||||
if(likely(bool(*this)))
|
|
||||||
seek(*this, pos::NEXT);
|
|
||||||
else
|
|
||||||
seek(*this, pos::FRONT);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::db::index::const_reverse_iterator &
|
|
||||||
ircd::db::index::const_reverse_iterator::operator++()
|
|
||||||
{
|
|
||||||
if(likely(bool(*this)))
|
|
||||||
seek(*this, pos::PREV);
|
|
||||||
else
|
|
||||||
seek(*this, pos::BACK);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ircd::db::index::const_iterator_base::value_type &
|
|
||||||
ircd::db::index::const_iterator_base::operator*()
|
|
||||||
const
|
|
||||||
{
|
|
||||||
const auto &prefix
|
|
||||||
{
|
|
||||||
describe(*c).prefix
|
|
||||||
};
|
|
||||||
|
|
||||||
// Fetch the full value like a standard column first
|
|
||||||
column::const_iterator_base::operator*();
|
|
||||||
string_view &key{val.first};
|
|
||||||
|
|
||||||
// When there's no prefixing this index column is just
|
|
||||||
// like a normal column. Otherwise, we remove the prefix
|
|
||||||
// from the key the user will end up seeing.
|
|
||||||
if(prefix.has && prefix.has(key))
|
|
||||||
{
|
|
||||||
const auto &first(prefix.get(key));
|
|
||||||
const auto &second(key.substr(first.size()));
|
|
||||||
key = second;
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ircd::db::index::const_iterator_base::value_type *
|
|
||||||
ircd::db::index::const_iterator_base::operator->()
|
|
||||||
const
|
|
||||||
{
|
|
||||||
return &this->operator*();
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// db/row.h
|
// db/row.h
|
||||||
|
@ -4979,6 +4790,195 @@ const
|
||||||
return bool(it) && db::valid(*it);
|
return bool(it) && db::valid(*it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// db/index.h
|
||||||
|
//
|
||||||
|
|
||||||
|
const ircd::db::gopts
|
||||||
|
ircd::db::index::applied_opts
|
||||||
|
{
|
||||||
|
{ get::PREFIX }
|
||||||
|
};
|
||||||
|
|
||||||
|
bool
|
||||||
|
ircd::db::seek(index::const_iterator_base &it,
|
||||||
|
const pos &p)
|
||||||
|
{
|
||||||
|
switch(p)
|
||||||
|
{
|
||||||
|
case pos::BACK:
|
||||||
|
{
|
||||||
|
// This is inefficient as per RocksDB's prefix impl. unknown why
|
||||||
|
// a seek to NEXT is still needed after walking back one.
|
||||||
|
while(seek(it, pos::NEXT));
|
||||||
|
if(seek(it, pos::PREV))
|
||||||
|
seek(it, pos::NEXT);
|
||||||
|
|
||||||
|
return bool(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
it.opts |= index::applied_opts;
|
||||||
|
return seek(static_cast<column::const_iterator_base &>(it), p);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
ircd::db::seek(index::const_iterator_base &it,
|
||||||
|
const string_view &p)
|
||||||
|
{
|
||||||
|
it.opts |= index::applied_opts;
|
||||||
|
return seek(static_cast<column::const_iterator_base &>(it), p);
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::index::const_iterator
|
||||||
|
ircd::db::index::begin(const string_view &key,
|
||||||
|
gopts opts)
|
||||||
|
{
|
||||||
|
const_iterator ret
|
||||||
|
{
|
||||||
|
c, {}, std::move(opts)
|
||||||
|
};
|
||||||
|
|
||||||
|
seek(ret, key);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::index::const_iterator
|
||||||
|
ircd::db::index::end(const string_view &key,
|
||||||
|
gopts opts)
|
||||||
|
{
|
||||||
|
const_iterator ret
|
||||||
|
{
|
||||||
|
c, {}, std::move(opts)
|
||||||
|
};
|
||||||
|
|
||||||
|
if(seek(ret, key))
|
||||||
|
seek(ret, pos::END);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// NOTE: RocksDB says they don't support reverse iteration over a prefix range
|
||||||
|
/// This means we have to forward scan to the end and then walk back! Reverse
|
||||||
|
/// iterations of an index shoud only be used for debugging and statistics! The
|
||||||
|
/// index should be ordered the way it will be primarily accessed using the
|
||||||
|
/// comparator. If it will be accessed in different directions, make another
|
||||||
|
/// index column.
|
||||||
|
ircd::db::index::const_reverse_iterator
|
||||||
|
ircd::db::index::rbegin(const string_view &key,
|
||||||
|
gopts opts)
|
||||||
|
{
|
||||||
|
const_reverse_iterator ret
|
||||||
|
{
|
||||||
|
c, {}, std::move(opts)
|
||||||
|
};
|
||||||
|
|
||||||
|
if(seek(ret, key))
|
||||||
|
seek(ret, pos::BACK);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::index::const_reverse_iterator
|
||||||
|
ircd::db::index::rend(const string_view &key,
|
||||||
|
gopts opts)
|
||||||
|
{
|
||||||
|
const_reverse_iterator ret
|
||||||
|
{
|
||||||
|
c, {}, std::move(opts)
|
||||||
|
};
|
||||||
|
|
||||||
|
if(seek(ret, key))
|
||||||
|
seek(ret, pos::END);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// const_iterator
|
||||||
|
//
|
||||||
|
|
||||||
|
ircd::db::index::const_iterator &
|
||||||
|
ircd::db::index::const_iterator::operator--()
|
||||||
|
{
|
||||||
|
if(likely(bool(*this)))
|
||||||
|
seek(*this, pos::PREV);
|
||||||
|
else
|
||||||
|
seek(*this, pos::BACK);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::index::const_iterator &
|
||||||
|
ircd::db::index::const_iterator::operator++()
|
||||||
|
{
|
||||||
|
if(likely(bool(*this)))
|
||||||
|
seek(*this, pos::NEXT);
|
||||||
|
else
|
||||||
|
seek(*this, pos::FRONT);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::index::const_reverse_iterator &
|
||||||
|
ircd::db::index::const_reverse_iterator::operator--()
|
||||||
|
{
|
||||||
|
if(likely(bool(*this)))
|
||||||
|
seek(*this, pos::NEXT);
|
||||||
|
else
|
||||||
|
seek(*this, pos::FRONT);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::db::index::const_reverse_iterator &
|
||||||
|
ircd::db::index::const_reverse_iterator::operator++()
|
||||||
|
{
|
||||||
|
if(likely(bool(*this)))
|
||||||
|
seek(*this, pos::PREV);
|
||||||
|
else
|
||||||
|
seek(*this, pos::BACK);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ircd::db::index::const_iterator_base::value_type &
|
||||||
|
ircd::db::index::const_iterator_base::operator*()
|
||||||
|
const
|
||||||
|
{
|
||||||
|
const auto &prefix
|
||||||
|
{
|
||||||
|
describe(*c).prefix
|
||||||
|
};
|
||||||
|
|
||||||
|
// Fetch the full value like a standard column first
|
||||||
|
column::const_iterator_base::operator*();
|
||||||
|
string_view &key{val.first};
|
||||||
|
|
||||||
|
// When there's no prefixing this index column is just
|
||||||
|
// like a normal column. Otherwise, we remove the prefix
|
||||||
|
// from the key the user will end up seeing.
|
||||||
|
if(prefix.has && prefix.has(key))
|
||||||
|
{
|
||||||
|
const auto &first(prefix.get(key));
|
||||||
|
const auto &second(key.substr(first.size()));
|
||||||
|
key = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ircd::db::index::const_iterator_base::value_type *
|
||||||
|
ircd::db::index::const_iterator_base::operator->()
|
||||||
|
const
|
||||||
|
{
|
||||||
|
return &this->operator*();
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// db/column.h
|
// db/column.h
|
||||||
|
|
Loading…
Reference in a new issue