[mb-commits] r13710 - in search_server/trunk: index/src/main/java/org/musicbrainz/search/index index/src/test/java/org/musicbrainz/search/index servlet/src/main/java/org/musicbrainz/search/servlet/mmd2 servlet/src/test/java/org/musicbrainz/search/servlet

[email protected] Wed, 02 Oct 2013 10:30:14 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1VRJh8-0001zs-7o@wiley>
Author: ijabz
Date: 2013-10-02 10:29:56 +0000 (Wed, 02 Oct 2013)
New Revision: 13710

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java
Log:
SEARCH-321:Recording, release and release-group search results incomplete artist aliases

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -19,12 +19,16 @@
 
 package org.musicbrainz.search.index;
 
+import com.google.common.base.Strings;
 import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 
+import java.io.IOException;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 
@@ -72,19 +76,17 @@
      * @param rs
      * @param entityKey
      * @param artistCreditId
-     *@param aliasName  @return
      * @throws SQLException
      */
     public static Map<Integer, ArtistCreditWrapper> completeArtistCreditFromDbResults(ResultSet rs,
-                                                                               String entityKey,
-                                                                               String artistCreditId,
-                                                                               String artistId,
-                                                                               String artistName,
-                                                                               String artistSortName,
-                                                                               String comment,
-                                                                               String joinPhrase,
-                                                                               String artistCreditName,
-                                                                               String aliasName) throws SQLException {
+                                                                                      String entityKey,
+                                                                                      String artistCreditId,
+                                                                                      String artistId,
+                                                                                      String artistName,
+                                                                                      String artistSortName,
+                                                                                      String comment,
+                                                                                      String joinPhrase,
+                                                                                      String artistCreditName) throws SQLException {
         Map<Integer, ArtistCreditWrapper> artistCredits = new HashMap<Integer, ArtistCreditWrapper>();
         ObjectFactory of = new ObjectFactory();
         ArtistCreditWrapper acw;
@@ -112,15 +114,6 @@
                 artist.setDisambiguation(disamb);
             }
 
