X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=inline;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fdemoscenemusic%2Fdata%2FDataManager.java;h=374bb6cd97184710018e0245a27dea1f648088a5;hb=eb3a62a5014e129da19f70b90c2b089301e08050;hp=928eebcf2223d0dfda7910443554792f8ef89494;hpb=f533deea6ecc3f1bd59ca8926c31dd7667ee572a;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 928eebc..374bb6c 100644 --- a/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java +++ b/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java @@ -31,6 +31,7 @@ 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; @@ -47,6 +48,9 @@ import net.pterodactylus.util.database.ValueFieldWhereClause; */ public class DataManager { + private final ObjectCreator artistCreator = new ArtistCreator(); + private final ObjectCreator groupCreator = new GroupCreator(); + private final Database database; public DataManager(Database database) { @@ -56,14 +60,7 @@ 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 { @@ -80,6 +77,14 @@ public class DataManager { return artistLoader.get(); } + 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.*")); @@ -118,6 +123,14 @@ public class DataManager { return trackLoader.all(); } + public Collection getGroupsByArtist(String artistId) throws DatabaseException { + Query query = new Query(Type.SELECT, "GROUPS"); + 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); + } + private class TrackLoader implements ResultProcessor { private final List loadedTracks = new ArrayList(); @@ -185,7 +198,7 @@ public class DataManager { private class LazyArtist extends DefaultArtist { - private final Memoizer tracks = new Memoizer(new Callable() { + private final Memoizer tracksMemoizer = new Memoizer(new Callable() { public Void call() throws DatabaseException { if (!hasValue("tracks")) { value("tracks", Collection.class).set(getTracksByArtist(id())); @@ -194,15 +207,89 @@ public class DataManager { } }); + 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; + } + + }); + public LazyArtist(String id) { super(id); } + /** + * {@inheritDoc} + */ + @Override + public Collection groups() { + groupsMemoizer.get(); + return super.groups(); + } + public Collection tracks() { - tracks.get(); + tracksMemoizer.get(); return super.tracks(); } } + private class ArtistCreator implements ObjectCreator { + + /** + * {@inheritDoc} + */ + @Override + public Artist createObject(ResultSet resultSet) throws SQLException { + return new LazyArtist(resultSet.getString("ARTISTS.ID")).name(resultSet.getString("ARTISTS.NAME")); + } + + } + + private class LazyGroup extends DefaultGroup { + + private final Memoizer artistsMemoizer = new Memoizer(new Callable() { + + @Override + public Void call() throws Exception { + if (!hasValue("artists")) { + value("artists", Collection.class).set(getArtistsByGroup(id())); + } + return null; + } + + }); + + public LazyGroup(String id) { + super(id); + } + + /** + * {@inheritDoc} + */ + @Override + public Collection artists() { + artistsMemoizer.get(); + return super.artists(); + } + + } + + private class GroupCreator implements ObjectCreator { + + /** + * {@inheritDoc} + */ + @Override + public Group createObject(ResultSet resultSet) throws SQLException { + return new LazyGroup(resultSet.getString("GROUPS.ID")).name(resultSet.getString("GROUPS.NAME")).url(resultSet.getString("GROUPS.URL")); + } + + } + }