1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-04-22 17:01:51 +02:00

Add support for track, artist, and album generic queries

This commit is contained in:
Leo Franchi 2011-07-30 17:05:01 -04:00
parent 9c36b32e8e
commit ce60c173b7
5 changed files with 83 additions and 21 deletions

@ -27,9 +27,10 @@
using namespace Tomahawk;
DatabaseCommand_GenericSelect::DatabaseCommand_GenericSelect( const QString& sqlSelect, QObject* parent )
DatabaseCommand_GenericSelect::DatabaseCommand_GenericSelect( const QString& sqlSelect, QueryType type, QObject* parent )
: DatabaseCommand( parent )
, m_sqlSelect( sqlSelect )
, m_queryType( type )
{
}
@ -43,19 +44,40 @@ DatabaseCommand_GenericSelect::exec( DatabaseImpl* dbi )
query.exec();
QList< query_ptr > queries;
QList< artist_ptr > arts;
QList< album_ptr > albs;
// Expecting
while ( query.next() )
{
Tomahawk::result_ptr result = Tomahawk::result_ptr( new Tomahawk::Result() );
Tomahawk::source_ptr s;
query_ptr qry;
artist_ptr artist;
album_ptr album;
QString artist, track, album;
track = query.value( 0 ).toString();
artist = query.value( 1 ).toString();
if ( m_queryType == Track )
{
QString artist, track;
track = query.value( 0 ).toString();
artist = query.value( 1 ).toString();
Tomahawk::query_ptr qry = Tomahawk::Query::get( artist, track, QString(), uuid(), true ); // Only auto-resolve non-local results
qry = Tomahawk::Query::get( artist, track, QString(), uuid(), true ); // Only auto-resolve non-local results
} else if ( m_queryType == Artist )
{
int artistId = query.value( 0 ).toInt();
QString artistName = query.value( 1 ).toString();
artist = Tomahawk::Artist::get( artistId, artistName );
} else if ( m_queryType == Album )
{
int albumId = query.value( 0 ).toInt();
QString albumName = query.value( 1 ).toString();
int artistId = query.value( 2 ).toInt();
QString artistName = query.value( 3 ).toString();
artist = Tomahawk::Artist::get( artistId, artistName );
album = Tomahawk::Album::get( albumId, albumName, artist );
}
QVariantList extraData;
int count = 2;
@ -64,11 +86,29 @@ DatabaseCommand_GenericSelect::exec( DatabaseImpl* dbi )
extraData << query.value( count );
count++;
}
if( !extraData.isEmpty() )
qry->setProperty( "data", extraData );
queries << qry;
if ( m_queryType == Track )
{
if ( !extraData.isEmpty() )
qry->setProperty( "data", extraData );
queries << qry;
} else if ( m_queryType == Artist )
{
if ( !extraData.isEmpty() )
artist->setProperty( "data", extraData );
arts << artist;
} else if ( m_queryType == Album )
{
if ( !extraData.isEmpty() )
album->setProperty( "data", extraData );
albs << album;
}
}
emit tracks( queries );
if ( m_queryType == Track )
emit tracks( queries );
else if ( m_queryType == Artist )
emit artists( arts );
else if ( m_queryType == Album )
emit albums( albs );
}

@ -32,7 +32,15 @@
* that match.
*
* In order for the conversion to query_ptr to work, the SELECT command should select the following items:
* track.name, artist.name [, optional extra values ]
*
* track query:
* track.name, artist.name [, optional extra values ]
*
* artist query:
* artist.id, artist.name [, optional extra values ]
*
* album query:
* album.id, album.name, artist.id, artist.name [, optional extra values ]
*
* Any extra values in the resultset will be returned as a QVariantList attached to the "data" property of each query_ptr
*
@ -42,7 +50,13 @@ class DLLEXPORT DatabaseCommand_GenericSelect : public DatabaseCommand
Q_OBJECT
public:
explicit DatabaseCommand_GenericSelect( const QString& sqlSelect, QObject* parent = 0 );
enum QueryType {
Track,
Artist,
Album
};
explicit DatabaseCommand_GenericSelect( const QString& sqlSelect, QueryType type, QObject* parent = 0 );
virtual void exec( DatabaseImpl* lib );
virtual bool doesMutates() const { return false; }
@ -50,9 +64,12 @@ public:
signals:
void tracks( const QList< Tomahawk::query_ptr >& tracks );
void artists( const QList< Tomahawk::artist_ptr >& artists );
void albums( const QList< Tomahawk::album_ptr >& albums );
private:
QString m_sqlSelect;
QueryType m_queryType;
};
#endif // DATABASECOMMAND_GENERICSELECT_H