-            String engAlias = rs.getString(aliasName);
-            if(engAlias!=null && engAlias.length()>0)
-            {
-                Alias alias  =of.createAlias();
-                alias.setContent(engAlias);
-                AliasList al =of.createAliasList();
-                al.getAlias().add(alias);
-                artist.setAliasList(al);
-            }
             nc.setArtist(artist);
             String jp=rs.getString(joinPhrase);
             if(jp!=null && !jp.isEmpty()) {
@@ -136,6 +129,74 @@
     }
 
     /**
+     * Add aliases for the artist credits from the database
+     *
+     * @param artistCredits
+     * @param entityKey
+     * @param rs
+     * @return
+     * @throws SQLException
+     * @throws IOException
+     */
+    public static Map<Integer, ArtistCreditWrapper> updateArtistCreditWithAliases(
+            Map<Integer, ArtistCreditWrapper> artistCredits,
+            String entityKey,
+            ResultSet rs)
+            throws SQLException, IOException {
+
+        ObjectFactory of = new ObjectFactory();
+
+        int entityId = -1;
+        int position = -1;
+        NameCredit nc = null;
+        while (rs.next()) {
+            int currEntityId = rs.getInt(entityKey);
+            int currPosition = rs.getInt("pos");
+            if(currEntityId!=entityId || currPosition!=position)
+            {
+                ArtistCreditWrapper acw = artistCredits.get(currEntityId);
+                nc = acw.getArtistCredit().getNameCredit().get(currPosition);
+                entityId = currEntityId;
+                position = currPosition;
+            }
+
+            if(nc.getArtist().getAliasList()==null)
+            {
+                nc.getArtist().setAliasList(of.createAliasList());
+            }
+            List<Alias> aliasList = nc.getArtist().getAliasList().getAlias();
+            Alias alias = of.createAlias();
+            alias.setContent(rs.getString("name"));
+            alias.setSortName(rs.getString("sort_name"));
+            boolean isPrimary = rs.getBoolean("primary_for_locale");
+            if(isPrimary) {
+                alias.setPrimary("primary");
+            }
+            String locale = rs.getString("locale");
+            if(locale!=null) {
+                alias.setLocale(locale);
+            }
+            String type = rs.getString("type");
+            if(type!=null) {
+                alias.setType(type);
+            }
+
+            String begin = Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day"));
+            if(!Strings.isNullOrEmpty(begin))  {
+                alias.setBeginDate(begin);
+            }
+
+            String end = Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day"));
+            if(!Strings.isNullOrEmpty(end))  {
+                alias.setEndDate(end);
+            }
+            aliasList.add(alias);
+        }
+        rs.close();
+        return artistCredits;
+    }
+
+    /**
      * Populate all artist credit fields from Lucene index fields from ArtistCredit instance
      *
      * @param doc
@@ -177,9 +238,16 @@
 
                 //If there is an english locale based alias we add this to help when looking up releases
                 //by artists who name is in non-latin script
-                if(nc.getArtist().getAliasList()!=null)
+                if(nc.getArtist().getAliasList()!=null && nc.getArtist().getAliasList().getAlias().size()>0)
                 {
-                    doc.addField(artistName,(String)nc.getArtist().getAliasList().getAlias().get(0).getContent());
+                    for(Alias alias:nc.getArtist().getAliasList().getAlias())
+                    {
+                        if(alias.getLocale()!=null && alias.getLocale().equals("en"))
+                        {
+                            doc.addField(artistName,nc.getArtist().getAliasList().getAlias().get(0).getContent());
+                            break;
+                        }
+                    }
                 }
             }
 
@@ -219,11 +287,20 @@
 
                 //If there is an english locale based alias we add this to help when looking up releases
                 //by artists who name is in non-latin script
-                if(nc.getArtist().getAliasList()!=null)
+                if(nc.getArtist().getAliasList()!=null && nc.getArtist().getAliasList().getAlias().size()>0)
                 {
-                    doc.addField(artistName,(String)nc.getArtist().getAliasList().getAlias().get(0).getContent());
+                    for(Alias alias:nc.getArtist().getAliasList().getAlias())
+                    {
+                        if(alias.getLocale()!=null && alias.getLocale().equals("en"))
+                        {
+                            doc.addField(artistName, nc.getArtist().getAliasList().getAlias().get(0).getContent());
+                            break;
+                        }
+                    }
                 }
             }
         }
     }
+
+
 }

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -42,8 +42,11 @@
 
     public static final String INDEX_NAME = "artist";
 
-    //Special purpose Artist
-    private static final String DELETED_ARTIST_MBID = "c06aa285-520e-40c0-b776-83d2c9e8a6d1";
+    //Special purpose Artists
+    public  static final String DELETED_ARTIST_MBID = "c06aa285-520e-40c0-b776-83d2c9e8a6d1";
+    public  static final String VARIOUS_ARTIST_MBID = "89ad4ac3-39f7-470e-963a-56509c546377";
+    public  static final String UNKNOWN_ARTIST_MBID = "125ec42a-7229-4250-afc5-e057484327fe";
+
     private static final String PERSON = "Person";
 
     private CharsetEncoder latinEncoder;

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -54,7 +54,7 @@
 
     /**
      * Create table showing all artist credits, then create index
-     * for the table.
+     * for the table, a merge of required artist credit_name & artist information
      *
      * @throws SQLException
      */
@@ -68,19 +68,14 @@
                 "SELECT acn.artist_credit as artist_credit, " +
                 "  acn.position as pos, " +
                 "  acn.join_phrase as joinphrase, " +
+                "  a.id," +
                 "  a.gid as artistId,  " +
                 "  a.comment as comment, " +
                 "  a.name as artistName, " +
                 "  acn.name as artistCreditName, " +
