def _luceneQuery(self, prefix, sets=None, setsMask=None, partition=None): query = BooleanQuery() if prefix: query.add(TermQuery(Term(PREFIX_FIELD, prefix)), BooleanClause.Occur.MUST) if sets: setQuery = BooleanQuery() for setSpec in sets: setQuery.add(TermQuery(Term(SETS_FIELD, setSpec)), BooleanClause.Occur.SHOULD) query.add(setQuery, BooleanClause.Occur.MUST) for set_ in setsMask or []: query.add(TermQuery(Term(SETS_FIELD, set_)), BooleanClause.Occur.MUST) if partition: partitionQueries = [] for start, stop in partition.ranges(): partitionQueries.append(NumericRangeQuery.newIntRange(HASH_FIELD, start, stop, True, False)) if len(partitionQueries) == 1: pQuery = partitionQueries[0] else: pQuery = BooleanQuery() for q in partitionQueries: pQuery.add(q, BooleanClause.Occur.SHOULD) query.add(pQuery, BooleanClause.Occur.MUST) if query.clauses().size() == 0: query.add(MatchAllDocsQuery(), BooleanClause.Occur.MUST) return query