Changeset 1397:14ae3a40546e in orange-bioinformatics


Ignore:
Timestamp:
05/17/11 15:02:19 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
dcb39304dbc9474ddb2a92ff78ee69d017f4ea77
Message:

Caching intermediate filtering results.
Added some more characters to exclude in the search.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/OWGEODatasets.py

    r1380 r1397  
    1 """<name>GEO DataSets</name> 
     1"""<name>GEO Data Sets</name> 
    22<description>Access to Gene Expression Omnibus data sets.</description> 
    33<priority>20</priority> 
     
    7979        self._header[orientation][section][role] = value 
    8080         
     81from Orange.misc import lru_cache 
     82 
    8183class MySortFilterProxyModel(QSortFilterProxyModel):     
    8284    def __init__(self, parent=None): 
     
    8789        self._cache_prefix = {} 
    8890        self._row_text = {} 
    89      
    90 #    def setFilterFixedStrings(self, strings, op="AND"): 
    91 #        self._filter_strings = strings 
    92 #        for string in strings: 
    93 #            for row in range(self.sourceModel().rowCount()): 
    94 #                self._cache[row] 
    95 #        self._op = op 
    96 #        self.invalidate() 
     91         
     92        # Create a cached version of _filteredRows 
     93        self._filteredRows = lru_cache(100)(self._filteredRows)  
    9794 
    9895    def setSourceModel(self, model): 
     96        """ Set the source model for the filter 
     97        """  
    9998        self._filter_strings = [] 
    10099        self._cache = {} 
     
    105104         
    106105    def addFilterFixedString(self, string, invalidate=True): 
     106        """ Add `string` filter to the list of filters. If invalidate is 
     107        True the filter cache will be recomputed. 
     108        """ 
    107109        self._filter_strings.append(string) 
    108110        all_rows = range(self.sourceModel().rowCount()) 
     
    111113        if invalidate: 
    112114            self.updateCached() 
    113             self.invalidate() 
     115            self.invalidateFilter() 
    114116         
    115117    def removeFilterFixedString(self, index=-1, invalidate=True): 
    116         string = self._filter_strings.pop(index) 
    117         del self._cache[string] 
     118        """ Remove the `index`-th filter string. If invalidate is True the 
     119        filter cache will be recomputed. 
     120        """ 
     121        string = self._filter_strings.pop(index)  
     122        del self._cache[string]  
    118123        if invalidate: 
    119124            self.updateCached() 
    120             self.invalidate() 
     125            self.invalidateFilter() 
    121126             
    122127    def setFilterFixedStrings(self, strings): 
     128        """ Set a list of string to be the new filters. 
     129        """ 
    123130        s_time = time.time() 
    124131        to_remove = set(self._filter_strings) - set(strings) 
     
    130137            self.addFilterFixedString(str, invalidate=False) 
    131138        self.updateCached() 
    132         self.invalidate() 
    133              
     139        self.invalidateFilter() 
     140             
     141    def _filteredRows(self, filter_strings): 
     142        """ Return a dictionary mapping row indexes to True False values. 
     143        .. note:: This helper function is wrapped in the __init__ method.  
     144        """ 
     145        all_rows = range(self.sourceModel().rowCount()) 
     146        cache = self._cache 
     147        return dict([(row, all([cache[str][row] for str in filter_strings])) for row in all_rows]) 
     148     
    134149    def updateCached(self): 
    135         all_rows = range(self.sourceModel().rowCount()) 
    136         self._cache_fixed = dict([(row, all([self._cache[str][row] for str in self._filter_strings])) for row in all_rows]) 
     150        """ Update the combined filter cache. 
     151        """ 
     152        self._cache_fixed = self._filteredRows(tuple(sorted(self._filter_strings)))  
    137153         
    138154    def setFilterFixedString(self, string): 
     155        """Should this raise an error? It is not being used. 
     156        """ 
    139157        QSortFilterProxyModel.setFilterFixedString(self, string) 
    140158         
    141159    def rowFilterText(self, row): 
     160        """ Return text for `row` to filter on.  
     161        """ 
    142162        f_role = self.filterRole() 
    143163        f_column = self.filterKeyColumn() 
     
    150170        return data 
    151171         
    152     def filterAcceptsRow(self, row, parent): 
    153 ##        accepts = QSortFilterProxyModel.filterAcceptsRow(self, row, parent)  
    154         return self._cache_fixed.get(row, True) #and accepts 
    155      
     172    def filterAcceptsRow(self, row, parent):  
     173        return self._cache_fixed.get(row, True) 
    156174     
    157175from OWGUI import LinkStyledItemDelegate, LinkRole 
     
    166184    settingsList = ["outputRows", "mergeSpots", "gdsSelectionStates", "splitterSettings", "currentGds", "autoCommit"] 
    167185 
    168     def __init__(self, parent=None ,signalManager=None, name=" GEO Data sets"): 
     186    def __init__(self, parent=None ,signalManager=None, name=" GEO Data Sets"): 
    169187        OWWidget.__init__(self, parent ,signalManager, name) 
    170188 
     
    301319        proxyModel.setFilterRole(TextFilterRole) 
    302320        proxyModel.setFilterCaseSensitivity(False) 
    303 #        proxyModel.setFilterWildcard("*" + self.filterString + "*") 
    304321        proxyModel.setFilterFixedString(self.filterString) 
    305322        self.treeWidget.setModel(proxyModel) 
    306323        self.connect(self.treeWidget.selectionModel(), SIGNAL("selectionChanged(QItemSelection , QItemSelection )"), self.updateSelection) 
    307324        filterItems = " ".join([self.gds[i][key] for i in range(len(self.gds)) for key in self.searchKeys]) 
    308         filterItems = reduce(lambda s, d: s.replace(d, " "), [",", ".", ":", ";", "!", "?", "(", ")", "{", "}" 
    309                                                               "[", "]", "_", "-", "+", "\\", "|", "/"], 
    310                                                               filterItems.lower()) 
     325        filterItems = reduce(lambda s, d: s.replace(d, " "), 
     326                             [",", ".", ":", ";", "!", "?", "(", ")", "{", "}" 
     327                              "[", "]", "_", "-", "+", "\\", "|", "/", "%", "#", 
     328                              "@", "$", "^", "&", "*", "<", ">", "~", "`"], 
     329                             filterItems.lower()) 
    311330        filterItems = sorted(set(filterItems.split(" "))) 
    312331        filterItems = [item for item in filterItems if len(filterItems) > 3] 
     
    343362     
    344363    def setAnnotations(self, gds): 
    345 #        self.sampleSubsets = ["%s (%d)" % (s["description"], len(s["sample_id"])) for s in gds["subsets"]] 
    346 #        self.annotationCombo.clear() 
    347 #        self.annotationCombo.addItems(["Include all"] + list(set([sampleinfo["type"] for sampleinfo in gds["subsets"]]))) 
    348          
    349364        self._annotationsUpdating = True 
    350365        self.annotationsTree.clear() 
     
    393408        proxyModel.setFilterFixedStrings(strings) 
    394409        self.updateInfo() 
    395          
    396 #        filterStrings = self.filterString.lower().split() 
    397 #        mapFromSource = self.treeWidget.model().mapFromSource 
    398 #        index = self.treeWidget.model().sourceModel().index 
    399 #         
    400 #        for i, row in enumerate(self.cells): 
    401 #            self.treeWidget.setRowHidden(mapFromSource(index(i, 0)).row(), QModelIndex(), self.rowFiltered(i)) 
    402 #        self.updateInfo() 
    403410 
    404411    def selectedSamples(self): 
Note: See TracChangeset for help on using the changeset viewer.