From fb5c974365db56515d0fb154dd45aa7d4c6e256b Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 29 Jun 2009 12:35:52 +0200 Subject: [PATCH] ResourceDB: new method matchItems(), renamed ItemList to ItemHashMap Added new method ResourceDB::matchItems() which returns a list of item which somehow match the given list of keywords. Furthermore renamed ItemList to ItemHashMap to better reflect actual container type. Additionally some coding style improvements. Signed-off-by: Tobias Doerffel --- include/ResourceDB.h | 26 ++++++++++++------ src/core/ResourceDB.cpp | 41 ++++++++++++++++++++++++++-- src/core/ResourceTreeModel.cpp | 4 +-- src/core/UnifiedResourceProvider.cpp | 8 +++--- 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/include/ResourceDB.h b/include/ResourceDB.h index 09ede443f..5fc4d5239 100644 --- a/include/ResourceDB.h +++ b/include/ResourceDB.h @@ -38,41 +38,49 @@ class ResourceDB : public QObject { Q_OBJECT public: - typedef QHash ItemList; + typedef QHash ItemHashMap; ResourceDB( ResourceProvider * _provider ); ~ResourceDB(); - void init( void ); + void init(); void load( const QString & _file ); void save( const QString & _file ); - inline ResourceProvider * provider( void ) + inline ResourceProvider * provider() { return m_provider; } - inline const ItemList & items( void ) const + inline const ItemHashMap & items() const { return m_items; } - inline ItemList & items( void ) + inline ItemHashMap & items() { return m_items; } - inline ResourceTreeItem * topLevelNode( void ) + inline ResourceTreeItem * topLevelNode() { return &m_topLevelNode; } + // similiar to items()[_hash] but faster and returns NULL if not found const ResourceItem * itemByHash( const QString & _hash ) const; + + // return a list of ResourceItems who somehow match the given keywords + ResourceItemList matchItems( const QStringList & _keyWords ); + + // return an item which matches a resource desceibed in _item as + // good as possible const ResourceItem * nearestMatch( const ResourceItem & _item ); - void addItem( ResourceItem * newItem ); + // add given item to DB + void addItem( ResourceItem * _newItem ); void recursiveRemoveItems( ResourceTreeItem * parent, bool removeTopLevelParent = true ); @@ -127,12 +135,12 @@ private: static BaseDirStringMap s_baseDirNames; ResourceProvider * m_provider; - ItemList m_items; + ItemHashMap m_items; ResourceTreeItem m_topLevelNode; signals: - void itemsChanged( void ); + void itemsChanged(); void directoryItemAdded( const QString & _path ); void directoryItemRemoved( const QString & _path ); diff --git a/src/core/ResourceDB.cpp b/src/core/ResourceDB.cpp index 7fb14f960..68b4f85b6 100644 --- a/src/core/ResourceDB.cpp +++ b/src/core/ResourceDB.cpp @@ -190,7 +190,7 @@ loadTreeItem( treeItem, e ); const ResourceItem * ResourceDB::itemByHash( const QString & _hash ) const { - ItemList::ConstIterator it = m_items.find( _hash ); + ItemHashMap::ConstIterator it = m_items.find( _hash ); if( it != m_items.end() ) { return it.value(); @@ -201,11 +201,48 @@ const ResourceItem * ResourceDB::itemByHash( const QString & _hash ) const +ResourceItemList ResourceDB::matchItems( const QStringList & _keyWords ) +{ + ResourceItemList matchingItems; + + // iterate over all items in our DB + for( ItemHashMap::ConstIterator it = m_items.begin(); + it != m_items.end(); ++it ) + { + const ResourceItem * item = *it; + // build up a string containing all searchable strings of item + const QString itemString = + QString( item->name() + + item->path() + + item->author() + + item->tags() ).toLower(); + bool accept = true; + for( QStringList::ConstIterator jt = _keyWords.begin(); + jt != _keyWords.end(); ++jt ) + { + if( !itemString.contains( *jt ) ) + { + accept = false; + break; + } + } + if( accept ) + { + matchingItems << *it; + } + } + + return matchingItems; +} + + + + const ResourceItem * ResourceDB::nearestMatch( const ResourceItem & _item ) { if( !_item.hash().isEmpty() ) { - ItemList::ConstIterator it = m_items.find( _item.hash() ); + ItemHashMap::ConstIterator it = m_items.find( _item.hash() ); if( it != m_items.end() ) { return it.value(); diff --git a/src/core/ResourceTreeModel.cpp b/src/core/ResourceTreeModel.cpp index 5005bc47a..6256d9e61 100644 --- a/src/core/ResourceTreeModel.cpp +++ b/src/core/ResourceTreeModel.cpp @@ -251,7 +251,7 @@ void ResourceTreeModel::setFilter( const QString & _s ) int ResourceTreeModel::totalItems() const { - const ResourceDB::ItemList & items = m_db->items(); + const ResourceDB::ItemHashMap & items = m_db->items(); int num = 0; foreach( const ResourceItem * i, items ) { @@ -268,7 +268,7 @@ int ResourceTreeModel::totalItems() const int ResourceTreeModel::shownItems() const { - const ResourceDB::ItemList & items = m_db->items(); + const ResourceDB::ItemHashMap & items = m_db->items(); int num = 0; foreach( const ResourceItem * i, items ) { diff --git a/src/core/UnifiedResourceProvider.cpp b/src/core/UnifiedResourceProvider.cpp index 5461d1ec6..f2f6b9594 100644 --- a/src/core/UnifiedResourceProvider.cpp +++ b/src/core/UnifiedResourceProvider.cpp @@ -89,11 +89,11 @@ void UnifiedResourceProvider::remergeItems( void ) const ResourceItem *> PointerHashMap; PointerHashMap itemsSeen; - ResourceDB::ItemList & items = database()->items(); + ResourceDB::ItemHashMap & items = database()->items(); itemsSeen.reserve( items.size() ); - for( ResourceDB::ItemList::Iterator it = items.begin(); + for( ResourceDB::ItemHashMap::Iterator it = items.begin(); it != items.end(); ++it ) { itemsSeen[*it] = *it; @@ -101,7 +101,7 @@ void UnifiedResourceProvider::remergeItems( void ) foreach( ResourceDB * db, m_mergedDatabases ) { - for( ResourceDB::ItemList::ConstIterator it = + for( ResourceDB::ItemHashMap::ConstIterator it = db->items().begin(); it != db->items().end(); ++it ) { @@ -117,7 +117,7 @@ void UnifiedResourceProvider::remergeItems( void ) } } - for( ResourceDB::ItemList::Iterator it = items.begin(); + for( ResourceDB::ItemHashMap::Iterator it = items.begin(); it != items.end(); ) { if( itemsSeen[*it] == *it )