mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-02-23 21:18:58 +00:00
Index query builder automatically ignores redundant predicates.
This commit is contained in:
parent
1e4157017d
commit
105d93cd85
@ -2,6 +2,10 @@ package nu.marginalia.index.query;
|
||||
|
||||
import nu.marginalia.index.query.filter.QueryFilterStepIf;
|
||||
|
||||
/** Builds a query.
|
||||
* <p />
|
||||
* Note: The query builder may omit predicates that are deemed redundant.
|
||||
*/
|
||||
public interface IndexQueryBuilder {
|
||||
/** Filters documents that also contain termId, within the full index.
|
||||
*/
|
||||
|
@ -1,5 +1,6 @@
|
||||
package nu.marginalia.index.index;
|
||||
|
||||
import gnu.trove.set.hash.TIntHashSet;
|
||||
import nu.marginalia.index.priority.ReverseIndexPriorityReader;
|
||||
import nu.marginalia.index.query.IndexQuery;
|
||||
import nu.marginalia.index.query.IndexQueryBuilder;
|
||||
@ -14,18 +15,39 @@ public class SearchIndexQueryBuilder implements IndexQueryBuilder {
|
||||
private final ReverseIndexFullReader reverseIndexFullReader;
|
||||
private final ReverseIndexPriorityReader reverseIndexPrioReader;
|
||||
|
||||
/* Keep track of already added include terms to avoid redundant checks.
|
||||
*
|
||||
* Warning: This may cause unexpected behavior if for example attempting to
|
||||
* first check one index and then another for the same term. At the moment, that
|
||||
* makes no sense, but in the future, that might be a thing one might want to do.
|
||||
* */
|
||||
private final TIntHashSet alreadyConsideredTerms = new TIntHashSet();
|
||||
|
||||
SearchIndexQueryBuilder(ReverseIndexFullReader reverseIndexFullReader,
|
||||
ReverseIndexPriorityReader reverseIndexPrioReader,
|
||||
IndexQuery query)
|
||||
IndexQuery query, int... sourceTerms)
|
||||
{
|
||||
this.query = query;
|
||||
this.reverseIndexFullReader = reverseIndexFullReader;
|
||||
this.reverseIndexPrioReader = reverseIndexPrioReader;
|
||||
|
||||
alreadyConsideredTerms.addAll(sourceTerms);
|
||||
}
|
||||
|
||||
public IndexQueryBuilder alsoFull(int termId) {
|
||||
|
||||
query.addInclusionFilter(reverseIndexFullReader.also(termId));
|
||||
if (alreadyConsideredTerms.add(termId)) {
|
||||
query.addInclusionFilter(reverseIndexFullReader.also(termId));
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public IndexQueryBuilder alsoPrio(int termId) {
|
||||
|
||||
if (alreadyConsideredTerms.add(termId)) {
|
||||
query.addInclusionFilter(reverseIndexPrioReader.also(termId));
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
@ -38,12 +60,17 @@ public class SearchIndexQueryBuilder implements IndexQueryBuilder {
|
||||
step = QueryFilterStepIf.noPass();
|
||||
}
|
||||
else if (termIds.length == 1) {
|
||||
step = reverseIndexPrioReader.also(termIds[0]);
|
||||
return alsoPrio(termIds[0]);
|
||||
}
|
||||
else {
|
||||
var steps = IntStream.of(termIds)
|
||||
.filter(alreadyConsideredTerms::add)
|
||||
.mapToObj(reverseIndexPrioReader::also)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (steps.isEmpty())
|
||||
return this;
|
||||
|
||||
step = QueryFilterStepIf.anyOf(steps);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user