+ return loadProperties(database.getMultiple(query, artistCreator));
+ }
+
+ /**
+ * Creates a new artist with the given name.
+ *
+ * @param name
+ * The name of the artist
+ * @return The created artist
+ * @throws DatabaseException
+ * if a database error occurs
+ */
+ public Artist createArtist(String name) throws DatabaseException {
+ Query query = new Query(Type.INSERT, "ARTISTS");
+ 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 loadProperties(getArtistById(id));
+ }
+
+ /**
+ * Saves the given artist.
+ *
+ * @param artist
+ * The artist to save
+ * @throws DatabaseException
+ * if a database error occurs
+ */
+ public void saveArtist(Artist artist) throws DatabaseException {
+ Query query = new Query(Type.UPDATE, "ARTISTS");
+ query.addValueField(new ValueField("NAME", new StringParameter(artist.getName())));
+ query.addWhereClause(new ValueFieldWhereClause(new ValueField("ID", new StringParameter(artist.getId()))));
+ database.update(query);
+ }
+
+ /**
+ * Loads the properties for an artist.
+ *
+ * @param artist
+ * The artist to load the properties for
+ * @return The artist
+ * @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;
+ }
+
+ /**
+ * Loads the properties of all given artists.
+ *
+ * @param artists
+ * The artists to load the properties for
+ * @return The list of artists
+ * @throws DatabaseException
+ * if a database error occurs
+ */
+ public List<Artist> loadProperties(List<Artist> artists) throws DatabaseException {
+ for (Artist artist : artists) {
+ loadProperties(artist);
+ }
+ return artists;
+ }
+
+ /**
+ * Returns all remix artists involved in the track with the given ID.
+ *
+ * @param trackId
+ * The ID of the track
+ * @return All remix artists involved in the track, in preferred order
+ * @throws DatabaseException
+ * if a database error occurs
+ */
+ public List<Artist> getRemixArtistsByTrack(String trackId) throws DatabaseException {
+ Query query = new Query(Type.SELECT, "ARTISTS");
+ query.addField(new Field("ARTISTS.*"));
+ query.addJoin(new Join(JoinType.INNER, "TRACK_REMIX_ARTISTS", new Field("TRACK_REMIX_ARTISTS.ARTIST"), new Field("ARTISTS.ID")));
+ query.addWhereClause(new ValueFieldWhereClause(new ValueField("TRACK_REMIX_ARTISTS.TRACK", new StringParameter(trackId))));
+ query.addOrderField(new OrderField(new Field("TRACK_REMIX_ARTISTS.DISPLAY_ORDER")));