@Override protected Query doToQuery(QueryShardContext context) { if (values.isEmpty()) { return Queries.newMatchNoDocsQuery("No terms supplied for \"" + getName() + "\" query."); } // Fail before we attempt to create the term queries: if (values.size() > BooleanQuery.getMaxClauseCount()) { throw new BooleanQuery.TooManyClauses(); } List<Query> queries = createTermQueries(context); LongValuesSource longValuesSource = createValuesSource(context); return new CoveringQuery(queries, longValuesSource); }
@Override public boolean equals(Object obj) { if (sameClassAs(obj) == false) { return false; } CoveringQuery that = (CoveringQuery) obj; return hashCode == that.hashCode // not necessary but makes equals faster && Objects.equals(queries, that.queries) && Objects.equals(minimumNumberMatch, that.minimumNumberMatch); }
private int computeHashCode() { int h = classHash(); h = 31 * h + queries.hashCode(); h = 31 * h + minimumNumberMatch.hashCode(); return h; }
/** * Sole constructor. * @param queries Sub queries to match. * @param minimumNumberMatch Per-document long value that records how many queries * should match. Values that are less than 1 are treated * like <tt>1</tt>: only documents that have at least one * matching clause will be considered matches. Documents * that do not have a value for <tt>minimumNumberMatch</tt> * do not match. */ public CoveringQuery(Collection<Query> queries, LongValuesSource minimumNumberMatch) { if (queries.size() > BooleanQuery.getMaxClauseCount()) { throw new BooleanQuery.TooManyClauses(); } if (minimumNumberMatch.needsScores()) { throw new IllegalArgumentException("The minimum number of matches may not depend on the score."); } this.queries = new Multiset<>(); this.queries.addAll(queries); this.minimumNumberMatch = Objects.requireNonNull(minimumNumberMatch); this.hashCode = computeHashCode(); }
@Override protected Query doToQuery(QueryShardContext context) { if (values.isEmpty()) { return Queries.newMatchNoDocsQuery("No terms supplied for \"" + getName() + "\" query."); } // Fail before we attempt to create the term queries: if (values.size() > BooleanQuery.getMaxClauseCount()) { throw new BooleanQuery.TooManyClauses(); } List<Query> queries = createTermQueries(context); LongValuesSource longValuesSource = createValuesSource(context); return new CoveringQuery(queries, longValuesSource); }
@Override protected Query doToQuery(QueryShardContext context) { if (values.isEmpty()) { return Queries.newMatchNoDocsQuery("No terms supplied for \"" + getName() + "\" query."); } // Fail before we attempt to create the term queries: if (values.size() > BooleanQuery.getMaxClauseCount()) { throw new BooleanQuery.TooManyClauses(); } List<Query> queries = createTermQueries(context); LongValuesSource longValuesSource = createValuesSource(context); return new CoveringQuery(queries, longValuesSource); }
@Override public Query rewrite(IndexReader reader) throws IOException { Multiset<Query> rewritten = new Multiset<>(); boolean actuallyRewritten = false; for (Query query : queries) { Query r = query.rewrite(reader); rewritten.add(r); actuallyRewritten |= query != r; } if (actuallyRewritten) { return new CoveringQuery(rewritten, minimumNumberMatch); } return super.rewrite(reader); }
subQueries.add(new TermQuery(new Term(queryTermsField.name(), extractedTerm))); candidateQuery.add(new CoveringQuery(subQueries, valuesSource), BooleanClause.Occur.SHOULD); } else { candidateQuery.add(new TermInSetQuery(queryTermsField.name(), extractedTerms), BooleanClause.Occur.SHOULD);
subQueries.add(new TermQuery(new Term(queryTermsField.name(), extractedTerm))); candidateQuery.add(new CoveringQuery(subQueries, valuesSource), BooleanClause.Occur.SHOULD); } else { candidateQuery.add(new TermInSetQuery(queryTermsField.name(), extractedTerms), BooleanClause.Occur.SHOULD);