mirror of https://gitee.com/bigwinds/arangodb
Adding edge key into edge index
This commit is contained in:
parent
2006a53342
commit
3e8c16d1a7
|
@ -387,6 +387,7 @@ RocksDBEdgeIndex::RocksDBEdgeIndex(TRI_idx_iid_t iid,
|
|||
!ServerState::instance()->isCoordinator() /*useCache*/
|
||||
),
|
||||
_directionAttr(attr),
|
||||
_isFromIndex(attr == StaticStrings::FromString),
|
||||
_estimator(nullptr) {
|
||||
if (!ServerState::instance()->isCoordinator()) {
|
||||
// We activate the estimator only on DBServers
|
||||
|
@ -450,12 +451,16 @@ int RocksDBEdgeIndex::insert(transaction::Methods* trx,
|
|||
TRI_ASSERT(fromTo.isString());
|
||||
auto fromToRef = StringRef(fromTo);
|
||||
RocksDBKey key = RocksDBKey::EdgeIndexValue(_objectId, fromToRef, revisionId);
|
||||
VPackSlice toFrom = _isFromIndex ? doc.get(StaticStrings::ToString) : doc.get(StaticStrings::FromString);
|
||||
TRI_ASSERT(toFrom.isString());
|
||||
RocksDBValue value = RocksDBValue::EdgeIndexValue(StringRef(toFrom));
|
||||
|
||||
// blacklist key in cache
|
||||
blackListKey(fromToRef);
|
||||
|
||||
|
||||
// acquire rocksdb transaction
|
||||
RocksDBMethods* mthd = rocksutils::toRocksMethods(trx);
|
||||
Result r = mthd->Put(_cf, rocksdb::Slice(key.string()), rocksdb::Slice(),
|
||||
Result r = mthd->Put(_cf, rocksdb::Slice(key.string()), value.string(),
|
||||
rocksutils::index);
|
||||
if (r.ok()) {
|
||||
std::hash<StringRef> hasher;
|
||||
|
@ -480,6 +485,9 @@ int RocksDBEdgeIndex::remove(transaction::Methods* trx,
|
|||
auto fromToRef = StringRef(fromTo);
|
||||
TRI_ASSERT(fromTo.isString());
|
||||
RocksDBKey key = RocksDBKey::EdgeIndexValue(_objectId, fromToRef, revisionId);
|
||||
VPackSlice toFrom = _isFromIndex ? doc.get(StaticStrings::ToString) : doc.get(StaticStrings::FromString);
|
||||
TRI_ASSERT(toFrom.isString());
|
||||
RocksDBValue value = RocksDBValue::EdgeIndexValue(StringRef(toFrom));
|
||||
|
||||
// blacklist key in cache
|
||||
blackListKey(fromToRef);
|
||||
|
|
|
@ -184,6 +184,7 @@ class RocksDBEdgeIndex final : public RocksDBIndex {
|
|||
arangodb::aql::AstNode const* valNode) const;
|
||||
|
||||
std::string _directionAttr;
|
||||
bool _isFromIndex;
|
||||
|
||||
/// @brief A fixed size library to estimate the selectivity of the index.
|
||||
/// On insertion of a document we have to insert it into the estimator,
|
||||
|
|
|
@ -45,8 +45,8 @@ RocksDBValue RocksDBValue::PrimaryIndexValue(TRI_voc_rid_t revisionId) {
|
|||
return RocksDBValue(RocksDBEntryType::PrimaryIndexValue, revisionId);
|
||||
}
|
||||
|
||||
RocksDBValue RocksDBValue::EdgeIndexValue() {
|
||||
return RocksDBValue(RocksDBEntryType::EdgeIndexValue);
|
||||
RocksDBValue RocksDBValue::EdgeIndexValue(arangodb::StringRef const& vertexId) {
|
||||
return RocksDBValue(RocksDBEntryType::EdgeIndexValue, vertexId);
|
||||
}
|
||||
|
||||
RocksDBValue RocksDBValue::IndexValue() {
|
||||
|
@ -81,16 +81,8 @@ TRI_voc_rid_t RocksDBValue::revisionId(std::string const& s) {
|
|||
return revisionId(s.data(), s.size());
|
||||
}
|
||||
|
||||
StringRef RocksDBValue::primaryKey(RocksDBValue const& value) {
|
||||
return primaryKey(value._buffer.data(), value._buffer.size());
|
||||
}
|
||||
|
||||
StringRef RocksDBValue::primaryKey(rocksdb::Slice const& slice) {
|
||||
return primaryKey(slice.data(), slice.size());
|
||||
}
|
||||
|
||||
StringRef RocksDBValue::primaryKey(std::string const& s) {
|
||||
return primaryKey(s.data(), s.size());
|
||||
StringRef RocksDBValue::vertexId(rocksdb::Slice const& s) {
|
||||
return vertexId(s.data(), s.size());
|
||||
}
|
||||
|
||||
VPackSlice RocksDBValue::data(RocksDBValue const& value) {
|
||||
|
@ -141,12 +133,26 @@ RocksDBValue::RocksDBValue(RocksDBEntryType type, VPackSlice const& data)
|
|||
}
|
||||
}
|
||||
|
||||
RocksDBValue::RocksDBValue(RocksDBEntryType type, StringRef const& data)
|
||||
: _type(type), _buffer() {
|
||||
switch (_type) {
|
||||
case RocksDBEntryType::EdgeIndexValue: {
|
||||
_buffer.reserve(static_cast<size_t>(data.size()));
|
||||
_buffer.append(data.data(), data.size());
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
THROW_ARANGO_EXCEPTION(TRI_ERROR_BAD_PARAMETER);
|
||||
}
|
||||
}
|
||||
|
||||
TRI_voc_rid_t RocksDBValue::revisionId(char const* data, uint64_t size) {
|
||||
TRI_ASSERT(data != nullptr && size >= sizeof(uint64_t));
|
||||
return uint64FromPersistent(data);
|
||||
}
|
||||
|
||||
StringRef RocksDBValue::primaryKey(char const* data, size_t size) {
|
||||
StringRef RocksDBValue::vertexId(char const* data, size_t size) {
|
||||
TRI_ASSERT(data != nullptr);
|
||||
TRI_ASSERT(size >= sizeof(char));
|
||||
return StringRef(data, size);
|
||||
|
|
|
@ -49,7 +49,7 @@ class RocksDBValue {
|
|||
static RocksDBValue Collection(VPackSlice const& data);
|
||||
static RocksDBValue Document(VPackSlice const& data);
|
||||
static RocksDBValue PrimaryIndexValue(TRI_voc_rid_t revisionId);
|
||||
static RocksDBValue EdgeIndexValue();
|
||||
static RocksDBValue EdgeIndexValue(arangodb::StringRef const& vertexId);
|
||||
static RocksDBValue IndexValue();
|
||||
static RocksDBValue UniqueIndexValue(TRI_voc_rid_t revisionId);
|
||||
static RocksDBValue View(VPackSlice const& data);
|
||||
|
@ -72,14 +72,12 @@ class RocksDBValue {
|
|||
static TRI_voc_rid_t revisionId(std::string const&);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief Extracts the primary key (`_key`) from a value
|
||||
/// @brief Extracts the vertex _to or _from ID (`_key`) from a value
|
||||
///
|
||||
/// May be called only on UniqueIndexValue values. Other types will throw.
|
||||
/// May be called only on EdgeIndexValue values. Other types will throw.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
static StringRef primaryKey(RocksDBValue const&);
|
||||
static StringRef primaryKey(rocksdb::Slice const&);
|
||||
static StringRef primaryKey(std::string const&);
|
||||
|
||||
static StringRef vertexId(rocksdb::Slice const&);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief Extracts the VelocyPack data from a value
|
||||
///
|
||||
|
@ -111,11 +109,12 @@ class RocksDBValue {
|
|||
explicit RocksDBValue(RocksDBEntryType type);
|
||||
RocksDBValue(RocksDBEntryType type, uint64_t data);
|
||||
RocksDBValue(RocksDBEntryType type, VPackSlice const& data);
|
||||
RocksDBValue(RocksDBEntryType type, arangodb::StringRef const& data);
|
||||
|
||||
private:
|
||||
static RocksDBEntryType type(char const* data, size_t size);
|
||||
static TRI_voc_rid_t revisionId(char const* data, uint64_t size);
|
||||
static StringRef primaryKey(char const* data, size_t size);
|
||||
static StringRef vertexId(char const* data, size_t size);
|
||||
static VPackSlice data(char const* data, size_t size);
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in New Issue