aboutsummaryrefslogtreecommitdiffstats
path: root/predicate-search/src/main/java/com/yahoo/search/predicate/index/MultiIntervalPostingList.java
diff options
context:
space:
mode:
Diffstat (limited to 'predicate-search/src/main/java/com/yahoo/search/predicate/index/MultiIntervalPostingList.java')
-rw-r--r--predicate-search/src/main/java/com/yahoo/search/predicate/index/MultiIntervalPostingList.java67
1 files changed, 67 insertions, 0 deletions
diff --git a/predicate-search/src/main/java/com/yahoo/search/predicate/index/MultiIntervalPostingList.java b/predicate-search/src/main/java/com/yahoo/search/predicate/index/MultiIntervalPostingList.java
new file mode 100644
index 00000000000..1811f11b621
--- /dev/null
+++ b/predicate-search/src/main/java/com/yahoo/search/predicate/index/MultiIntervalPostingList.java
@@ -0,0 +1,67 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.predicate.index;
+
+import com.yahoo.search.predicate.utils.PostingListSearch;
+
+/**
+ * Shared implementation for posting lists that may have multiple intervals.
+ * @author <a href="mailto:magnarn@yahoo-inc.com">Magnar Nedland</a>
+ * @author bjorncs
+ */
+public abstract class MultiIntervalPostingList implements PostingList {
+ private final int[] docIds;
+ private final int[] dataRefs;
+ private final long subquery;
+ private final int length;
+ private int currentIndex;
+ private int currentDocId;
+
+ public MultiIntervalPostingList(int[] docIds, int[] dataRefs, long subquery) {
+ this.docIds = docIds;
+ this.dataRefs = dataRefs;
+ this.subquery = subquery;
+ this.length = docIds.length;
+ this.currentIndex = 0;
+ this.currentDocId = -1;
+ }
+
+ @Override
+ public final boolean nextDocument(int docId) {
+ int index = currentIndex;
+ index = PostingListSearch.interpolationSearch(docIds, index, length, docId);
+ if (index == length) {
+ return false;
+ }
+ this.currentDocId = docIds[index];
+ this.currentIndex = index;
+ assert currentDocId > docId;
+ return true;
+ }
+
+ @Override
+ public final boolean prepareIntervals() {
+ return prepareIntervals(dataRefs[currentIndex]);
+ }
+
+ protected abstract boolean prepareIntervals(int dataRef);
+
+ @Override
+ public final int size() {
+ return length;
+ }
+
+ @Override
+ public final int getDocId() {
+ return currentDocId;
+ }
+
+ @Override
+ public final int[] getDocIds() {
+ return docIds;
+ }
+
+ @Override
+ public final long getSubquery() {
+ return subquery;
+ }
+}