-                "  a.sort_name as artistSortName, " +
-                "  aa1.aliasName " +
+                "  a.sort_name as artistSortName " +
                 " FROM artist_credit_name acn  " +
                 "  INNER JOIN artist a ON a.id=acn.artist " +
-                "  LEFT JOIN ( SELECT aa.artist, MAX(aa.name) AS aliasName FROM" +
-                "     artist_alias aa " +
-                "     WHERE aa.locale='" + ENGLISH_ISO_CODE + "'" +
-                "     GROUP BY aa.artist) AS aa1"  +
-                "     ON a.id=aa1.artist " +
                 " ORDER BY acn.artist_credit,acn.position ");
         clock.stop();
         System.out.println("tmp_artistcredit:Finished:"+ Utils.formatClock(clock));

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -154,13 +154,37 @@
                         "  a.comment, " +
                         "  a.artistName, " +
                         "  a.artistCreditName, " +
-                        "  a.artistSortName, " +
-                        "  a.aliasName " +
+                        "  a.artistSortName " +
                         " FROM recording AS r " +
                         "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
                         " WHERE r.id BETWEEN ? AND ?  " +
                         " ORDER BY r.id, a.pos");
 
+        addPreparedStatement("ARTISTCREDITALIASES",
+                "SELECT r.id as recordingId," +
+                        " a.artist_credit, " +
+                        " a.pos, " +
+                        " aa.name," +
+                        " aa.sort_name," +
+                        " aa.primary_for_locale," +
+                        " aa.locale," +
+                        " aa.begin_date_year," +
+                        " aa.begin_date_month," +
+                        " aa.begin_date_day," +
+                        " aa.end_date_year," +
+                        " aa.end_date_month," +
+                        " aa.end_date_day," +
+                        " att.name as type" +
+                        " FROM recording AS r " +
+                        "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
+                        "  INNER JOIN artist_alias aa ON a.id=aa.artist" +
+                        "  LEFT  JOIN artist_alias_type att on (aa.type=att.id)" +
+                        " WHERE r.id BETWEEN ? AND ?  " +
+                        " AND a.artistId!='" + ArtistIndex.VARIOUS_ARTIST_MBID +"'" +
+                        " AND a.artistId!='" + ArtistIndex.UNKNOWN_ARTIST_MBID  +"'" +
+                        " ORDER BY r.id, a.pos, aa.name");
+
+
         addPreparedStatement("TRACKARTISTCREDITS",
                 "SELECT t.id as id, " +
                         "  a.artist_credit, " +
@@ -170,13 +194,35 @@
                         "  a.comment, " +
                         "  a.artistName, " +
                         "  a.artistCreditName, " +
-                        "  a.artistSortName, " +
-                        "  a.aliasName " +
+                        "  a.artistSortName " +
                         " FROM track AS t " +
                         "  INNER JOIN tmp_artistcredit a ON t.artist_credit=a.artist_credit " +
                         " WHERE t.recording BETWEEN ? AND ?  " +
                         " ORDER BY t.recording, a.pos");
 
+        addPreparedStatement("TRACKARTISTCREDITALIASES",
+                "SELECT r.id as recordingId," +
+                        " a.artist_credit, " +
+                        " a.pos, " +
+                        " aa.name," +
+                        " aa.sort_name," +
+                        " aa.primary_for_locale," +
+                        " aa.locale," +
+                        " aa.begin_date_year," +
+                        " aa.begin_date_month," +
+                        " aa.begin_date_day," +
+                        " aa.end_date_year," +
+                        " aa.end_date_month," +
+                        " aa.end_date_day," +
+                        " att.name as type" +
+                        " FROM track AS r " +
+                        "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
+                        "  INNER JOIN artist_alias aa ON a.id=aa.artist" +
+                        "  LEFT  JOIN artist_alias_type att on (aa.type=att.id)" +
+                        " WHERE r.recording BETWEEN ? AND ?  " +
+                        " AND a.artistId!='" + ArtistIndex.VARIOUS_ARTIST_MBID +"'" +
+                        " AND a.artistId!='" + ArtistIndex.UNKNOWN_ARTIST_MBID  +"'" +
+                        " ORDER BY r.id, a.pos, aa.name");
         releases =
                 "SELECT " +
                         "  id as releaseKey, gid as releaseid, name as releasename, type, " +
