the-algorithm/src/java/com/twitter/search/common/search/AndNotDocIdSetIterator.java
twitter-team ef4c5eb65e Twitter Recommendation Algorithm
Please note we have force-pushed a new initial commit in order to remove some publicly-available Twitter user information. Note that this process may be required in the future.
2023-03-31 17:36:31 -05:00

72 lines
1.7 KiB
Java

package com.twitter.search.common.search;
import java.io.IOException;
import org.apache.lucene.search.DocIdSetIterator;
public class AndNotDocIdSetIterator extends DocIdSetIterator {
private int nextDelDoc;
private final DocIdSetIterator baseIter;
private final DocIdSetIterator notIter;
private int currID;
/** Creates a new AndNotDocIdSetIterator instance. */
public AndNotDocIdSetIterator(DocIdSetIterator baseIter, DocIdSetIterator notIter)
throws IOException {
nextDelDoc = notIter.nextDoc();
this.baseIter = baseIter;
this.notIter = notIter;
currID = -1;
}
@Override
public int advance(int target) throws IOException {
currID = baseIter.advance(target);
if (currID == DocIdSetIterator.NO_MORE_DOCS) {
return currID;
}
if (nextDelDoc != DocIdSetIterator.NO_MORE_DOCS) {
if (currID < nextDelDoc) {
return currID;
} else if (currID == nextDelDoc) {
return nextDoc();
} else {
nextDelDoc = notIter.advance(currID);
if (currID == nextDelDoc) {
return nextDoc();
}
}
}
return currID;
}
@Override
public int docID() {
return currID;
}
@Override
public int nextDoc() throws IOException {
currID = baseIter.nextDoc();
if (nextDelDoc != DocIdSetIterator.NO_MORE_DOCS) {
while (currID != DocIdSetIterator.NO_MORE_DOCS) {
if (currID < nextDelDoc) {
return currID;
} else {
if (currID == nextDelDoc) {
currID = baseIter.nextDoc();
}
nextDelDoc = notIter.advance(currID);
}
}
}
return currID;
}
@Override
public long cost() {
return baseIter.cost();
}
}