1.1 --- a/iixr/terms.py Mon Feb 14 00:44:57 2011 +0100
1.2 +++ b/iixr/terms.py Mon Feb 14 01:53:57 2011 +0100
1.3 @@ -381,18 +381,38 @@
1.4 self.reader = reader
1.5 self.index_reader = index_reader
1.6 self.records = list(index_reader)
1.7 + self.terms = [t for t, dp in self.records]
1.8 +
1.9 + # Cache the last term and positions.
1.10 +
1.11 + self.last_term = None
1.12 + self.last_positions = None
1.13
1.14 def go_to_term(self, term):
1.15
1.16 + """
1.17 + Return the 'term' and positions or nearest following term and positions.
1.18 + """
1.19 +
1.20 + if self.last_term == term:
1.21 + return self.last_term, self.last_positions
1.22 +
1.23 # Get the record providing a term less than or equal to the requested
1.24 # term, getting the first entry if no such records exist.
1.25
1.26 - i = max(0, bisect_right(self.records, (term, None)) - 1)
1.27 - t, offset = self.records[i]
1.28 + after = bisect_right(self.terms, term)
1.29 + before = max(0, after - 1)
1.30 +
1.31 + t, offset = self.records[before]
1.32 + terms_after = self.terms[after:]
1.33
1.34 # Seek to the corresponding record in the information file.
1.35 + # Only do this if the term is more quickly reached by seeking.
1.36
1.37 - self.reader.seek(offset)
1.38 + if term <= t or self.last_term is None or term <= self.last_term or \
1.39 + self.last_term < t or terms_after and terms_after[0] <= self.last_term:
1.40 +
1.41 + self.reader.seek(offset)
1.42
1.43 # Where the found term is equal or greater, just read the positions for
1.44 # the index entry.
1.45 @@ -426,7 +446,8 @@
1.46 return self
1.47
1.48 def next(self):
1.49 - return self.reader.next()
1.50 + self.last_term, self.last_positions = t = self.reader.next()
1.51 + return t
1.52
1.53 def close(self):
1.54 if self.reader is not None: