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;
|
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 {
|
public interface IndexQueryBuilder {
|
||||||
/** Filters documents that also contain termId, within the full index.
|
/** Filters documents that also contain termId, within the full index.
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package nu.marginalia.index.index;
|
package nu.marginalia.index.index;
|
||||||
|
|
||||||
|
import gnu.trove.set.hash.TIntHashSet;
|
||||||
import nu.marginalia.index.priority.ReverseIndexPriorityReader;
|
import nu.marginalia.index.priority.ReverseIndexPriorityReader;
|
||||||
import nu.marginalia.index.query.IndexQuery;
|
import nu.marginalia.index.query.IndexQuery;
|
||||||
import nu.marginalia.index.query.IndexQueryBuilder;
|
import nu.marginalia.index.query.IndexQueryBuilder;
|
||||||
@ -14,18 +15,39 @@ public class SearchIndexQueryBuilder implements IndexQueryBuilder {
|
|||||||
private final ReverseIndexFullReader reverseIndexFullReader;
|
private final ReverseIndexFullReader reverseIndexFullReader;
|
||||||
private final ReverseIndexPriorityReader reverseIndexPrioReader;
|
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,
|
SearchIndexQueryBuilder(ReverseIndexFullReader reverseIndexFullReader,
|
||||||
ReverseIndexPriorityReader reverseIndexPrioReader,
|
ReverseIndexPriorityReader reverseIndexPrioReader,
|
||||||
IndexQuery query)
|
IndexQuery query, int... sourceTerms)
|
||||||
{
|
{
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.reverseIndexFullReader = reverseIndexFullReader;
|
this.reverseIndexFullReader = reverseIndexFullReader;
|
||||||
this.reverseIndexPrioReader = reverseIndexPrioReader;
|
this.reverseIndexPrioReader = reverseIndexPrioReader;
|
||||||
|
|
||||||
|
alreadyConsideredTerms.addAll(sourceTerms);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndexQueryBuilder alsoFull(int termId) {
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
@ -38,12 +60,17 @@ public class SearchIndexQueryBuilder implements IndexQueryBuilder {
|
|||||||
step = QueryFilterStepIf.noPass();
|
step = QueryFilterStepIf.noPass();
|
||||||
}
|
}
|
||||||
else if (termIds.length == 1) {
|
else if (termIds.length == 1) {
|
||||||
step = reverseIndexPrioReader.also(termIds[0]);
|
return alsoPrio(termIds[0]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var steps = IntStream.of(termIds)
|
var steps = IntStream.of(termIds)
|
||||||
|
.filter(alreadyConsideredTerms::add)
|
||||||
.mapToObj(reverseIndexPrioReader::also)
|
.mapToObj(reverseIndexPrioReader::also)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (steps.isEmpty())
|
||||||
|
return this;
|
||||||
|
|
||||||
step = QueryFilterStepIf.anyOf(steps);
|
step = QueryFilterStepIf.anyOf(steps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user