X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fdemoscenemusic%2Fdata%2FDataManager.java;h=967faa5fecd042ee0c6bb53f40df485e2a923943;hb=747a5afddade17479a3d0e951c1e5ce51a3b7950;hp=5324d28fbc02eff8b88eedf6a55340ec402aabcc;hpb=1cc008977b7c075c415ec43b34870229260b2506;p=demoscenemusic.git diff --git a/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java b/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java index 5324d28..967faa5 100644 --- a/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java +++ b/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java @@ -38,6 +38,7 @@ import net.pterodactylus.util.database.Join.JoinType; import net.pterodactylus.util.database.ObjectCreator; import net.pterodactylus.util.database.ObjectCreator.StringCreator; import net.pterodactylus.util.database.OrderField; +import net.pterodactylus.util.database.Parameter.IntegerParameter; import net.pterodactylus.util.database.Parameter.StringParameter; import net.pterodactylus.util.database.Query; import net.pterodactylus.util.database.Query.Type; @@ -99,7 +100,7 @@ public class DataManager { public Collection getAllArtists() throws DatabaseException { Query query = new Query(Type.SELECT, "ARTISTS"); query.addField(new Field("ARTISTS.*")); - return loadProperties(database.getMultiple(query, artistCreator)); + return loadArtistProperties(database.getMultiple(query, artistCreator)); } /** @@ -116,7 +117,7 @@ public class DataManager { Query query = new Query(Type.SELECT, "ARTISTS"); query.addField(new Field("ARTISTS.*")); query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTISTS.ID", new StringParameter(id)))); - return loadProperties(database.getSingle(query, artistCreator)); + return loadArtistProperties(database.getSingle(query, artistCreator)); } /** @@ -133,7 +134,7 @@ public class DataManager { query.addField(new Field("ARTISTS.*")); query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("ARTISTS.ID"), new Field("GROUP_ARTISTS.ARTIST"))); query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.GROUP_", new StringParameter(groupId)))); - return loadProperties(database.getMultiple(query, artistCreator)); + return loadArtistProperties(database.getMultiple(query, artistCreator)); } /** @@ -151,7 +152,7 @@ public class DataManager { query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACK_ARTISTS.ARTIST"), new Field("ARTISTS.ID"))); query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.TRACK", new StringParameter(trackId)))); query.addOrderField(new OrderField(new Field("TRACK_ARTISTS.DISPLAY_ORDER"))); - return loadProperties(database.getMultiple(query, artistCreator)); + return loadArtistProperties(database.getMultiple(query, artistCreator)); } /** @@ -169,7 +170,7 @@ public class DataManager { query.addValueField(new ValueField("ID", new StringParameter(id))); query.addValueField(new ValueField("NAME", new StringParameter(name))); database.insert(query); - return loadProperties(getArtistById(id)); + return loadArtistProperties(getArtistById(id)); } /** @@ -240,23 +241,8 @@ public class DataManager { * @throws DatabaseException * if a database error occurs */ - public Artist loadProperties(final Artist artist) throws DatabaseException { - Query query = new Query(Type.SELECT, "ARTIST_PROPERTIES"); - query.addField(new Field("ARTIST_PROPERTIES.PROPERTY")); - query.addField(new Field("ARTIST_PROPERTIES.VALUE")); - query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTIST", new StringParameter(artist.getId())))); - database.process(query, new ResultProcessor() { - - @Override - public void processResult(ResultSet resultSet) throws SQLException { - if (resultSet.isFirst()) { - artist.getProperties().removeAll(); - } - artist.getProperties().set(resultSet.getString("ARTIST_PROPERTIES.PROPERTY"), resultSet.getString("ARTIST_PROPERTIES.VALUE")); - } - - }); - return artist; + public Artist loadArtistProperties(final Artist artist) throws DatabaseException { + return loadProperties(artist, "ARTIST_PROPERTIES", "ARTIST"); } /** @@ -268,9 +254,9 @@ public class DataManager { * @throws DatabaseException * if a database error occurs */ - public List loadProperties(List artists) throws DatabaseException { + public List loadArtistProperties(List artists) throws DatabaseException { for (Artist artist : artists) { - loadProperties(artist); + loadArtistProperties(artist); } return artists; } @@ -339,7 +325,25 @@ public class DataManager { Query query = new Query(Type.SELECT, "TRACKS"); query.addField(new Field("TRACKS.*")); query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACKS.ID", new StringParameter(id)))); - return database.getSingle(query, trackCreator); + return loadTrackProperties(database.getSingle(query, trackCreator)); + } + + /** + * Returns the track that contains the derivative with the given ID. + * + * @param id + * The ID of the track derivative + * @return The track the derivative belongs to, or {@code null} if there is + * no such track + * @throws DatabaseException + * if a database error occurs + */ + public Track getTrackByDerivativeId(String id) throws DatabaseException { + Query query = new Query(Type.SELECT, "TRACKS"); + query.addField(new Field("TRACKS.*")); + query.addJoin(new Join(JoinType.INNER, "TRACK_DERIVATIVES", new Field("TRACK_DERIVATIVES.TRACK"), new Field("TRACKS.ID"))); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_DERIVATIVES.ID", new StringParameter(id)))); + return loadTrackProperties(database.getSingle(query, trackCreator)); } /** @@ -356,7 +360,193 @@ public class DataManager { query.addField(new Field("TRACKS.*")); query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACKS.ID"), new Field("TRACK_ARTISTS.TRACK"))); query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.ARTIST", new StringParameter(artistId)))); - return database.getMultiple(query, trackCreator); + return loadTrackProperties(database.getMultiple(query, trackCreator)); + } + + /** + * Loads the properties for the given track. + * + * @param track + * The track for which to load the properties + * @return The track with the properties loaded + * @throws DatabaseException + * if a database error occurs + */ + public Track loadTrackProperties(Track track) throws DatabaseException { + return loadProperties(track, "TRACK_PROPERTIES", "TRACK"); + } + + /** + * Loads the properties for the given tracks. + * + * @param tracks + * The tracks for which to load the properties + * @return The tracks with the properties loaded + * @throws DatabaseException + * if a database error occurs + */ + public List loadTrackProperties(List tracks) throws DatabaseException { + for (Track track : tracks) { + loadTrackProperties(track); + } + return tracks; + } + + /** + * Creates a new track with the given name. + * + * @param name + * The name of the track + * @return The created track + * @throws DatabaseException + * if a database error occurs + */ + public Track createTrack(String name) throws DatabaseException { + Query query = new Query(Type.INSERT, "TRACKS"); + String id = UUID.randomUUID().toString(); + query.addValueField(new ValueField("ID", new StringParameter(id))); + query.addValueField(new ValueField("NAME", new StringParameter(name))); + database.insert(query); + return getTrackById(id); + } + + /** + * Saves the given track. This also saves all relationships of the track. + * + * @param track + * The track to save + * @throws DatabaseException + * if a database error occurs + */ + public void saveTrack(Track track) throws DatabaseException { + Query query = new Query(Type.UPDATE, "TRACKS"); + query.addValueField(new ValueField("TRACKS.NAME", new StringParameter(track.getName()))); + query.addValueField(new ValueField("TRACKS.REMIX", new StringParameter(track.getRemix()))); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACKS.ID", new StringParameter(track.getId())))); + database.update(query); + /* store artist information. */ + track.getArtists(); /* prefetch artists. */ + query = new Query(Type.DELETE, "TRACK_ARTISTS"); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.TRACK", new StringParameter(track.getId())))); + database.update(query); + for (int index = 0; index < track.getArtists().size(); ++index) { + query = new Query(Type.INSERT, "TRACK_ARTISTS"); + query.addValueField(new ValueField("TRACK_ARTISTS.TRACK", new StringParameter(track.getId()))); + query.addValueField(new ValueField("TRACK_ARTISTS.ARTIST", new StringParameter(track.getArtists().get(index).getId()))); + query.addValueField(new ValueField("TRACK_ARTISTS.DISPLAY_ORDER", new IntegerParameter(index + 1))); + database.insert(query); + } + /* store properties. */ + saveProperties(track.getProperties(), "TRACK_PROPERTIES", "TRACK", track.getId()); + } + + /** + * Returns the derivative with the given ID. + * + * @param id + * The ID of the derivatives to load + * @return The derivative with the given ID + * @throws DatabaseException + * if a database error occurs + */ + public TrackDerivative getTrackDerivativeById(String id) throws DatabaseException { + Query query = new Query(Type.SELECT, "TRACK_DERIVATIVES"); + query.addField(new Field("TRACK_DERIVATIVES.*")); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_DERIVATIVES.ID", new StringParameter(id)))); + return loadTrackDerivativeProperties(database.getSingle(query, trackDerivativeCreator)); + } + + /** + * Returns the derivatives for the given track. + * + * @param trackId + * The track ID to get the derivatives for + * @return The derivatives for the given track + * @throws DatabaseException + * if a database error occurs + */ + public Collection getTrackDerivativesByTrack(String trackId) throws DatabaseException { + Query query = new Query(Type.SELECT, "TRACK_DERIVATIVES"); + query.addField(new Field("TRACK_DERIVATIVES.*")); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_DERIVATIVES.TRACK", new StringParameter(trackId)))); + return loadTrackDerivativeProperties(database.getMultiple(query, trackDerivativeCreator)); + } + + /** + * Creates a new derivative for the given track. + * + * @param track + * The track to create the derivative for + * @return The created derivative + * @throws DatabaseException + * if a database error occurs + */ + public TrackDerivative createTrackDerivative(Track track) throws DatabaseException { + Query query = new Query(Type.INSERT, "TRACK_DERIVATIVES"); + String id = UUID.randomUUID().toString(); + query.addValueField(new ValueField("TRACK_DERIVATIVES.ID", new StringParameter(id))); + query.addValueField(new ValueField("TRACK_DERIVATIVES.TRACK", new StringParameter(track.getId()))); + database.insert(query); + return getTrackDerivativeById(id); + } + + /** + * Loads the properties for the given track derivative. + * + * @param trackDerivative + * The track derivative to load the properties for + * @return The track derivative with its properties loaded + * @throws DatabaseException + * if a database error occurs + */ + public TrackDerivative loadTrackDerivativeProperties(TrackDerivative trackDerivative) throws DatabaseException { + return loadProperties(trackDerivative, "TRACK_DERIVATIVE_PROPERTIES", "TRACK_DERIVATIVE"); + } + + /** + * Loads the properties for the given track derivatives. + * + * @param trackDerivatives + * The track derivatives to load the properties for + * @return The track derivatives with their properties loaded + * @throws DatabaseException + * if a database error occurs + */ + public List loadTrackDerivativeProperties(List trackDerivatives) throws DatabaseException { + for (TrackDerivative trackDerivative : trackDerivatives) { + loadTrackDerivativeProperties(trackDerivative); + } + return trackDerivatives; + } + + /** + * Saves the given track derivative. As a track derivative does not have any + * attributes of its own only its properties are saved. + * + * @param trackDerivative + * The track derivative to save + * @throws DatabaseException + * if a database error occurs + */ + public void saveTrackDerivate(TrackDerivative trackDerivative) throws DatabaseException { + saveProperties(trackDerivative.getProperties(), "TRACK_DERIVATIVE_PROPERTIES", "TRACK_DERIVATIVE", trackDerivative.getId()); + } + + /** + * Removes the given track derivative and all its properties from the + * database. + * + * @param trackDerivative + * The track derivative to remove + * @throws DatabaseException + * if a database error occurs + */ + public void removeTrackDerivative(TrackDerivative trackDerivative) throws DatabaseException { + Query query = new Query(Type.DELETE, "TRACK_DERIVATIVES"); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_DERIVATIVES.ID", new StringParameter(trackDerivative.getId())))); + database.update(query); + /* remove the properties. */ + saveProperties(new Properties().set("dirty", "true").removeAll(), "TRACK_DERIVATIVE_PROPERTIES", "TRACK_DERIVATIVE", trackDerivative.getId()); } /** @@ -492,6 +682,7 @@ public class DataManager { /** Memoizer for the tracks by this artist. */ private final Memoizer tracksMemoizer = new Memoizer(new Callable() { + @Override public Void call() throws DatabaseException { if (!hasValue("tracks")) { @@ -680,6 +871,19 @@ public class DataManager { }); + /** Memoizer for the track derivatives. */ + private final Memoizer derivativesMemoizer = new Memoizer(new Callable() { + + @Override + public Void call() throws Exception { + if (!hasValue("derivatives")) { + getValue("derivatives", Collection.class).set(getTrackDerivativesByTrack(getId())); + } + return null; + } + + }); + /** Memoizer for the related tracks. */ private final Memoizer relatedTracksMemoizer = new Memoizer(new Callable() { @@ -690,6 +894,7 @@ public class DataManager { } return null; } + }); /** @@ -737,6 +942,15 @@ public class DataManager { * {@inheritDoc} */ @Override + public Collection getDerivatives() { + derivativesMemoizer.get(); + return super.getDerivatives(); + } + + /** + * {@inheritDoc} + */ + @Override public Map> getRelatedTracks() { relatedTracksMemoizer.get(); return super.getRelatedTracks();