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

[email protected] Wed, 01 May 2013 10:22:28 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1UXUBA-0002px-7s@wiley>
Author: ijabz
Date: 2013-05-01 10:22:17 +0000 (Wed, 01 May 2013)
New Revision: 13670

Modified:
   search_server/trunk/index/pom.xml
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/MMDSerializer.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/servlet/pom.xml
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
Log:
SEARCH-273/SEARCH-274:Releases changes for Schema Release.

Modified: search_server/trunk/index/pom.xml
===================================================================
--- search_server/trunk/index/pom.xml	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/pom.xml	2013-05-01 10:22:17 UTC (rev 13670)
@@ -91,7 +91,12 @@
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-json</artifactId>
       <version>1.1.4</version>
-    </dependency>  
+    </dependency>
+    <dependency>
+       <groupId>com.google.guava</groupId>
+       <artifactId>guava</artifactId>
+       <version>14.0.1</version>
+    </dependency>
   </dependencies>
    <build>
     <pluginManagement>

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-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -188,4 +188,42 @@
 
         }
     }
+
+    public static void buildIndexFieldsOnlyFromArtistCredit(MbDocument doc,
+                                                        ArtistCredit ac,
+                                                        IndexField artist,
+                                                        IndexField artistNameCredit,
+                                                        IndexField artistId,
+                                                        IndexField artistName)
+
+    {
+        if (ac!=null) {
+
+            //Search Fields
+
+            //The full artist credit as it appears on the release
+            doc.addField(artist, ArtistCreditHelper.buildFullArtistCreditName(ac));
+            for(NameCredit nc:ac.getNameCredit()) {
+
+                //Each individual name credit (uses artist if name credit is unchanged from artist name)
+                if(nc.getName()!=null) {
+                    doc.addField(artistNameCredit, nc.getName());
+                }
+                else {
+                    doc.addField(artistNameCredit, nc.getArtist().getName());
+                }
+
+                //Each artist id and name on the release
+                doc.addField(artistId, nc.getArtist().getId());
+                doc.addField(artistName, nc.getArtist().getName());
+
+                //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)
+                {
+                    doc.addField(artistName,(String)nc.getArtist().getAliasList().getAlias().get(0).getContent());
+                }
+            }
+        }
+    }
 }

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/MMDSerializer.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/MMDSerializer.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/MMDSerializer.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -32,7 +32,7 @@
 
 
 /**
- * Handles Serializing clases in the MMD for storing within Index, and deserealizing back into
+ * Handles Serializing classes in the MMD for storing within Index, and deserializing back into
  * the original class.
  *
  * We use JSON rather than XML or Java Serialization because it is the quickest and takes less space.

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -31,6 +31,7 @@
 
 import org.musicbrainz.mmd2.ObjectFactory;
 import org.musicbrainz.mmd2.Release;
+import org.musicbrainz.mmd2.ReleaseEvent;
 import org.musicbrainz.mmd2.Tag;
 
 import java.math.BigInteger;
@@ -43,21 +44,21 @@
 
 public class ReleaseEventHelper {
 
-    public static Map<Integer,List<Release>> completeReleaseEventsFromDbResults(ResultSet rs,
+    public static Map<Integer,List<ReleaseEvent>> completeReleaseEventsFromDbResults(ResultSet rs,
                                                                   String entityKey) throws SQLException {
-        Map<Integer, List<Release>> releaseEvents = new HashMap<Integer, List<Release>>();
+        Map<Integer, List<ReleaseEvent>> releaseEvents = new HashMap<Integer, List<ReleaseEvent>>();
         ObjectFactory of = new ObjectFactory();
-        List<Release> releaseEventList;
+        List<ReleaseEvent> releaseEventList;
         while (rs.next()) {
             int entityId = rs.getInt(entityKey);
             if (!releaseEvents.containsKey(entityId)) {
-                releaseEventList = new ArrayList<Release>();
+                releaseEventList = new ArrayList<ReleaseEvent>();
                 releaseEvents.put(entityId, releaseEventList);
             } else {
                 releaseEventList = releaseEvents.get(entityId);
             }
 
-            Release releaseEvent = of.createRelease();
+            ReleaseEvent releaseEvent = of.createReleaseEvent();
             releaseEvent.setCountry(rs.getString("country"));
             releaseEvent.setDate(Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day")));
             releaseEventList.add(releaseEvent);

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-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -28,15 +28,17 @@
 
 package org.musicbrainz.search.index;
 
+import com.google.common.base.Strings;
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.StopWatch;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexWriter;
-import org.musicbrainz.mmd2.Release;
-import org.musicbrainz.mmd2.Tag;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.sql.*;
 import java.util.*;
 
@@ -252,15 +254,14 @@
 
     }
 
-    private Map<Integer, List<Release>> loadReleaseEvents(int min, int max) throws SQLException, IOException {
+    private Map<Integer, List<ReleaseEvent>> loadReleaseEvents(int min, int max) throws SQLException, IOException {
 
         // Get Release Country
         PreparedStatement st = getPreparedStatement("RELEASE_COUNTRY");
         st.setInt(1, min);
         st.setInt(2, max);
         ResultSet rs = st.executeQuery();
-        //TODO Will Become ReleaseEvent when MMD updated
-        Map<Integer,List<Release>> releaseEvents = ReleaseEventHelper.completeReleaseEventsFromDbResults(rs,"release");
+        Map<Integer,List<ReleaseEvent>> releaseEvents = ReleaseEventHelper.completeReleaseEventsFromDbResults(rs,"release");
         rs.close();
         return releaseEvents;
 
@@ -269,7 +270,7 @@
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
         Map<Integer, List<Tag>> tags                        = loadTags(min, max);
-        Map<Integer, List<Release>> releaseEvents           = loadReleaseEvents(min, max);
+        Map<Integer, List<ReleaseEvent>> releaseEvents      = loadReleaseEvents(min, max);
 
         //A particular release can have multiple catalog nos, labels when released as an imprint, typically used
         //by major labels
@@ -387,103 +388,194 @@
     public Document documentFromResultSet(ResultSet rs,
                                           Map<Integer, List<String>> secondaryTypes,
                                           Map<Integer,List<Tag>> tags,
-                                          Map<Integer,List<Release>> releaseEvents,
+                                          Map<Integer,List<ReleaseEvent>> releaseEvents,
                                           Map<Integer,List<List<String>>> labelInfo,
                                           Map<Integer,List<List<String>>> mediums,
                                           Map<Integer, List<String>> puids,
                                           Map<Integer, ArtistCreditWrapper> artistCredits) throws SQLException {
         MbDocument doc = new MbDocument();
+
+        ObjectFactory of = new ObjectFactory();
+        Release release = of.createRelease();
+
         int id = rs.getInt("id");
         doc.addField(ReleaseIndexField.ID, id);
         doc.addField(ReleaseIndexField.RELEASE_ID, rs.getString("gid"));
+        release.setId(rs.getString("gid"));
+
         String name = rs.getString("name");
         doc.addField(ReleaseIndexField.RELEASE, name );
         doc.addField(ReleaseIndexField.RELEASE_ACCENT, name);
+        release.setTitle(name);
 
         String primaryType = rs.getString("type");
         doc.addFieldOrUnknown(ReleaseIndexField.PRIMARY_TYPE, primaryType);
+        ReleaseGroup rg = of.createReleaseGroup();
+        release.setReleaseGroup(rg);
+        if (primaryType!=null && !primaryType.isEmpty()){
+            release.getReleaseGroup().setType(primaryType);
+        }
+
         if (secondaryTypes.containsKey(id)) {
+            SecondaryTypeList stl = of.createSecondaryTypeList();
             for (String secondaryType : secondaryTypes.get(id)) {
                 doc.addField(ReleaseIndexField.SECONDARY_TYPE, secondaryType);
+                stl.getSecondaryType().add(secondaryType);
             }
+            release.getReleaseGroup().setSecondaryTypeList(stl);
         }
+
         String type = ReleaseGroupHelper.calculateOldTypeFromPrimaryType(primaryType, secondaryTypes.get(id));
         doc.addFieldOrUnknown(ReleaseIndexField.TYPE, type);
+        if (type!=null && !type.isEmpty()) {
+            release.getReleaseGroup().setType(type);
+        }
 
+        String releaseGroupId = rs.getString("rg_gid");
+        doc.addNonEmptyField(ReleaseIndexField.RELEASEGROUP_ID, releaseGroupId);
+        release.getReleaseGroup().setId(releaseGroupId);
 
-        doc.addNonEmptyField(ReleaseIndexField.RELEASEGROUP_ID, rs.getString("rg_gid"));
-        doc.addFieldOrUnknown(ReleaseIndexField.STATUS, rs.getString("status"));
+        String status = rs.getString("status");
+        doc.addFieldOrUnknown(ReleaseIndexField.STATUS, status);
+        if (status!=null && !status.isEmpty()) {
+            release.setStatus(type);
+        }
 
-
-
         String barcode = rs.getString("barcode");
         if(barcode==null) {
             doc.addField(ReleaseIndexField.BARCODE,Index.NO_VALUE);
         }
         else if(barcode.equals("")) {
             doc.addField(ReleaseIndexField.BARCODE, BARCODE_NONE);
+            release.setBarcode(barcode);
         }
         else {
             doc.addField(ReleaseIndexField.BARCODE,barcode);
+            release.setBarcode(barcode);
         }
-        doc.addFieldOrNoValue(ReleaseIndexField.AMAZON_ID, rs.getString("amazon_asin"));
 
+        String asin = rs.getString("amazon_asin");
+        doc.addFieldOrNoValue(ReleaseIndexField.AMAZON_ID, asin);
+        if (asin!=null && !asin.isEmpty()) {
+            release.setAsin(asin);
+        }
+
+        boolean isScriptOrLanguage = false;
+        TextRepresentation tr = of.createTextRepresentation();
+        String script = rs.getString("script");
+        doc.addFieldOrUnknown(ReleaseIndexField.SCRIPT, script) ;
+        if (script!=null && !script.isEmpty()) {
+            tr.setScript(script);
+            isScriptOrLanguage=true;
+        }
+
         String lang3= rs.getString("language");
         String lang2= rs.getString("language_2t");
         if(lang3!=null)
         {
             doc.addFieldOrUnknown(ReleaseIndexField.LANGUAGE, lang3);
+            tr.setLanguage(lang3.toLowerCase(Locale.US));
+            isScriptOrLanguage=true;
         }
-        else
+        else if(lang2!=null)
         {
             doc.addFieldOrUnknown(ReleaseIndexField.LANGUAGE, lang2);
+            tr.setLanguage(lang2.toLowerCase(Locale.US));
+            isScriptOrLanguage=true;
         }
-        doc.addFieldOrUnknown(ReleaseIndexField.SCRIPT, rs.getString("script"));
-        doc.addFieldOrNoValue(ReleaseIndexField.COMMENT, rs.getString("comment"));
+        else {
+            doc.addFieldOrUnknown(ReleaseIndexField.LANGUAGE, null);
+        }
+        if(isScriptOrLanguage) {
+            release.setTextRepresentation(tr);
+        }
 
+        String comment = rs.getString("comment");
+        doc.addFieldOrNoValue(ReleaseIndexField.COMMENT, comment);
+        if (comment!=null && !comment.isEmpty()) {
+            release.setDisambiguation(comment);
+        }
+
         if (labelInfo.containsKey(id)) {
+            LabelInfoList labelInfoList = of.createLabelInfoList();
             for (List<String> entry : labelInfo.get(id)) {
+                LabelInfo li = of.createLabelInfo();
+                Label label = of.createLabel();
+                li.setLabel(label);
+                labelInfoList.getLabelInfo().add(li);
                 doc.addFieldOrNoValue(ReleaseIndexField.LABEL_ID, entry.get(0));
+                if(entry.get(0)!=null && !entry.get(0).isEmpty()) {
+                    label.setId(entry.get(0));
+                }
+
                 doc.addFieldOrNoValue(ReleaseIndexField.LABEL, entry.get(1));
+                if(entry.get(1)!=null && !entry.get(1).isEmpty()) {
+                    label.setName(entry.get(1));
+                }
+
                 doc.addFieldOrUnknown(ReleaseIndexField.CATALOG_NO, entry.get(2));
+                if(entry.get(2)!=null && !entry.get(2).isEmpty()) {
+                    li.setCatalogNumber(entry.get(2));
+                }
             }
+            release.setLabelInfoList(labelInfoList);
         }
+        else {
+            doc.addFieldOrNoValue(ReleaseIndexField.LABEL, null);
+            doc.addFieldOrNoValue(ReleaseIndexField.CATALOG_NO, null);
+        }
 
         int trackCount = 0;
         int discCount = 0;
         int mediumCount = 0;
         if (mediums.containsKey(id)) {
+            MediumList mediumList = of.createMediumList();
             for (List<String> entry : mediums.get(id)) {
-                String str;
-                str = entry.get(0);
-                doc.addFieldOrNoValue(ReleaseIndexField.FORMAT, str);
+                Medium medium = of.createMedium();
+
+                String mediumFormat = entry.get(0);
+                doc.addFieldOrNoValue(ReleaseIndexField.FORMAT, mediumFormat);
+                if(mediumFormat!=null && !mediumFormat.isEmpty()) {
+                    medium.setFormat(mediumFormat);
+                }
+
+                //Num of tracks on the Medium
                 int numTracksOnMedium = Integer.parseInt(entry.get(1));
                 doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, numTracksOnMedium);
+                org.musicbrainz.mmd2.Medium.TrackList trackList = of.createMediumTrackList();
+                trackList.setCount(BigInteger.valueOf(numTracksOnMedium));
                 trackCount += numTracksOnMedium;
+                medium.setTrackList(trackList);
 
+                //Num of discids associated with medium
                 int numDiscsOnMedium = Integer.parseInt(entry.get(2));
                 doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, numDiscsOnMedium);
                 discCount += numDiscsOnMedium;
                 mediumCount++;
+                DiscList discList = of.createDiscList();
+                discList.setCount(BigInteger.valueOf(numDiscsOnMedium));
+                medium.setDiscList(discList);
+
+                mediumList.getMedium().add(medium);
+
             }
+
             //Num of mediums on the release
             doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, mediumCount);
 
             //Num Tracks over the whole release
             doc.addNumericField(ReleaseIndexField.NUM_TRACKS, trackCount);
+            mediumList.setTrackCount(BigInteger.valueOf(trackCount));
 
-            //Num Discs over the whole release
+            //Num Discs Ids over the whole release
             doc.addNumericField(ReleaseIndexField.NUM_DISCIDS, discCount);
-
         }
         else
         {
             //No mediums on release
             doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, 0);
-
         }
 
-
         if (puids.containsKey(id)) {
             for (String puid : puids.get(id)) {
                  doc.addField(ReleaseIndexField.PUID, puid);
@@ -493,36 +585,61 @@
 
         ArtistCreditWrapper ac = artistCredits.get(id);
         if(ac!=null) {
-            ArtistCreditHelper.buildIndexFieldsFromArtistCredit
+            ArtistCreditHelper.buildIndexFieldsOnlyFromArtistCredit
                    (doc,
                     ac.getArtistCredit(),
                     ReleaseIndexField.ARTIST,
                     ReleaseIndexField.ARTIST_NAMECREDIT,
                     ReleaseIndexField.ARTIST_ID,
-                    ReleaseIndexField.ARTIST_NAME,
-                    ReleaseIndexField.ARTIST_CREDIT);
+                    ReleaseIndexField.ARTIST_NAME);
+            release.setArtistCredit(ac.getArtistCredit());
         }
         else {
             System.out.println("\nNo artist credit found for release:"+rs.getString("gid"));
         }
 
         if (tags.containsKey(id)) {
-            for (Tag tag : tags.get(id)) {
-                doc.addField(ReleaseIndexField.TAG, tag.getName());
-                doc.addField(ReleaseIndexField.TAGCOUNT, tag.getCount().toString());
+            TagList tagList = of.createTagList();
+            for (Tag nextTag : tags.get(id)) {
+                Tag tag = of.createTag();
+                doc.addField(ReleaseIndexField.TAG, nextTag.getName());
+                tag.setName(nextTag.getName());
+                tag.setCount(new BigInteger(nextTag.getCount().toString()));
+                tagList.getTag().add(tag);
             }
+            release.setTagList(tagList);
         }
 
         if (releaseEvents.containsKey(id)) {
-            for (Release releaseEvent : releaseEvents.get(id)) {
-                doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY, releaseEvent.getCountry());
-                doc.addFieldOrUnknown(ReleaseIndexField.DATE, releaseEvent.getDate());
+            ReleaseEventList rel = of.createReleaseEventList();
+            for (ReleaseEvent releaseEvent : releaseEvents.get(id)) {
+
+                String nextCountry  = releaseEvent.getCountry();
+                doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY,nextCountry);
+
+                String nextDate     = releaseEvent.getDate();
+                doc.addFieldOrUnknown(ReleaseIndexField.DATE, nextDate );
+                rel.getReleaseEvent().add(releaseEvent);
             }
+            release.setReleaseEventList(rel);
+
+            //backwards compatability
+            ReleaseEvent firstReleaseEvent = rel.getReleaseEvent().get(0);
+            if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
+                release.setCountry(firstReleaseEvent.getCountry());
+            }
+            if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {
+                release.setDate(firstReleaseEvent.getDate());
+            }
         }
         else {
             doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY, null);
-            doc.addFieldOrUnknown(ReleaseIndexField.DATE, null);
+            doc.addFieldOrUnknown(ReleaseIndexField.DATE, null );
         }
+
+
+        doc.addField(ReleaseIndexField.RELEASE_STORE, MMDSerializer.serialize(release));
+
         return doc.getLuceneDocument();
     }
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -11,38 +11,38 @@
 public enum ReleaseIndexField implements IndexField {
 	
     ID				    ("_id",		    	MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    AMAZON_ID		    ("asin",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    AMAZON_ID		    ("asin",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     ARTIST_ID		    ("arid",			MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     ARTIST              ("artist",          MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_CREDIT       ("artistcredit",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
     ARTIST_NAME         ("artistname",		MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_NAMECREDIT   ("creditname",	    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    BARCODE			    ("barcode",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new StripLeadingZeroesAnalyzer()),
-    CATALOG_NO		    ("catno",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new StripSpacesAndSeparatorsAnalyzer()),
-    COMMENT		        ("comment",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    COUNTRY			    ("country",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    DATE			    ("date",		    MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    FORMAT  		    ("format",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new CaseInsensitiveKeywordAnalyzer()),
-    LABEL			    ("label",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    LABEL_ID            ("laid",            MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    LANGUAGE		    ("lang",	        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    NUM_DISCIDS         ("discids",		    MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    NUM_DISCIDS_MEDIUM  ("discidsmedium",   MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    BARCODE			    ("barcode",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new StripLeadingZeroesAnalyzer()),
+    CATALOG_NO		    ("catno",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new StripSpacesAndSeparatorsAnalyzer()),
+    COMMENT		        ("comment",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    COUNTRY			    ("country",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    DATE			    ("date",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    FORMAT  		    ("format",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new CaseInsensitiveKeywordAnalyzer()),
+    LABEL			    ("label",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    LABEL_ID            ("laid",            MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    LANGUAGE		    ("lang",	        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    NUM_DISCIDS         ("discids",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    NUM_DISCIDS_MEDIUM  ("discidsmedium",   MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     NUM_MEDIUMS         ("mediums",	        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    NUM_TRACKS		    ("tracks",		    MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    NUM_TRACKS_MEDIUM   ("tracksmedium",	MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    PRIMARY_TYPE        ("primarytype",		MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    NUM_TRACKS		    ("tracks",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    NUM_TRACKS_MEDIUM   ("tracksmedium",	MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    PRIMARY_TYPE        ("primarytype",		MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     PUID    		    ("puid",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    RELEASE			    ("release",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new TitleAnalyzer()),
+    RELEASE			    ("release",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new TitleAnalyzer()),
     RELEASE_ACCENT      ("releaseaccent",   MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzKeepAccentsAnalyzer()),
-    RELEASE_ID		    ("reid",		    MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    RELEASEGROUP_ID	    ("rgid",			MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    SCRIPT			    ("script",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new CaseInsensitiveKeywordAnalyzer()),
-    SECONDARY_TYPE      ("secondarytype",   MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    STATUS		        ("status",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    TAG		            ("tag",		        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    TAGCOUNT            ("tagcount",	    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    TYPE		        ("type",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    RELEASE_ID		    ("reid",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    RELEASEGROUP_ID	    ("rgid",			MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    SCRIPT			    ("script",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new CaseInsensitiveKeywordAnalyzer()),
+    SECONDARY_TYPE      ("secondarytype",   MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    STATUS		        ("status",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    TAG		            ("tag",		        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    TYPE		        ("type",		    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    RELEASE_STORE		("releasestore",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
     ;
 
     private String name;

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -3,6 +3,7 @@
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.*;
 import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.NumericUtils;
 import org.junit.Before;
 import org.musicbrainz.search.LuceneVersion;
 
@@ -61,7 +62,16 @@
         assertEquals(value,termsEnum.term().utf8ToString());
     }
 
-    /** Check first term of given field, terms are listed lexigrahically
+    protected void checkTerm(IndexReader ir, IndexField field, int value) throws IOException {
+
+        Fields fields = MultiFields.getFields(ir);
+        Terms terms = fields.terms(field.getName());
+        TermsEnum termsEnum = terms.iterator(null);
+        termsEnum.next();
+        assertEquals(value, NumericUtils.prefixCodedToInt(termsEnum.term()));
+    }
+
+    /** Check nth term of given field, terms are listed lexigraphically
      *  Use when field is indexed. but not stored
      *
      * @param ir

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-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -6,6 +6,7 @@
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Test;
 import org.musicbrainz.mmd2.ArtistCredit;
+import org.musicbrainz.mmd2.Release;
 
 import java.sql.Statement;
 
@@ -96,6 +97,11 @@
         stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging," +
                 "  language, script) " +
                 " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1)");
+
+        stmt.addBatch("INSERT INTO release_country (release, country, date_year, date_month, date_day) values (491241, 221, 1970,1,1)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (221, 'United Kingdom')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (221, 'GB')");
+
         stmt.addBatch("INSERT INTO release_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position) VALUES (1, 1, 491240, 1)");
 
@@ -127,6 +133,11 @@
         stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, packaging," +
                 "  language, script) " +
                 " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1)");
+
+        stmt.addBatch("INSERT INTO release_country (release, country, date_year, date_month, date_day) values (491240, 221, 1970,1,1)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (221, 'United Kingdom')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (221, 'GB')");
+
         stmt.addBatch("INSERT INTO release_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 10, 491240, 1, 7)");
         stmt.addBatch("INSERT INTO medium_cdtoc (id, medium, cdtoc) VALUES (1, 1, 1)");
@@ -162,6 +173,15 @@
         stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging," +
                 "language, script) " +
                 "  VALUES (491240,'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 28)");
+
+        stmt.addBatch("INSERT INTO release_country (release, country, date_year, date_month, date_day) values (491240, 221, 1970,1,1)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (221, 'United Kingdom')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (221, 'GB')");
+
+        stmt.addBatch("INSERT INTO release_country (release, country, date_year, date_month, date_day) values (491240, 222, 1970,1,1)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (222, 'Sweden')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (222, 'SW')");
+
         stmt.addBatch("INSERT INTO language (id, iso_code_3, iso_code_2t, iso_code_2b, iso_code_2, name, frequency) " +
         	" VALUES (1, null, 'eng', 'eng', 'en', 'English', 1)");
         stmt.addBatch("INSERT INTO script (id, iso_code, iso_number, name, frequency) VALUES (28, 'Latn' , 215, 'Latin', 4)");
@@ -240,16 +260,13 @@
         assertEquals(2, ir.numDocs());
         {
             Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals("Crocodiles (bonus disc)", doc.getField(ReleaseIndexField.RELEASE.getName()).stringValue());
-            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", doc.getField(ReleaseIndexField.RELEASE_ID.getName()).stringValue());
-            assertEquals(1, doc.getFields(ReleaseIndexField.TYPE.getName()).length);
-            assertEquals("EP", doc.getField(ReleaseIndexField.TYPE.getName()).stringValue());
-            assertEquals("efd2ace2-b3b9-305f-8a53-9803595c0e37", doc.getField(ReleaseIndexField.RELEASEGROUP_ID.getName()).stringValue());
-            assertEquals(1, doc.getFields(ReleaseIndexField.STATUS.getName()).length);
-            assertEquals("Official", doc.getField(ReleaseIndexField.STATUS.getName()).stringValue());
-            assertEquals(1, doc.getFields(ReleaseIndexField.LANGUAGE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.SCRIPT.getName()).length);
+            checkTerm(ir, ReleaseIndexField.RELEASE, "bonus");
+            checkTerm(ir, ReleaseIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
+            checkTerm(ir, ReleaseIndexField.TYPE, "ep");
+            checkTerm(ir, ReleaseIndexField.RELEASEGROUP_ID, "efd2ace2-b3b9-305f-8a53-9803595c0e37");
+            checkTerm(ir, ReleaseIndexField.STATUS, "official");
+            checkTerm(ir, ReleaseIndexField.LANGUAGE, "unknown");
+            checkTerm(ir, ReleaseIndexField.SCRIPT, "unknown");
         }
         ir.close();
     }
@@ -267,13 +284,12 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
+
             Document doc = ir.document(1);
-            checkTerm(ir, ReleaseIndexField.ARTIST_NAME, "and");
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseIndexField.ARTIST_CREDIT.getName()));
+            Release release = (Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE.getName()), Release.class);
+            ArtistCredit ac = release.getArtistCredit();
             assertNotNull(ac);
             assertEquals("Echo & The Bunnymen", ac.getNameCredit().get(0).getArtist().getName());
-            assertEquals(null, ac.getNameCredit().get(0).getJoinphrase());
-
         }
         ir.close();
     }
@@ -292,10 +308,9 @@
         assertEquals(2, ir.numDocs());
         {
             Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.NUM_DISCIDS_MEDIUM.getName()).length);
-            //assertEquals(1, NumericUtils.prefixCodedToInt(doc.getField(ReleaseIndexField.NUM_DISCIDS_MEDIUM.getName()).stringValue()));
-            assertEquals(1, doc.getFields(ReleaseIndexField.NUM_DISCIDS.getName()).length);
-            //assertEquals(1, NumericUtils.prefixCodedToInt(doc.getField(ReleaseIndexField.NUM_DISCIDS.getName()).stringValue()));
+
+            checkTerm(ir,ReleaseIndexField.NUM_DISCIDS_MEDIUM,1);
+            checkTerm(ir,ReleaseIndexField.NUM_DISCIDS,1);
         }
         ir.close();
     }
@@ -334,7 +349,8 @@
         assertEquals(2, ir.numDocs());
         {
             Document doc = ir.document(1);
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseIndexField.ARTIST_CREDIT.getName()));
+            Release release = (Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE.getName()), Release.class);
+            ArtistCredit ac = release.getArtistCredit();
             assertNotNull(ac);
             assertEquals("Echo and The Bunnymen", ac.getNameCredit().get(0).getArtist().getSortName());
         }
@@ -354,9 +370,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.TYPE.getName()).length);
-            assertEquals("unknown", doc.getField(ArtistIndexField.TYPE.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.TYPE, "unknown");
         }
         ir.close();
     }
@@ -374,10 +388,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.LANGUAGE.getName()).length);
-            assertEquals(Index.UNKNOWN, doc.getField(ReleaseIndexField.LANGUAGE.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.LANGUAGE, "unknown");
         }
         ir.close();
     }
@@ -395,10 +406,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.SCRIPT.getName()).length);
-            assertEquals(Index.UNKNOWN, doc.getField(ReleaseIndexField.SCRIPT.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.SCRIPT, "unknown");
         }
         ir.close();
     }
@@ -416,10 +424,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.FORMAT.getName()).length);
-            assertEquals("-", doc.getField(ReleaseIndexField.FORMAT.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.FORMAT, "-");
         }
         ir.close();
     }
@@ -437,9 +442,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.BARCODE.getName()).length);
+            checkTerm(ir, ReleaseIndexField.BARCODE, "-");
         }
         ir.close();
     }
@@ -457,9 +460,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(0, doc.getFields(ReleaseIndexField.LABEL.getName()).length);
+            checkTerm(ir, ReleaseIndexField.LABEL, "-");
         }
         ir.close();
     }
@@ -477,9 +478,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(0, doc.getFields(ReleaseIndexField.CATALOG_NO.getName()).length);
+            checkTerm(ir, ReleaseIndexField.CATALOG_NO, "-");
         }
         ir.close();
     }
@@ -497,10 +496,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.COUNTRY.getName()).length);
-            assertEquals(Index.UNKNOWN, doc.getField(ReleaseIndexField.COUNTRY.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.COUNTRY, "unknown");
 
         }
         ir.close();
@@ -519,9 +515,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.DATE.getName()).length);
+            checkTerm(ir, ReleaseIndexField.DATE, "unknown");
         }
         ir.close();
     }
@@ -539,10 +533,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.STATUS.getName()).length);
-            assertEquals(Index.UNKNOWN, doc.getField(ReleaseIndexField.STATUS.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.STATUS, "unknown");
         }
         ir.close();
     }
@@ -560,10 +551,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.LANGUAGE.getName()).length);
-            assertEquals("eng", doc.getField(ReleaseIndexField.LANGUAGE.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.LANGUAGE, "eng");
         }
         ir.close();
     }
@@ -581,10 +569,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.LANGUAGE.getName()).length);
-            assertEquals("end", doc.getField(ReleaseIndexField.LANGUAGE.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.LANGUAGE, "end");
         }
         ir.close();
     }
@@ -602,10 +587,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.AMAZON_ID.getName()).length);
-            assertEquals("B00005NTQ7", doc.getField(ReleaseIndexField.AMAZON_ID.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.AMAZON_ID, "b00005ntq7");
         }
         ir.close();
     }
@@ -623,10 +605,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.SCRIPT.getName()).length);
-            assertEquals("Latn", doc.getField(ReleaseIndexField.SCRIPT.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.SCRIPT, "latn");
         }
         ir.close();
     }
@@ -644,10 +623,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.COMMENT.getName()).length);
-            assertEquals("demo", doc.getField(ReleaseIndexField.COMMENT.getName()).stringValue());
+            checkTerm(ir,ReleaseIndexField.COMMENT,"demo");
         }
         ir.close();
     }
@@ -664,10 +640,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.FORMAT.getName()).length);
-            assertEquals("Vinyl", doc.getField(ReleaseIndexField.FORMAT.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.FORMAT, "vinyl");
         }
         ir.close();
     }
@@ -684,10 +657,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.COUNTRY.getName()).length);
-            assertEquals("GB", doc.getField(ReleaseIndexField.COUNTRY.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.COUNTRY, "gb");
         }
         ir.close();
     }
@@ -696,6 +666,24 @@
      * @throws Exception exception
      */
     @Test