@@ -301,13 +347,41 @@
                         "artistSortName",
                         "comment",
                         "joinphrase",
-                        "artistCreditName",
-                        "aliasName");
+                        "artistCreditName"
+                );
         rs.close();
         artistClock.suspend();
         return artistCredits;
     }
 
+    private Map<Integer, ArtistCreditWrapper> updateArtistCreditWithAliases(
+            Map<Integer, ArtistCreditWrapper> artistCredits,
+            int min,
+            int max)
+            throws SQLException, IOException {
+
+        //Artist Credit Aliases
+        PreparedStatement st = getPreparedStatement("ARTISTCREDITALIASES");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        return ArtistCreditHelper.updateArtistCreditWithAliases(artistCredits,"recordingId", rs);
+    }
+
+    private Map<Integer, ArtistCreditWrapper> updateTrackArtistCreditWithAliases(
+            Map<Integer, ArtistCreditWrapper> artistCredits,
+            int min,
+            int max)
+            throws SQLException, IOException {
+
+        //Artist Credit Aliases
+        PreparedStatement st = getPreparedStatement("TRACKARTISTCREDITALIASES");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        return ArtistCreditHelper.updateArtistCreditWithAliases(artistCredits,"recordingId", rs);
+    }
+
     /**
      * Get Track Artist Credit
      *
@@ -335,8 +409,8 @@
                         "artistSortName",
                         "comment",
                         "joinphrase",
-                        "artistCreditName",
-                        "aliasName");
+                        "artistCreditName"
+                );
         rs.close();
         trackArtistClock.suspend();
         return artistCredits;
@@ -587,12 +661,12 @@
 
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
-        Map<Integer, List<Tag>> tags = loadTags(min, max);
-        Map<Integer, List<String>> isrcs = loadISRCs(min, max);
-        Map<Integer, ArtistCreditWrapper> artistCredits = loadArtists(min, max);
-        Map<Integer, ArtistCreditWrapper> trackArtistCredits = loadTrackArtists(min, max);
-        Map<Integer, List<TrackWrapper>> tracks = loadTracks(min, max);
-        Map<Integer, Release> releases = loadReleases(tracks);
+        Map<Integer, List<Tag>>             tags                = loadTags(min, max);
+        Map<Integer, List<String>>          isrcs               = loadISRCs(min, max);
+        Map<Integer, ArtistCreditWrapper>   artistCredits       = updateArtistCreditWithAliases(loadArtists(min, max), min, max);
+        Map<Integer, ArtistCreditWrapper>   trackArtistCredits  = updateTrackArtistCreditWithAliases(loadTrackArtists(min, max), min, max);
+        Map<Integer, List<TrackWrapper>>    tracks              = loadTracks(min, max);
+        Map<Integer, Release>               releases            = loadReleases(tracks);
 
         PreparedStatement st = getPreparedStatement("RECORDINGS");
         st.setInt(1, min);

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -32,7 +32,7 @@
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.search.similarities.Similarity;
-import org.musicbrainz.mmd2.Tag;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.ReleaseGroupSimilarity;
 
@@ -113,13 +113,36 @@
                 "  a.comment, " +
                 "  a.artistName, " +
                 "  a.artistCreditName, " +
-                "  a.artistSortName, " +
-                "  a.aliasName " +
+                "  a.artistSortName " +
                 " FROM release_group AS r " +
                 "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
                 " WHERE r.id BETWEEN ? AND ?  " +
                 " ORDER BY r.id, a.pos");
 
+        addPreparedStatement("ARTISTCREDITALIASES",
+                "SELECT r.id as releaseGroupId," +
+                " a.artist_credit, " +
+                " a.pos, " +
+                " aa.name," +
+                " aa.sort_name," +
+                " aa.primary_for_locale," +
+                " aa.locale," +
+                " aa.begin_date_year," +
+                " aa.begin_date_month," +
+                " aa.begin_date_day," +
+                " aa.end_date_year," +
+                " aa.end_date_month," +
+                " aa.end_date_day," +
+                " att.name as type" +
+                " FROM release_group AS r " +
+                "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
+                "  INNER JOIN artist_alias aa ON a.id=aa.artist" +
+                "  LEFT  JOIN artist_alias_type att on (aa.type=att.id)" +
+                " WHERE r.id BETWEEN ? AND ?  " +
+                " AND a.artistId!='" + ArtistIndex.VARIOUS_ARTIST_MBID +"'" +
+                " AND a.artistId!='" + ArtistIndex.UNKNOWN_ARTIST_MBID  +"'" +
+                " ORDER BY r.id, a.pos, aa.name");
+
         addPreparedStatement("SECONDARYTYPES",
                 "SELECT rg.name as type, rgj.release_group as release_group " +
                 " FROM release_group_secondary_type_join rgj " +
@@ -138,10 +161,10 @@
 
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
-        Map<Integer, List<Tag>> tags                        = loadTags(min, max);
-        Map<Integer, List<ReleaseWrapper>> releases         = loadReleases(min, max);
-        Map<Integer, ArtistCreditWrapper> artistCredits     = loadArtistCredits(min, max);
-        Map<Integer, List<String>> secondaryTypes           = loadSecondaryTypes(min, max);
+        Map<Integer, List<Tag>> tags                            = loadTags(min, max);
+        Map<Integer, List<ReleaseWrapper>> releases             = loadReleases(min, max);
+        Map<Integer, ArtistCreditWrapper> artistCredits         = updateArtistCreditWithAliases(loadArtistCredits(min, max),min, max);
+        Map<Integer, List<String>> secondaryTypes               = loadSecondaryTypes(min, max);
         //ReleaseGroups
         PreparedStatement st = getPreparedStatement("RELEASEGROUPS");
         st.setInt(1, min);
@@ -239,12 +262,26 @@
                         "artistSortName",
                         "comment",
                         "joinphrase",
-                        "artistCreditName",
-                        "aliasName");
+                        "artistCreditName"
+                );
         rs.close();
         return artistCredits;
     }
 
+    private Map<Integer, ArtistCreditWrapper> updateArtistCreditWithAliases(
+            Map<Integer, ArtistCreditWrapper> artistCredits,
+            int min,
+            int max)
+            throws SQLException, IOException {
+
+        //Artist Credit Aliases
+        PreparedStatement st = getPreparedStatement("ARTISTCREDITALIASES");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        return ArtistCreditHelper.updateArtistCreditWithAliases(artistCredits,"releaseGroupId", rs);
+    }
+
     /**
      * Load work iswcs
      *

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -131,13 +131,36 @@
                 "  a.comment, " +
                 "  a.artistName, " +
                 "  a.artistCreditName, " +
-                "  a.artistSortName, " +
-                "  a.aliasName " +
+                "  a.artistSortName " +
                 " FROM release AS r " +
                 "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
                 " WHERE r.id BETWEEN ? AND ?  " +
                 " ORDER BY r.id, a.pos");
 
+        addPreparedStatement("ARTISTCREDITALIASES",
+                "SELECT r.id as releaseId," +
+                " a.artist_credit, " +
+                " a.pos, " +
+                " aa.name," +
+                " aa.sort_name," +
+                " aa.primary_for_locale," +
+                " aa.locale," +
+                " aa.begin_date_year," +
+                " aa.begin_date_month," +
+                " aa.begin_date_day," +
+                " aa.end_date_year," +
+                " aa.end_date_month," +
+                " aa.end_date_day," +
+                " att.name as type" +
+                " FROM release AS r " +
+                "  INNER JOIN tmp_artistcredit a ON r.artist_credit=a.artist_credit " +
+                "  INNER JOIN artist_alias aa ON a.id=aa.artist" +
+                "  LEFT  JOIN artist_alias_type att on (aa.type=att.id)" +
+                " WHERE r.id BETWEEN ? AND ?  " +
+                " AND a.artistId!='" + ArtistIndex.VARIOUS_ARTIST_MBID +"'" +
+                " AND a.artistId!='" + ArtistIndex.UNKNOWN_ARTIST_MBID  +"'" +
+                " ORDER BY r.id, a.pos, aa.name");
+
         addPreparedStatement("SECONDARYTYPES",
                 "SELECT rg.name as type, r.id as rid" +
                 " FROM tmp_release r " +
@@ -317,23 +340,7 @@
 
         //Artist Credits
         artistClock.resume();
-        st = getPreparedStatement("ARTISTCREDITS");
-        st.setInt(1, min);
-        st.setInt(2, max);
-        rs = st.executeQuery();
-        Map<Integer, ArtistCreditWrapper> artistCredits
-                = ArtistCreditHelper.completeArtistCreditFromDbResults
-                     (rs,
-                      "releaseId",
-                      "artist_Credit",
-                      "artistId",
-                      "artistName",
-                      "artistSortName",
-                      "comment",
-                      "joinphrase",
-                      "artistCreditName",
-                      "aliasName");
-        rs.close();
+        Map<Integer, ArtistCreditWrapper> artistCredits = updateArtistCreditWithAliases(loadArtistCredits(min, max),min, max);
         artistClock.suspend();
 
         Map<Integer, List<String>> secondaryTypes = loadSecondaryTypes(min, max);
@@ -349,6 +356,53 @@
         rs.close();
     }
 
+    /**
+     * Load Artist Credits
+     *
+     * @param min
+     * @param max
+     * @return
+     * @throws SQLException
+     * @throws IOException
+     */
+    private Map<Integer, ArtistCreditWrapper> loadArtistCredits(int min, int max) throws SQLException, IOException {
+
+        //Artist Credits
+        PreparedStatement st = getPreparedStatement("ARTISTCREDITS");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        Map<Integer, ArtistCreditWrapper> artistCredits
+                = ArtistCreditHelper.completeArtistCreditFromDbResults
+                (rs,
+                        "releaseId",
+                        "artist_Credit",
+                        "artistId",
+                        "artistName",
+                        "artistSortName",
+                        "comment",
+                        "joinphrase",
+                        "artistCreditName"
+                );
+        rs.close();
+        return artistCredits;
+    }
+
+    private Map<Integer, ArtistCreditWrapper> updateArtistCreditWithAliases(
+            Map<Integer, ArtistCreditWrapper> artistCredits,
+            int min,
+            int max)
+            throws SQLException, IOException {
+
+        //Artist Credit Aliases
+        PreparedStatement st = getPreparedStatement("ARTISTCREDITALIASES");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        return ArtistCreditHelper.updateArtistCreditWithAliases(artistCredits,"releaseId", rs);
+    }
+
+
     public Document documentFromResultSet(ResultSet rs,
                                           Map<Integer, List<String>> secondaryTypes,
                                           Map<Integer, List<Tag>> tags,

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -45,6 +45,8 @@
 
         stmt.addBatch("INSERT INTO artist (id, gid, name, sort_name, comment)" +
                 " VALUES (16153, 'ccd4879c-5e88-4385-b131-bf65296bf245', 'Echo & The Bunnymen', 'Echo and The Bunnymen','')");
+        stmt.addBatch("INSERT INTO artist_alias(id, artist, name, sort_name, locale, edits_pending, last_updated) VALUES (1, 16153, 'Echo & Bunneymen','Bunneymen & Echo', 'en',1,null)");
+
         stmt.addBatch("INSERT INTO artist_credit (id, name, artist_count, ref_count) VALUES (1,  'Echo & The Bunnymen', 1, 1)");
         stmt.addBatch("INSERT INTO artist_credit_name (artist_credit, position, artist, name, join_phrase) " +
                 " VALUES (1, 0, 16153, 'Echo & The Bunnymen', '')");
@@ -779,6 +781,10 @@
             assertEquals("2f250ed2-6285-40f1-aa2a-14f1c05e9765", recording.getId());
             assertEquals("Do It Clean", recording.getTitle());
 
+            ArtistCredit ac = recording.getArtistCredit();
+            assertEquals("Echo & Bunneymen", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getContent());
+            assertEquals("Bunneymen & Echo", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getSortName());
+
             ReleaseList releaseList = recording.getReleaseList();
             Release     release     = releaseList.getRelease().get(0);
             assertNotNull(release);

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -132,15 +132,19 @@
 
         stmt.addBatch("INSERT INTO artist (id, gid, name, sort_name, comment)" +
                 " VALUES (1, '99845d0c-f239-4051-a6b1-4b5e9f7ede0b', 'Erich Kunzel', 'Kunzel, Eric', 'a comment')");
+        stmt.addBatch("INSERT INTO artist_alias(id, artist, name, sort_name, locale, edits_pending, last_updated) VALUES (1, 1, 'Erich Kunzstel','Kunzstel, Erich', 'en',1,null)");
+        stmt.addBatch("INSERT INTO artist_alias(id, artist, name, sort_name, locale, edits_pending, last_updated) VALUES (2, 1, 'Erich Kunzstelein','Kunzstelein, Erich', 'de',1,null)");
+
         stmt.addBatch("INSERT INTO artist (id, gid, name, sort_name, comment)" +
                 " VALUES (2, 'd8fbd94c-cd06-4e8b-a559-761ad969d07e', 'The Cincinnati Pops Orchestra', 'Cincinnati Pops Orchestra, The', 'a comment')");
 
+
         stmt.addBatch("INSERT INTO artist_credit (id, name, artist_count, ref_count) VALUES (1, 'Erich Kunzel and Kunzel, Eric', 1, 1)");
         stmt.addBatch("INSERT INTO artist_credit_name (artist_credit, position, artist, name, join_phrase)" +
                 " VALUES (1, 0, 1, 'Erich Kunzel', ' and ')");
         stmt.addBatch("INSERT INTO artist_credit_name (artist_credit, position, artist, name, join_phrase)" +
                 " VALUES (1, 1, 2, 'Cincinnati Pops','')");
-        
+
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit, type)" +
                 "    VALUES (1, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 'Epics', 1, 1)");
 
