Changeset 371

Show
Ignore:
Timestamp:
01/19/06 18:41:23 (3 years ago)
Author:
athomas
Message:

RepoSearchPlugin:

  • Added incremental indexing. Should be backwards compatible.
  • Fixed bug when matching directory names.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • reposearchplugin/0.9/tracreposearch/indexer.py

    r369 r371  
    2222    from sets import Set as set 
    2323 
    24 class dbdict(object): 
    25     """ Wrapper around anydbm to transparently allow lists to be stored as 
    26         values. """ 
     24class psetdict(object): 
     25    """ Wrapper around anydbm to persistently store a dictionary of sets. """ 
    2726 
    2827    def __init__(self, file, mode): 
     
    3332 
    3433    def __getitem__(self, key): 
    35        return self.dbm[key].split(pathsep
     34       return set(self.dbm[key].split(pathsep)
    3635 
    3736    def __setitem__(self, key, value): 
     
    5150 
    5251def acquire_lock(): 
     52    # This is not ideal... 
    5353    global index_lock, lock_count 
    5454    lock_count += 1 
     
    101101 
    102102    def _open_storage(self, mode): 
     103        # Stores meta information; last repo version, include list, etc. 
    103104        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 :\ 
    106114    _open_storage = synchronized(_open_storage) 
    107115 
     
    117125        self.words.sync() 
    118126        self.bigrams.sync() 
     127        self.revs.sync() 
     128        self.files.sync() 
    119129    sync = synchronized(sync) 
    120130 
     
    130140 
    131141    def _bigram_search(self, bigrams): 
    132         """ Find all words matching bigrams. """ 
     142        """ Find all words containing matching bigrams. """ 
    133143        first_hit = 1 
    134144        words = set() 
     
    136146            if bigram in self.bigrams: 
    137147                if first_hit: 
    138                     words = set(self.bigrams[bigram]) 
     148                    words = self.bigrams[bigram] 
    139149                    first_hit = 0 
    140150                else: 
     
    152162                yield token.group().lower() 
    153163 
     164        node_words = set() 
    154165        for word in node_tokens(): 
    155166            if len(word) >= self.minimum_word_length: 
     
    171182                else: 
    172183                    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) 
    173187    reindex_node = synchronized(reindex_node) 
    174188 
    175189    def reindex(self, repo = None): 
     190        """ Reindex the repository if necessary. """ 
    176191        repo = repo or self.env.get_repository() 
    177192 
    178193        if self.need_reindex(repo): 
    179194            self.env.log.debug('Indexing repository (either repository or indexing criteria have changed)') 
    180             self._open_storage('n') 
     195            self._open_storage('c') 
    181196            for node in TracRepoSearchPlugin(self.env).walk_repo(repo): 
    182197                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) 
    184208 
    185209            self.sync(repo) 
  • reposearchplugin/0.9/tracreposearch/search.py

    r368 r371  
    100100            change = repo.get_changeset(node.rev) 
    101101            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, 
    104104                       'Directory') 
    105105            else: