X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fdemoscenemusic%2Fdata%2FDataManager.java;h=0c6f4220189809aad824209a9596c647c094cbf9;hb=cc3a4940ce06e23e0d480d5db706878a11c007c3;hp=85f35faf3cea00034d17651c3a950e303584a9c1;hpb=5f24f213aebba016708f1794d012d3e4189c487b;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 85f35fa..0c6f422 100644 --- a/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java +++ b/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java @@ -19,9 +19,7 @@ package net.pterodactylus.demoscenemusic.data; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.concurrent.Callable; @@ -31,12 +29,11 @@ import net.pterodactylus.util.database.DatabaseException; import net.pterodactylus.util.database.Field; import net.pterodactylus.util.database.Join; import net.pterodactylus.util.database.Join.JoinType; +import net.pterodactylus.util.database.ObjectCreator; import net.pterodactylus.util.database.OrderField; -import net.pterodactylus.util.database.OrderField.Order; import net.pterodactylus.util.database.Parameter.StringParameter; import net.pterodactylus.util.database.Query; import net.pterodactylus.util.database.Query.Type; -import net.pterodactylus.util.database.ResultProcessor; import net.pterodactylus.util.database.ValueField; import net.pterodactylus.util.database.ValueFieldWhereClause; @@ -47,6 +44,10 @@ import net.pterodactylus.util.database.ValueFieldWhereClause; */ public class DataManager { + private final ObjectCreator artistCreator = new ArtistCreator(); + private final ObjectCreator groupCreator = new GroupCreator(); + private final ObjectCreator trackCreator = new TrackCreator(); + private final Database database; public DataManager(Database database) { @@ -56,66 +57,37 @@ public class DataManager { public Collection getAllArtists() throws DatabaseException { Query query = new Query(Type.SELECT, "ARTISTS"); query.addField(new Field("ARTISTS.*")); - query.addField(new Field("GROUP_ARTISTS.*")); - query.addField(new Field("GROUPS.*")); - query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("ARTISTS.ID"), new Field("GROUP_ARTISTS.ARTIST"))); - query.addJoin(new Join(JoinType.INNER, "GROUPS", new Field("GROUP_ARTISTS.GROUP_"), new Field("GROUPS.ID"))); - query.addOrderField(new OrderField(new Field("ARTISTS.ID"))); - ArtistLoader artistLoader = new ArtistLoader(); - database.process(query, artistLoader); - return artistLoader.all(); + return database.getMultiple(query, artistCreator); } public Artist getArtistById(String id) throws DatabaseException { Query query = new Query(Type.SELECT, "ARTISTS"); query.addField(new Field("ARTISTS.*")); - query.addField(new Field("GROUP_ARTISTS.*")); - query.addField(new Field("GROUPS.*")); - query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("ARTISTS.ID"), new Field("GROUP_ARTISTS.ARTIST"))); - query.addJoin(new Join(JoinType.INNER, "GROUPS", new Field("GROUP_ARTISTS.GROUP_"), new Field("GROUPS.ID"))); query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTISTS.ID", new StringParameter(id)))); - query.addOrderField(new OrderField(new Field("ARTISTS.ID"))); - ArtistLoader artistLoader = new ArtistLoader(); - database.process(query, artistLoader); - return artistLoader.get(); + return database.getSingle(query, artistCreator); + } + + public Collection getArtistsByGroup(String groupId) throws DatabaseException { + Query query = new Query(Type.SELECT, "ARTISTS"); + 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 database.getMultiple(query, artistCreator); } public Track trackById(String id) throws DatabaseException { Query query = new Query(Type.SELECT, "TRACKS"); query.addField(new Field("TRACKS.*")); - query.addField(new Field("TRACK_ARTISTS.*")); - query.addField(new Field("ARTISTS.*")); - query.addField(new Field("TRACK_STYLES.*")); - query.addField(new Field("STYLES.*")); - query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACKS.ID"), new Field("TRACK_ARTISTS.TRACK"))); - query.addJoin(new Join(JoinType.INNER, "ARTISTS", new Field("TRACK_ARTISTS.ARTIST"), new Field("ARTISTS.ID"))); - query.addJoin(new Join(JoinType.INNER, "TRACK_STYLES", new Field("TRACKS.ID"), new Field("TRACK_STYLES.TRACK"))); - query.addJoin(new Join(JoinType.INNER, "STYLES", new Field("TRACK_STYLES.STYLE"), new Field("STYLES.ID"))); query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACKS.ID", new StringParameter(id)))); - query.addOrderField(new OrderField(new Field("TRACKS.ID"), Order.ASCENDING)); - query.addOrderField(new OrderField(new Field("TRACK_ARTISTS.DISPLAY_ORDER"), Order.ASCENDING)); - TrackLoader trackLoader = new TrackLoader(); - database.process(query, trackLoader); - return trackLoader.get(); + return database.getSingle(query, trackCreator); } public Collection getTracksByArtist(String artistId) throws DatabaseException { Query query = new Query(Type.SELECT, "TRACKS"); query.addField(new Field("TRACKS.*")); - query.addField(new Field("TRACK_ARTISTS.*")); - query.addField(new Field("ARTISTS.*")); - query.addField(new Field("TRACK_STYLES.*")); - query.addField(new Field("STYLES.*")); query.addJoin(new Join(JoinType.INNER, "TRACK_ARTISTS", new Field("TRACKS.ID"), new Field("TRACK_ARTISTS.TRACK"))); - query.addJoin(new Join(JoinType.INNER, "ARTISTS", new Field("TRACK_ARTISTS.ARTIST"), new Field("ARTISTS.ID"))); - query.addJoin(new Join(JoinType.INNER, "TRACK_STYLES", new Field("TRACKS.ID"), new Field("TRACK_STYLES.TRACK"))); - query.addJoin(new Join(JoinType.INNER, "STYLES", new Field("TRACK_STYLES.STYLE"), new Field("STYLES.ID"))); - query.addWhereClause(new ValueFieldWhereClause(new ValueField("ARTISTS.ID", new StringParameter(artistId)))); - query.addOrderField(new OrderField(new Field("TRACKS.ID"), Order.ASCENDING)); - query.addOrderField(new OrderField(new Field("TRACK_ARTISTS.DISPLAY_ORDER"), Order.ASCENDING)); - TrackLoader trackLoader = new TrackLoader(); - database.process(query, trackLoader); - return trackLoader.all(); + query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_ARTISTS.ARTIST", new StringParameter(artistId)))); + return database.getMultiple(query, trackCreator); } public Collection getGroupsByArtist(String artistId) throws DatabaseException { @@ -123,92 +95,154 @@ public class DataManager { query.addField(new Field("GROUPS.*")); query.addJoin(new Join(JoinType.INNER, "GROUP_ARTISTS", new Field("GROUPS.ID"), new Field("GROUP_ARTISTS.GROUP_"))); query.addWhereClause(new ValueFieldWhereClause(new ValueField("GROUP_ARTISTS.ARTIST", new StringParameter(artistId)))); - return database.getMultiple(query, DefaultGroup.CREATOR); + return database.getMultiple(query, groupCreator); } - private class TrackLoader implements ResultProcessor { + private class LazyArtist extends DefaultArtist { + + private final Memoizer tracksMemoizer = new Memoizer(new Callable() { + public Void call() throws DatabaseException { + if (!hasValue("tracks")) { + value("tracks", Collection.class).set(getTracksByArtist(id())); + } + return null; + } + }); + + private final Memoizer groupsMemoizer = new Memoizer(new Callable() { + + @Override + public Void call() throws Exception { + if (!hasValue("groups")) { + value("groups", Collection.class).set(getGroupsByArtist(id())); + } + return null; + } - private final List loadedTracks = new ArrayList(); - private Track track; + }); + + public LazyArtist(String id) { + super(id); + } - public Track get() { - return loadedTracks.isEmpty() ? null : loadedTracks.get(0); + /** + * {@inheritDoc} + */ + @Override + public Collection groups() { + groupsMemoizer.get(); + return super.groups(); } - public List all() { - return loadedTracks; + public Collection tracks() { + tracksMemoizer.get(); + return super.tracks(); } + } + + private class ArtistCreator implements ObjectCreator { + /** * {@inheritDoc} */ - public void processResult(ResultSet resultSet) throws SQLException { - String trackId = resultSet.getString("TRACKS.ID"); - if ((track == null) || (!track.id().equals(trackId))) { - track = new DefaultTrack(trackId).name(resultSet.getString("TRACKS.NAME")).artists(new ArrayList()).styles(new HashSet