Changeset 371
- Timestamp:
- 01/19/06 18:41:23 (3 years ago)
- Files:
-
- reposearchplugin/0.9/tracreposearch/indexer.py (modified) (9 diffs)
- reposearchplugin/0.9/tracreposearch/search.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
reposearchplugin/0.9/tracreposearch/indexer.py
r369 r371 22 22 from sets import Set as set 23 23 24 class dbdict(object): 25 """ Wrapper around anydbm to transparently allow lists to be stored as 26 values. """ 24 class psetdict(object): 25 """ Wrapper around anydbm to persistently store a dictionary of sets. """ 27 26 28 27 def __init__(self, file, mode): … … 33 32 34 33 def __getitem__(self, key): 35 return se lf.dbm[key].split(pathsep)34 return set(self.dbm[key].split(pathsep)) 36 35 37 36 def __setitem__(self, key, value): … … 51 50 52 51 def acquire_lock(): 52 # This is not ideal... 53 53 global index_lock, lock_count 54 54 lock_count += 1 … … 101 101 102 102 def _open_storage(self, mode): 103 # Stores meta information; last repo version, include list, etc. 103 104 self.meta = anydbm.open(os.path.join(self.index_dir, 'meta.db'), mode) 104 self.words = dbdict(os.path.join(self.index_dir, 'words.db'), mode) 105 self.bigrams = dbdict(os.path.join(self.index_dir, 'bigrams.db'), mode) 105 # word:file mapping 106 self.words = psetdict(os.path.join(self.index_dir, 'words.db'), mode) 107 # bigram:word mapping 108 self.bigrams = psetdict(os.path.join(self.index_dir, 'bigrams.db'), mode) 109 # file:rev mapping 110 self.revs = anydbm.open(os.path.join(self.index_dir, 'revs.db'), mode) 111 # file:words mapping 112 self.files = psetdict(os.path.join(self.index_dir, 'files.db'), mode) 113 # Probably need a word:bigram mapping table as well :\ 106 114 _open_storage = synchronized(_open_storage) 107 115 … … 117 125 self.words.sync() 118 126 self.bigrams.sync() 127 self.revs.sync() 128 self.files.sync() 119 129 sync = synchronized(sync) 120 130 … … 130 140 131 141 def _bigram_search(self, bigrams): 132 """ Find all words matching bigrams. """142 """ Find all words containing matching bigrams. """ 133 143 first_hit = 1 134 144 words = set() … … 136 146 if bigram in self.bigrams: 137 147 if first_hit: 138 words = se t(self.bigrams[bigram])148 words = self.bigrams[bigram] 139 149 first_hit = 0 140 150 else: … … 152 162 yield token.group().lower() 153 163 164 node_words = set() 154 165 for word in node_tokens(): 155 166 if len(word) >= self.minimum_word_length: … … 171 182 else: 172 183 self.words[word] = [node.path] 184 node_words.add(word) 185 self.files[node.path] = node_words 186 self.revs[node.path] = str(node.rev) 173 187 reindex_node = synchronized(reindex_node) 174 188 175 189 def reindex(self, repo = None): 190 """ Reindex the repository if necessary. """ 176 191 repo = repo or self.env.get_repository() 177 192 178 193 if self.need_reindex(repo): 179 194 self.env.log.debug('Indexing repository (either repository or indexing criteria have changed)') 180 self._open_storage(' n')195 self._open_storage('c') 181 196 for node in TracRepoSearchPlugin(self.env).walk_repo(repo): 182 197 if node.kind != Node.DIRECTORY: 183 self.reindex_node(node) 198 # Node has changed? 199 if int(self.revs.get(node.path, -1)) != node.rev: 200 self.env.log.debug("Reindexing %s" % node.path) 201 # Invalidate old index 202 if node.path in self.files: 203 for word in self.files[node.path]: 204 word_files = self.words[word] 205 word_files.discard(node.path) 206 self.words[word] = word_files 207 self.reindex_node(node) 184 208 185 209 self.sync(repo) reposearchplugin/0.9/tracreposearch/search.py
r368 r371 100 100 change = repo.get_changeset(node.rev) 101 101 if node.kind == Node.DIRECTORY: 102 yield (self.env.href.browser( path),103 path, change.date, change.author,102 yield (self.env.href.browser(node.path), 103 node.path, change.date, change.author, 104 104 'Directory') 105 105 else:
