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:
@@ -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 );
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 );
|
||||||
|
@@ -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 ) ) );
|
||||||
|
Reference in New Issue
Block a user