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 <tobias.doerffel@gmail.com>
This commit is contained in:
Tobias Doerffel
2009-06-29 12:35:52 +02:00
parent fd9d2b0e61
commit fb5c974365
4 changed files with 62 additions and 17 deletions

View File

@@ -38,41 +38,49 @@ class ResourceDB : public QObject
{
Q_OBJECT
public:
typedef QHash<QString, ResourceItem *> ItemList;
typedef QHash<QString, ResourceItem *> 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 );

View File

@@ -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();

View File

@@ -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 )
{

View File

@@ -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 )