Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nested crates #1304

Closed
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
f3ad479
Add cratetreemodel.h
gramanas Jun 7, 2017
1fba5bc
Merge branch 'jmigual-library-redesign' of https://github.com/daschue…
gramanas Jun 15, 2017
3c09995
Nested Crate Insertion with bad code
gramanas Jun 20, 2017
1635ac3
Merge branch 'jmigual-library-redesign' of https://github.com/daschue…
gramanas Jun 20, 2017
2720d6c
Add nested crates
gramanas Jun 21, 2017
f3e474f
Disguise sql columns as variables
gramanas Jul 6, 2017
bc97923
Merge branch 'jmigual-library-redesign' of https://github.com/daschue…
gramanas Jul 6, 2017
8242c67
Add 'Add new crate' that adds a crate to the top level
gramanas Jul 7, 2017
596df84
Merge branch 'jmigual-library-redesign' of https://github.com/mixxxdj…
gramanas Jul 15, 2017
8d187b5
Move hierarchy functions into CrateHierarchy
gramanas Jul 16, 2017
7cf56f3
Split CrateStorage file
gramanas Jul 16, 2017
f9946ec
Moved crateHierarchy to crateStorage
gramanas Jul 16, 2017
d137704
Merge branch 'jmigual-library-redesign' of https://github.com/mixxxdj…
gramanas Jul 18, 2017
1d48fa5
Fix small mistakes and typos
gramanas Jul 19, 2017
5587e1c
Refactor CrateStorage
gramanas Jul 23, 2017
06d9cbe
Select crates usinc the crate filter
gramanas Jul 27, 2017
bf5cd72
First attempt at a recursive crate select via filter
gramanas Jul 27, 2017
9948c55
Duplicate crate, small fixes and typos, privacy at crateHierarchy
gramanas Jul 29, 2017
6fa0f83
Rename now avaliable. Fix typos
gramanas Jul 31, 2017
add5459
insertCrate is now the only thing gui knows when inserting a crate
gramanas Aug 1, 2017
b0ca91d
Add recursive deletion, no filter in crate select anymore
gramanas Aug 4, 2017
6a7ac10
Toggle recursion in crate selection + small fixes
gramanas Aug 4, 2017
9d74122
Fix bug with crateSelect, typos & small fixes
gramanas Aug 5, 2017
d380b51
More small changes
gramanas Aug 5, 2017
f2fc75a
Fix renaming issue and small changes
gramanas Aug 7, 2017
e7f6781
Introduce new more stable crate filter
gramanas Aug 7, 2017
5f3daab
RichtClick > add to crate on a track now shows paths, fix filter bug
gramanas Aug 9, 2017
82c3d45
Add crate summary
gramanas Aug 12, 2017
3bdecdb
small code cleanup
gramanas Aug 15, 2017
774ba58
Change naming conventions to work more like a file system
gramanas Aug 20, 2017
79ee638
Merge branch 'NestedCrates' of https://github.com/gramanas/mixxx into…
gramanas Aug 20, 2017
aa4d06f
Add moving capabilities to crates via right click option
gramanas Aug 22, 2017
d0591a9
Enforce naming conventions
gramanas Aug 22, 2017
41d2e81
Correct crate filter tests
gramanas Aug 23, 2017
59af9a9
Don't move a crate to it's parent
gramanas Aug 23, 2017
e8417d5
Fix bug...
gramanas Oct 11, 2017
8996708
Wrap moveCrate in a transaction
gramanas Oct 12, 2017
14c2cfc
Merge branch 'NestedCrates' of https://github.com/gramanas/mixxx into…
gramanas Oct 12, 2017
311e22b
Merge branch 'jmigual-library-redesign' of https://github.com/mixxxdj…
gramanas Oct 12, 2017
23c2c9d
Fix bugs with move crate and with the merge problem
gramanas Oct 14, 2017
de6cd1b
Merge branch 'jmigual-library-redesign' of https://github.com/mixxxdj…
gramanas Jan 5, 2018
a73cbc0
Merge commit '9df14fa6f3706df6b3563ad2cd8f66ae56ca99db' into NestedCr…
gramanas Apr 20, 2018
47157bb
Merge branch 'jmigual-library-redesign' into NestedCrates
gramanas Apr 20, 2018
a26ff55
Merge branch 'jmigual-library-redesign' into NestedCrates
gramanas May 7, 2018
e2cf708
Merge remote-tracking branch 'upstream/jmigual-library-redesign' into…
Be-ing Jun 23, 2018
e4da311
fix database schema upgrade for nested crates
Be-ing Jun 23, 2018
cdb08fc
show context menu to add crate when right clicking empty area
Be-ing Jun 23, 2018
a5c5adc
Merge pull request #3 from Be-ing/nested-crates
gramanas Jun 24, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build/depends.py
Original file line number Diff line number Diff line change
Expand Up @@ -949,6 +949,7 @@ def sources(self, build):
"library/features/crates/cratetablemodel.cpp",
"library/features/crates/cratetreemodel.cpp",
"library/features/crates/cratestorage.cpp",
"library/features/crates/cratestoragehelpers.cpp",
"library/features/crates/cratefeaturehelper.cpp",
"library/features/crates/cratehierarchy.cpp",

