From 0768947f946cfe41e0782c44ff255248f08b6624 Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Sat, 30 Dec 2017 16:47:22 +1300 Subject: [PATCH] Rejig honey valuestats keys The keys are mostly the same size (the odd case is shorter) but they now sort in the same order as the value slot numbers --- xapian-core/backends/honey/honey_compact.cc | 19 +++++++++++++++++-- xapian-core/backends/honey/honey_values.cc | 14 ++------------ xapian-core/backends/honey/honey_version.cc | 5 +++-- xapian-core/common/pack.h | 22 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/xapian-core/backends/honey/honey_compact.cc b/xapian-core/backends/honey/honey_compact.cc index 138507c65..2cb60de5e 100644 --- a/xapian-core/backends/honey/honey_compact.cc +++ b/xapian-core/backends/honey/honey_compact.cc @@ -111,7 +111,7 @@ namespace HoneyCompact { enum { KEY_USER_METADATA = 0x00, - KEY_VALUE_STATS = 0xd0, + KEY_VALUE_STATS = 0x01, KEY_VALUE_CHUNK = 0xd8, KEY_DOCLEN_CHUNK = 0xe0, KEY_POSTING_CHUNK = 0xff @@ -127,6 +127,11 @@ key_type(const string& key) if (key.size() <= 1) return -1; + switch (static_cast(key[1])) { + case 0x01: case 0x02: case 0x03: case 0x04: + return KEY_VALUE_STATS; + } + // If key[1] is \xff then this correctly returns KEY_POSTING_CHUNK. return static_cast(key[1]); } @@ -294,7 +299,17 @@ class PostlistCursor : private GlassCursor { key[1] = KEY_USER_METADATA; return true; } - if (GlassCompact::is_valuestats_key(key)) return true; + if (GlassCompact::is_valuestats_key(key)) { + // Adjust key. + const char * p = key.data(); + const char * end = p + key.length(); + p += 2; + Xapian::valueno slot; + if (!unpack_uint_last(&p, end, &slot)) + throw Xapian::DatabaseCorruptError("bad value stats key"); + key = pack_honey_valuestats_key(slot); + return true; + } if (GlassCompact::is_valuechunk_key(key)) { const char * p = key.data(); const char * end = p + key.length(); diff --git a/xapian-core/backends/honey/honey_values.cc b/xapian-core/backends/honey/honey_values.cc index b4f01e861..b797869a8 100644 --- a/xapian-core/backends/honey/honey_values.cc +++ b/xapian-core/backends/honey/honey_values.cc @@ -60,16 +60,6 @@ make_slot_key(Xapian::docid did) RETURN(key); } -/** Generate a key for a value statistics item. */ -inline string -make_valuestats_key(Xapian::valueno slot) -{ - LOGCALL_STATIC(DB, string, "make_valuestats_key", slot); - string key("\0\xd0", 2); - pack_uint_last(key, slot); - RETURN(key); -} - void ValueChunkReader::assign(const char * p_, size_t len, Xapian::docid did_) { @@ -550,7 +540,7 @@ HoneyValueManager::get_value_stats(Xapian::valueno slot, ValueStats & stats) con LOGCALL_VOID(DB, "HoneyValueManager::get_value_stats", slot | Literal("[stats]")); string tag; - if (postlist_table.get_exact_entry(make_valuestats_key(slot), tag)) { + if (postlist_table.get_exact_entry(pack_honey_valuestats_key(slot), tag)) { const char * pos = tag.data(); const char * end = pos + tag.size(); @@ -579,7 +569,7 @@ HoneyValueManager::set_value_stats(map & value_stat LOGCALL_VOID(DB, "HoneyValueManager::set_value_stats", value_stats); map::const_iterator i; for (i = value_stats.begin(); i != value_stats.end(); ++i) { - string key = make_valuestats_key(i->first); + string key = pack_honey_valuestats_key(i->first); const ValueStats & stats = i->second; if (stats.freq != 0) { string new_value; diff --git a/xapian-core/backends/honey/honey_version.cc b/xapian-core/backends/honey/honey_version.cc index d34d68181..5a2c6e835 100644 --- a/xapian-core/backends/honey/honey_version.cc +++ b/xapian-core/backends/honey/honey_version.cc @@ -50,8 +50,9 @@ using namespace std; /// Honey format version (date of change): -#define HONEY_FORMAT_VERSION DATE_TO_VERSION(2017,12,29) -// 2017,12,29 1.5.0 User metadata key changes +#define HONEY_FORMAT_VERSION DATE_TO_VERSION(2017,12,30) +// 2017,12,30 1.5.0 Value stats key changes +// 2017,12,29 User metadata key changes // 2017,12,5 New Honey backend /// Convert date <-> version number. Dates up to 2141-12-31 fit in 2 bytes. diff --git a/xapian-core/common/pack.h b/xapian-core/common/pack.h index abdb87ddf..7de300e68 100644 --- a/xapian-core/common/pack.h +++ b/xapian-core/common/pack.h @@ -512,4 +512,26 @@ pack_honey_postlist_key(const std::string& term, Xapian::docid did) return key; } +inline std::string +pack_honey_valuestats_key(Xapian::valueno slot) +{ + char data[6]; + data[0] = '\0'; + int l = 1; + if (slot >= 0x100) { + if (slot >= 0x10000) { + if (slot >= 0x1000000) { + data[++l] = char(slot >> 24); + } + data[++l] = char(slot >> 16); + } + data[++l] = char(slot >> 8); + } + data[++l] = char(slot); + data[1] = l - 1; + // Prune trailing zero bytes. + while (data[l] == 0) --l; + return std::string(data, l + 1); +} + #endif // XAPIAN_INCLUDED_PACK_H -- 2.11.4.GIT