@@ -366,6 +370,8 @@
             tr.next();
             assertEquals("kunzel", tr.term().utf8ToString());
             tr.next();
+            assertEquals("kunzstel", tr.term().utf8ToString());
+            tr.next();
             assertEquals("orchestra", tr.term().utf8ToString());
             tr.next();
             assertEquals("pops", tr.term().utf8ToString());
@@ -401,6 +407,15 @@
             assertEquals("Erich Kunzel", ac.getNameCredit().get(0).getArtist().getName());
             assertEquals("Cincinnati Pops", ac.getNameCredit().get(1).getName());
             assertEquals("The Cincinnati Pops Orchestra", ac.getNameCredit().get(1).getArtist().getName());
+            assertEquals(2, ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().size());
+            assertNull(ac.getNameCredit().get(1).getArtist().getAliasList());
+            assertEquals("Erich Kunzstel", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getContent());
+            assertEquals("Erich Kunzstelein", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(1).getContent());
+            assertEquals("Kunzstel, Erich", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getSortName());
+            assertEquals("Kunzstelein, Erich", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(1).getSortName());
+            assertEquals("en", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getLocale());
+            assertEquals("de", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(1).getLocale());
+
         }
         ir.close();
 

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -115,6 +115,8 @@
 
         stmt.addBatch("INSERT INTO artist (id, gid, name, sort_name, comment)" +
                 " VALUES (16153, 'ccd4879c-5e88-4385-b131-bf65296bf245', 'Echo & The Bunnymen', 'Echo and The Bunnymen', 'a comment')");
