def _compile_query(self, ixreader): from whoosh.fields import NUMERIC from whoosh.support.numeric import tiered_ranges field = ixreader.schema[self.fieldname] if not isinstance(field, NUMERIC): raise Exception("NumericRange: field %r is not numeric" % self.fieldname) start = field.prepare_number(self.start) end = field.prepare_number(self.end) subqueries = [] # Get the term ranges for the different resolutions for starttext, endtext in tiered_ranges(field.type, field.signed, start, end, field.shift_step, self.startexcl, self.endexcl): if starttext == endtext: subq = terms.Term(self.fieldname, starttext) else: subq = TermRange(self.fieldname, starttext, endtext) subqueries.append(subq) if len(subqueries) == 1: q = subqueries[0] elif subqueries: q = nary.Or(subqueries, boost=self.boost) else: return qcore.NullQuery if self.constantscore: q = wrappers.ConstantScoreQuery(q, self.boost) return q
def _compile_query(self, ixreader): from whoosh.fields import NUMERIC from whoosh.util.numeric import tiered_ranges field = ixreader.schema[self.fieldname] if not isinstance(field, NUMERIC): raise Exception("NumericRange: field %r is not numeric" % self.fieldname) start = self.start if start is not None: start = field.prepare_number(start) end = self.end if end is not None: end = field.prepare_number(end) subqueries = [] stb = field.sortable_to_bytes # Get the term ranges for the different resolutions ranges = tiered_ranges( field.numtype, field.bits, field.signed, start, end, field.shift_step, self.startexcl, self.endexcl, ) for startnum, endnum, shift in ranges: if startnum == endnum: subq = terms.Term(self.fieldname, stb(startnum, shift)) else: startbytes = stb(startnum, shift) endbytes = stb(endnum, shift) subq = TermRange(self.fieldname, startbytes, endbytes) subqueries.append(subq) if len(subqueries) == 1: q = subqueries[0] elif subqueries: q = compound.Or(subqueries, boost=self.boost) else: return qcore.NullQuery if self.constantscore: q = wrappers.ConstantScoreQuery(q, self.boost) return q