1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-08 23:26:40 +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

View File

@@ -27,9 +27,10 @@
using namespace Tomahawk; 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 ) : DatabaseCommand( parent )
, m_sqlSelect( sqlSelect ) , m_sqlSelect( sqlSelect )
, m_queryType( type )
{ {
} }
@@ -43,19 +44,40 @@ DatabaseCommand_GenericSelect::exec( DatabaseImpl* dbi )
query.exec(); query.exec();
QList< query_ptr > queries; QList< query_ptr > queries;
QList< artist_ptr > arts;
QList< album_ptr > albs;
// Expecting // Expecting
while ( query.next() ) while ( query.next() )
{ {
Tomahawk::result_ptr result = Tomahawk::result_ptr( new Tomahawk::Result() ); query_ptr qry;
Tomahawk::source_ptr s; artist_ptr artist;
album_ptr album;
QString artist, track, album; if ( m_queryType == Track )
{
QString artist, track;
track = query.value( 0 ).toString(); track = query.value( 0 ).toString();
artist = query.value( 1 ).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; QVariantList extraData;
int count = 2; int count = 2;
@@ -64,11 +86,29 @@ DatabaseCommand_GenericSelect::exec( DatabaseImpl* dbi )
extraData << query.value( count ); extraData << query.value( count );
count++; count++;
} }
if( !extraData.isEmpty() )
qry->setProperty( "data", extraData );
if ( m_queryType == Track )
{
if ( !extraData.isEmpty() )
qry->setProperty( "data", extraData );
queries << qry; 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;
}
} }
if ( m_queryType == Track )
emit tracks( queries ); emit tracks( queries );
else if ( m_queryType == Artist )
emit artists( arts );
else if ( m_queryType == Album )
emit albums( albs );
} }

View File

@@ -32,8 +32,16 @@
* that match. * that match.
* *
* In order for the conversion to query_ptr to work, the SELECT command should select the following items: * In order for the conversion to query_ptr to work, the SELECT command should select the following items:
*
* track query:
* track.name, artist.name [, optional extra values ] * 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 * 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 Q_OBJECT
public: 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 void exec( DatabaseImpl* lib );
virtual bool doesMutates() const { return false; } virtual bool doesMutates() const { return false; }
@@ -50,9 +64,12 @@ public:
signals: signals:
void tracks( const QList< Tomahawk::query_ptr >& tracks ); 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: private:
QString m_sqlSelect; QString m_sqlSelect;
QueryType m_queryType;
}; };
#endif // DATABASECOMMAND_GENERICSELECT_H #endif // DATABASECOMMAND_GENERICSELECT_H

View File

@@ -38,9 +38,11 @@ DatabaseFactory::createControl ( const QString& controlType )
} }
dyncontrol_ptr 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(); dyncontrol_ptr control = m_controls.first();
tDebug() << "Generated sql query:" << control.dynamicCast< DatabaseControl >()->sql(); 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 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> ) ) ); 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 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 << dyncontrol_ptr( new DatabaseControl( sql, summary, GeneratorFactory::typeSelectors( m_type ) ) );
m_controls.last()->setMatch( QString::number( type ) );
return m_controls.last(); return m_controls.last();
} }

View File

@@ -24,7 +24,7 @@
#include "playlist/dynamic/GeneratorInterface.h" #include "playlist/dynamic/GeneratorInterface.h"
#include "playlist/dynamic/GeneratorFactory.h" #include "playlist/dynamic/GeneratorFactory.h"
#include "playlist/dynamic/DynamicControl.h" #include "playlist/dynamic/DynamicControl.h"
#include "database/databasecommand_genericselect.h"
#include "dllmacro.h" #include "dllmacro.h"
namespace Tomahawk namespace Tomahawk
@@ -39,7 +39,7 @@ namespace Tomahawk
virtual dyncontrol_ptr createControl( const QString& controlType = QString() ); 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 // 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; virtual QStringList typeSelectors() const;
}; };
@@ -56,7 +56,7 @@ namespace Tomahawk
virtual ~DatabaseGenerator(); virtual ~DatabaseGenerator();
virtual dyncontrol_ptr createControl( const QString& type = QString() ); 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 QPixmap logo();
virtual void generate ( int number = -1 ); virtual void generate ( int number = -1 );

View File

@@ -25,6 +25,7 @@
#include "dynamic/GeneratorInterface.h" #include "dynamic/GeneratorInterface.h"
#include "dynamic/database/DatabaseGenerator.h" #include "dynamic/database/DatabaseGenerator.h"
#include "utils/logger.h" #include "utils/logger.h"
#include "database/databasecommand_genericselect.h"
#define COOLPLAYLIST_GUID "TOMAHAWK_COOLPLAYLISTOHAI_GUID" #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;"; 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() ); m_coolQuery1->createNewRevision( uuid() );
connect( m_coolQuery1.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( playlistRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) ); connect( m_coolQuery1.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( playlistRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) );