X-Git-Url: https://git.pterodactylus.net/?p=demoscenemusic.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fdemoscenemusic%2Fdata%2FDataManager.java;h=a11027c732cb881cb3da03edc31afdc141675911;hp=f06a48b62bfb0f360f2d9ddeb120f750d28e0af8;hb=8ee27528d19f7e96f330daec1060ca137bedac20;hpb=c9abfe7d653c88931b01137a65188873ee586a37 diff --git a/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java b/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java index f06a48b..a11027c 100644 --- a/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java +++ b/src/main/java/net/pterodactylus/demoscenemusic/data/DataManager.java @@ -21,10 +21,12 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; import java.util.EnumMap; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; @@ -37,6 +39,7 @@ import net.pterodactylus.util.database.Join; 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.OrWhereClause; import net.pterodactylus.util.database.OrderField; import net.pterodactylus.util.database.Parameter.IntegerParameter; import net.pterodactylus.util.database.Parameter.StringParameter; @@ -273,10 +276,7 @@ public class DataManager { * if a database error occurs */ public List loadArtistProperties(List artists) throws DatabaseException { - for (Artist artist : artists) { - loadArtistProperties(artist); - } - return artists; + return loadProperties(artists, "ARTIST_PROPERTIES", "ARTIST"); } /** @@ -421,10 +421,7 @@ public class DataManager { * if a database error occurs */ public List loadTrackProperties(List tracks) throws DatabaseException { - for (Track track : tracks) { - loadTrackProperties(track); - } - return tracks; + return loadProperties(tracks, "TRACK_PROPERTIES", "TRACK"); } /** @@ -561,10 +558,7 @@ public class DataManager { * if a database error occurs */ public List loadTrackDerivativeProperties(List trackDerivatives) throws DatabaseException { - for (TrackDerivative trackDerivative : trackDerivatives) { - loadTrackDerivativeProperties(trackDerivative); - } - return trackDerivatives; + return loadProperties(trackDerivatives, "TRACK_DERIVATIVE_PROPERTIES", "TRACK_DERIVATIVE"); } /** @@ -666,11 +660,8 @@ public class DataManager { * @throws DatabaseException * if a database error occurs */ - public Collection loadGroupProperties(Collection groups) throws DatabaseException { - for (Group group : groups) { - loadGroupProperties(group); - } - return groups; + public Collection loadGroupProperties(List groups) throws DatabaseException { + return loadProperties(groups, "GROUP_PROPERTIES", "GROUP_ID"); } /** @@ -806,10 +797,7 @@ public class DataManager { * if a database error occurs */ public List loadPartyProperties(List parties) throws DatabaseException { - for (Party party : parties) { - loadPartyProperties(party); - } - return parties; + return loadProperties(parties, "PARTY_PROPERTIES", "PARTY"); } /** @@ -950,6 +938,53 @@ public class DataManager { } /** + * Loads the properties for the given objects. + * + * @param + * The type of the object + * @param objects + * The objects + * @param table + * The table to load the properties from + * @param type + * The type of the object (“ARTIST,” “TRACK,” etc.) + * @return The object with its properties loaded + * @throws DatabaseException + * if a database error occurs + */ + private List loadProperties(List objects, final String table, final String type) throws DatabaseException { + final Map objectMap = new HashMap(); + final Set firstObjects = new HashSet(); + for (T object : objects) { + objectMap.put(object.getId(), object); + firstObjects.add(object.getId()); + } + Query query = new Query(Type.SELECT, table); + query.addField(new Field(table + "." + type)); + query.addField(new Field(table + ".PROPERTY")); + query.addField(new Field(table + ".VALUE")); + OrWhereClause whereClause = new OrWhereClause(); + for (T object : objects) { + whereClause.add(new ValueFieldWhereClause(new ValueField(type, new StringParameter(object.getId())))); + } + query.addWhereClause(whereClause); + database.process(query, new ResultProcessor() { + + @Override + public void processResult(ResultSet resultSet) throws SQLException { + String id = resultSet.getString(table + "." + type); + T object = objectMap.get(id); + if (firstObjects.remove(id)) { + object.getProperties().removeAll(); + } + object.getProperties().set(resultSet.getString(table + ".PROPERTY"), resultSet.getString(table + ".VALUE")); + } + + }); + return objects; + } + + /** * {@link Artist} implementation that retrieves some attributes (such as * {@link #getGroups()}, and {@link #getTracks()}) from the * {@link DataManager} on demand.