@ -38,9 +38,11 @@ DatabaseFactory::createControl ( const QString& controlType )
}
dyncontrol_ptr
DatabaseFactory::createControl ( const QString& sql, const QString& summary )
DatabaseFactory::createControl ( const QString& sql, DatabaseCommand_GenericSelect::QueryType type, const QString& summary )
{
return dyncontrol_ptr( new DatabaseControl( sql, summary, typeSelectors() ) );
dyncontrol_ptr control = dyncontrol_ptr( new DatabaseControl( sql, summary, typeSelectors() ) );
control->setMatch( QString::number( type ) );
return control;
}
@ -122,7 +124,8 @@ DatabaseGenerator::generate( int number )
dyncontrol_ptr control = m_controls.first();
tDebug() << "Generated sql query:" << control.dynamicCast< DatabaseControl >()->sql();
DatabaseCommand_GenericSelect* cmd = new DatabaseCommand_GenericSelect( control.dynamicCast< DatabaseControl >()->sql() );
DatabaseCommand_GenericSelect* cmd = new DatabaseCommand_GenericSelect( control.dynamicCast< DatabaseControl >()->sql(),
static_cast< DatabaseCommand_GenericSelect::QueryType >( control->match().toInt() ) );
m_curCountRequested = number; // Can't set count on dbcmd itself as sender() in slot is 0
connect( cmd, SIGNAL( tracks( QList<Tomahawk::query_ptr> ) ), this, SLOT( tracksGenerated( QList<Tomahawk::query_ptr> ) ) );
@ -156,9 +159,10 @@ DatabaseGenerator::createControl( const QString& type )
}
dyncontrol_ptr
DatabaseGenerator::createControl ( const QString& sql, const QString& summary )
DatabaseGenerator::createControl ( const QString& sql, DatabaseCommand_GenericSelect::QueryType type, const QString& summary )
{
m_controls << dyncontrol_ptr( new DatabaseControl( sql, summary, GeneratorFactory::typeSelectors( m_type ) ) );
m_controls.last()->setMatch( QString::number( type ) );
return m_controls.last();
}

@ -24,7 +24,7 @@
#include "playlist/dynamic/GeneratorInterface.h"
#include "playlist/dynamic/GeneratorFactory.h"
#include "playlist/dynamic/DynamicControl.h"
#include "database/databasecommand_genericselect.h"
#include "dllmacro.h"
namespace Tomahawk
@ -39,7 +39,7 @@ namespace Tomahawk
virtual dyncontrol_ptr createControl( const QString& controlType = QString() );
// TO create a special SQL resolver that consists of a pre-baked SQL query and a description of it
virtual dyncontrol_ptr createControl( const QString& sql, const QString& summary );
virtual dyncontrol_ptr createControl( const QString& sql, DatabaseCommand_GenericSelect::QueryType type, const QString& summary );
virtual QStringList typeSelectors() const;
};
@ -56,7 +56,7 @@ namespace Tomahawk
virtual ~DatabaseGenerator();
virtual dyncontrol_ptr createControl( const QString& type = QString() );
virtual dyncontrol_ptr createControl( const QString& sql, const QString& summary );
virtual dyncontrol_ptr createControl( const QString& sql, DatabaseCommand_GenericSelect::QueryType type, const QString& summary );
virtual QPixmap logo();
virtual void generate ( int number = -1 );

@ -25,6 +25,7 @@
#include "dynamic/GeneratorInterface.h"
#include "dynamic/database/DatabaseGenerator.h"
#include "utils/logger.h"
#include "database/databasecommand_genericselect.h"
#define COOLPLAYLIST_GUID "TOMAHAWK_COOLPLAYLISTOHAI_GUID"
@ -119,7 +120,7 @@ SocialPlaylistWidget::playlist1Created()
QString sql = "select track.name, artist.name, count(*) as counter from (select track from playback_log group by track, source), track, artist where track.id = track and artist.id = track.artist group by track order by counter desc limit 0,100;";
dyncontrol_ptr control = m_coolQuery1->generator().dynamicCast< DatabaseGenerator >()->createControl( sql, "This is a cool playlist!" );
dyncontrol_ptr control = m_coolQuery1->generator().dynamicCast< DatabaseGenerator >()->createControl( sql, DatabaseCommand_GenericSelect::Track, "This is a cool playlist!" );
m_coolQuery1->createNewRevision( uuid() );
connect( m_coolQuery1.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( playlistRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) );