+    public void testIndexReleaseMultipleCountrys() throws Exception {
+        addReleaseFour();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+            checkTerm(ir, ReleaseIndexField.COUNTRY, "gb");
+            checkTermX(ir, ReleaseIndexField.COUNTRY, "sw", 1);
+        }
+        ir.close();
+    }
+
+    /**
+     * @throws Exception exception
+     */
+    @Test
     public void testIndexReleaseDiscIds() throws Exception {
 
         addReleaseThree();
@@ -705,10 +693,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.NUM_DISCIDS_MEDIUM.getName()).length);
-            //assertEquals(2, NumericUtils.prefixCodedToInt(doc.getField(ReleaseIndexField.NUM_DISCIDS_MEDIUM.getName()).stringValue()));
+            checkTerm(ir,ReleaseIndexField.NUM_DISCIDS_MEDIUM, 2);
         }
         ir.close();
     }
@@ -726,10 +711,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.NUM_TRACKS_MEDIUM.getName()).length);
-            //assertEquals(10, NumericUtils.prefixCodedToInt(doc.getField(ReleaseIndexField.NUM_TRACKS_MEDIUM.getName()).stringValue()));
+            checkTerm(ir,ReleaseIndexField.NUM_TRACKS_MEDIUM, 10);
         }
         ir.close();
     }
@@ -747,22 +729,12 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.COUNTRY.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.BARCODE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.DATE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.CATALOG_NO.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.LABEL.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.FORMAT.getName()).length);
-
-            assertEquals("GB", doc.getField(ReleaseIndexField.COUNTRY.getName()).stringValue());
-            assertEquals("5060180310066", doc.getField(ReleaseIndexField.BARCODE.getName()).stringValue());
-            assertEquals("1970-01-01", doc.getField(ReleaseIndexField.DATE.getName()).stringValue());
-            assertEquals("ECHO1", doc.getField(ReleaseIndexField.CATALOG_NO.getName()).stringValue());
-            assertEquals("korova", doc.getField(ReleaseIndexField.LABEL.getName()).stringValue());
-            assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.getField(ReleaseIndexField.LABEL_ID.getName()).stringValue());
-            assertEquals("Vinyl", doc.getField(ReleaseIndexField.FORMAT.getName()).stringValue());
+            checkTerm(ir,ReleaseIndexField.COUNTRY, "gb");
+            checkTerm(ir,ReleaseIndexField.BARCODE, "5060180310066");
+            checkTerm(ir,ReleaseIndexField.DATE, "1970-01-01");
+            checkTerm(ir,ReleaseIndexField.CATALOG_NO, "echo1");
+            checkTerm(ir,ReleaseIndexField.LABEL, "korova");
+            checkTerm(ir,ReleaseIndexField.FORMAT, "vinyl");
         }
         ir.close();
     }
@@ -781,11 +753,10 @@
         assertEquals(2, ir.numDocs());
         {
             Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.COUNTRY.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.BARCODE.getName()).length);
-            assertEquals(0, doc.getFields(ReleaseIndexField.LABEL.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.FORMAT.getName()).length);
+            checkTerm(ir, ReleaseIndexField.COUNTRY, "unknown");
+            checkTerm(ir, ReleaseIndexField.BARCODE, "-");
+            checkTerm(ir, ReleaseIndexField.LABEL, "-");
+            checkTerm(ir, ReleaseIndexField.FORMAT, "-");
         }
         ir.close();
     }
@@ -840,9 +811,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASEGROUP_ID.getName()).length);
-            assertEquals("efd2ace2-b3b9-305f-8a53-9803595c0e37", doc.getField(ReleaseIndexField.RELEASEGROUP_ID.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.RELEASEGROUP_ID, "efd2ace2-b3b9-305f-8a53-9803595c0e37");
         }
         ir.close();
     }
@@ -860,20 +829,11 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
+            checkTerm(ir,ReleaseIndexField.PRIMARY_TYPE, "album");
+            checkTerm(ir, ReleaseIndexField.TYPE, "compilation");
+            checkTerm(ir, ReleaseIndexField.SECONDARY_TYPE, "compilation");
+            checkTermX(ir, ReleaseIndexField.SECONDARY_TYPE, "interview", 1);
 
-            assertEquals(1, doc.getFields(ReleaseGroupIndexField.PRIMARY_TYPE.getName()).length);
-            assertEquals("Album", doc.getFields(ReleaseGroupIndexField.PRIMARY_TYPE.getName())[0].stringValue());
-
-            //Note old type field maps secondary type to compilation
-            assertEquals(1, doc.getFields(ReleaseGroupIndexField.TYPE.getName()).length);
-            assertEquals("Compilation", doc.getFields(ReleaseGroupIndexField.TYPE.getName())[0].stringValue());
-
-            assertEquals(2, doc.getFields(ReleaseIndexField.SECONDARY_TYPE.getName()).length);
-            assertEquals("Compilation", doc.getFields(ReleaseIndexField.SECONDARY_TYPE.getName())[0].stringValue());
-            assertEquals("Interview", doc.getFields(ReleaseIndexField.SECONDARY_TYPE.getName())[1].stringValue());
-
         }
         ir.close();
     }
@@ -888,10 +848,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(1, doc.getFields(ReleaseIndexField.TAG.getName()).length);
-            assertEquals("punk", doc.getField(ReleaseGroupIndexField.TAG.getName()).stringValue());
+            checkTerm(ir, ReleaseIndexField.TAG, "punk");
         }
         ir.close();
     }

Modified: search_server/trunk/servlet/pom.xml
===================================================================
--- search_server/trunk/servlet/pom.xml	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/pom.xml	2013-05-01 10:22:17 UTC (rev 13670)
@@ -49,9 +49,9 @@
       <version>4.1.0</version>
      </dependency>
     <dependency>
-          <groupId>org.apache.lucene</groupId>
-          <artifactId>lucene-queryparser</artifactId>
-          <version>4.1.0</version>
+      <groupId>org.apache.lucene</groupId>
+      <artifactId>lucene-queryparser</artifactId>
+      <version>4.1.0</version>
     </dependency>
     <dependency>
       <groupId>javax.servlet</groupId>
@@ -87,6 +87,11 @@
       <version>1.12</version>
     </dependency>
     <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>14.0.1</version>
+    </dependency>
+    <dependency>
       <groupId>org.musicbrainz.search</groupId>
       <artifactId>index</artifactId>
       <version>2.0-SNAPSHOT</version>

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -28,13 +28,24 @@
 
 package org.musicbrainz.search.servlet.mmd1;
 
+import com.google.common.base.Strings;
 import com.jthink.brainz.mmd.*;
+import com.jthink.brainz.mmd.Artist;
+import com.jthink.brainz.mmd.DiscList;
+import com.jthink.brainz.mmd.Label;
+import com.jthink.brainz.mmd.Metadata;
+import com.jthink.brainz.mmd.ObjectFactory;
+import com.jthink.brainz.mmd.Release;
+import com.jthink.brainz.mmd.ReleaseEventList;
+import com.jthink.brainz.mmd.ReleaseList;
+import com.jthink.brainz.mmd.TextRepresentation;
 import org.apache.commons.lang.StringUtils;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.NumericUtils;