Expand Down
109 changes: 1 addition & 108 deletions src/library/features/crates/cratestorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,114 +18,7 @@ namespace {

const mixxx::Logger kLogger("CrateStorage");

const QString CRATETABLE_LOCKED = "locked";

const QString CRATE_SUMMARY_VIEW = "crate_summary";

const QString CRATESUMMARY_TRACK_COUNT = "track_count";
const QString CRATESUMMARY_TRACK_DURATION = "track_duration";

const QString kCrateTracksJoin = QString(
"LEFT JOIN %3 ON %3.%4=%1.%2").arg(
CRATE_TABLE,
CRATETABLE_ID,
CRATE_TRACKS_TABLE,
CRATETRACKSTABLE_CRATEID);

const QString kLibraryTracksJoin = kCrateTracksJoin + QString(
" LEFT JOIN %3 ON %3.%4=%1.%2").arg(
CRATE_TRACKS_TABLE,
CRATETRACKSTABLE_TRACKID,
LIBRARY_TABLE,
LIBRARYTABLE_ID);

const QString kCrateSummaryViewSelect = QString(
"SELECT %1.*,"
"COUNT(CASE %2.%4 WHEN 0 THEN 1 ELSE NULL END) AS %5,"
"SUM(CASE %2.%4 WHEN 0 THEN %2.%3 ELSE 0 END) AS %6 "
"FROM %1").arg(
CRATE_TABLE,
LIBRARY_TABLE,
LIBRARYTABLE_DURATION,
LIBRARYTABLE_MIXXXDELETED,
CRATESUMMARY_TRACK_COUNT,
CRATESUMMARY_TRACK_DURATION);

const QString kCrateSummaryViewQuery = QString(
"CREATE TEMPORARY VIEW IF NOT EXISTS %1 AS %2 %3 GROUP BY %4.%5").arg(
CRATE_SUMMARY_VIEW,
kCrateSummaryViewSelect,
kLibraryTracksJoin,
CRATE_TABLE,
CRATETABLE_ID);


class CrateQueryBinder {
public:
explicit CrateQueryBinder(FwdSqlQuery& query)
: m_query(query) {
}
virtual ~CrateQueryBinder() = default;

void bindId(const QString& placeholder, const Crate& crate) const {
m_query.bindValue(placeholder, crate.getId());
}
void bindName(const QString& placeholder, const Crate& crate) const {
m_query.bindValue(placeholder, crate.getName());
}
void bindLocked(const QString& placeholder, const Crate& crate) const {
m_query.bindValue(placeholder, crate.isLocked());
}
void bindAutoDjSource(const QString& placeholder, const Crate& crate) const {
m_query.bindValue(placeholder, crate.isAutoDjSource());
}

protected:
FwdSqlQuery& m_query;
};

} // anonymous namespace



CrateQueryFields::CrateQueryFields(const FwdSqlQuery& query)
: m_iId(query.fieldIndex(CRATETABLE_ID)),
m_iName(query.fieldIndex(CRATETABLE_NAME)),
m_iLocked(query.fieldIndex(CRATETABLE_LOCKED)),
m_iAutoDjSource(query.fieldIndex(CRATETABLE_AUTODJ_SOURCE)) {
}


void CrateQueryFields::populateFromQuery(
const FwdSqlQuery& query,
Crate* pCrate) const {
pCrate->setId(getId(query));
pCrate->setName(getName(query));
pCrate->setLocked(isLocked(query));
pCrate->setAutoDjSource(isAutoDjSource(query));
}


