Changeset 1374:688f6403983d in orange-bioinformatics


Ignore:
Timestamp:
04/18/11 18:51:52 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
c1a9ab4349ddd6a3368f3badda1f04a9ab7fbf87
Message:

Speedup of experiments filtering.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/OWGEODatasets.py

    r1373 r1374  
    2020 
    2121LOCAL_GDS_COLOR = Qt.darkGreen 
     22 
     23TextFilterRole = OWGUI.OrangeUserRole.next() 
    2224 
    2325class TreeModel(QAbstractItemModel): 
     
    7678    def setHeaderData(self, section, orientation, value, role=Qt.EditRole): 
    7779        self._header[orientation][section][role] = value 
     80         
     81class MySortFilterProxyModel(QSortFilterProxyModel):     
     82    def __init__(self, parent=None): 
     83        QSortFilterProxyModel.__init__(self, parent) 
     84        self._filter_strings = [] 
     85        self._cache = {} 
     86        self._cache_fixed = {} 
     87        self._cache_prefix = {} 
     88        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() 
     97 
     98    def setSourceModel(self, model): 
     99        self._filter_strings = [] 
     100        self._cache = {} 
     101        self._cache_fixed = {} 
     102        self._cache_prefix = {} 
     103        self._row_text = {} 
     104        QSortFilterProxyModel.setSourceModel(self, model) 
     105         
     106    def addFilterFixedString(self, string, invalidate=True): 
     107        self._filter_strings.append(string) 
     108        all_rows = range(self.sourceModel().rowCount()) 
     109        row_text = [self.rowFilterText(row) for row in all_rows] 
     110        self._cache[string] = [string in text for text in row_text] 
     111        if invalidate: 
     112            self.updateCached() 
     113            self.invalidate() 
     114         
     115    def removeFilterFixedString(self, index=-1, invalidate=True): 
     116        string = self._filter_strings.pop(index) 
     117        del self._cache[string] 
     118        if invalidate: 
     119            self.updateCached() 
     120            self.invalidate() 
     121             
     122    def setFilterFixedStrings(self, strings): 
     123        s_time = time.time() 
     124        to_remove = set(self._filter_strings) - set(strings) 
     125        to_add = set(strings) - set(self._filter_strings) 
     126        for str in to_remove: 
     127            self.removeFilterFixedString(self._filter_strings.index(str), invalidate=False) 
     128         
     129        for str in to_add: 
     130            self.addFilterFixedString(str, invalidate=False) 
     131        self.updateCached() 
     132        self.invalidate() 
     133             
     134    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]) 
     137         
     138    def setFilterFixedString(self, string): 
     139        QSortFilterProxyModel.setFilterFixedString(self, string) 
     140         
     141    def rowFilterText(self, row): 
     142        f_role = self.filterRole() 
     143        f_column = self.filterKeyColumn() 
     144        s_model = self.sourceModel() 
     145        data = s_model.data(s_model.index(row, f_column), f_role) 
     146        if isinstance(data, QVariant): 
     147            data = unicode(data.toString(), errors="ignore") 
     148        else: 
     149            data = unicode(data, errors="ignore") 
     150        return data 
     151         
     152    def filterAcceptsRow(self, row, parent): 
     153##        accepts = QSortFilterProxyModel.filterAcceptsRow(self, row, parent)  
     154        return self._cache_fixed.get(row, True) #and accepts 
     155     
    78156     
    79157from OWGUI import LinkStyledItemDelegate, LinkRole 
     
    138216        self.treeWidget.setSortingEnabled(True) 
    139217        self.treeWidget.setAlternatingRowColors(True) 
     218        self.treeWidget.setUniformRowHeights(True) 
    140219        self.treeWidget.setItemDelegate(LinkStyledItemDelegate(self.treeWidget)) 
    141220        self.treeWidget.setItemDelegateForColumn(0, OWGUI.IndicatorItemDelegate(self.treeWidget, role=Qt.DisplayRole)) 
     
    172251 
    173252    def updateInfo(self): 
    174         gds_info = obiGEO.GDSInfo() 
     253        gds_info = self.gds_info #obiGEO.GDSInfo() 
    175254        text = "%i datasets\n%i datasets cached\n" % (len(gds_info), len(glob.glob(orngServerFiles.localpath("GEO") + "/GDS*"))) 
    176         filtered = len([row for row in range(len(self.cells)) if self.rowFiltered(row)]) 
     255        filtered = self.treeWidget.model().rowCount() 
    177256        if len(self.cells) != filtered: 
    178257            text += ("%i after filtering") % filtered 
     
    183262        self.progressBarInit() 
    184263        with orngServerFiles.DownloadProgress.setredirect(self.progressBarSet): 
    185             info = obiGEO.GDSInfo() 
     264            self.gds_info = info = obiGEO.GDSInfo() 
    186265        milestones = set(range(0, len(info), max(len(info)/100, 1))) 
    187266        self.cells = cells = [] 
     
    189268        pmLinks = [] 
    190269        localGDS = [] 
     270        full_text_search_data = [] 
     271         
    191272        self.gds = [] 
    192273        for i, (name, gds) in enumerate(info.items()): 
     
    202283            self.gds.append(gds) 
    203284             
     285            full_text_search_data.append(unicode(" | ".join([gds.get(key, "").lower() for key in self.searchKeys]), errors="ignore")) 
     286             
    204287            if i in milestones: 
    205288                self.progressBarSet(100.0*i/len(info)) 
     
    208291        model.setColumnLinks(1, gdsLinks) 
    209292        model.setColumnLinks(8, pmLinks) 
    210 #        for i in localGDS: 
    211 #            model._roleData[Qt.ForegroundRole][i].update(zip(range(2, 8), [QVariant(QColor(LOCAL_GDS_COLOR))] * 6)) 
    212 #            mode.._roleData[OWGUI.IndicatorItemDelegate.] 
    213         proxyModel = QSortFilterProxyModel(self.treeWidget) 
     293         
     294        for i, text in enumerate(full_text_search_data): 
     295            model.setData(model.index(i, 0), QVariant(text), TextFilterRole) 
     296         
     297        proxyModel = MySortFilterProxyModel(self.treeWidget) 
     298#        proxyModel = QSortFilterProxyModel(self.treeWidget) 
    214299        proxyModel.setSourceModel(model) 
     300        proxyModel.setFilterKeyColumn(0) 
     301        proxyModel.setFilterRole(TextFilterRole) 
     302        proxyModel.setFilterCaseSensitivity(False) 
     303#        proxyModel.setFilterWildcard("*" + self.filterString + "*") 
     304        proxyModel.setFilterFixedString(self.filterString) 
    215305        self.treeWidget.setModel(proxyModel) 
    216306        self.connect(self.treeWidget.selectionModel(), SIGNAL("selectionChanged(QItemSelection , QItemSelection )"), self.updateSelection) 
     
    295385     
    296386    def filter(self): 
    297         filterStrings = self.filterString.lower().split() 
    298         mapFromSource = self.treeWidget.model().mapFromSource 
    299         index = self.treeWidget.model().sourceModel().index 
    300          
    301         for i, row in enumerate(self.cells): 
    302             self.treeWidget.setRowHidden(mapFromSource(index(i, 0)).row(), QModelIndex(), self.rowFiltered(i)) 
     387        filter_string = unicode(self.filterLineEdit.text(), errors="ignore") 
     388        proxyModel = self.treeWidget.model() 
     389        strings = filter_string.lower().strip().split() 
     390        proxyModel.setFilterFixedStrings(strings) 
    303391        self.updateInfo() 
     392         
     393#        filterStrings = self.filterString.lower().split() 
     394#        mapFromSource = self.treeWidget.model().mapFromSource 
     395#        index = self.treeWidget.model().sourceModel().index 
     396#         
     397#        for i, row in enumerate(self.cells): 
     398#            self.treeWidget.setRowHidden(mapFromSource(index(i, 0)).row(), QModelIndex(), self.rowFiltered(i)) 
     399#        self.updateInfo() 
    304400 
    305401    def selectedSamples(self): 
     
    313409        samples = [] 
    314410        unused_types = [] 
    315         for stype in childiter(self.annotationsTree.invisibleRootItem()): 
     411        for stype in childiter(self.annotationsTree.invisibleRootItem()):  
    316412            selected_values = [] 
    317413            all_values = [] 
Note: See TracChangeset for help on using the changeset viewer.