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:
parent
9c36b32e8e
commit
ce60c173b7
src/libtomahawk
database
playlist/dynamic/database
widgets
@ -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 ) ) );
|
||||
|
Loading…
x
Reference in New Issue
Block a user