CrateTrackQueryFields::CrateTrackQueryFields(const FwdSqlQuery& query)
: m_iCrateId(query.fieldIndex(CRATETRACKSTABLE_CRATEID)),
m_iTrackId(query.fieldIndex(CRATETRACKSTABLE_TRACKID)) {
}


CrateSummaryQueryFields::CrateSummaryQueryFields(const FwdSqlQuery& query)
: CrateQueryFields(query),
m_iTrackCount(query.fieldIndex(CRATESUMMARY_TRACK_COUNT)),
m_iTrackDuration(query.fieldIndex(CRATESUMMARY_TRACK_DURATION)) {
}

void CrateSummaryQueryFields::populateFromQuery(
const FwdSqlQuery& query,
CrateSummary* pCrateSummary) const {
CrateQueryFields::populateFromQuery(query, pCrateSummary);
pCrateSummary->setTrackCount(getTrackCount(query));
pCrateSummary->setTrackDuration(getTrackDuration(query));
}

} // anonymus namespace

void CrateStorage::repairDatabase(QSqlDatabase database) {
// NOTE(uklotzde): No transactions
Expand Down
166 changes: 1 addition & 165 deletions src/library/features/crates/cratestorage.h
Original file line number Diff line number Diff line change
@@ -1,181 +1,17 @@
#ifndef MIXXX_CRATESTORAGE_H
#define MIXXX_CRATESTORAGE_H


#include <QObject>
#include <QList>
#include <QSet>

#include "library/crate/cratesummary.h"
#include "track/trackid.h"
#include "library/features/crates/cratestoragehelpers.h"

#include "util/db/fwdsqlqueryselectresult.h"
#include "util/db/sqlsubselectmode.h"
#include "util/db/sqlstorage.h"


class CrateQueryFields {
public:
CrateQueryFields() {}
explicit CrateQueryFields(const FwdSqlQuery& query);
virtual ~CrateQueryFields() = default;

CrateId getId(const FwdSqlQuery& query) const {
return CrateId(query.fieldValue(m_iId));
}
QString getName(const FwdSqlQuery& query) const {
return query.fieldValue(m_iName).toString();
}
bool isLocked(const FwdSqlQuery& query) const {
return query.fieldValueBoolean(m_iLocked);
}
bool isAutoDjSource(const FwdSqlQuery& query) const {
return query.fieldValueBoolean(m_iAutoDjSource);
}

void populateFromQuery(
const FwdSqlQuery& query,
Crate* pCrate) const;

private:
DbFieldIndex m_iId;
DbFieldIndex m_iName;
DbFieldIndex m_iLocked;
DbFieldIndex m_iAutoDjSource;
};

class CrateSelectResult: public FwdSqlQuerySelectResult {
public:
CrateSelectResult(CrateSelectResult&& other)
: FwdSqlQuerySelectResult(std::move(other)),
m_queryFields(std::move(other.m_queryFields)) {
}
~CrateSelectResult() override = default;

bool populateNext(Crate* pCrate) {
if (next()) {
m_queryFields.populateFromQuery(query(), pCrate);
return true;
} else {
return false;
}
}

private:
friend class CrateStorage;
CrateSelectResult() = default;
explicit CrateSelectResult(FwdSqlQuery&& query)
: FwdSqlQuerySelectResult(std::move(query)),
m_queryFields(FwdSqlQuerySelectResult::query()) {
}

CrateQueryFields m_queryFields;
};

class CrateSummaryQueryFields: public CrateQueryFields {
public:
CrateSummaryQueryFields() = default;
explicit CrateSummaryQueryFields(const FwdSqlQuery& query);
~CrateSummaryQueryFields() override = default;

uint getTrackCount(const FwdSqlQuery& query) const {
QVariant varTrackCount = query.fieldValue(m_iTrackCount);
if (varTrackCount.isNull()) {
return 0; // crate is empty
} else {
return varTrackCount.toUInt();
}
}
double getTrackDuration(const FwdSqlQuery& query) const {
QVariant varTrackDuration = query.fieldValue(m_iTrackDuration);
if (varTrackDuration.isNull()) {
return 0.0; // crate is empty
} else {
return varTrackDuration.toDouble();
}
}

void populateFromQuery(
const FwdSqlQuery& query,
CrateSummary* pCrateSummary) const;

private:
DbFieldIndex m_iTrackCount;
DbFieldIndex m_iTrackDuration;
};

class CrateSummarySelectResult: public FwdSqlQuerySelectResult {
public:
CrateSummarySelectResult(CrateSummarySelectResult&& other)
: FwdSqlQuerySelectResult(std::move(other)),
m_queryFields(std::move(other.m_queryFields)) {
}
~CrateSummarySelectResult() override = default;

bool populateNext(CrateSummary* pCrateSummary) {
if (next()) {
m_queryFields.populateFromQuery(query(), pCrateSummary);
return true;
} else {
return false;
}
}

private:
friend class CrateStorage;
CrateSummarySelectResult() = default;
explicit CrateSummarySelectResult(FwdSqlQuery&& query)
: FwdSqlQuerySelectResult(std::move(query)),
m_queryFields(FwdSqlQuerySelectResult::query()) {
}

CrateSummaryQueryFields m_queryFields;
};

class CrateTrackQueryFields {
public:
CrateTrackQueryFields() = default;
explicit CrateTrackQueryFields(const FwdSqlQuery& query);
virtual ~CrateTrackQueryFields() = default;

CrateId crateId(const FwdSqlQuery& query) const {
return CrateId(query.fieldValue(m_iCrateId));
}
TrackId trackId(const FwdSqlQuery& query) const {
return TrackId(query.fieldValue(m_iTrackId));
}

private:
DbFieldIndex m_iCrateId;
DbFieldIndex m_iTrackId;
};

class CrateTrackSelectResult: public FwdSqlQuerySelectResult {
public:
CrateTrackSelectResult(CrateTrackSelectResult&& other)
: FwdSqlQuerySelectResult(std::move(other)),
m_queryFields(std::move(other.m_queryFields)) {
}
~CrateTrackSelectResult() override = default;

CrateId crateId() const {
return m_queryFields.crateId(query());
}
TrackId trackId() const {
return m_queryFields.trackId(query());
}

private:
friend class CrateStorage;
CrateTrackSelectResult() = default;
explicit CrateTrackSelectResult(FwdSqlQuery&& query)
: FwdSqlQuerySelectResult(std::move(query)),
m_queryFields(FwdSqlQuerySelectResult::query()) {
}

CrateTrackQueryFields m_queryFields;
};

class CrateStorage: public virtual /*implements*/ SqlStorage {
public:
CrateStorage() = default;
Expand Down
40 changes: 40 additions & 0 deletions src/library/features/crates/cratestoragehelpers.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include "library/features/crates/cratestoragehelpers.h"

CrateQueryFields::CrateQueryFields(const FwdSqlQuery& query)
: m_iId(query.fieldIndex(CRATETABLE_ID)),
m_iName(query.fieldIndex(CRATETABLE_NAME)),
m_iLocked(query.fieldIndex(CRATETABLE_LOCKED)),
m_iAutoDjSource(query.fieldIndex(CRATETABLE_AUTODJ_SOURCE)) {
}


void CrateQueryFields::populateFromQuery(
const FwdSqlQuery& query,
Crate* pCrate) const {
pCrate->setId(getId(query));
pCrate->setName(getName(query));
pCrate->setLocked(isLocked(query));
pCrate->setAutoDjSource(isAutoDjSource(query));
}


CrateTrackQueryFields::CrateTrackQueryFields(const FwdSqlQuery& query)
: m_iCrateId(query.fieldIndex(CRATETRACKSTABLE_CRATEID)),
m_iTrackId(query.fieldIndex(CRATETRACKSTABLE_TRACKID)) {
}


CrateSummaryQueryFields::CrateSummaryQueryFields(const FwdSqlQuery& query)
: CrateQueryFields(query),
m_iTrackCount(query.fieldIndex(CRATESUMMARY_TRACK_COUNT)),
m_iTrackDuration(query.fieldIndex(CRATESUMMARY_TRACK_DURATION)) {
}

void CrateSummaryQueryFields::populateFromQuery(
const FwdSqlQuery& query,
CrateSummary* pCrateSummary) const {
CrateQueryFields::populateFromQuery(query, pCrateSummary);
pCrateSummary->setTrackCount(getTrackCount(query));
pCrateSummary->setTrackDuration(getTrackDuration(query));
}

Loading