summaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/diskindex/docidmapper.h
diff options
context:
space:
mode:
Diffstat (limited to 'searchlib/src/vespa/searchlib/diskindex/docidmapper.h')
-rw-r--r--searchlib/src/vespa/searchlib/diskindex/docidmapper.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/searchlib/src/vespa/searchlib/diskindex/docidmapper.h b/searchlib/src/vespa/searchlib/diskindex/docidmapper.h
new file mode 100644
index 00000000000..43e1ea44b89
--- /dev/null
+++ b/searchlib/src/vespa/searchlib/diskindex/docidmapper.h
@@ -0,0 +1,91 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/util/array.h>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace search
+{
+
+class BitVector;
+
+namespace diskindex
+{
+
+typedef vespalib::Array<uint8_t, vespalib::DefaultAlloc> SelectorArray;
+
+class DocIdMapping
+{
+public:
+ uint32_t _docIdLimit;
+ const SelectorArray *_selector; // External ownership
+ uint8_t _selectorId;
+
+ DocIdMapping(void);
+
+ void
+ clear(void);
+
+ void
+ setup(uint32_t docIdLimit);
+
+ void
+ setup(uint32_t docIdLimit,
+ const SelectorArray *selector,
+ uint8_t selectorId);
+
+ bool
+ readDocIdLimit(const vespalib::string &dir);
+};
+
+
+class DocIdMapper
+{
+public:
+ const uint8_t *_selector;
+ uint32_t _docIdLimit; // Limit on legal input values
+ uint32_t _selectorLimit; // Limit on output
+ uint8_t _selectorId;
+
+ DocIdMapper(void)
+ : _selector(NULL),
+ _docIdLimit(0u),
+ _selectorLimit(0),
+ _selectorId(0u)
+ {
+ }
+
+ void
+ setup(const DocIdMapping &mapping)
+ {
+ _selector = (mapping._selector != NULL) ?
+ &((*mapping._selector)[0]) : NULL;
+ _docIdLimit = mapping._docIdLimit;
+ _selectorLimit = (mapping._selector != NULL) ?
+ (*mapping._selector).size() :
+ 0u;
+ _selectorId = mapping._selectorId;
+ }
+
+ static uint32_t
+ noDocId(void)
+ {
+ return static_cast<uint32_t>(-1);
+ }
+
+ uint32_t
+ mapDocId(uint32_t docId) const
+ {
+ assert(docId < _docIdLimit);
+ if (_selector != NULL &&
+ (docId >= _selectorLimit || _selector[docId] != _selectorId)) {
+ docId = noDocId();
+ }
+ return docId;
+ }
+};
+
+} // namespace diskindex
+
+} // namespace search
+