+        stmt.addBatch("INSERT INTO artist_alias(id, artist, name, sort_name, locale, edits_pending, last_updated) VALUES (1, 16153, 'Echo & Bunneymen','Bunneymen & Echo', 'en',1,null)");
+
         stmt.addBatch("INSERT INTO artist_credit (id, name, artist_count, ref_count) VALUES (1, 'Echo & The Bunnymen', 1, 1)");
         stmt.addBatch("INSERT INTO artist_credit_name (artist_credit, position, artist, name, join_phrase) " +
                 " VALUES (1, 0, 16153, 'Echo & The Bunnymen', '')");
@@ -864,6 +866,10 @@
             assertEquals(1,release.getMediumList().getCount().intValue());
             assertEquals(10,release.getMediumList().getTrackCount().intValue());
 
+            ArtistCredit ac = release.getArtistCredit();
+            assertEquals("Echo & Bunneymen", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getContent());
+            assertEquals("Bunneymen & Echo", ac.getNameCredit().get(0).getArtist().getAliasList().getAlias().get(0).getSortName());
+
             ReleaseEventList rel = release.getReleaseEventList();
             assertNotNull(rel);
             assertEquals(4,rel.getReleaseEvent().size());

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -148,4 +148,37 @@
         }
         list.add(releaseGroup);
     }