-import org.musicbrainz.mmd2.ArtistCredit;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.ArtistCreditHelper;
+import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.index.ReleaseIndexField;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
@@ -54,163 +65,148 @@
 
         for (Result result : results.results) {
             MbDocument doc = result.getDoc();
-            Release release = of.createRelease();
-            release.setId(doc.get(ReleaseIndexField.RELEASE_ID));
 
-            String type = doc.get(ReleaseIndexField.TYPE);
-            String status = doc.get(ReleaseIndexField.STATUS);
-            if (isNotUnknown(type) || isNotUnknown(status)) {
-                if (isNotUnknown(type)) {
-                    release.getType().add(StringUtils.capitalize(type));
-                }
-
-                if (isNotUnknown(status)) {
-                    release.getType().add(status);
-                }
-            }
-
+            Release release = of.createRelease();
             result.setNormalizedScore(results.getMaxScore());
             release.getOtherAttributes().put(getScore(), String.valueOf(result.getNormalizedScore()));
 
-            String name = doc.get(ReleaseIndexField.RELEASE);
-            if (name != null) {
-                release.setTitle(name);
+            org.musicbrainz.mmd2.Release releasev2
+                    = (org.musicbrainz.mmd2.Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE), org.musicbrainz.mmd2.Release.class);
+            release.setId(releasev2.getId());
+            release.getType().add(StringUtils.capitalize(releasev2.getReleaseGroup().getType()));
 
+            if (!Strings.isNullOrEmpty(releasev2.getStatus())) {
+                release.getType().add(releasev2.getStatus());
             }
 
-            String asin = doc.get(ReleaseIndexField.AMAZON_ID);
-            if (isNotNoValue(asin)) {
-                release.setAsin(asin);
+            if (!Strings.isNullOrEmpty(releasev2.getTitle())) {
+                release.setTitle(releasev2.getTitle());
+            }
 
+            if (!Strings.isNullOrEmpty(releasev2.getAsin())) {
+                release.setAsin(releasev2.getAsin());
             }
 
             TextRepresentation tr = of.createTextRepresentation();
-            String script = doc.get(ReleaseIndexField.SCRIPT);
-            if (isNotUnknown(script)) {
-                tr.setScript(script);
+            org.musicbrainz.mmd2.TextRepresentation tr2 = releasev2.getTextRepresentation();
+            if (tr != null) {
+                if (!Strings.isNullOrEmpty(tr2.getScript())) {
+                    tr.setScript(tr2.getScript());
+                }
+
+                if (!Strings.isNullOrEmpty(tr2.getLanguage())) {
+                    tr.setLanguage(tr2.getLanguage().toUpperCase(Locale.US));
+                }
+                release.setTextRepresentation(tr);
             }
-            String lang = doc.get(ReleaseIndexField.LANGUAGE);
-            if (isNotUnknown(lang)) {
-                tr.setLanguage(lang.toUpperCase(Locale.US));
+
+            if (!Strings.isNullOrEmpty(releasev2.getCountry())) {
+                release.setAsin(releasev2.getAsin());
             }
 
-            if (script != null || lang != null) {
-                release.setTextRepresentation(tr);
+            if (!Strings.isNullOrEmpty(releasev2.getDate())) {
+                release.setAsin(releasev2.getAsin());
             }
 
-            String country = doc.get(ReleaseIndexField.COUNTRY);
-            String date = doc.get(ReleaseIndexField.DATE);
-            String barcode = doc.get(ReleaseIndexField.BARCODE);
-            String format = doc.get(ReleaseIndexField.FORMAT);
+            if (!Strings.isNullOrEmpty(releasev2.getBarcode())) {
+                release.setAsin(releasev2.getAsin());
+            }
 
-            String[] labelNames = doc.getValues(ReleaseIndexField.LABEL);
-            //Now releases can only have multiple labe;/catno combinations but MMDv1
-            //expects country,date,barcode and format to also be part of each release event.
-            if (labelNames.length > 0) {
-                ReleaseEventList eventList = of.createReleaseEventList();
-                String[] catnos = doc.getValues(ReleaseIndexField.CATALOG_NO);
-                String[] labelIds = doc.getValues(ReleaseIndexField.LABEL_ID);
+            if (!Strings.isNullOrEmpty(releasev2.getAsin())) {
+                release.setAsin(releasev2.getAsin());
+            }
 
-                for (int i = 0; i < labelNames.length; i++) {
+            //Just use format of first medium
+            Medium firstMediumv2 = releasev2.getMediumList().getMedium().get(0);
+            LabelInfoList lilv2 = releasev2.getLabelInfoList();
+            if (!lilv2.getLabelInfo().isEmpty()) {
+                ReleaseEventList eventList = of.createReleaseEventList();
+                for (LabelInfo liv2 : lilv2.getLabelInfo()) {
                     Event event = of.createEvent();
 
-                    if (isNotNoValue(labelNames[i]) || isNotNoValue(labelIds[i])) {
+                    if (!Strings.isNullOrEmpty(liv2.getCatalogNumber())) {
+                        event.setCatalogNumber(liv2.getCatalogNumber());
+                    }
+
+                    org.musicbrainz.mmd2.Label labelv2 = liv2.getLabel();
+                    if (labelv2 != null) {
                         Label label = of.createLabel();
                         event.setLabel(label);
-                        
-                        if (isNotNoValue(labelNames[i])) {
-                            label.setName(labelNames[i]);
+                        if (!Strings.isNullOrEmpty(labelv2.getId())) {
+                            label.setId(labelv2.getId());
                         }
-                        
-                        if (isNotNoValue(labelIds[i])) {
-                            label.setId(labelIds[i]);
+
+                        if (!Strings.isNullOrEmpty(labelv2.getName())) {
+                            label.setName(labelv2.getName());
                         }
                     }
 
-                    if (isNotNoValue(catnos[i])) {
-                        event.setCatalogNumber(catnos[i]);
+                    if (!Strings.isNullOrEmpty(releasev2.getCountry())) {
+                        event.setCountry(StringUtils.upperCase(releasev2.getCountry()));
                     }
 
-                    if (isNotUnknown(country)) {
-                        event.setCountry(StringUtils.upperCase(country));
+                    if (!Strings.isNullOrEmpty(releasev2.getDate())) {
+                        event.setDate(releasev2.getDate());
                     }
 
-                    if (event != null) {
-                        event.setDate(date);
+                    if (!Strings.isNullOrEmpty(releasev2.getBarcode())) {
+                        event.setBarcode(releasev2.getBarcode());
                     }
 
-                    if (isNotNoValue(barcode)) {
-                        event.setBarcode(barcode);
+                    if (!Strings.isNullOrEmpty(firstMediumv2.getFormat())) {
+                        event.setFormat(firstMediumv2.getFormat());
                     }
-
-                    if (isNotNoValue(format)) {
-                        event.setFormat(format);
-                    }
                     eventList.getEvent().add(event);
                 }
                 release.setReleaseEventList(eventList);
-            }
-            else {
+            } else {
                 ReleaseEventList eventList = of.createReleaseEventList();
                 Event event = of.createEvent();
+                eventList.getEvent().add(event);
+                release.setReleaseEventList(eventList);
 
-                if (country != null) {
-                    event.setCountry(StringUtils.upperCase(country));
+                if (!Strings.isNullOrEmpty(releasev2.getCountry())) {
+                    event.setCountry(StringUtils.upperCase(releasev2.getCountry()));
                 }
 
-                if (event != null) {
-                    event.setDate(date);
+                if (!Strings.isNullOrEmpty(releasev2.getDate())) {
+                    event.setDate(releasev2.getDate());
                 }
 
-                if (barcode != null) {
-                    event.setBarcode(barcode);
+                if (!Strings.isNullOrEmpty(releasev2.getBarcode())) {
+                    event.setBarcode(releasev2.getBarcode());
                 }
 
-                if (format != null) {
-                    event.setFormat(format);
+                if (!Strings.isNullOrEmpty(firstMediumv2.getFormat())) {
+                    event.setFormat(firstMediumv2.getFormat());
                 }
-                eventList.getEvent().add(event);
-                release.setReleaseEventList(eventList);                    
             }
 
-            //Just add the first Artist (if there are more than one, this means that once releases get added with multiple
-            //name credits using this old interface isn't going to give very good results
-            if(doc.get(ReleaseIndexField.ARTIST_CREDIT)!=null) {
-                ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseIndexField.ARTIST_CREDIT));
-                if (ac.getNameCredit().size()>0) {
+            ArtistCredit acv2 = releasev2.getArtistCredit();
+            if(acv2!=null) {
+                if (acv2.getNameCredit().size() > 0) {
                     Artist artist = of.createArtist();
-                    artist.setName(ac.getNameCredit().get(0).getArtist().getName());
-                    artist.setId(ac.getNameCredit().get(0).getArtist().getId());
-                    artist.setSortName(ac.getNameCredit().get(0).getArtist().getSortName());
+                    artist.setName(acv2.getNameCredit().get(0).getArtist().getName());
+                    artist.setId(acv2.getNameCredit().get(0).getArtist().getId());
+                    artist.setSortName(acv2.getNameCredit().get(0).getArtist().getSortName());
                     release.setArtist(artist);
                 }
             }
 
-            String[] numDiscsIdsOnMedium = doc.getValues(ReleaseIndexField.NUM_DISCIDS_MEDIUM);
-            if(numDiscsIdsOnMedium.length>0)
-            {
-                int numDiscs = 0;
-                for(int i=0;i<numDiscsIdsOnMedium.length;i++) {
-                    numDiscs+=NumericUtils.prefixCodedToInt(new BytesRef(numDiscsIdsOnMedium[i]));
-                }
+            int totaldiscIds=0;
+            MediumList mediumListv2 = releasev2.getMediumList();
+            TrackList trackList = of.createTrackList();
+            trackList.setCount(mediumListv2.getTrackCount());
+            release.setTrackList(trackList);
 
-                DiscList discList = of.createDiscList();
-                discList.setCount(BigInteger.valueOf(numDiscs));
-                release.setDiscList(discList);
-            }
-
-            String[] numTracksOnMedium = doc.getValues(ReleaseIndexField.NUM_TRACKS_MEDIUM);
-            if(numTracksOnMedium.length>0)
+            for(Medium mediumv2:mediumListv2.getMedium())
             {
-                int numTracks = 0;
-                for(int i=0;i<numTracksOnMedium.length;i++) {
-                    numTracks+=NumericUtils.prefixCodedToInt(new BytesRef(numTracksOnMedium[i]));
-                }
-
-                TrackList trackList = of.createTrackList();
-                trackList.setCount(BigInteger.valueOf(numTracks));
-                release.setTrackList(trackList);
+                totaldiscIds+=mediumv2.getDiscList().getCount().intValue();
             }
+            DiscList discList = of.createDiscList();
+            discList.setCount(BigInteger.valueOf(totaldiscIds));
+            release.setDiscList(discList);
+
             releaseList.getRelease().add(release);
         }
         releaseList.setCount(BigInteger.valueOf(results.getTotalHits()));

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -29,12 +29,12 @@
 package org.musicbrainz.search.servlet.mmd2;
 
 
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.NumericUtils;
-import org.musicbrainz.mmd2.*;
+import org.musicbrainz.mmd2.Metadata;
+import org.musicbrainz.mmd2.ObjectFactory;
+import org.musicbrainz.mmd2.Release;
+import org.musicbrainz.mmd2.ReleaseList;
 import org.musicbrainz.search.MbDocument;
-import org.musicbrainz.search.index.ArtistCreditHelper;
-import org.musicbrainz.search.index.ReleaseGroupIndexField;
+import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.index.ReleaseIndexField;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
@@ -42,25 +42,21 @@
 import java.io.IOException;
 import java.math.BigInteger;
 import java.util.List;
-import java.util.Locale;
 
 
 public class ReleaseWriter extends ResultsWriter {
 
 
     /**
-     *
      * @param metadata
      * @param results
      * @throws IOException
      */
-    public void write(Metadata metadata, Results results) throws IOException
-    {
+    public void write(Metadata metadata, Results results) throws IOException {
         ObjectFactory of = new ObjectFactory();
         ReleaseList releaseList = of.createReleaseList();
 
-        for(Result result:results.results)
-        {
+        for (Result result : results.results) {
             result.setNormalizedScore(results.getMaxScore());
         }
         write(releaseList.getRelease(), results);
@@ -71,214 +67,25 @@
     }
 
     /**
-     *
      * @param list
      * @param results
      * @throws IOException
      */
-    public void write(List list, Results results) throws IOException
-    {
-        for (Result result : results.results)
-        {
+    public void write(List list, Results results) throws IOException {
+        for (Result result : results.results) {
             write(list, result);
         }
     }
 
     /**
-     *
      * @param list
      * @param result
      * @throws IOException
      */
-    public void write(List list, Result result) throws IOException
-    {
-        ObjectFactory of = new ObjectFactory();
-
-            MbDocument doc = result.getDoc();
-            Release release = of.createRelease();
-            release.setId(doc.get(ReleaseIndexField.RELEASE_ID));
-            release.setScore(String.valueOf(result.getNormalizedScore()));
-
-            String name = doc.get(ReleaseIndexField.RELEASE);
-            if (name != null) {
-                release.setTitle(name);
-            }
-
-            String comment = doc.get(ReleaseIndexField.COMMENT);
-            if (isNotNoValue(comment)) {
-                release.setDisambiguation(comment);
-            }
-
-            String type = doc.get(ReleaseIndexField.TYPE);
-            ReleaseGroup rg = of.createReleaseGroup();
-            release.setReleaseGroup(rg);
-            if (isNotUnknown(type)){
-                release.getReleaseGroup().setType(type);
-            }
-
-            String primaryType = doc.get(ReleaseGroupIndexField.PRIMARY_TYPE);
-            if(isNotUnknown(primaryType )) {
-                release.getReleaseGroup().setPrimaryType(primaryType );
-            }
-
-            String[] secondaryTypes = doc.getValues(ReleaseIndexField.SECONDARY_TYPE);
-            if(secondaryTypes.length>0) {
-                SecondaryTypeList stl = of.createSecondaryTypeList();
-                for(int i =0; i< secondaryTypes.length; i++) {
-                    stl.getSecondaryType().add(secondaryTypes[i]);
-                }
-                release.getReleaseGroup().setSecondaryTypeList(stl);
-            }
-
-            String rgid = doc.get(ReleaseIndexField.RELEASEGROUP_ID);
-            if (rgid != null) {
-                release.getReleaseGroup().setId(rgid);
-            }
-
-            String status = doc.get(ReleaseIndexField.STATUS);
-            if (isNotUnknown(status)) {
-                release.setStatus(status);
-            }
-
-            String[] countrys = doc.getValues(ReleaseIndexField.COUNTRY);
-            String[] dates    = doc.getValues(ReleaseIndexField.DATE);
-            ReleaseEventList rel = of.createReleaseEventList();
-            for(int i=0;i<countrys.length; i++)
-            {
-                String nextCountry = countrys[i];
-                String nextDate = dates[i];
-                if(isNotUnknown(nextCountry) || isNotUnknown(nextDate))
-                {
-                    ReleaseEvent re = of.createReleaseEvent();
-                    if(isNotUnknown(nextCountry))
-                    {
-                        re.setCountry(nextCountry);
-                    }
-                    if(isNotUnknown(nextDate))
-                    {
-                        re.setDate(nextDate);
-                    }
-                    rel.getReleaseEvent().add(re);
-                }
-            }
-            if(rel.getReleaseEvent().size()>0) {
-                release.setReleaseEventList(rel);
-            }
-
-            //For backwards compatability
-            if (isNotUnknown(countrys[0])){
-
-                release.setCountry(countrys[0]);
-            }
-            if (isNotUnknown(dates[0])){
-
-                release.setDate(dates[0]);
-            }
-
-            String barcode = doc.get(ReleaseIndexField.BARCODE);
-            if (isNotNoValue(barcode)) {
-                release.setBarcode(barcode);
-            }
-
-            String asin = doc.get(ReleaseIndexField.AMAZON_ID);
-            if (isNotNoValue(asin)) {
-                release.setAsin(asin);
-            }
-
-            TextRepresentation tr = of.createTextRepresentation();
-            String script = doc.get(ReleaseIndexField.SCRIPT);
-            if (isNotUnknown(script)) {
-                tr.setScript(script);
-            }
-
-            String lang = doc.get(ReleaseIndexField.LANGUAGE);
-            if (isNotUnknown(lang)) {
-                tr.setLanguage(lang.toLowerCase(Locale.US));
-            }
-
-            if (script != null || lang != null) {
-                release.setTextRepresentation(tr);
-            }
-
-            String[] labelNames = doc.getValues(ReleaseIndexField.LABEL);
-            //Releases can only have multiple label/catno combinations
-            if (labelNames.length > 0) {
-                LabelInfoList labelInfoList = of.createLabelInfoList();
-                String[] catnos = doc.getValues(ReleaseIndexField.CATALOG_NO);
-                String[] labelIds = doc.getValues(ReleaseIndexField.LABEL_ID);
-                for (int i = 0; i < labelNames.length; i++) {
-                    LabelInfo labelInfo = of.createLabelInfo();
-
-                    if (isNotNoValue(labelNames[i]) || isNotNoValue(labelIds[i])) {
-                        Label label = of.createLabel();
-                        labelInfo.setLabel(label);
-                    
-                        if (isNotNoValue(labelNames[i])) {
-                            label.setName(labelNames[i]);
-                        }
-                        
-                        if (isNotNoValue(labelIds[i])) {
-                            label.setId(labelIds[i]);
-                        }
-                    }
-                    
-                    if (isNotNoValue(catnos[i])) {
-                        labelInfo.setCatalogNumber(catnos[i]);
-                    }
-                    labelInfoList.getLabelInfo().add(labelInfo);
-                }
-                release.setLabelInfoList(labelInfoList);
-            }
-
-            if(doc.get(ReleaseIndexField.ARTIST_CREDIT)!=null) {
-                ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseIndexField.ARTIST_CREDIT));
-                release.setArtistCredit(ac);
-            }
-
-            String numTracksOnRelease = doc.get(ReleaseIndexField.NUM_TRACKS);
-            if(numTracksOnRelease!=null)
-            {
-                MediumList mediumList = of.createMediumList();
-                mediumList.setTrackCount(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(numTracksOnRelease))));
-
-                String[] formats          = doc.getValues(ReleaseIndexField.FORMAT);
-                String[] numTracks        = doc.getValues(ReleaseIndexField.NUM_TRACKS_MEDIUM);
-                String[] numDiscIds       = doc.getValues(ReleaseIndexField.NUM_DISCIDS_MEDIUM);
-                for (int i = 0; i < formats.length; i++) {
-
-                    Medium medium = of.createMedium();
-
-                    if(isNotNoValue(formats[i])) {
-                        medium.setFormat(formats[i]);
-                    }
-                    org.musicbrainz.mmd2.Medium.TrackList trackList = of.createMediumTrackList();
-                    trackList.setCount(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(numTracks[i]))));
-                    medium.setTrackList(trackList);
-
-                    DiscList discList = of.createDiscList();
-                    discList.setCount(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(numDiscIds[i]))));
-                    medium.setDiscList(discList);
-
-                    mediumList.getMedium().add(medium);
-                }
-                mediumList.setCount(BigInteger.valueOf(formats.length));
-                release.setMediumList(mediumList);
-            }
-
-            String[] tags       = doc.getValues(ReleaseIndexField.TAG);
-            String[] tagCounts  = doc.getValues(ReleaseIndexField.TAGCOUNT);
-            if(tags.length>0)
-            {
-                TagList tagList = of.createTagList();
-                for(int i = 0;i<tags.length;i++) {
-                    Tag tag = of.createTag();
-                    tag.setName(tags[i]);
-                    tag.setCount(new BigInteger(tagCounts[i]));
-                    tagList.getTag().add(tag);
-                }
-                release.setTagList(tagList);
-            }
-
-            list.add(release);
-        }
+    public void write(List list, Result result) throws IOException {
+        MbDocument doc = result.getDoc();
+        Release release = (Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE), Release.class);
+        release.setScore(String.valueOf(result.getNormalizedScore()));
+        list.add(release);
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2013-05-01 10:22:17 UTC (rev 13670)
@@ -3,16 +3,17 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.math.BigInteger;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.*;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.SearcherManager;
 import org.apache.lucene.store.RAMDirectory;
@@ -20,19 +21,10 @@
 import org.apache.lucene.util.NumericUtils;
 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;
-import org.musicbrainz.search.index.Index;
-import org.musicbrainz.search.index.MMDSerializer;
-import org.musicbrainz.search.index.MetaIndexField;
-import org.musicbrainz.search.index.ReleaseGroupIndexField;
-import org.musicbrainz.search.index.ReleaseIndex;
-import org.musicbrainz.search.index.ReleaseIndexField;
+import org.musicbrainz.search.index.*;
 import org.musicbrainz.search.servlet.mmd1.ReleaseGroupType;
 import org.musicbrainz.search.servlet.mmd1.ReleaseMmd1XmlWriter;
 
@@ -42,304 +34,361 @@
  */
 public class FindReleaseTest {
 
-  private AbstractSearchServer ss;
-  private AbstractDismaxSearchServer sd;
+    protected void checkTerm(IndexReader ir, IndexField field, String value) throws IOException {
 
-  @Before
-  public void setUp() throws Exception {
-    RAMDirectory ramDir = new RAMDirectory();
-    ObjectFactory of = new ObjectFactory();
+        Fields fields = MultiFields.getFields(ir);
+        Terms terms = fields.terms(field.getName());
+        TermsEnum termsEnum = terms.iterator(null);
+        termsEnum.next();
+        assertEquals(value, termsEnum.term().utf8ToString());
+    }
 
-    Analyzer analyzer = DatabaseIndex.getAnalyzer(ReleaseIndexField.class);
-    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
-    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+    private AbstractSearchServer ss;
+    private AbstractDismaxSearchServer sd;
 
-    MbDocument doc = new MbDocument();
-    doc.addField(ReleaseIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
-    doc.addField(ReleaseIndexField.RELEASEGROUP_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e333");
+    @Before
+    public void setUp() throws Exception {
+        RAMDirectory ramDir = new RAMDirectory();
+        ObjectFactory of = new ObjectFactory();
 
-    doc.addField(ReleaseIndexField.RELEASE, "Our Glorious 5 Year Plan");
-    doc.addField(ReleaseIndexField.SCRIPT, "Latn");
-    doc.addField(ReleaseIndexField.LANGUAGE, "eng");
-    doc.addField(ReleaseIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-    doc.addField(ReleaseIndexField.ARTIST, "Farming Incident");
-    doc.addField(ReleaseIndexField.ARTIST_NAME, "Farming Incident");
-    doc.addField(ReleaseIndexField.ARTIST_NAMECREDIT, "Farming Incident");
-    doc.addField(ReleaseIndexField.COMMENT, "demo");
-    doc.addField(ReleaseIndexField.SECONDARY_TYPE, "Live");
-    doc.addField(ReleaseIndexField.SECONDARY_TYPE, "Compilation");
-    doc.addField(ReleaseIndexField.TAG, "punk");
-    doc.addField(ReleaseIndexField.TAGCOUNT, "10");
+        Analyzer analyzer = DatabaseIndex.getAnalyzer(ReleaseIndexField.class);
+        IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+        IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+        {
+            MbDocument doc = new MbDocument();
+            Release release = of.createRelease();
+            doc.addField(ReleaseIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
+            release.setId("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
 
+            doc.addField(ReleaseIndexField.RELEASEGROUP_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e333");
+            ReleaseGroup rg = of.createReleaseGroup();
+            rg.setId("1d9e8ed6-3893-4d3b-aa7d-6cd79609e333");
+            release.setReleaseGroup(rg);
 
-      ArtistCredit ac = of.createArtistCredit();
-    NameCredit nc = of.createNameCredit();
-    Artist artist = of.createArtist();
-    artist.setId("4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-    artist.setName("Farming Incident");
-    artist.setSortName("Incident, Farming");
-    nc.setArtist(artist);
-    ac.getNameCredit().add(nc);
-    doc.addField(ReleaseIndexField.ARTIST_CREDIT, MMDSerializer.serialize(ac));
-    doc.addField(ReleaseIndexField.PUID, "668f3a22-03e8-e3cd-55e4-2e9a0906419a");
-    doc.addField(ReleaseIndexField.PUID, "1fa8aa07-c688-1f7c-734b-4d82e528b09a");
+            doc.addField(ReleaseIndexField.RELEASE, "Our Glorious 5 Year Plan");
+            release.setTitle("Our Glorious 5 Year Plan");
 
-    //Medium 1
-    doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, 10);
-    doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, 1);
-    doc.addField(ReleaseIndexField.FORMAT, "Vinyl");
-    //Medium 2
-    doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, 7);
-    doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, 2);
-    doc.addField(ReleaseIndexField.FORMAT, Index.NO_VALUE);
-    doc.addNumericField(ReleaseIndexField.NUM_TRACKS, 17);
-    doc.addNumericField(ReleaseIndexField.NUM_DISCIDS, 3);
+            doc.addField(ReleaseIndexField.SCRIPT, "Latn");
+            TextRepresentation tr = of.createTextRepresentation();
+            release.setTextRepresentation(tr);
+            tr.setScript("Latn");
+            doc.addField(ReleaseIndexField.LANGUAGE, "eng");
+            tr.setLanguage("eng");
 
-    doc.addField(ReleaseIndexField.STATUS, "Official");
-    doc.addField(ReleaseIndexField.PRIMARY_TYPE, "Album");
-    doc.addField(ReleaseIndexField.TYPE, "Compilation");
+            doc.addField(ReleaseIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
 
-    doc.addField(ReleaseIndexField.AMAZON_ID, "B00004Y6O9");
+            doc.addField(ReleaseIndexField.ARTIST, "Farming Incident");
+            doc.addField(ReleaseIndexField.ARTIST_NAME, "Farming Incident");
+            doc.addField(ReleaseIndexField.ARTIST_NAMECREDIT, "Farming Incident");
+            ArtistCredit ac = of.createArtistCredit();
+            NameCredit nc = of.createNameCredit();
+            Artist artist = of.createArtist();
+            artist.setId("4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Farming Incident");
+            artist.setSortName("Incident, Farming");
+            nc.setArtist(artist);
+            ac.getNameCredit().add(nc);
+            release.setArtistCredit(ac);
 
-    doc.addField(ReleaseIndexField.COUNTRY, "GB");
+            doc.addField(ReleaseIndexField.COMMENT, "demo");
+            release.setDisambiguation("demo");
 
-    doc.addField(ReleaseIndexField.DATE, "2005");
-    doc.addField(ReleaseIndexField.BARCODE, "07599273202");
+            doc.addField(ReleaseIndexField.PRIMARY_TYPE, "Album");
+            release.getReleaseGroup().setType("Compilation");
+            release.getReleaseGroup().setPrimaryType("Album");
+            doc.addField(ReleaseIndexField.TYPE, "Compilation");
+            doc.addField(ReleaseIndexField.SECONDARY_TYPE, "Live");
+            doc.addField(ReleaseIndexField.SECONDARY_TYPE, "Compilation");
+            SecondaryTypeList stl = of.createSecondaryTypeList();
+            stl.getSecondaryType().add("Live");
+            stl.getSecondaryType().add("Compilation");
+            release.getReleaseGroup().setSecondaryTypeList(stl);
 
-    //Multiples allowed of these
-    doc.addField(ReleaseIndexField.CATALOG_NO, "WRATHCD-25");
-    doc.addField(ReleaseIndexField.CATALOG_NO, "CAT WITH SPACE");
+            doc.addField(ReleaseIndexField.TAG, "punk");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("punk");
+            tag.setCount(new BigInteger("10"));
+            tagList.getTag().add(tag);
+            release.setTagList(tagList);
 
-    doc.addField(ReleaseIndexField.LABEL, "Wrath Records");
-    doc.addField(ReleaseIndexField.LABEL_ID, Index.NO_VALUE);
+            doc.addField(ReleaseIndexField.PUID, "668f3a22-03e8-e3cd-55e4-2e9a0906419a");
+            doc.addField(ReleaseIndexField.PUID, "1fa8aa07-c688-1f7c-734b-4d82e528b09a");
 
-    doc.addField(ReleaseIndexField.CATALOG_NO, "LP-001");
-    doc.addField(ReleaseIndexField.LABEL, "Major Records");
-    doc.addField(ReleaseIndexField.LABEL_ID, "c1dfaf9c-d498-4f6c-b040-f7714315fcea");
+            MediumList mediumList = of.createMediumList();
 
-    doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, 2);
+            //Medium 1
+            {
+                doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, 10);
+                doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, 1);
+                doc.addField(ReleaseIndexField.FORMAT, "Vinyl");
+                Medium medium = of.createMedium();
+                medium.setFormat("Vinyl");
+                org.musicbrainz.mmd2.Medium.TrackList trackList = of.createMediumTrackList();
+                trackList.setCount(BigInteger.valueOf(10));
+                medium.setTrackList(trackList);
+                DiscList discList = of.createDiscList();
+                discList.setCount(BigInteger.valueOf(1));
+                medium.setDiscList(discList);
+                mediumList.getMedium().add(medium);
+            }
+            //Medium 2
+            {
+                doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, 7);
+                doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, 2);
+                doc.addField(ReleaseIndexField.FORMAT, Index.NO_VALUE);
+                Medium medium = of.createMedium();
+                org.musicbrainz.mmd2.Medium.TrackList trackList = of.createMediumTrackList();
+                trackList.setCount(BigInteger.valueOf(7));
+                medium.setTrackList(trackList);
+                DiscList discList = of.createDiscList();
+                discList.setCount(BigInteger.valueOf(2));
+                medium.setDiscList(discList);
+                mediumList.getMedium().add(medium);
+            }
 
-    writer.addDocument(doc.getLuceneDocument());
+            doc.addNumericField(ReleaseIndexField.NUM_TRACKS, 17);
+            doc.addNumericField(ReleaseIndexField.NUM_DISCIDS, 3);
+            doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, 2);
+            mediumList.setTrackCount(BigInteger.valueOf(17));
+            mediumList.setCount(BigInteger.valueOf(2));
+            release.setMediumList(mediumList);
 
-    //Release with Multiple Artists
-    doc = new MbDocument();
-    doc.addField(ReleaseIndexField.RELEASE_ID, "0011c128-b1f2-300e-88cc-c33c30dce704");
-    doc.addField(ReleaseIndexField.RELEASE, "Epics");
-    doc.addField(ReleaseIndexField.SCRIPT, "Taml");
-    doc.addField(ReleaseIndexField.LANGUAGE, "fra");
-    doc.addField(ReleaseIndexField.TYPE, ReleaseGroupType.SINGLE.getName());
-    doc.addField(ReleaseIndexField.ARTIST, "Erich Kunzel and Cincinnati Pops");
-    doc.addField(ReleaseIndexField.ARTIST_ID, "99845d0c-f239-4051-a6b1-4b5e9f7ede0b");
-    doc.addField(ReleaseIndexField.ARTIST_NAME, "Erich Kunzel");
-    doc.addField(ReleaseIndexField.ARTIST_NAMECREDIT, "Erich Kunzel");
+            doc.addField(ReleaseIndexField.STATUS, "Official");
+            release.setStatus("Official");
 
-    doc.addField(ReleaseIndexField.ARTIST_ID, "d8fbd94c-cd06-4e8b-a559-761ad969d07e");
-    doc.addField(ReleaseIndexField.ARTIST_NAME, "The Cincinnati Pops Orchestra");
-    doc.addField(ReleaseIndexField.ARTIST_NAMECREDIT, "Cincinnati Pops");
+            doc.addField(ReleaseIndexField.AMAZON_ID, "B00004Y6O9");
+            release.setAsin("B00004Y6O9");
 
-    ac = of.createArtistCredit();
-    nc = of.createNameCredit();
-    artist = of.createArtist();
-    artist.setId("99845d0c-f239-4051-a6b1-4b5e9f7ede0b");
-    artist.setName("Erich Kunzel");
-    artist.setSortName("Kunzel, Eric");
-    nc.setJoinphrase("and");
-    nc.setArtist(artist);
-    ac.getNameCredit().add(nc);
+            doc.addField(ReleaseIndexField.COUNTRY, "GB");
+            doc.addField(ReleaseIndexField.DATE, "2005");
+            ReleaseEventList rel = of.createReleaseEventList();
+            ReleaseEvent     re  = of.createReleaseEvent();
+            re.setDate("2005");
+            re.setCountry("GB");
+            rel.getReleaseEvent().add(re);
+            release.setReleaseEventList(rel);
+            release.setDate("2005");
+            release.setCountry("GB");
 
-    nc = of.createNameCredit();
-    artist = of.createArtist();
-    artist.setId("d8fbd94c-cd06-4e8b-a559-761ad969d07e");
-    artist.setName("The Cincinnati Pops Orchestra");
-    artist.setSortName("Cincinnati Pops Orchestra, The");
-    nc.setArtist(artist);
-    nc.setName("Cincinnati Pops");
-    ac.getNameCredit().add(nc);
+            doc.addField(ReleaseIndexField.BARCODE, "07599273202");
+            release.setBarcode("07599273202");
 
-    doc.addField(ReleaseGroupIndexField.ARTIST_CREDIT, MMDSerializer.serialize(ac));
+            //Multiples allowed of these
+            LabelInfoList labelInfoList = of.createLabelInfoList();
 
-    doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, 14);
-    doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, 1);
-    doc.addField(ReleaseIndexField.STATUS, "Promotion");
-    doc.addNumericField(ReleaseIndexField.NUM_TRACKS, 14);
-    doc.addNumericField(ReleaseIndexField.NUM_DISCIDS, 1);
-    doc.addField(ReleaseIndexField.FORMAT, "CD");
+            {
+                doc.addField(ReleaseIndexField.CATALOG_NO, "WRATHCD-25");
+                doc.addField(ReleaseIndexField.LABEL, "Wrath Records");
+                doc.addField(ReleaseIndexField.LABEL_ID, Index.NO_VALUE);
+                LabelInfo li = of.createLabelInfo();
+                Label label = of.createLabel();
+                li.setLabel(label);
+                li.setCatalogNumber("WRATHCD-25");
+                label.setName("Wrath Records");
+                labelInfoList.getLabelInfo().add(li);
+            }
 
-    doc.addField(ReleaseIndexField.COUNTRY, "US");
-    doc.addField(ReleaseIndexField.DATE, "2003-09-23");
-    doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, 1);
-    doc.addField(ReleaseIndexField.BARCODE, ReleaseIndex.BARCODE_NONE);
+            {
+                doc.addField(ReleaseIndexField.CATALOG_NO, "CAT WITH SPACE");
+                LabelInfo li = of.createLabelInfo();
+                li.setCatalogNumber("CAT WITH SPACE");
+                labelInfoList.getLabelInfo().add(li);
+            }
 
-    writer.addDocument(doc.getLuceneDocument());
+            {
+                doc.addField(ReleaseIndexField.CATALOG_NO, "LP-001");
+                doc.addField(ReleaseIndexField.LABEL, "Major Records");
+                doc.addField(ReleaseIndexField.LABEL_ID, "c1dfaf9c-d498-4f6c-b040-f7714315fcea");
+                LabelInfo li = of.createLabelInfo();
+                Label label = of.createLabel();
+                li.setLabel(label);
+                li.setCatalogNumber("LP-001");
+                label.setName("Major Records");
+                label.setId("c1dfaf9c-d498-4f6c-b040-f7714315fcea");
+                labelInfoList.getLabelInfo().add(li);
+            }
+            release.setLabelInfoList(labelInfoList);
 
-    {
-      doc = new MbDocument();
-      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
-      doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
-      writer.addDocument(doc.getLuceneDocument());
-    }
 
-    writer.close();
-    Map<ResourceType, IndexSearcher> searchers = new HashMap<ResourceType, IndexSearcher>();
-    searchers.put(ResourceType.RELEASE, new IndexSearcher(DirectoryReader.open(ramDir)));
+            doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, 2);
 
-    SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.RELEASE));
-    ss = new ReleaseSearch(searcherManager);
-    sd = new ReleaseDismaxSearch(ss);
-  }
 
-  @Test
-  public void testFindReleaseById() throws Exception {
-    Results res = ss.search("reid:\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals(3, doc.getFields(ReleaseIndexField.CATALOG_NO).length);
-    assertEquals("WRATHCD-25", doc.get(ReleaseIndexField.CATALOG_NO));
-    assertEquals(1, doc.getFields(ReleaseIndexField.BARCODE).length);
-    assertEquals("07599273202", doc.get(ReleaseIndexField.BARCODE));
-    assertEquals(1, doc.getFields(ReleaseIndexField.AMAZON_ID).length);
-    assertEquals("B00004Y6O9", doc.get(ReleaseIndexField.AMAZON_ID));
+            doc.addField(ReleaseIndexField.RELEASE_STORE, MMDSerializer.serialize(release));
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-    assertEquals(1, doc.getFields(ReleaseIndexField.COUNTRY).length);
-    assertEquals("GB", doc.get(ReleaseIndexField.COUNTRY));
-    assertEquals(1, doc.getFields(ReleaseIndexField.DATE).length);
-    assertEquals("2005", doc.get(ReleaseIndexField.DATE));
-    assertEquals(2, doc.getFields(ReleaseIndexField.NUM_DISCIDS_MEDIUM).length);
-    assertEquals(1, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(ReleaseIndexField.NUM_DISCIDS_MEDIUM))));
-    assertEquals("eng", doc.get(ReleaseIndexField.LANGUAGE));
-    assertEquals("Latn", doc.get(ReleaseIndexField.SCRIPT));
-    assertEquals("Official", doc.get(ReleaseIndexField.STATUS));
-    assertEquals("Compilation", doc.get(ReleaseIndexField.TYPE));
-    assertEquals("Album", doc.get(ReleaseIndexField.PRIMARY_TYPE));
-    assertEquals("Vinyl", doc.get(ReleaseIndexField.FORMAT));
-    assertEquals("B00004Y6O9", doc.get(ReleaseIndexField.AMAZON_ID));
+        //Another Release with Multiple Artists
+        {
+            MbDocument doc = new MbDocument();
+            Release release = of.createRelease();
+            doc.addField(ReleaseIndexField.RELEASE_ID, "0011c128-b1f2-300e-88cc-c33c30dce704");
+            release.setId("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
 
+            doc.addField(ReleaseIndexField.RELEASE, "Epics");
 
-  }
+            doc.addField(ReleaseIndexField.SCRIPT, "Taml");
+            doc.addField(ReleaseIndexField.LANGUAGE, "fra");
+            doc.addField(ReleaseIndexField.TYPE, ReleaseGroupType.SINGLE.getName());
+            doc.addField(ReleaseIndexField.ARTIST, "Erich Kunzel and Cincinnati Pops");
+            doc.addField(ReleaseIndexField.ARTIST_ID, "99845d0c-f239-4051-a6b1-4b5e9f7ede0b");
+            doc.addField(ReleaseIndexField.ARTIST_NAME, "Erich Kunzel");
+            doc.addField(ReleaseIndexField.ARTIST_NAMECREDIT, "Erich Kunzel");
 
-  @Test
-  public void testFindReleaseByName() throws Exception {
-    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+            doc.addField(ReleaseIndexField.ARTIST_ID, "d8fbd94c-cd06-4e8b-a559-761ad969d07e");
+            doc.addField(ReleaseIndexField.ARTIST_NAME, "The Cincinnati Pops Orchestra");
+            doc.addField(ReleaseIndexField.ARTIST_NAMECREDIT, "Cincinnati Pops");
 
-  @Test
-  public void testFindReleaseByDismax1() throws Exception {
-    Results res = sd.search("Wrath", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+            ArtistCredit ac = of.createArtistCredit();
+            NameCredit nc = of.createNameCredit();
+            Artist artist = of.createArtist();
+            artist = of.createArtist();
+            artist.setId("99845d0c-f239-4051-a6b1-4b5e9f7ede0b");
+            artist.setName("Erich Kunzel");
+            artist.setSortName("Kunzel, Eric");
+            nc.setJoinphrase("and");
+            nc.setArtist(artist);
+            ac.getNameCredit().add(nc);
 
-  @Test
-  public void testFindReleaseByDismax2() throws Exception {
-    Results res = sd.search("Farming", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+            nc = of.createNameCredit();
+            artist = of.createArtist();
+            artist.setId("d8fbd94c-cd06-4e8b-a559-761ad969d07e");
+            artist.setName("The Cincinnati Pops Orchestra");
+            artist.setSortName("Cincinnati Pops Orchestra, The");
+            nc.setArtist(artist);
+            nc.setName("Cincinnati Pops");
+            ac.getNameCredit().add(nc);
 
-  @Test
-  public void testFindReleaseByDismax3() throws Exception {
-    Results res = sd.search("Incident", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+            doc.addField(ReleaseGroupIndexField.ARTIST_CREDIT, MMDSerializer.serialize(ac));
 
-  @Test
-  public void testFindReleaseByDismax4() throws Exception {
-    Results res = sd.search("Our Glorious", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+            doc.addNumericField(ReleaseIndexField.NUM_TRACKS_MEDIUM, 14);
+            doc.addNumericField(ReleaseIndexField.NUM_DISCIDS_MEDIUM, 1);
+            doc.addField(ReleaseIndexField.STATUS, "Promotion");
+            doc.addNumericField(ReleaseIndexField.NUM_TRACKS, 14);
+            doc.addNumericField(ReleaseIndexField.NUM_DISCIDS, 1);
+            doc.addField(ReleaseIndexField.FORMAT, "CD");
 
-  @Test
-  public void testFindReleaseByDefault() throws Exception {
-    Results res = ss.search("\"Our Glorious 5 Year Plan\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
+            doc.addField(ReleaseIndexField.COUNTRY, "US");
+            doc.addField(ReleaseIndexField.DATE, "2003-09-23");
+            doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, 1);
+            doc.addField(ReleaseIndexField.BARCODE, ReleaseIndex.BARCODE_NONE);
 
-  }
+            doc.addField(ReleaseIndexField.RELEASE_STORE, MMDSerializer.serialize(release));
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-  @Test
-  public void testFindReleaseByArtistName() throws Exception {
-    Results res = ss.search("artist:\"Farming Incident\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+            doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-  @Test
-  public void testFindReleaseByFormat() throws Exception {
-    Results res = ss.search("format:Vinyl", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
+        writer.close();
+        Map<ResourceType, IndexSearcher> searchers = new HashMap<ResourceType, IndexSearcher>();
+        searchers.put(ResourceType.RELEASE, new IndexSearcher(DirectoryReader.open(ramDir)));
 
-  }
+        SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.RELEASE));
+        ss = new ReleaseSearch(searcherManager);
+        sd = new ReleaseDismaxSearch(ss);
+    }
 
-  @Test
-  public void testFindReleaseByCatNo() throws Exception {
-    Results res = ss.search("catno:WRATHCD-25", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    protected String getReleaseId(MbDocument doc) {
+        Release release = (Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE), Release.class);
+        return release.getId();
+    }
 
     @Test
+    public void testFindReleaseById() throws Exception {
+        Results res = ss.search("reid:\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByName() throws Exception {
+        Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByDismax1() throws Exception {
+        Results res = sd.search("Wrath", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByDismax2() throws Exception {
+        Results res = sd.search("Farming", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByDismax3() throws Exception {
+        Results res = sd.search("Incident", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByDismax4() throws Exception {
+        Results res = sd.search("Our Glorious", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByDefault() throws Exception {
+        Results res = ss.search("\"Our Glorious 5 Year Plan\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+
+    }
+
+    @Test
+    public void testFindReleaseByArtistName() throws Exception {
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
+    public void testFindReleaseByFormat() throws Exception {
+        Results res = ss.search("format:Vinyl", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+
+    }
+
+    @Test
+    public void testFindReleaseByCatNo() throws Exception {
+        Results res = ss.search("catno:WRATHCD-25", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
+
+    @Test
     public void testFindReleaseByCatNoWithSpaces() throws Exception {
         Results res = ss.search("catno:\"CAT WITH SPACE\"", 0, 10);
         assertEquals(1, res.getTotalHits());
-        Result result = res.results.get(0);
-        MbDocument doc = result.getDoc();
-        assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-        assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
     }
 
     @Test
     public void testFindReleaseByCatNoWithSpacesIgnoringingSpaces() throws Exception {
         Results res = ss.search("catno:\"CATWITHSPACE\"", 0, 10);
         assertEquals(1, res.getTotalHits());
-        Result result = res.results.get(0);
-        MbDocument doc = result.getDoc();
-        assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-        assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
     }
 
     @Test
     public void testFindReleaseByCatNoWithSpacesIgnoringingSpacesWildcard() throws Exception {
         Results res = ss.search("catno:CATWITHSPACE*", 0, 10);
         assertEquals(1, res.getTotalHits());
-        Result result = res.results.get(0);
-        MbDocument doc = result.getDoc();
-        assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-        assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
     }
 
     /*
@@ -355,13 +404,10 @@
     */
 
     @Test
-   public void testFindReleaseByCatNoAsterisk() throws Exception {
+    public void testFindReleaseByCatNoAsterisk() throws Exception {
         Results res = ss.search("catno:WRATHCD-25*", 0, 10);
         assertEquals(1, res.getTotalHits());
-        Result result = res.results.get(0);
-        MbDocument doc = result.getDoc();
-        assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-        assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
     }
 
     /*
@@ -375,556 +421,448 @@
         assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
     }
     */
-  @Test
-  public void testFindReleaseByBarcodeWithoutZero() throws Exception {
-    Results res = ss.search("barcode:7599273202", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals(1, doc.getFields(ReleaseIndexField.BARCODE).length);
-    assertEquals("07599273202", doc.get(ReleaseIndexField.BARCODE));
-  }
+    @Test
+    public void testFindReleaseByBarcodeWithoutZero() throws Exception {
+        Results res = ss.search("barcode:7599273202", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByBarcodeWithZero() throws Exception {
-    Results res = ss.search("barcode:07599273202", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals(1, doc.getFields(ReleaseIndexField.BARCODE).length);
-    assertEquals("07599273202", doc.get(ReleaseIndexField.BARCODE));
-  }
+    @Test
+    public void testFindReleaseByBarcodeWithZero() throws Exception {
+        Results res = ss.search("barcode:07599273202", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByAsin() throws Exception {
-    Results res = ss.search("asin:B00004Y6O9", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    @Test
+    public void testFindReleaseByAsin() throws Exception {
+        Results res = ss.search("asin:B00004Y6O9", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByAsinLowercase() throws Exception {
-    Results res = ss.search("asin:b00004y6O9", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    @Test
+    public void testFindReleaseByAsinLowercase() throws Exception {
+        Results res = ss.search("asin:b00004y6O9", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /**
-   * Works as is even though lang code not analysed because lang code always lowercase
-   *
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByLanguage() throws Exception {
-    Results res = ss.search("lang:eng", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /**
+     * Works as is even though lang code not analysed because lang code always lowercase
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByLanguage() throws Exception {
+        Results res = ss.search("lang:eng", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /**
-   * Works as is even though lang code not analysed because lang code always lowercase
-   *
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByLanguageUppercase() throws Exception {
-    Results res = ss.search("lang:ENG", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /**
+     * Works as is even though lang code not analysed because lang code always lowercase
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByLanguageUppercase() throws Exception {
+        Results res = ss.search("lang:ENG", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /**
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByScript() throws Exception {
-    Results res = ss.search("script:latn", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /**
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByScript() throws Exception {
+        Results res = ss.search("script:latn", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /**
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByComment() throws Exception {
-    Results res = ss.search("comment:demo", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("demo", doc.get(ReleaseIndexField.COMMENT));
-  }
+    /**
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByComment() throws Exception {
+        Results res = ss.search("comment:demo", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /**
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByScriptUppercase() throws Exception {
-    Results res = ss.search("script:LATN", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /**
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByScriptUppercase() throws Exception {
+        Results res = ss.search("script:LATN", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByCountry() throws Exception {
-    Results res = ss.search("country:gb", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByCountry() throws Exception {
+        Results res = ss.search("country:gb", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseWithNoBarcode() throws Exception {
-    Results res = ss.search("barcode:none", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Epics", doc.get(ReleaseIndexField.RELEASE));
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseWithNoBarcode() throws Exception {
+        Results res = ss.search("barcode:none", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseWithNotKnownBarcode() throws Exception {
-    Results res = ss.search("barcode:\\-", 0, 10);
-    assertEquals(0, res.getTotalHits());
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseWithNotKnownBarcode() throws Exception {
+        Results res = ss.search("barcode:\\-", 0, 10);
+        assertEquals(0, res.getTotalHits());
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByNumTracks() throws Exception {
-    Results res = ss.search("tracks:17", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByNumTracks() throws Exception {
+        Results res = ss.search("tracks:17", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByTracksOnMedium() throws Exception {
-    Results res = ss.search("tracksmedium:10", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByTracksOnMedium() throws Exception {
+        Results res = ss.search("tracksmedium:10", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByNumDiscOnMedium() throws Exception {
-    Results res = ss.search("discidsmedium:2", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByNumDiscOnMedium() throws Exception {
+        Results res = ss.search("discidsmedium:2", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /*
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByNumDisc() throws Exception {
-    Results res = ss.search("discids:3", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /*
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByNumDisc() throws Exception {
+        Results res = ss.search("discids:3", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  /**
-   * @throws Exception
-   */
-  @Test
-  public void testFindReleaseByCountryUppercase() throws Exception {
-    Results res = ss.search("country:GB", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    /**
+     * @throws Exception
+     */
+    @Test
+    public void testFindReleaseByCountryUppercase() throws Exception {
+        Results res = ss.search("country:GB", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
 
-  @Test
-  public void testFindReleaseByDate() throws Exception {
-    Results res = ss.search("date:2005", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-  }
+    @Test
+    public void testFindReleaseByDate() throws Exception {
+        Results res = ss.search("date:2005", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByTypeLowercase() throws Exception {
-    Results res = ss.search("type:\"compilation\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByTypeLowercase() throws Exception {
+        Results res = ss.search("type:\"compilation\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseBySecondaryTypeFirst() throws Exception {
-    Results res = ss.search("secondarytype:\"Live\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseBySecondaryTypeFirst() throws Exception {
+        Results res = ss.search("secondarytype:\"Live\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseBySecondaryTypeSecond() throws Exception {
-    Results res = ss.search("secondarytype:\"Compilation\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseBySecondaryTypeSecond() throws Exception {
+        Results res = ss.search("secondarytype:\"Compilation\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByTypeTitleCase() throws Exception {
-    Results res = ss.search("type:\"Compilation\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByTypeTitleCase() throws Exception {
+        Results res = ss.search("type:\"Compilation\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByRgid() throws Exception {
-    Results res = ss.search("rgid:1d9e8ed6-3893-4d3b-aa7d-6cd79609e333", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByRgid() throws Exception {
+        Results res = ss.search("rgid:1d9e8ed6-3893-4d3b-aa7d-6cd79609e333", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByNumericType() throws Exception {
-    Results res = ss.search("type:4", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByNumericType() throws Exception {
+        Results res = ss.search("type:4", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByStatusLowercase() throws Exception {
-    Results res = ss.search("status:\"official\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByStatusLowercase() throws Exception {
+        Results res = ss.search("status:\"official\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByStatusTitleCase() throws Exception {
-    Results res = ss.search("status:\"Official\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByStatusTitleCase() throws Exception {
+        Results res = ss.search("status:\"Official\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByNumericstatus() throws Exception {
-    Results res = ss.search("status:1", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("Our Glorious 5 Year Plan", doc.get(ReleaseIndexField.RELEASE));
-    assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
-    assertEquals("Album", doc.get(ReleaseGroupIndexField.PRIMARY_TYPE));
-    assertEquals("Compilation", doc.get(ReleaseGroupIndexField.TYPE));
-  }
+    @Test
+    public void testFindReleaseByNumericstatus() throws Exception {
+        Results res = ss.search("status:1", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseGroupByArtist2() throws Exception {
-    Results res = ss.search("artist:\"Erich Kunzel\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("0011c128-b1f2-300e-88cc-c33c30dce704", doc.get(ReleaseIndexField.RELEASE_ID));
-    assertEquals("Epics", doc.get(ReleaseIndexField.RELEASE));
+    @Test
+    public void testFindReleaseGroupByArtist2() throws Exception {
+        Results res = ss.search("artist:\"Erich Kunzel\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
 
-  }
+    }
 
-  @Test
-  public void testFindReleaseGroupByAllArtist2() throws Exception {
-    Results res = ss.search("artist:\"Erich Kunzel and Cincinnati Pops\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("0011c128-b1f2-300e-88cc-c33c30dce704", doc.get(ReleaseIndexField.RELEASE_ID));
-    assertEquals("Epics", doc.get(ReleaseIndexField.RELEASE));
-  }
+    @Test
+    public void testFindReleaseGroupByAllArtist2() throws Exception {
+        Results res = ss.search("artist:\"Erich Kunzel and Cincinnati Pops\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
+    }
 
-  @Test
-  public void testFindReleaseByNumberofMediums() throws Exception {
-    Results res = ss.search("mediums:2", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    @Test
+    public void testFindReleaseByNumberofMediums() throws Exception {
+        Results res = ss.search("mediums:2", 0, 10);
+        assertEquals(1, res.getTotalHits());
+    }
 
-  @Test
-  public void testFindReleaseByLabelId() throws Exception {
-    Results res = ss.search("laid:c1dfaf9c-d498-4f6c-b040-f7714315fcea", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    @Test
+    public void testFindReleaseByLabelId() throws Exception {
+        Results res = ss.search("laid:c1dfaf9c-d498-4f6c-b040-f7714315fcea", 0, 10);
+        assertEquals(1, res.getTotalHits());
+    }
 
-  @Test
-  public void testNumericRangeQuery() throws Exception {
-    Results res = ss.search("tracksmedium:[7 TO 17]", 0, 10);
-    assertEquals(2, res.getTotalHits());
-  }
+    @Test
+    public void testNumericRangeQuery() throws Exception {
+        Results res = ss.search("tracksmedium:[7 TO 17]", 0, 10);
+        assertEquals(2, res.getTotalHits());
+    }
 
-  @Test
-  public void testFindReleaseByPuid() throws Exception {
-    Results res = ss.search("puid:668f3a22-03e8-e3cd-55e4-2e9a0906419a", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    @Test
+    public void testFindReleaseByPuid() throws Exception {
+        Results res = ss.search("puid:668f3a22-03e8-e3cd-55e4-2e9a0906419a", 0, 10);
+        assertEquals(1, res.getTotalHits());
+    }
 
-  /**
-   * Tests get same results as
-   * http://musicbrainz.org/ws/1/release/?type=xml&query=%22Our%20Glorious%205%20Year%20Plan%22
-   *
-   * @throws Exception
-   */
-  @Test
-  public void testOutputAsMmdv1Xml() throws Exception {
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/release/?type=xml&query=%22Our%20Glorious%205%20Year%20Plan%22
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testOutputAsMmdv1Xml() throws Exception {
 
-    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 1);
-    ResultsWriter writer = new ReleaseMmd1XmlWriter();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res);
-    pr.close();
-    String output = sw.toString();
-    System.out.println("Xml is" + output);
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
-    assertTrue(output.contains("language=\"ENG\""));
-    assertTrue(output.contains("script=\"Latn\""));
-    assertTrue(output.contains("type=\"Compilation Official\""));
-    assertTrue(output.contains("<title>Our Glorious 5 Year Plan</title>"));
-    assertTrue(output.contains("<name>Farming Incident</name>"));
-    assertTrue(output.contains("<sort-name>Incident, Farming</sort-name>"));
-    assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("<disc-list count=\"3\""));
-    assertTrue(output.contains("<track-list count=\"17\""));
-    assertTrue(output.contains("date=\"2005\""));
-    assertTrue(output.contains("country=\"GB\""));
-    assertTrue(output.contains("format=\"Vinyl\""));
-    assertTrue(output.contains("<asin>B00004Y6O9</asin>"));
+        Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 1);
+        ResultsWriter writer = new ReleaseMmd1XmlWriter();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res);
+        pr.close();
+        String output = sw.toString();
+        System.out.println("Xml is" + output);
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
+        assertTrue(output.contains("language=\"ENG\""));
+        assertTrue(output.contains("script=\"Latn\""));
+        assertTrue(output.contains("type=\"Compilation Official\""));
+        assertTrue(output.contains("<title>Our Glorious 5 Year Plan</title>"));
+        assertTrue(output.contains("<name>Farming Incident</name>"));
+        assertTrue(output.contains("<sort-name>Incident, Farming</sort-name>"));
+        assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("<disc-list count=\"3\""));
+        assertTrue(output.contains("<track-list count=\"17\""));
+        assertTrue(output.contains("date=\"2005\""));
+        assertTrue(output.contains("country=\"GB\""));
+        assertTrue(output.contains("format=\"Vinyl\""));
+        assertTrue(output.contains("<asin>B00004Y6O9</asin>"));
 
-    assertTrue(output.contains("<label><name>Wrath Records</name></label>"));
-    assertTrue(output.contains("catalog-number=\"WRATHCD-25\""));
+        assertTrue(output.contains("<label><name>Wrath Records</name></label>"));
+        assertTrue(output.contains("catalog-number=\"WRATHCD-25\""));
 
-  }
+    }
 
-  /**
-   * Tests get same results as
-   * http://musicbrainz.org/ws/1/release/?type=xml&query=%22Our%20Glorious%205%20Year%20Plan%22
-   *
-   * @throws Exception
-   */
-  @Test
-  public void testOutputAsXml() throws Exception {
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/release/?type=xml&query=%22Our%20Glorious%205%20Year%20Plan%22
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testOutputAsXml() throws Exception {
 
-    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 1);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res, SearchServerServlet.RESPONSE_XML, true);
-    pr.close();
-    String output = sw.toString();
-    System.out.println("Xml is" + output);
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
-    assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
-    assertTrue(output.contains("<language>eng</language>"));
-    assertTrue(output.contains("<script>Latn</script>"));
-    assertTrue(output.contains("type=\"Compilation\""));
-    assertTrue(output.contains("<primary-type>Album</primary-type>"));
+        Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 1);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_XML, true);
+        pr.close();
+        String output = sw.toString();
+        System.out.println("Xml is" + output);
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
+        assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
+        assertTrue(output.contains("<language>eng</language>"));
+        assertTrue(output.contains("<script>Latn</script>"));
+        assertTrue(output.contains("type=\"Compilation\""));
+        assertTrue(output.contains("<primary-type>Album</primary-type>"));
 
-    assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e333\""));
-    assertTrue(output.contains("<title>Our Glorious 5 Year Plan</title>"));
-    assertTrue(output.contains("<name>Farming Incident</name>"));
-    assertTrue(output.contains("<sort-name>Incident, Farming</sort-name>"));
-    assertTrue(output.contains("<disambiguation>demo</disambiguation>"));
-    assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("<disc-list count=\"1\""));
-    assertTrue(output.contains("<track-list count=\"10\""));
-    assertTrue(output.contains("<date>2005</date>"));
-    assertTrue(output.contains("<country>GB</country>"));
-    assertTrue(output.contains("<format>Vinyl</format>"));
-    assertTrue(output.contains("<asin>B00004Y6O9</asin>"));
-    assertTrue(output.contains("<track-count>17</track-count>"));
-    assertTrue(output.contains("<name>Wrath Records</name>"));
-    assertTrue(output.contains("<label id=\"c1dfaf9c-d498-4f6c-b040-f7714315fcea\">"));
-    assertTrue(output.contains("<name>Major Records</name>"));
-    assertTrue(output.contains("<catalog-number>WRATHCD-25</catalog-number>"));
-    assertTrue(output.contains("<medium-list count=\"2\">"));
-    assertTrue(output.contains("<secondary-type>Live</secondary-type>"));
-    assertTrue(output.contains("<secondary-type>Compilation</secondary-type>"));
-    assertTrue(output.contains("<name>punk</name>"));
-  }
+        assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e333\""));
+        assertTrue(output.contains("<title>Our Glorious 5 Year Plan</title>"));
+        assertTrue(output.contains("<name>Farming Incident</name>"));
+        assertTrue(output.contains("<sort-name>Incident, Farming</sort-name>"));
+        assertTrue(output.contains("<disambiguation>demo</disambiguation>"));
+        assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("<disc-list count=\"1\""));
+        assertTrue(output.contains("<track-list count=\"10\""));
+        assertTrue(output.contains("<date>2005</date>"));
+        assertTrue(output.contains("<country>GB</country>"));
+        assertTrue(output.contains("<format>Vinyl</format>"));
+        assertTrue(output.contains("<asin>B00004Y6O9</asin>"));
+        assertTrue(output.contains("<track-count>17</track-count>"));
+        assertTrue(output.contains("<name>Wrath Records</name>"));
+        assertTrue(output.contains("<label id=\"c1dfaf9c-d498-4f6c-b040-f7714315fcea\">"));
+        assertTrue(output.contains("<name>Major Records</name>"));
+        assertTrue(output.contains("<catalog-number>WRATHCD-25</catalog-number>"));
+        assertTrue(output.contains("<medium-list count=\"2\">"));
+        assertTrue(output.contains("<secondary-type>Live</secondary-type>"));
+        assertTrue(output.contains("<secondary-type>Compilation</secondary-type>"));
+        assertTrue(output.contains("<name>punk</name>"));
+    }
 
-  @Test
-  public void testOutputJson() throws Exception {
+    @Test
+    public void testOutputJson() throws Exception {
 
-    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res, SearchServerServlet.RESPONSE_JSON);
-    pr.close();
+        Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_JSON);
+        pr.close();
 
-    String output = sw.toString();
-    System.out.println("Json is" + output);
+        String output = sw.toString();
+        System.out.println("Json is" + output);
 
-    assertTrue(output.contains("id\":\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
-    assertTrue(output.contains("\"type\":\"Compilation\""));
-    assertTrue(output.contains("title\":\"Our Glorious 5 Year Plan\""));
-    assertTrue(output.contains("\"status\":\"Official\""));
-    assertTrue(output.contains("\"language\":\"eng\""));
-    assertTrue(output.contains("\"script\":\"Latn\""));
-    assertTrue(output.contains("\"barcode\":\"07599273202\""));
-    assertTrue(output.contains("\"asin\":\"B00004Y6O9\""));
-    assertTrue(output.contains("\"track-count\":17"));
-    assertTrue(output.contains("\"secondary-type-list\":{\"secondary-type\":[\"Live\",\"Compilation\"]}}"));
+        assertTrue(output.contains("id\":\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("\"type\":\"Compilation\""));
+        assertTrue(output.contains("title\":\"Our Glorious 5 Year Plan\""));
+        assertTrue(output.contains("\"status\":\"Official\""));
+        assertTrue(output.contains("\"language\":\"eng\""));
+        assertTrue(output.contains("\"script\":\"Latn\""));
+        assertTrue(output.contains("\"barcode\":\"07599273202\""));
+        assertTrue(output.contains("\"asin\":\"B00004Y6O9\""));
+        assertTrue(output.contains("\"track-count\":17"));
+        assertTrue(output.contains("\"secondary-type-list\":{\"secondary-type\":[\"Live\",\"Compilation\"]}}"));
 
-  }
+    }
 
-  @Test
-  public void testOutputJsonNew() throws Exception {
+    @Test
+    public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW);
-    pr.close();
+        Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW);
+        pr.close();
 
-    String output = sw.toString();
-    System.out.println("Json New is" + output);
+        String output = sw.toString();
+        System.out.println("Json New is" + output);
 
-    assertTrue(output.contains("id\":\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
-    assertTrue(output.contains("title\":\"Our Glorious 5 Year Plan\""));
-    assertTrue(output.contains("\"status\":\"Official\""));
-    assertTrue(output.contains("\"language\":\"eng\""));
-    assertTrue(output.contains("\"script\":\"Latn\""));
-    assertTrue(output.contains("\"barcode\":\"07599273202\""));
-    assertTrue(output.contains("\"asin\":\"B00004Y6O9\""));
-    assertTrue(output.contains("\"secondary-types\":[\"Live\",\"Compilation\"]"));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
-    assertTrue(output.contains("\"track-count\":17"));
-    assertTrue(output.contains("\"media\""));
-    assertTrue(output.contains("\"disc-count\":1"));
-    assertTrue(output.contains("\"track-count\":7"));
-    assertTrue(output.contains("\"label-info\""));
-    assertTrue(output.contains("\"catalog-number\":\"WRATHCD-25\""));
-    assertTrue(output.contains("\"primary-type\":\"Album\""));
-    assertTrue(output.contains(""));
-  }
+        assertTrue(output.contains("id\":\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
+        assertTrue(output.contains("title\":\"Our Glorious 5 Year Plan\""));
+        assertTrue(output.contains("\"status\":\"Official\""));
+        assertTrue(output.contains("\"language\":\"eng\""));
+        assertTrue(output.contains("\"script\":\"Latn\""));
+        assertTrue(output.contains("\"barcode\":\"07599273202\""));
+        assertTrue(output.contains("\"asin\":\"B00004Y6O9\""));
+        assertTrue(output.contains("\"secondary-types\":[\"Live\",\"Compilation\"]"));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("\"track-count\":17"));
+        assertTrue(output.contains("\"media\""));
+        assertTrue(output.contains("\"disc-count\":1"));
+        assertTrue(output.contains("\"track-count\":7"));
+        assertTrue(output.contains("\"label-info\""));
+        assertTrue(output.contains("\"catalog-number\":\"WRATHCD-25\""));
+        assertTrue(output.contains("\"primary-type\":\"Album\""));
+        assertTrue(output.contains(""));
+    }
 
-  @Test
-  public void testOutputJsonNewPretty() throws Exception {
+    @Test
+    public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW, true);
-    pr.close();
+        Results res = ss.search("release:\"Our Glorious 5 Year Plan\"", 0, 10);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW, true);
+        pr.close();
 
-    String output = sw.toString();
-    System.out.println("Json New  Pretty is" + output);
-    assertTrue(output.contains("\"count\" : 1"));
-  }
+        String output = sw.toString();
+        System.out.println("Json New  Pretty is" + output);
+        assertTrue(output.contains("\"count\" : 1"));
+    }
 
 
-  @Test
-  public void testFindReleaseByTag() throws Exception {
+    @Test
+    public void testFindReleaseByTag() throws Exception {
         Results res = ss.search("tag:punk", 0, 10);
         assertEquals(1, res.getTotalHits());
-        Result result = res.results.get(0);
-        MbDocument doc = result.getDoc();
-        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(ReleaseIndexField.RELEASE_ID));
-        assertEquals("punk", doc.get(ReleaseIndexField.TAG));
-        assertEquals("10", doc.get(ReleaseIndexField.TAGCOUNT));
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", getReleaseId(res.results.get(0).getDoc()));
 
-  }
+    }
 
 }
\ No newline at end of file