+
+    /**
+     * Overridden to ensure all attributes are set for each alias
+     *
+     * @param metadata
+     */
+    @Override
+    public void adjustForJson(Metadata metadata) {
+
+        if (metadata.getReleaseGroupList().getReleaseGroup().size()>0) {
+            for(ReleaseGroup releaseGroup:metadata.getReleaseGroupList().getReleaseGroup()) {
+                if(releaseGroup.getArtistCredit()!=null) {
+                    for (NameCredit nc :releaseGroup.getArtistCredit().getNameCredit())
+                    {
+                        if(nc.getArtist()!=null && nc.getArtist().getAliasList()!=null)
+                        {
+                            for (Alias alias : nc.getArtist().getAliasList().getAlias()) {
+                                //On Xml output as primary, but in json they have changed to true/false
+                                if (alias.getPrimary() == null) {
+                                    alias.setPrimary("false");
+                                }
+                                else {
+                                    alias.setPrimary("true");
+                                }
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java	2013-09-30 13:43:50 UTC (rev 13709)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseGroupTest.java	2013-10-02 10:29:56 UTC (rev 13710)
@@ -14,10 +14,7 @@
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Before;
 import org.junit.Test;
-import org.musicbrainz.mmd2.Artist;
-import org.musicbrainz.mmd2.ArtistCredit;
-import org.musicbrainz.mmd2.NameCredit;
-import org.musicbrainz.mmd2.ObjectFactory;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.LuceneVersion;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.DatabaseIndex;
@@ -67,12 +64,18 @@
       doc.addField(ReleaseGroupIndexField.ARTIST_NAMECREDIT, "The Wedding Present");
       doc.addNumericField(ReleaseGroupIndexField.NUM_RELEASES,1);
 
+      Alias alias = of.createAlias();
+      alias.setContent("The Weddoes");
+      alias.setSortName("Weddoes, The");
+      AliasList aliasList = of.createAliasList();
+      aliasList.getAlias().add(alias);
       ArtistCredit ac = of.createArtistCredit();
       NameCredit nc = of.createNameCredit();
       Artist artist = of.createArtist();
       artist.setId("707622da-475f-48e1-905d-248718df6521");
       artist.setName("The Wedding Present");
       artist.setSortName("Wedding Present, The");
+      artist.setAliasList(aliasList);
       nc.setArtist(artist);
       ac.getNameCredit().add(nc);
       doc.addField(ReleaseGroupIndexField.ARTIST_CREDIT, MMDSerializer.serialize(ac));