<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.audio.musicbrainz.cvs">
    <title>gmane.comp.audio.musicbrainz.cvs</title>
    <link>http://blog.gmane.org/gmane.comp.audio.musicbrainz.cvs</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18251"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18250"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18249"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18248"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18247"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18246"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18245"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18244"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18243"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18242"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18241"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18240"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18239"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18238"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18237"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18236"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18235"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18234"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18233"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18232"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18251">
    <title>[mb-commits] r13690 - in search_server/tags: . release-2013-05-20</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18251</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-20 12:11:03 +0000 (Mon, 20 May 2013)
New Revision: 13690

Added:
   search_server/tags/release-2013-05-20/
Log:



Property changes on: search_server/tags/release-2013-05-20
___________________________________________________________________
Added: svn:mergeinfo
   + /search_server/branches/lucene-java:12117-12127
/search_server/trunk:12128-12159
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-20T12:11:03</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18250">
    <title>[mb-commits] r13689 - search_server/trunk</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18250</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-20 11:58:40 +0000 (Mon, 20 May 2013)
New Revision: 13689

Modified:
   search_server/trunk/README
Log:
Updated README

Modified: search_server/trunk/README
===================================================================
--- search_server/trunk/README2013-05-20 10:46:39 UTC (rev 13688)
+++ search_server/trunk/README2013-05-20 11:58:40 UTC (rev 13689)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -7,7 +7,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 ------------
 
 This server can be run on linux/osx/windows, but these instructions assume 
-that you will be running linux and will be using the tomcat6 server to host
+that you will be running linux and will be using the tomcat7 server to host
 the servlet.
 
 It also assumes you have created a user called search with a home folder of /home/search
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -23,12 +23,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 You will also need these tools:
 
     - Java complete with JDK 1.6, not just the JRE
-    - Apache Tomcat 6
+    - Apache Tomcat 7
     - Maven 2
 
 In a recent Ubuntu, you can install these with this command:
 
-    apt-get install openjdk-6-jdk maven2 tomcat6
+    apt-get install openjdk-6-jdk maven2 tomcat7
 
 Alternatively if you're not on Ubuntu, install the required tools from the following links
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,9 +44,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 Check out and build server code
 -------------------------------
 
-Check out the mmd-schema and search_server repositories using Subversion as follows:
+Check out the mmd-schema using Git as follows:
+    git clone https://github.com/metabrainz/mmd-schema.git
 
-    svn co http://svn.musicbrainz.org/mmd-schema/trunk mmd-schema
+Check out the search_server repositories using Subversion as follows:
     svn co http://svn.musicbrainz.org/search_server/trunk search_server
 
 Build and install the model:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -76,7 +77,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 Unjar the search server webapp into the ROOT directory under webapps for your tomcat installation. If you installed
 Tomcat using apt this will be
 
-    /var/lib/tomcat6/webapps
+    /var/lib/tomcat7/webapps
 
 If you installed tomcat manually the webapps directory is directly within the folder tomcat has been installed to.
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -85,12 +86,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 On Ubuntu this will work:
 
-    sudo /etc/init.d/tomcat6 stop
+    sudo /etc/init.d/tomcat7 stop
     cd /var/lib/tomcat6/webapps
     rm -rf ROOT/*
     cd ROOT
     jar -xf &amp;lt;your lucene java src dir&amp;gt;/servlet/target/searchserver.war
-    sudo /etc/init.d/tomcat6 start
+    sudo /etc/init.d/tomcat7 start
 
 
 Build Indexes
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -131,7 +132,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 Once indexes are built, ensure that your tomcat instance has the permissions to access your data.
 In Ubuntu:
 
-    chown -R tomcat6:tomcat6 /home/search
+    chown -R tomcat7:tomcat7 /home/search
 
 Update Indexes using the Live Data Feed
 ---------------------------------------
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -165,7 +166,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 -------------
 
 Ubuntu enables the Java security manager by default, this will prevent the search server working.
-For Ubuntu, set TOMCAT6_SECURITY in /etc/default/tomcat6 to no:
+For Ubuntu, set TOMCAT6_SECURITY in /etc/default/tomcat7 to no:
 
     # Use the Java security manager? (yes/no)
     TOMCAT6_SECURITY=no
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -180,10 +181,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     export JAVA_OPTS="-Xms512M -Xmx512M -Dfile.encoding=UTF-8"
 
-In Ubuntu, you can change JAVA_OPTS in /etc/default/tomcat6 -- you do not need to set an environment var.
+In Ubuntu, you can change JAVA_OPTS in /etc/default/tomcat7 -- you do not need to set an environment var.
 
 Next, specify that Tomcat expects URIEncodings in UTF-8 format so they are decoded correctly.
-In server.xml (in ubuntu thats in /etc/tomcat6/server.xml) add the URIEncoding parameter to this 
+In server.xml (in ubuntu thats in /etc/tomcat7/server.xml) add the URIEncoding parameter to this
 line:
 
     &amp;lt;Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -305,8 +306,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     java -Xmx512M -jar index-2.0-SNAPSHOT-jar-with-dependencies.jar -d musicbrainz_db_20110716 -u musicbrainz_user --indexes-dir /home/username/indexdata
     cd /home/username/tomcat/ROOT
     jar -xf /home/username/search_server/servlet/target/searchserver.war
-    sudo /etc/init.d/tomcat6 stop
-    sudo /etc/init.d/tomcat6 start
+    sudo /etc/init.d/tomcat7 stop
+    sudo /etc/init.d/tomcat7 start
 
 
 where username is the username of the test searchserver admin.
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-20T11:58:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18249">
    <title>[mb-commits] r13688 -search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18249</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-20 10:46:39 +0000 (Mon, 20 May 2013)
New Revision: 13688

Modified:
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java
Log:
SEARCH-298:ws/1 release search output broken for releases with no labels

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.java2013-05-20 09:23:17 UTC (rev 13687)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java2013-05-20 10:46:39 UTC (rev 13688)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,7 +89,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             TextRepresentation tr = of.createTextRepresentation();
             org.musicbrainz.mmd2.TextRepresentation tr2 = releasev2.getTextRepresentation();
-            if (tr != null) {
+            if (tr2 != null) {
                 if (!Strings.isNullOrEmpty(tr2.getScript())) {
                     tr.setScript(tr2.getScript());
                 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -119,7 +119,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             //Just use format of first medium
             Medium firstMediumv2 = releasev2.getMediumList().getMedium().get(0);
             LabelInfoList lilv2 = releasev2.getLabelInfoList();
-            if (!lilv2.getLabelInfo().isEmpty()) {
+            if (lilv2!=null &amp;amp;&amp;amp; !lilv2.getLabelInfo().isEmpty()) {
                 ReleaseEventList eventList = of.createReleaseEventList();
                 for (LabelInfo liv2 : lilv2.getLabelInfo()) {
                     Event event = of.createEvent();
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-20T10:46:41</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18248">
    <title>[mb-commits] r13687 - in search_server/trunk/index/src:main/java/org/musicbrainz/search/indextest/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18248</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-20 09:23:17 +0000 (Mon, 20 May 2013)
New Revision: 13687

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
Log:
SEARCH-294:Search results no longer include medium-list count attribute

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.java2013-05-16 09:29:38 UTC (rev 13686)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-20 09:23:17 UTC (rev 13687)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -561,11 +561,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 DiscList discList = of.createDiscList();
                 discList.setCount(BigInteger.valueOf(numDiscsOnMedium));
                 medium.setDiscList(discList);
-
                 mediumList.getMedium().add(medium);
-                release.setMediumList(mediumList);
             }
+            mediumList.setCount(BigInteger.valueOf(mediumList.getMedium().size()));
+            release.setMediumList(mediumList);
 
+
             //Num of mediums on the release
             doc.addNumericField(ReleaseIndexField.NUM_MEDIUMS, mediumCount);
 

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.java2013-05-16 09:29:38 UTC (rev 13686)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-20 09:23:17 UTC (rev 13687)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -888,6 +888,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("EP", release.getReleaseGroup().getPrimaryType());
             assertEquals("EP", release.getReleaseGroup().getType());
             assertNotNull(release.getMediumList());
+            assertEquals(1,release.getMediumList().getCount().intValue());
+            assertEquals(1,release.getMediumList().getTrackCount().intValue());
 
 
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -915,6 +917,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("B00005NTQ7", release.getAsin());
             assertNull(release.getStatus());
             assertNotNull(release.getMediumList());
+            assertEquals(1,release.getMediumList().getCount().intValue());
+            assertEquals(10,release.getMediumList().getTrackCount().intValue());
+
             ReleaseEventList rel = release.getReleaseEventList();
             assertNotNull(rel);
             assertEquals(4,rel.getReleaseEvent().size());
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-20T09:23:18</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18247">
    <title>[mb-commits] r13686 - in search_server/trunk/index/src:main/java/org/musicbrainz/search/indextest/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18247</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-16 09:29:38 +0000 (Thu, 16 May 2013)
New Revision: 13686

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
Log:
SEARCH-290:Fixed with the bug present the behaviour was that whenever there was track artist credit that was different to the recording artist credit then it would in fact output the recording artist credit as the track artist credit.

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-10 13:14:08 UTC (rev 13685)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-16 09:29:38 UTC (rev 13686)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -867,7 +867,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                         RecordingIndexField.ARTIST_NAMECREDIT,
                                         RecordingIndexField.ARTIST_ID,
                                         RecordingIndexField.ARTIST_NAME);
-                        track.setArtistCredit(ac.getArtistCredit());
+                        track.setArtistCredit(taw.getArtistCredit());
                     }
                 }
             }

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-10 13:14:08 UTC (rev 13685)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-16 09:29:38 UTC (rev 13686)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -575,7 +575,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             ac = recording.getReleaseList().getRelease().get(0).getMediumList().getMedium().get(0).getTrackList().getDefTrack().get(0).getArtistCredit();
             assertNotNull(ac);
-            assertEquals("Echo &amp;amp; The Bunnymen", ac.getNameCredit().get(0).getArtist().getName());
+            assertEquals("Pixies", ac.getNameCredit().get(0).getArtist().getName());
         }
         ir.close();
     }
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-16T09:29:39</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18246">
    <title>[mb-commits] r13685 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/main/resourcesservlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18246</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-10 13:14:08 +0000 (Fri, 10 May 2013)
New Revision: 13685

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/servlet/src/main/resources/oxml.xml
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
Log:
SEARCH-274:Updated to reflect latest changes to schema for areas

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -592,7 +592,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             }
             ReleaseEvent re = of.createReleaseEvent();
             re.setDate(Strings.emptyToNull(Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day"))));
-            re.setCountry((rs.getString("country")));
+            String iso_code=rs.getString("country");
+            if(iso_code!=null) {
+                Iso31661CodeList isoList = of.createIso31661CodeList();
+                isoList.getIso31661Code().add(iso_code);
+                DefAreaElementInner area = of.createDefAreaElementInner();
+                area.setIso31661CodeList(isoList);
+                re.setArea(area);
+            }
             release.getReleaseEventList().getReleaseEvent().add(re);
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -805,15 +812,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                             ) {
                         for (ReleaseEvent re : release.getReleaseEventList().getReleaseEvent()) {
                             doc.addNonEmptyField(RecordingIndexField.RELEASE_DATE, re.getDate());
-                            doc.addNonEmptyField(RecordingIndexField.COUNTRY, re.getCountry());
+                            if(re.getArea()!=null) {
+                                if(re.getArea().getIso31661CodeList()!=null) {
+                                    doc.addNonEmptyField(RecordingIndexField.COUNTRY, re.getArea().getIso31661CodeList().getIso31661Code().get(0));
+                                }
+                            }
                         }
                         Collections.sort(release.getReleaseEventList().getReleaseEvent(), new ReleaseEventComparator());
                         ReleaseEvent firstReleaseEvent = release.getReleaseEventList().getReleaseEvent().get(0);
                         if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {
                             release.setDate(firstReleaseEvent.getDate());
                         }
-                        if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
-                            release.setCountry(firstReleaseEvent.getCountry());
+                        if(firstReleaseEvent.getArea()!=null) {
+                            if(firstReleaseEvent.getArea().getIso31661CodeList()!=null)
+                            {
+                                release.setCountry(firstReleaseEvent.getArea().getIso31661CodeList().getIso31661Code().get(0));
+                            }
                         }
 
                     } else {

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.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -30,10 +30,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.musicbrainz.search.index;
 
 import com.google.common.base.Strings;
-import org.musicbrainz.mmd2.ObjectFactory;
-import org.musicbrainz.mmd2.Release;
-import org.musicbrainz.mmd2.ReleaseEvent;
-import org.musicbrainz.mmd2.Tag;
+import org.musicbrainz.mmd2.*;
 
 import java.math.BigInteger;
 import java.sql.ResultSet;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,8 +56,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 releaseEventList = releaseEvents.get(entityId);
             }
 
+            String iso_code = rs.getString("country");
             ReleaseEvent releaseEvent = of.createReleaseEvent();
-            releaseEvent.setCountry(rs.getString("country"));
+            if(iso_code!=null) {
+                Iso31661CodeList isoList = of.createIso31661CodeList();
+                isoList.getIso31661Code().add(iso_code);
+                DefAreaElementInner area = of.createDefAreaElementInner();
+                area.setIso31661CodeList(isoList);
+                releaseEvent.setArea(area);
+            }
             releaseEvent.setDate(Strings.emptyToNull(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.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -620,9 +620,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             ReleaseEventList rel = of.createReleaseEventList();
             for (ReleaseEvent releaseEvent : releaseEvents.get(id)) {
 
-                String nextCountry  = releaseEvent.getCountry();
-                doc.addNonEmptyField(ReleaseIndexField.COUNTRY,nextCountry);
-
+                if(releaseEvent.getArea()!=null) {
+                    String nextCountry  = releaseEvent.getArea().getIso31661CodeList().getIso31661Code().get(0);
+                    doc.addNonEmptyField(ReleaseIndexField.COUNTRY,nextCountry);
+                }
                 String nextDate     = releaseEvent.getDate();
                 doc.addNonEmptyField(ReleaseIndexField.DATE, nextDate );
                 rel.getReleaseEvent().add(releaseEvent);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -633,8 +634,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             //backwards compatibility
             ReleaseEvent firstReleaseEvent = rel.getReleaseEvent().get(0);
-            if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
-                release.setCountry(firstReleaseEvent.getCountry());
+            if (firstReleaseEvent.getArea()!=null) {
+                release.setCountry(firstReleaseEvent.getArea().getIso31661CodeList().getIso31661Code().get(0));
             }
             if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {
                 release.setDate(firstReleaseEvent.getDate());

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -864,13 +864,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals(4, rel.getReleaseEvent().size());
             assertEquals(null, release.getCountry());
             assertEquals("1950", release.getDate());
-            assertEquals(null, rel.getReleaseEvent().get(0).getCountry());
+            assertEquals(null, rel.getReleaseEvent().get(0).getArea());
             assertEquals("1950", rel.getReleaseEvent().get(0).getDate());
-            assertEquals("GB", rel.getReleaseEvent().get(1).getCountry());
+            assertEquals("GB", rel.getReleaseEvent().get(1).getArea().getIso31661CodeList().getIso31661Code().get(0));
             assertEquals("1970-01-01", rel.getReleaseEvent().get(1).getDate());
-            assertEquals("AF", rel.getReleaseEvent().get(2).getCountry());
+            assertEquals("AF", rel.getReleaseEvent().get(2).getArea().getIso31661CodeList().getIso31661Code().get(0));
             assertEquals(null, rel.getReleaseEvent().get(2).getDate());
-            assertEquals("AN", rel.getReleaseEvent().get(3).getCountry());
+            assertEquals("AN", rel.getReleaseEvent().get(3).getArea().getIso31661CodeList().getIso31661Code().get(0));
             assertEquals(null, rel.getReleaseEvent().get(3).getDate());
 
             ReleaseGroup releaseGroup = release.getReleaseGroup();

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.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -920,13 +920,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals(4,rel.getReleaseEvent().size());
             assertEquals(null, release.getCountry());
             assertEquals("1950", release.getDate());
-            assertEquals(null, rel.getReleaseEvent().get(0).getCountry());
+            assertEquals(null, rel.getReleaseEvent().get(0).getArea());
             assertEquals("1950", rel.getReleaseEvent().get(0).getDate());
-            assertEquals("GB", rel.getReleaseEvent().get(1).getCountry());
+            assertEquals("GB", rel.getReleaseEvent().get(1).getArea().getIso31661CodeList().getIso31661Code().get(0));
             assertEquals("1970-01-01", rel.getReleaseEvent().get(1).getDate());
-            assertEquals("AF", rel.getReleaseEvent().get(2).getCountry());
+            assertEquals("AF", rel.getReleaseEvent().get(2).getArea().getIso31661CodeList().getIso31661Code().get(0));
             assertEquals(null, rel.getReleaseEvent().get(2).getDate());
-            assertEquals("AN", rel.getReleaseEvent().get(3).getCountry());
+            assertEquals("AN", rel.getReleaseEvent().get(3).getArea().getIso31661CodeList().getIso31661Code().get(0));
             assertEquals(null, rel.getReleaseEvent().get(3).getDate());
 
         }

Modified: search_server/trunk/servlet/src/main/resources/oxml.xml
===================================================================
--- search_server/trunk/servlet/src/main/resources/oxml.xml2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/servlet/src/main/resources/oxml.xml2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,6 +29,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 &amp;lt;xml-element java-attribute="recordingList" xml-path="."/&amp;gt;
             &amp;lt;/java-attributes&amp;gt;
         &amp;lt;/java-type&amp;gt;
+        &amp;lt;java-type name="DefAreaElementInner"&amp;gt;
+            &amp;lt;java-attributes&amp;gt;
+                &amp;lt;xml-element java-attribute="iso31661CodeList" xml-path="."/&amp;gt;
+            &amp;lt;/java-attributes&amp;gt;
+        &amp;lt;/java-type&amp;gt;
         &amp;lt;java-type name="Metadata"&amp;gt;
             &amp;lt;java-attributes&amp;gt;
                 &amp;lt;xml-element java-attribute="releaseList" xml-path="."/&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -324,5 +329,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 &amp;lt;xml-element java-attribute="releaseEvent" name="release-events"/&amp;gt;
             &amp;lt;/java-attributes&amp;gt;
         &amp;lt;/java-type&amp;gt;
+        &amp;lt;java-type name="Iso31661CodeList"&amp;gt;
+            &amp;lt;java-attributes&amp;gt;
+                &amp;lt;xml-element java-attribute="iso31661Code" name="iso-3166-1-codes"/&amp;gt;
+            &amp;lt;/java-attributes&amp;gt;
+        &amp;lt;/java-type&amp;gt;
     &amp;lt;/java-types&amp;gt;
 &amp;lt;/xml-bindings&amp;gt;

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -149,7 +149,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             release.setCountry("UK");
             ReleaseEventList rel = of.createReleaseEventList();
             ReleaseEvent     re  = of.createReleaseEvent();
-            re.setCountry("UK");
+            DefAreaElementInner areaInner = of.createDefAreaElementInner();
+            Iso31661CodeList    isoList   = of.createIso31661CodeList();
+            isoList.getIso31661Code().add("UK");
+            areaInner.setIso31661CodeList(isoList);
+            re.setArea(areaInner);
             re.setDate("1970-01-01");
             rel.getReleaseEvent().add(re);
             release.setReleaseEventList(rel);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -541,7 +545,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("indie&amp;lt;/name&amp;gt;"));
         assertTrue(output.contains("&amp;lt;track&amp;gt;&amp;lt;number&amp;gt;A4&amp;lt;/number&amp;gt;&amp;lt;title&amp;gt;Gravitational Lens&amp;lt;/title&amp;gt;&amp;lt;length&amp;gt;233000&amp;lt;/length&amp;gt;&amp;lt;artist-credit&amp;gt;&amp;lt;name-credit&amp;gt;&amp;lt;artist id=\"2302e264-1cf0-4d1f-aca7-2a6f89e34b36\"&amp;gt;&amp;lt;name&amp;gt;Pig Incident&amp;lt;/name&amp;gt;&amp;lt;sort-name&amp;gt;Incident, Pig&amp;lt;/sort-name&amp;gt;&amp;lt;/artist&amp;gt;&amp;lt;/name-credit&amp;gt;&amp;lt;/artist-credit&amp;gt;&amp;lt;/track&amp;gt;"));
         assertTrue(output.contains("&amp;lt;puid-list&amp;gt;&amp;lt;puid id=\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"/&amp;gt;&amp;lt;/puid-list&amp;gt;"));
-        assertTrue(output.contains("&amp;lt;release-event&amp;gt;&amp;lt;country&amp;gt;UK&amp;lt;/country&amp;gt;&amp;lt;date&amp;gt;1970-01-01&amp;lt;/date&amp;gt;&amp;lt;/release-event&amp;gt;&amp;lt;/release-event-list&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;release-event-list&amp;gt;&amp;lt;release-event&amp;gt;&amp;lt;date&amp;gt;1970-01-01&amp;lt;/date&amp;gt;&amp;lt;area&amp;gt;&amp;lt;iso-3166-1-code-list&amp;gt;&amp;lt;iso-3166-1-code&amp;gt;UK&amp;lt;/iso-3166-1-code&amp;gt;&amp;lt;/iso-3166-1-code-list&amp;gt;&amp;lt;/area&amp;gt;&amp;lt;/release-event&amp;gt;"));
     }
 
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -576,7 +580,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"tag\":[{\"count\":101,\"name\":\"indie\"}"));
         assertTrue(output.contains("\"puid-list\":{\"puid\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"}]}"));
         assertTrue(output.contains("\"artist-credit\":{\"name-credit\":[{\"artist\":{\"id\":\"89ad4ac3-39f7-470e-963a-56509c546377\",\"name\":\"Various Artists\"}"));
-        assertTrue(output.contains("\"release-event-list\":{\"release-event\":[{\"country\":\"UK\",\"date\":\"1970-01-01\"}]}"));
+        assertTrue(output.contains("\"release-event-list\":{\"release-event\":[{\"date\":\"1970-01-01\",\"area\":{\"iso-3166-1-code-list\":{\"iso-3166-1-code\":[\"UK\"]}}}]}"));
     }
 
     &amp;lt; at &amp;gt;Test
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -612,7 +616,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"position\":1"));
         assertTrue(output.contains("\"track-count\":10"));
         assertTrue(output.contains("\"secondary-types\":[\"Compilation\"]}"));
-        assertTrue(output.contains("\"release-events\":[{\"country\":\"UK\",\"date\":\"1970-01-01\"}]"));
+        assertTrue(output.contains("\"release-events\":[{\"date\":\"1970-01-01\",\"area\":{\"iso-3166-1-codes\":[\"UK\"]}}]"));
     }
 
     &amp;lt; at &amp;gt;Test

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.java2013-05-09 21:01:54 UTC (rev 13684)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java2013-05-10 13:14:08 UTC (rev 13685)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -164,8 +164,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             doc.addField(ReleaseIndexField.DATE, "2005");
             ReleaseEventList rel = of.createReleaseEventList();
             ReleaseEvent     re  = of.createReleaseEvent();
+            DefAreaElementInner areaInner = of.createDefAreaElementInner();
+            Iso31661CodeList    isoList   = of.createIso31661CodeList();
+            isoList.getIso31661Code().add("GB");
+            areaInner.setIso31661CodeList(isoList);
             re.setDate("2005");
-            re.setCountry("GB");
+            re.setArea(areaInner);
             rel.getReleaseEvent().add(re);
             release.setReleaseEventList(rel);
             release.setDate("2005");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -805,7 +809,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"asin\":\"B00004Y6O9\""));
         assertTrue(output.contains("\"track-count\":17"));
         assertTrue(output.contains("\"secondary-type-list\":{\"secondary-type\":[\"Live\",\"Compilation\"]}}"));
-        assertTrue(output.contains("\"release-event-list\":{\"release-event\":[{\"country\":\"GB\",\"date\":\"2005\"}]}"));
+        assertTrue(output.contains("{\"release-event\":[{\"date\":\"2005\",\"area\":{\"iso-3166-1-code-list\":{\"iso-3166-1-code\":[\"GB\"]}}}]}"));
     }
 
     &amp;lt; at &amp;gt;Test
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -838,7 +842,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"label-info\""));
         assertTrue(output.contains("\"catalog-number\":\"WRATHCD-25\""));
         assertTrue(output.contains("\"primary-type\":\"Album\""));
-        assertTrue(output.contains("\"release-events\":[{\"country\":\"GB\",\"date\":\"2005\"}]"));
+        assertTrue(output.contains("\"release-events\":[{\"date\":\"2005\",\"area\":{\"iso-3166-1-codes\":[\"GB\"]}}]"));
         assertTrue(output.contains("\"secondary-types\":[\"Live\",\"Compilation\"]}"));
     }
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-10T13:14:08</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18245">
    <title>[mb-commits] r13684 -search_server/trunk/index/src/main/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18245</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-09 21:01:54 +0000 (Thu, 09 May 2013)
New Revision: 13684

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
Log:
Fixed multiple mediums being displayed under recoridng releases

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-09 15:25:01 UTC (rev 13683)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-09 21:01:54 UTC (rev 13684)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -738,14 +738,26 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             // For each track that uses recording
             for (TrackWrapper trackWrapper : tracks.get(id)) {
-                //Set the release details for this track
-                Release release = releases.get(trackWrapper.getReleaseId());
-                releaseList.getRelease().add(release);
+                //Get the release details for this track
+                Release origRelease = releases.get(trackWrapper.getReleaseId());
 
-                if (release != null) {
 
+                if (origRelease != null) {
+                    //This release instance will be shared by all recordings that have a track on the release so we need
+                    //to copy details so we can append track specific details
+                    Release release = of.createRelease();
+                    release.setId(origRelease.getId());
+                    release.setTitle(origRelease.getTitle());
+                    MediumList ml = of.createMediumList();
+                    release.setReleaseGroup(origRelease.getReleaseGroup());
+                    release.setStatus(origRelease.getStatus());
+                    ml.setTrackCount(origRelease.getMediumList().getTrackCount());
+                    release.setMediumList(ml);
+                    release.setReleaseEventList(origRelease.getReleaseEventList());
+                    releaseList.getRelease().add(release);
+
+                    ReleaseGroup rg = release.getReleaseGroup();
                     doc.addNonEmptyField(RecordingIndexField.TRACK_ID, trackWrapper.getTrackGuid());
-                    ReleaseGroup rg = release.getReleaseGroup();
                     String primaryType = rg.getPrimaryType();
                     doc.addFieldOrUnknown(RecordingIndexField.RELEASEGROUP_ID, rg.getId());
                     doc.addFieldOrUnknown(RecordingIndexField.RELEASE_PRIMARY_TYPE, primaryType);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -785,12 +797,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                     release.getMediumList().getMedium().add(medium);
                     medium.setTrackList(tl);
                     tl.getDefTrack().add(track);
-
                     doc.addFieldOrNoValue(RecordingIndexField.RELEASE_STATUS, release.getStatus());
 
                     if (
                             (release.getReleaseEventList() != null) &amp;amp;&amp;amp;
-                                    (release.getReleaseEventList().getReleaseEvent() != null)
+                                    (release.getReleaseEventList().getReleaseEvent().size()&amp;gt;0)
                             ) {
                         for (ReleaseEvent re : release.getReleaseEventList().getReleaseEvent()) {
                             doc.addNonEmptyField(RecordingIndexField.RELEASE_DATE, re.getDate());
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-09T21:01:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18244">
    <title>[mb-commits] r13683 - in search_server/trunk/index/src:main/java/org/musicbrainz/search/indextest/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18244</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-09 15:25:01 +0000 (Thu, 09 May 2013)
New Revision: 13683

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
Log:
Fixed primaryType and status fields in release output

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.java2013-05-09 15:05:11 UTC (rev 13682)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-09 15:25:01 UTC (rev 13683)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -419,7 +419,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         ReleaseGroup rg = of.createReleaseGroup();
         release.setReleaseGroup(rg);
         if (primaryType!=null &amp;amp;&amp;amp; !primaryType.isEmpty()){
-            release.getReleaseGroup().setType(primaryType);
+            release.getReleaseGroup().setPrimaryType(primaryType);
         }
 
         if (secondaryTypes.containsKey(id)) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -444,7 +444,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         String status = rs.getString("status");
         doc.addFieldOrUnknown(ReleaseIndexField.STATUS, status);
         if (status!=null &amp;amp;&amp;amp; !status.isEmpty()) {
-            release.setStatus(type);
+            release.setStatus(status);
         }
 
         String barcode = rs.getString("barcode");

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.java2013-05-09 15:05:11 UTC (rev 13682)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-09 15:25:01 UTC (rev 13683)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -13,6 +13,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 public class ReleaseIndexTest extends AbstractIndexTest {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -883,6 +884,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
             assertEquals("Crocodiles (bonus disc)", release.getTitle());
             assertEquals("B00005NTQ7", release.getAsin());
+            assertEquals("Official", release.getStatus());
+            assertEquals("EP", release.getReleaseGroup().getPrimaryType());
+            assertEquals("EP", release.getReleaseGroup().getType());
             assertNotNull(release.getMediumList());
 
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -909,6 +913,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
             assertEquals("Crocodiles (bonus disc)", release.getTitle());
             assertEquals("B00005NTQ7", release.getAsin());
+            assertNull(release.getStatus());
             assertNotNull(release.getMediumList());
             ReleaseEventList rel = release.getReleaseEventList();
             assertNotNull(rel);
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-09T15:25:01</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18243">
    <title>[mb-commits] r13682 -search_server/trunk/index/src/main/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18243</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-09 15:05:11 +0000 (Thu, 09 May 2013)
New Revision: 13682

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
Log:
Fixed ReleaseGroupType missing from Recording index output

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-09 14:50:05 UTC (rev 13681)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-09 15:05:11 UTC (rev 13682)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -763,6 +763,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         rg.setType(type);
                     } else {
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_TYPE, release.getReleaseGroup().getPrimaryType());
+                        rg.setType(release.getReleaseGroup().getPrimaryType());
                     }
 
                     doc.addNumericField(RecordingIndexField.NUM_TRACKS, trackWrapper.getTrackCount());
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-09T15:05:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18242">
    <title>[mb-commits] r13681 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/main/java/org/musicbrainz/search/servlet/mmd1servlet/src/main/java/org/musicbrainz/search/servlet/mmd2servlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18242</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-09 14:50:05 +0000 (Thu, 09 May 2013)
New Revision: 13681

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndexField.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/LabelIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/WorkIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/LabelMmd1XmlWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java
Log:
SEARCH-268:Add extended alias info to the ws search results for labels.

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -307,7 +307,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             lifespan.setBegin(begin);
         }
         if(!Strings.isNullOrEmpty(end)) {
-            lifespan.setBegin(end);
+            lifespan.setEnd(end);
         }
         lifespan.setEnded(Boolean.toString(ended));
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -322,6 +322,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         if (!Strings.isNullOrEmpty(country)) {
             artist.setCountry(country.toUpperCase(Locale.US));
         }
+
         String gender = rs.getString("gender");
         if (gender != null) {
             doc.addField(ArtistIndexField.GENDER, gender);

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,20 +19,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.index;
 
+import com.google.common.base.Strings;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.search.similarities.Similarity;
-import org.musicbrainz.mmd2.Tag;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.MusicbrainzSimilarity;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.sql.*;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public class LabelIndex extends DatabaseIndex {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -93,14 +92,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "  INNER JOIN tag ON tag=id " +
                 " WHERE label between ? AND ?");
 
+        addPreparedStatement("ALIASES",
+                "SELECT a.label as label, n.name as alias, sn.name as alias_sortname, a.primary_for_locale, a.locale, att.name as type," +
+                        "a.begin_date_year, a.begin_date_month, a.begin_date_day, a.end_date_year, a.end_date_month, a.end_date_day" +
+                        " FROM label_alias a" +
+                        "  JOIN label_name n ON (a.name = n.id) " +
+                        "  JOIN label_name sn ON (a.sort_name = sn.id) " +
+                        "  LEFT JOIN label_alias_type att on (a.type=att.id)" +
+                        " WHERE label BETWEEN ? AND ?" +
+                        " ORDER BY label, alias, alias_sortname");
 
-        addPreparedStatement("ALIASES", 
-                "SELECT label_alias.label as label, n.name as alias " +
-                " FROM label_alias " +
-                "  JOIN label_name n ON (label_alias.name = n.id) " +
-                " WHERE label BETWEEN ? AND ?");
 
-
         addPreparedStatement("LABELS",
                 "SELECT label.id, gid, n0.name as name, n1.name as sort_name, " +
                 "  label_type.name as type, begin_date_year, begin_date_month, begin_date_day, " +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -146,6 +148,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
+        ObjectFactory of = new ObjectFactory();
+
         // Get Tags
         PreparedStatement st = getPreparedStatement("TAGS");
         st.setInt(1, min);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -159,22 +163,47 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 
         // Get labels aliases
-        Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; aliases = new HashMap&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt;();
+        //Aliases
+        Map&amp;lt;Integer, Set&amp;lt;Alias&amp;gt;&amp;gt; aliases = new HashMap&amp;lt;Integer, Set&amp;lt;Alias&amp;gt;&amp;gt;();
         st = getPreparedStatement("ALIASES");
         st.setInt(1, min);
         st.setInt(2, max);
         rs = st.executeQuery();
         while (rs.next()) {
-            int labelId = rs.getInt("label");
-
-            List&amp;lt;String&amp;gt; list;
-            if (!aliases.containsKey(labelId)) {
-                list = new LinkedList&amp;lt;String&amp;gt;();
-                aliases.put(labelId, list);
+            int artistId = rs.getInt("label");
+            Set&amp;lt;Alias&amp;gt; list;
+            if (!aliases.containsKey(artistId)) {
+                list = new LinkedHashSet&amp;lt;Alias&amp;gt;();
+                aliases.put(artistId, list);
             } else {
-                list = aliases.get(labelId);
+                list = aliases.get(artistId);
             }
-            list.add(rs.getString("alias"));
+            Alias alias = of.createAlias();
+            alias.setContent(rs.getString("alias"));
+            alias.setSortName(rs.getString("alias_sortname"));
+            boolean isPrimary = rs.getBoolean("primary_for_locale");
+            if(isPrimary) {
+                alias.setPrimary("primary");
+            }
+            String locale = rs.getString("locale");
+            if(locale!=null) {
+                alias.setLocale(locale);
+            }
+            String type = rs.getString("type");
+            if(type!=null) {
+                alias.setType(type);
+            }
+
+            String begin = Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day"));
+            if(!Strings.isNullOrEmpty(begin))  {
+                alias.setBeginDate(begin);
+            }
+
+            String end = Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day"));
+            if(!Strings.isNullOrEmpty(end))  {
+                alias.setEndDate(end);
+            }
+            list.add(alias);
         }
         rs.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -197,65 +226,116 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public Document documentFromResultSet(ResultSet rs,
                                           Map&amp;lt;Integer,List&amp;lt;Tag&amp;gt;&amp;gt; tags,
                                           Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes,
-                                          Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; aliases) throws SQLException {
+                                          Map&amp;lt;Integer, Set&amp;lt;Alias&amp;gt;&amp;gt; aliases) throws SQLException {
 
         MbDocument doc = new MbDocument();
+
+        ObjectFactory of = new ObjectFactory();
+        Label label = of.createLabel();
+
         int labelId = rs.getInt("id");
         String labelGuid = rs.getString("gid");
         doc.addField(LabelIndexField.LABEL_ID, labelGuid);
+        label.setId(labelGuid);
+
         String name=rs.getString("name");
         doc.addField(LabelIndexField.LABEL,name );
+        label.setName(name);
 
         //Accented artist
         doc.addField(LabelIndexField.LABEL_ACCENT, name );
 
-        doc.addField(LabelIndexField.SORTNAME, rs.getString("sort_name"));
-        doc.addFieldOrUnknown(LabelIndexField.TYPE, rs.getString("type"));
-        doc.addFieldOrNoValue(LabelIndexField.COMMENT, rs.getString("comment"));
-        doc.addFieldOrUnknown(LabelIndexField.COUNTRY, rs.getString("country"));
+        String sortName = rs.getString("sort_name");
+        doc.addField(LabelIndexField.SORTNAME, sortName);
+        label.setSortName(sortName);
 
 
-        if(rs.getBoolean("ended")) {
-            doc.addFieldOrUnknown(LabelIndexField.ENDED, "true");
+        String type = rs.getString("type");
+        doc.addFieldOrUnknown(LabelIndexField.TYPE, type);
+        if (!Strings.isNullOrEmpty(type)) {
+            label.setType(type);
         }
-        else {
-            doc.addFieldOrUnknown(LabelIndexField.ENDED, "false");
+
+        String comment = rs.getString("comment");
+        doc.addFieldOrNoValue(LabelIndexField.COMMENT, comment);
+        if (!Strings.isNullOrEmpty(comment)) {
+            label.setDisambiguation(comment);
         }
 
-        doc.addNonEmptyField(LabelIndexField.BEGIN,
-                Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day")));
+        String country = rs.getString("country");
+        doc.addFieldOrUnknown(LabelIndexField.COUNTRY, country);
+        if (!Strings.isNullOrEmpty(country)) {
+            label.setCountry(country.toUpperCase(Locale.US));
+        }
 
-        doc.addNonEmptyField(LabelIndexField.END,
-                Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day")));
+        boolean ended = rs.getBoolean("ended");
+        doc.addFieldOrUnknown(LabelIndexField.ENDED, Boolean.toString(ended));
 
+        String begin = Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day"));
+        doc.addNonEmptyField(LabelIndexField.BEGIN, begin);
+
+        String end = Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day"));
+        doc.addNonEmptyField(LabelIndexField.END, end);
+
+        LifeSpan lifespan = of.createLifeSpan();
+        label.setLifeSpan(lifespan);
+        if(!Strings.isNullOrEmpty(begin)) {
+            lifespan.setBegin(begin);
+        }
+        if(!Strings.isNullOrEmpty(end)) {
+            lifespan.setEnd(end);
+        }
+        lifespan.setEnded(Boolean.toString(ended));
+
+
         int labelcode = rs.getInt("label_code");
         if (labelcode &amp;gt; 0) {
             doc.addField(LabelIndexField.CODE, labelcode);
+            label.setLabelCode(BigInteger.valueOf(labelcode));
         }
         else {
             doc.addField(LabelIndexField.CODE,Index.NO_VALUE);
         }
 
         if (aliases.containsKey(labelId)) {
-            for (String alias : aliases.get(labelId)) {
-                doc.addField(LabelIndexField.ALIAS, alias);
+            AliasList aliasList = of.createAliasList();
+            for (Alias nextAlias : aliases.get(labelId)) {
+                doc.addField(LabelIndexField.ALIAS, nextAlias.getContent());
+                if(!nextAlias.getSortName().equals(nextAlias.getContent())) {
+                    doc.addField(LabelIndexField.ALIAS, nextAlias.getSortName());
+                }
+                aliasList.getAlias().add(nextAlias);
             }
+            label.setAliasList(aliasList);
         }
 
+
         if (tags.containsKey(labelId)) {
-            for (Tag tag : tags.get(labelId)) {
-                doc.addField(LabelIndexField.TAG, tag.getName());
-                doc.addField(LabelIndexField.TAGCOUNT, tag.getCount().toString());
+            TagList tagList = of.createTagList();
+            for (Tag nextTag : tags.get(labelId)) {
+                Tag tag = of.createTag();
+                doc.addField(LabelIndexField.TAG, nextTag.getName());
+                tag.setName(nextTag.getName());
+                tag.setCount(new BigInteger(nextTag.getCount().toString()));
+                tagList.getTag().add(tag);
             }
+           label.setTagList(tagList);
         }
 
         if (ipiCodes.containsKey(labelId)) {
+            IpiList ipiList = of.createIpiList();
             for (String ipiCode : ipiCodes.get(labelId)) {
                 doc.addField(LabelIndexField.IPI, ipiCode);
+                ipiList.getIpi().add(ipiCode);
             }
+            label.setIpiList(ipiList);
         }
 
         LabelBoostDoc.boost(labelGuid, doc);
+
+        String store = MMDSerializer.serialize(label);
+        doc.addField(LabelIndexField.LABEL_STORE, store);
+
         return doc.getLuceneDocument();
     }
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndexField.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndexField.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -39,21 +39,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 public enum LabelIndexField implements IndexField {
 
 ID("_id",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    ALIAS("alias",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    BEGIN("begin",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    COMMENT("comment",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    CODE("code",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new StripLeadingZeroesAnalyzer()),
-    COUNTRY("country",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    END("end",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    ENDED       ("ended",       MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    IPI         ("ipi",         MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    ALIAS("alias",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    BEGIN("begin",MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    COMMENT("comment",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    CODE("code",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new StripLeadingZeroesAnalyzer()),
+    COUNTRY("country",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    END("end",MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    ENDED       ("ended",       MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    IPI         ("ipi",         MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     LABEL("label",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzAnalyzer()),
     LABEL_ACCENT("labelaccent", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzKeepAccentsAnalyzer()),
     LABEL_ID("laid",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    SORTNAME("sortname",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    TYPE("type",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    TAG    ("tag",    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    TAGCOUNT    ("tagcount",MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
+    SORTNAME("sortname",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    TAG    ("tag",    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    TYPE("type",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    LABEL_STORE ("labelstore",  MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
     ;
 
     private String name;

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.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -563,7 +563,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 medium.setDiscList(discList);
 
                 mediumList.getMedium().add(medium);
-
+                release.setMediumList(mediumList);
             }
 
             //Num of mediums on the release

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.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -420,16 +420,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "  id serial NOT NULL," +
                 "  label integer NOT NULL," +
                 "  name integer NOT NULL," +
-                "  sort_name INTEGER," +
+                "  locale text," +
+                "  last_updated timestamp," +
+                "  edits_pending integer NOT NULL DEFAULT 0," +
                 "  type                INTEGER," +
+                "  sort_name           INTEGER NOT NULL," +
                 "  begin_date_year     SMALLINT," +
                 "  begin_date_month    SMALLINT," +
                 "  begin_date_day      SMALLINT," +
                 "  end_date_year       SMALLINT," +
                 "  end_date_month      SMALLINT," +
                 "  end_date_day        SMALLINT," +
-                "  last_updated timestamp," +
-                "  edits_pending integer NOT NULL DEFAULT 0" +
+                "  primary_for_locale  BOOLEAN"   +
                 ")");
 
         stmt.addBatch("CREATE TABLE label_alias_type (" +

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -199,7 +199,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 assertEquals(2, ir.numDocs());
                 {
                     checkTerm(ir, ArtistIndexField.IPI, "10001");
-                    Document doc = ir.document(1);
                 }
                 ir.close();
             }

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/LabelIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/LabelIndexTest.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/LabelIndexTest.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,11 +8,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Test;
+import org.musicbrainz.mmd2.Artist;
+import org.musicbrainz.mmd2.Label;
+import org.musicbrainz.mmd2.LifeSpan;
 
 import java.math.BigInteger;
 import java.sql.Statement;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 public class LabelIndexTest extends AbstractIndexTest {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -39,13 +44,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         Statement stmt = conn.createStatement();
 
-stmt.addBatch("INSERT INTO label_name (id, name) VALUES (1, '4AD')");
-stmt.addBatch("INSERT INTO label_name (id, name) VALUES (2, '4AD US')");
+    stmt.addBatch("INSERT INTO label_name (id, name) VALUES (1, '4AD')");
+    stmt.addBatch("INSERT INTO label_name (id, name) VALUES (2, '4AD US')");
 
         stmt.addBatch("INSERT INTO label (id, gid, name, sort_name, type, label_code, begin_date_year, ended) " +
 "VALUES (1, 'a539bb1e-f2e1-4b45-9db8-8053841e7503', 1, 1, 4, 5807, 1979, true)");
         stmt.addBatch("INSERT INTO label_ipi (label, ipi) values(1,'1001')");
-        stmt.addBatch("INSERT INTO label_alias (label, name) VALUES (1, 2)");
+        stmt.addBatch("INSERT INTO label_alias (label, name, sort_name) VALUES (1, 2, 2)");
 
         stmt.executeBatch();
         stmt.close();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,7 +95,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         stmt.addBatch("INSERT INTO label (id, gid, name, sort_name, area, ended)" +
 "VALUES (3, 'a539bb1e-f2e1-4b45-9db8-8053841e7503', 1, 1, 1, true)");
-        stmt.addBatch("INSERT INTO label_alias (label, name) VALUES (3, 2)");
+        stmt.addBatch("INSERT INTO label_alias (label, name,sort_name) VALUES (3, 2, 2)");
 
         stmt.addBatch("INSERT INTO tag (id, name, ref_count) VALUES (1, 'Goth', 2);");
         stmt.addBatch("INSERT INTO label_tag (label, tag, count) VALUES (3, 1, 10)");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,11 +114,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
            IndexReader ir = DirectoryReader.open(ramDir);
            assertEquals(2, ir.numDocs());
            {
-               Document doc = ir.document(1);
-               assertEquals(1, doc.getFields(LabelIndexField.LABEL_ID.getName()).length);
-               assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.getField(LabelIndexField.LABEL_ID.getName()).stringValue());               
-               assertEquals(1, doc.getFields(LabelIndexField.COUNTRY.getName()).length);
-               assertEquals("af", doc.getField(LabelIndexField.COUNTRY.getName()).stringValue());
+               checkTerm(ir, LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7503");
+               checkTerm(ir, LabelIndexField.COUNTRY, "af");
            }
            ir.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -130,9 +132,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.COUNTRY.getName()).length);
-            assertEquals("unknown", doc.getField(LabelIndexField.COUNTRY.getName()).stringValue());
+           checkTerm(ir, LabelIndexField.COUNTRY, "unknown");
         }
         ir.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -148,9 +148,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.COUNTRY.getName()).length);
-            assertEquals("af", doc.getField(LabelIndexField.COUNTRY.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.COUNTRY, "af");
         }
         ir.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -166,9 +164,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.IPI.getName()).length);
-            assertEquals("1001", doc.getField(LabelIndexField.IPI.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.IPI, "1001");
         }
         ir.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,9 +180,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.COMMENT.getName()).length);
-            assertEquals("-", doc.getField(LabelIndexField.COMMENT.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.COMMENT, "-");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -201,9 +195,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.COMMENT.getName()).length);
-            assertEquals("DO NOT EDIT THIS LABEL", doc.getField(LabelIndexField.COMMENT.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.COMMENT, "do");
+            checkTermX(ir, LabelIndexField.COMMENT, "edit", 1);
+            checkTermX(ir, LabelIndexField.COMMENT, "label",2);
+            checkTermX(ir, LabelIndexField.COMMENT, "not",3);
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -219,9 +214,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.CODE.getName()).length);
-            assertEquals("-", doc.getField(LabelIndexField.CODE.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.CODE, "-");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -236,9 +229,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.CODE.getName()).length);
-            assertEquals("5807", doc.get(LabelIndexField.CODE.getName()));
+            checkTerm(ir, LabelIndexField.CODE, "5807");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -253,9 +244,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.CODE.getName()).length);
-            assertEquals("99998", doc.get(LabelIndexField.CODE.getName()));
+            checkTerm(ir, LabelIndexField.CODE, "99998");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -275,8 +264,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.ALIAS.getName()).length);
+            checkTerm(ir, LabelIndexField.ALIAS, "4ad");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -296,9 +284,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.BEGIN.getName()).length);
-            assertEquals("1979", doc.getField(LabelIndexField.BEGIN.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.BEGIN, "1979");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -314,9 +300,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.ENDED.getName()).length);
-            assertEquals("true", doc.getField(LabelIndexField.ENDED.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.ENDED, "true");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -332,9 +316,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.ENDED.getName()).length);
-            assertEquals("false", doc.getField(LabelIndexField.ENDED.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.ENDED, "false");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -374,9 +356,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.END.getName()).length);
-            assertEquals("2009-04", doc.getField(LabelIndexField.END.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.END, "2009-04");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -413,9 +393,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.TYPE.getName()).length);
-            assertEquals("Original Production", doc.getField(LabelIndexField.TYPE.getName()).stringValue());
+            checkTerm(ir, LabelIndexField.TYPE, "original production");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -435,17 +413,72 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
+            checkTerm(ir, LabelIndexField.TAG, "goth");
+        }
+        ir.close();
+    }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredLabel1() throws Exception {
+
+        addLabelOne();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
             Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(LabelIndexField.LABEL.getName()).length);
-            assertEquals(1, doc.getFields(LabelIndexField.TAG.getName()).length);
-            assertEquals("Goth", doc.getField(LabelIndexField.TAG.getName()).stringValue());
-            assertEquals(1, doc.getFields(LabelIndexField.TAGCOUNT.getName()).length);
-            assertEquals("10", doc.getField(LabelIndexField.TAGCOUNT.getName()).stringValue());
+            Label label = (Label) MMDSerializer.unserialize(doc.get(LabelIndexField.LABEL_STORE.getName()), Label.class);
+            assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", label.getId());
+            assertEquals("4AD", label.getName());
+            assertNull(label.getCountry());
+            assertEquals("4AD", label.getSortName());
+            assertNull(label.getDisambiguation());
+            assertEquals("Original Production",label.getType());
+            assertEquals("4AD",label.getSortName());
         }
         ir.close();
     }
 
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredLabel2() throws Exception {
 
+        addLabelTwo();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
+            Document doc = ir.document(1);
+            Label label = (Label) MMDSerializer.unserialize(doc.get(LabelIndexField.LABEL_STORE.getName()), Label.class);
+            assertEquals("d8caa692-704d-412b-a410-4fbcf5b9c796", label.getId());
+            assertEquals("MusicBrainz Data Testing Label", label.getName());
+            assertEquals("CA", label.getCountry());
+            assertEquals("Data Testing Label, MusicBrainz",label.getSortName());
+            assertEquals("DO NOT EDIT THIS LABEL", label.getDisambiguation());
+            assertEquals("Distributor",label.getType());
+            assertEquals("Data Testing Label, MusicBrainz",label.getSortName());
+            LifeSpan lifespan = label.getLifeSpan();
+            assertNotNull(lifespan);
+            assertEquals("2009-01-01",lifespan.getBegin());
+            assertEquals("false",lifespan.getEnded());
+            assertEquals("2009-04",lifespan.getEnd());
+
+        }
+        ir.close();
+    }
+
+
 //    /**
 //     * Checks record with type = null is set to unknown
 //     *

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.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -883,6 +883,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
             assertEquals("Crocodiles (bonus disc)", release.getTitle());
             assertEquals("B00005NTQ7", release.getAsin());
+            assertNotNull(release.getMediumList());
 
 
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -908,6 +909,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
             assertEquals("Crocodiles (bonus disc)", release.getTitle());
             assertEquals("B00005NTQ7", release.getAsin());
+            assertNotNull(release.getMediumList());
             ReleaseEventList rel = release.getReleaseEventList();
             assertNotNull(rel);
             assertEquals(4,rel.getReleaseEvent().size());

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/WorkIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/WorkIndexTest.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/WorkIndexTest.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -311,7 +311,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals(1, doc.getFields(WorkIndexField.TAG.getName()).length);
             assertEquals("Classical", doc.getField(WorkIndexField.TAG.getName()).stringValue());
             assertEquals(1, doc.getFields(WorkIndexField.TAGCOUNT.getName()).length);
-            assertEquals("10", doc.getField(LabelIndexField.TAGCOUNT.getName()).stringValue());
+            assertEquals("10", doc.getField(WorkIndexField.TAGCOUNT.getName()).stringValue());
         }
         ir.close();
     }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/LabelMmd1XmlWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/LabelMmd1XmlWriter.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/LabelMmd1XmlWriter.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,10 +28,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.servlet.mmd1;
 
+import com.google.common.base.Strings;
 import com.jthink.brainz.mmd.*;
 import org.apache.commons.lang.StringUtils;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.LabelIndexField;
+import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -40,6 +42,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 public class LabelMmd1XmlWriter extends Mmd1XmlWriter {
     public Metadata write(Results results) throws IOException {
+
         ObjectFactory of = new ObjectFactory();
 
         Metadata metadata = of.createMetadata();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -48,50 +51,45 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         for (Result result : results.results) {
             MbDocument doc = result.getDoc();
             Label label = of.createLabel();
-            label.setId(doc.get(LabelIndexField.LABEL_ID));
 
-            String type = doc.get(LabelIndexField.TYPE);
-            if (isNotUnknown(type)) {
-                label.setType(StringUtils.capitalize(doc.get(LabelIndexField.TYPE)));
-            }
-
             result.setNormalizedScore(results.getMaxScore());
             label.getOtherAttributes().put(getScore(), String.valueOf(result.getNormalizedScore()));
 
-            String name = doc.get(LabelIndexField.LABEL);
-            if (name != null) {
-                label.setName(name);
+            org.musicbrainz.mmd2.Label labelv2
+                    = (org.musicbrainz.mmd2.Label) MMDSerializer.unserialize(doc.get(LabelIndexField.LABEL_STORE), org.musicbrainz.mmd2.Label.class);
+            label.setId(labelv2.getId());
+            label.setType(StringUtils.capitalize(labelv2.getType()));
+            label.setName(labelv2.getName());
+
+            if(!Strings.isNullOrEmpty(labelv2.getSortName())) {
+                label.setSortName(labelv2.getSortName());
             }
 
-            String code = doc.get(LabelIndexField.CODE);
-            if (isNotNoValue(code)) {
-                label.setLabelCode(new BigInteger(code));
+            if(labelv2.getLabelCode()!=null) {
+                label.setLabelCode(labelv2.getLabelCode());
             }
 
-            String sortname = doc.get(LabelIndexField.SORTNAME);
-            if (sortname != null) {
-                label.setSortName(sortname);
-        }
+            if(!Strings.isNullOrEmpty(labelv2.getDisambiguation())) {
+                label.setDisambiguation(labelv2.getDisambiguation());
+            }
 
-            String begin = doc.get(LabelIndexField.BEGIN);
-            String end = doc.get(LabelIndexField.END);
-            if (begin != null || end != null) {
-                LifeSpan lifespan = of.createLifeSpan();
-                if (begin != null) {
-                    lifespan.setBegin(begin);
+            if(labelv2.getLifeSpan()!=null) {
+                String begin = labelv2.getLifeSpan().getBegin();
+                String end = labelv2.getLifeSpan().getEnd();
+                if (begin != null || end != null) {
+                    LifeSpan lifespan = of.createLifeSpan();
+                    if (begin != null) {
+                        lifespan.setBegin(begin);
 
-                }
-                if (end != null) {
-                    lifespan.setEnd(end);
+                    }
+                    if (end != null) {
+                        lifespan.setEnd(end);
 
+                    }
+                    label.setLifeSpan(lifespan);
                 }
-                label.setLifeSpan(lifespan);
             }
 
-            String comment = doc.get(LabelIndexField.COMMENT);
-            if (isNotNoValue(comment)) {
-                label.setDisambiguation(comment);
-            }
             labelList.getLabel().add(label);
 
         }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,13 +32,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.LabelIndexField;
+import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 
 import java.io.IOException;
 import java.math.BigInteger;
 import java.util.List;
-import java.util.Locale;
 
 /**
  * Write Label Output
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -81,96 +81,53 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     /**
-     * Write result and add to the list
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param result
      * &amp;lt; at &amp;gt;throws IOException
      */
     public void write(List list, Result result) throws IOException {
-        ObjectFactory of = new ObjectFactory();
         MbDocument doc = result.getDoc();
-        Label label = of.createLabel();
-        label.setId(doc.get(LabelIndexField.LABEL_ID));
-        String type = doc.get(LabelIndexField.TYPE);
-        if (isNotUnknown(type)) {
-            label.setType(type);
-        }
+        Label label = (Label) MMDSerializer.unserialize(doc.get(LabelIndexField.LABEL_STORE), Label.class);
         label.setScore(String.valueOf(result.getNormalizedScore()));
-        String name = doc.get(LabelIndexField.LABEL);
-        if (name != null) {
-            label.setName(name);
-        }
+        list.add(label);
+    }
 
-        String[] ipiCodes = doc.getValues(LabelIndexField.IPI);
-        if (ipiCodes.length &amp;gt; 0) {
-            IpiList ipiList = of.createIpiList();
-            for (int i = 0; i &amp;lt; ipiCodes.length; i++) {
-                ipiList.getIpi().add(ipiCodes[i]);
-            }
-            label.setIpiList(ipiList);
-        }
+    /**
+     * Overriden to ensure all attributes are set for each alias
+     *
+     * &amp;lt; at &amp;gt;param metadata
+     */
+    &amp;lt; at &amp;gt;Override
+    public void adjustForJson(Metadata metadata) {
 
-        String code = doc.get(LabelIndexField.CODE);
-        if (isNotNoValue(code)) {
-            label.setLabelCode(new BigInteger(code));
-        }
+        if (metadata.getLabelList().getLabel().size()&amp;gt;0) {
+            for(Label label:metadata.getLabelList().getLabel()) {
+                if(label.getAliasList()!=null) {
+                    for (Alias alias : label.getAliasList().getAlias()) {
 
-        String countryCode = doc.get(LabelIndexField.COUNTRY);
-        if (isNotUnknown(countryCode)) {
-            label.setCountry(countryCode.toUpperCase(Locale.US));
-        }
-
-        String sortname = doc.get(LabelIndexField.SORTNAME);
-        if (sortname != null) {
-            label.setSortName(sortname);
-        }
-
-        String begin = doc.get(LabelIndexField.BEGIN);
-        String end = doc.get(LabelIndexField.END);
-        String ended = doc.get(LabelIndexField.ENDED);
-
-        LifeSpan lifespan = of.createLifeSpan();
-        label.setLifeSpan(lifespan);
-
-        if (begin != null) {
-            lifespan.setBegin(begin);
-        }
-
-        if (end != null) {
-            lifespan.setEnd(end);
-        }
-        lifespan.setEnded(ended);
-
-        String comment = doc.get(LabelIndexField.COMMENT);
-        if (isNotNoValue(comment)) {
-            label.setDisambiguation(comment);
-        }
-
-        String[] aliases = doc.getValues(LabelIndexField.ALIAS);
-        if (aliases.length &amp;gt; 0) {
-            AliasList aliasList = of.createAliasList();
-            for (int i = 0; i &amp;lt; aliases.length; i++) {
-                Alias alias = of.createAlias();
-                alias.setContent(aliases[i]);
-                aliasList.getAlias().add(alias);
+                        if (alias.getBeginDate() == null) {
+                            alias.setBeginDate("");
+                        }
+                        if (alias.getEndDate() == null) {
+                            alias.setEndDate("");
+                        }
+                        if (alias.getType() == null) {
+                            alias.setType("");
+                        }
+                        if (alias.getLocale() == null) {
+                            alias.setLocale("");
+                        }
+                        //On Xml output as primary, but in json they have changed to true/false
+                        if (alias.getPrimary() == null) {
+                            alias.setPrimary("false");
+                        }
+                        else {
+                            alias.setPrimary("true");
+                        }
+                    }
+                }
             }
-            label.setAliasList(aliasList);
         }
 
-        String[] tags = doc.getValues(LabelIndexField.TAG);
-        String[] tagCounts = doc.getValues(LabelIndexField.TAGCOUNT);
-        if (tags.length &amp;gt; 0) {
-            TagList tagList = of.createTagList();
-            for (int i = 0; i &amp;lt; tags.length; i++) {
-                Tag tag = of.createTag();
-                tag.setName(tags[i]);
-                tag.setCount(new BigInteger(tagCounts[i]));
-                tagList.getTag().add(tag);
-            }
-            label.setTagList(tagList);
-        }
-        list.add(label);
-
     }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindLabelTest.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,14 +1,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.musicbrainz.search.servlet;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Date;
-
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,149 +7,176 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Before;
 import org.junit.Test;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.LuceneVersion;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.MusicbrainzSimilarity;
-import org.musicbrainz.search.index.DatabaseIndex;
-import org.musicbrainz.search.index.Index;
-import org.musicbrainz.search.index.LabelIndexField;
-import org.musicbrainz.search.index.MetaIndexField;
+import org.musicbrainz.search.index.*;
 import org.musicbrainz.search.servlet.mmd1.LabelMmd1XmlWriter;
 import org.musicbrainz.search.servlet.mmd1.LabelType;
 import org.musicbrainz.search.servlet.mmd2.LabelWriter;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.math.BigInteger;
+import java.util.Date;
+
+import static org.junit.Assert.*;
+
 /**
  * Assumes an index has been built stored and in the data folder, I've picked a fairly obscure bside so hopefully
  * will not get added to another release
  */
 public class FindLabelTest {
 
-  private AbstractSearchServer ss;
-  private AbstractDismaxSearchServer sd;
+    private AbstractSearchServer ss;
+    private AbstractDismaxSearchServer sd;
 
 
-  &amp;lt; at &amp;gt;Before
-  public void setUp() throws Exception {
-    RAMDirectory ramDir = new RAMDirectory();
-    Analyzer analyzer = DatabaseIndex.getAnalyzer(LabelIndexField.class);
-    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
-    writerConfig.setSimilarity(new MusicbrainzSimilarity());
-    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+    &amp;lt; at &amp;gt;Before
+    public void setUp() throws Exception {
+        ObjectFactory of = new ObjectFactory();
+        RAMDirectory ramDir = new RAMDirectory();
+        Analyzer analyzer = DatabaseIndex.getAnalyzer(LabelIndexField.class);
+        IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+        writerConfig.setSimilarity(new MusicbrainzSimilarity());
+        IndexWriter writer = new IndexWriter(ramDir, writerConfig);
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(LabelIndexField.LABEL_ID, "ff571ff4-04cb-4b9c-8a1c-354c330f863c");
-      doc.addField(LabelIndexField.LABEL, "Jockey Slut");
-      doc.addField(LabelIndexField.SORTNAME, "Slut, Jockey");
-      doc.addField(LabelIndexField.ALIAS, "Jockeys");
-      doc.addField(LabelIndexField.CODE, 1234);
-      doc.addField(LabelIndexField.BEGIN, "1993");
-      doc.addField(LabelIndexField.END, "2004");
-      doc.addField(LabelIndexField.ENDED, "true");
-      doc.addField(LabelIndexField.TYPE, "Production");
-      doc.addField(LabelIndexField.COUNTRY, "GB");
-      doc.addField(LabelIndexField.TAG, "dance");
-      doc.addField(LabelIndexField.TAGCOUNT, "22");
-      doc.addField(LabelIndexField.IPI, "1001");
+        {
+            MbDocument doc = new MbDocument();
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            Label label = of.createLabel();
+            doc.addField(LabelIndexField.LABEL_ID, "ff571ff4-04cb-4b9c-8a1c-354c330f863c");
+            label.setId("ff571ff4-04cb-4b9c-8a1c-354c330f863c");
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7503");
-      doc.addField(LabelIndexField.LABEL, "4AD");
-      doc.addField(LabelIndexField.SORTNAME, "4AD");
-      doc.addField(LabelIndexField.BEGIN, "1979");
-      doc.addField(LabelIndexField.CODE, 5807);
-      doc.addField(LabelIndexField.TYPE, LabelType.PRODUCTION.getName());
-      doc.addField(LabelIndexField.COUNTRY, "unknown");
+            doc.addField(LabelIndexField.LABEL, "Jockey Slut");
+            label.setName("Jockey Slut");
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            doc.addField(LabelIndexField.SORTNAME, "Slut, Jockey");
+            label.setSortName("Slut, Jockey");
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7504");
-      doc.addField(LabelIndexField.LABEL, "Dark Prism");
-      doc.addField(LabelIndexField.SORTNAME, "Dark Prism");
-      doc.addField(LabelIndexField.CODE, Index.NO_VALUE);
-      doc.addField(LabelIndexField.TYPE, LabelType.HOLDING.getName());
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            doc.addField(LabelIndexField.ALIAS, "Jockeys");
+            AliasList aliasList = of.createAliasList();
+            Alias alias = of.createAlias();
+            aliasList.getAlias().add(alias);
+            alias.setContent("Jockeys");
+            label.setAliasList(aliasList);
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(LabelIndexField.LABEL_ID, "b539bb1e-f2e1-4b45-9db8-8053841e7504");
-      doc.addField(LabelIndexField.LABEL, "blob");
-      doc.addField(LabelIndexField.SORTNAME, "blob");
-      doc.addField(LabelIndexField.TYPE, "unknown");
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            doc.addField(LabelIndexField.CODE, 1234);
+            label.setLabelCode(BigInteger.valueOf(1234));
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
-      doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            doc.addField(LabelIndexField.BEGIN, "1993");
+            doc.addField(LabelIndexField.END, "2004");
+            doc.addField(LabelIndexField.ENDED, "true");
+            LifeSpan lifespan = of.createLifeSpan();
+            label.setLifeSpan(lifespan);
+            lifespan.setBegin("1993");
+            lifespan.setEnd("2004");
+            lifespan.setEnded("true");
 
+            doc.addField(LabelIndexField.TYPE, "Production");
+            label.setType("Production");
 
-    writer.close();
-    SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.LABEL));
-    ss = new LabelSearch(searcherManager);
-    sd = new LabelDismaxSearch(ss);
-  }
+            doc.addField(LabelIndexField.COUNTRY, "GB");
+            label.setCountry("GB");
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelById() throws Exception {
-    Results res = ss.search("laid:\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-    assertEquals("1993", doc.get(LabelIndexField.BEGIN));
-    assertEquals("2004", doc.get(LabelIndexField.END));
-    assertEquals("Jockeys", doc.get(LabelIndexField.ALIAS));
-    assertNull(doc.get(LabelIndexField.COMMENT));
-    assertEquals("Slut, Jockey", doc.get(LabelIndexField.SORTNAME));
-    assertEquals("Production", doc.get(LabelIndexField.TYPE));
-  }
+            doc.addField(LabelIndexField.TAG, "dance");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("dance");
+            tag.setCount(BigInteger.valueOf(22));
+            tagList.getTag().add(tag);
+            label.setTagList(tagList);
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByName() throws Exception {
-    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+            doc.addField(LabelIndexField.IPI, "1001");
+            IpiList ipiList = of.createIpiList();
+            ipiList.getIpi().add("1001");
+            label.setIpiList(ipiList);
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByDismax1() throws Exception {
-    Results res = sd.search("Jockey Slut", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+            doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByDismax2() throws Exception {
-    Results res = sd.search("Jockey", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+        {
+            MbDocument doc = new MbDocument();
+            Label label = of.createLabel();
+            doc.addField(LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7503");
+            label.setId("a539bb1e-f2e1-4b45-9db8-8053841e7503");
 
+            doc.addField(LabelIndexField.LABEL, "4AD");
+            label.setName("4AD");
+
+            doc.addField(LabelIndexField.SORTNAME, "4AD");
+            label.setSortName("4AD");
+
+            doc.addField(LabelIndexField.BEGIN, "1979");
+            doc.addField(LabelIndexField.CODE, 5807);
+            label.setLabelCode(BigInteger.valueOf(5807));
+
+            doc.addField(LabelIndexField.TYPE, "Production");
+            label.setType("Production");
+
+            doc.addField(LabelIndexField.COUNTRY, "unknown");
+            doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        {
+            MbDocument doc = new MbDocument();
+            Label label = of.createLabel();
+            doc.addField(LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7504");
+            label.setId("a539bb1e-f2e1-4b45-9db8-8053841e7504");
+
+            doc.addField(LabelIndexField.LABEL, "Dark Prism");
+            label.setName("Dark Prism");
+
+            doc.addField(LabelIndexField.SORTNAME, "Dark Prism");
+            label.setSortName("Dark Prism");
+
+            doc.addField(LabelIndexField.CODE, Index.NO_VALUE);
+            doc.addField(LabelIndexField.TYPE, LabelType.HOLDING.getName());
+            label.setType("Holding");
+
+            doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        {
+            MbDocument doc = new MbDocument();
+            Label label = of.createLabel();
+            doc.addField(LabelIndexField.LABEL_ID, "b539bb1e-f2e1-4b45-9db8-8053841e7504");
+            label.setId("b539bb1e-f2e1-4b45-9db8-8053841e7504");
+
+            doc.addField(LabelIndexField.LABEL, "blob");
+            label.setName("blob");
+
+            doc.addField(LabelIndexField.SORTNAME, "blob");
+            label.setSortName("blob");
+
+            doc.addField(LabelIndexField.TYPE, "unknown");
+            doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        {
+            MbDocument doc = new MbDocument();
+            Label label = of.createLabel();
+            doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+            doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
+            doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+
+        writer.close();
+        SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.LABEL));
+        ss = new LabelSearch(searcherManager);
+        sd = new LabelDismaxSearch(ss);
+    }
+
     &amp;lt; at &amp;gt;Test
-    public void testFindLabelByDismax3() throws Exception {
-        Results res = sd.search("1234", 0, 10);
+    public void testFindLabelById() throws Exception {
+        Results res = ss.search("laid:\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\"", 0, 10);
         assertEquals(1, res.getTotalHits());
         Result result = res.results.get(0);
         MbDocument doc = result.getDoc();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -166,382 +184,420 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
     }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByDefault() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByName() throws Exception {
+        Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-    {
-      Results res = ss.search("\"Jockey Slut\"", 0, 10);
-      assertEquals(1, res.getTotalHits());
-      Result result = res.results.get(0);
-      MbDocument doc = result.getDoc();
-      assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-      assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByDismax1() throws Exception {
+        Results res = sd.search("Jockey Slut", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
     }
 
-    {
-      Results res = ss.search("\"Slut Jockey\"", 0, 10);
-      assertEquals(1, res.getTotalHits());
-      Result result = res.results.get(0);
-      MbDocument doc = result.getDoc();
-      assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-      assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByDismax2() throws Exception {
+        Results res = sd.search("Jockey", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
     }
 
-    {
-      Results res = ss.search("\"Jockeys\"", 0, 10);
-      assertEquals(1, res.getTotalHits());
-      Result result = res.results.get(0);
-      MbDocument doc = result.getDoc();
-      assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-      assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByDismax3() throws Exception {
+        Results res = sd.search("1234", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByType() throws Exception {
-    Results res = ss.search("type:\"production\"", 0, 10);
-    assertEquals(2, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByDefault() throws Exception {
 
-    //(This will always come first because searcher sots by score and then docno, and this doc added first)
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+        {
+            Results res = ss.search("\"Jockey Slut\"", 0, 10);
+            assertEquals(1, res.getTotalHits());
+            Result result = res.results.get(0);
+            MbDocument doc = result.getDoc();
+            assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+            assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+        }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByIpi() throws Exception {
-    Results res = ss.search("ipi:1001", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
+        {
+            Results res = ss.search("\"Slut Jockey\"", 0, 10);
+            assertEquals(1, res.getTotalHits());
+            Result result = res.results.get(0);
+            MbDocument doc = result.getDoc();
+            assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+            assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+        }
 
-    //(This will always come first because searcher sots by score and then docno, and this doc added first)
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+        {
+            Results res = ss.search("\"Jockeys\"", 0, 10);
+            assertEquals(1, res.getTotalHits());
+            Result result = res.results.get(0);
+            MbDocument doc = result.getDoc();
+            assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+            assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+        }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByNumericType() throws Exception {
-    Results res = ss.search("type:3", 0, 10);
-    assertEquals(2, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByType() throws Exception {
+        Results res = ss.search("type:\"production\"", 0, 10);
+        assertEquals(2, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
 
-    //(This will always come first because searcher sots by score and then docno, and this doc added first)
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+        //(This will always come first because searcher sots by score and then docno, and this doc added first)
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelBySortname() throws Exception {
-    Results res = ss.search("sortname:\"Slut, Jockey\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByIpi() throws Exception {
+        Results res = ss.search("ipi:1001", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByCountry() 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("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+        //(This will always come first because searcher sots by score and then docno, and this doc added first)
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByUnknownCountry() throws Exception {
-    Results res = ss.search("country:\"unknown\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByNumericType() throws Exception {
+        Results res = ss.search("type:3", 0, 10);
+        assertEquals(2, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByCountryUpercase() 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("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+        //(This will always come first because searcher sots by score and then docno, and this doc added first)
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByCode() throws Exception {
-    Results res = ss.search("code:5807", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("4AD", doc.get(LabelIndexField.LABEL));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelBySortname() throws Exception {
+        Results res = ss.search("sortname:\"Slut, Jockey\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByCode2() throws Exception {
-    Results res = ss.search("code:05807", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("4AD", doc.get(LabelIndexField.LABEL));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByCountry() 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("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByCode3() throws Exception {
-    Results res = ss.search("code:005807", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("4AD", doc.get(LabelIndexField.LABEL));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByUnknownCountry() throws Exception {
+        Results res = ss.search("country:\"unknown\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByCodeRange() throws Exception {
-      try {
-    Results res = ss.search("code:[5806 TO 5807]", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("4AD", doc.get(LabelIndexField.LABEL));
-      }
-      catch(Exception ex)
-      {
-          ex.printStackTrace();
-      }
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByCountryUpercase() 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("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByZeroedCode() throws Exception {
-    Results res = ss.search("code:\"05807\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("4AD", doc.get(LabelIndexField.LABEL));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByCode() throws Exception {
+        Results res = ss.search("code:5807", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("4AD", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByTag() throws Exception {
-    Results res = ss.search("tag:dance", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-    assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByCode2() throws Exception {
+        Results res = ss.search("code:05807", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("4AD", doc.get(LabelIndexField.LABEL));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindLabelByEnded() throws Exception {
-    Results res = ss.search("ended:\"true\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByCode3() throws Exception {
+        Results res = ss.search("code:005807", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("4AD", doc.get(LabelIndexField.LABEL));
+    }
 
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByCodeRange() throws Exception {
+        try {
+            Results res = ss.search("code:[5806 TO 5807]", 0, 10);
+            assertEquals(1, res.getTotalHits());
+            Result result = res.results.get(0);
+            MbDocument doc = result.getDoc();
+            assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
+            assertEquals("4AD", doc.get(LabelIndexField.LABEL));
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
 
-  public void testIssue66() throws Exception {
-    Results res = ss.search("dark", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    ResultsWriter writer = new LabelMmd1XmlWriter();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res);
-    pr.close();
-    String output = sw.toString();
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Dark Prism&amp;lt;/name&amp;gt;"));
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByZeroedCode() throws Exception {
+        Results res = ss.search("code:\"05807\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("a539bb1e-f2e1-4b45-9db8-8053841e7503", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("4AD", doc.get(LabelIndexField.LABEL));
+    }
 
-    writer = new LabelWriter();
-    sw = new StringWriter();
-    pr = new PrintWriter(sw);
-    writer.write(pr, res);
-    pr.close();
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Dark Prism&amp;lt;/name&amp;gt;"));
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByTag() throws Exception {
+        Results res = ss.search("tag:dance", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+        assertEquals("Jockey Slut", doc.get(LabelIndexField.LABEL));
+    }
 
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindLabelByEnded() throws Exception {
+        Results res = ss.search("ended:\"true\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        Result result = res.results.get(0);
+        MbDocument doc = result.getDoc();
+        assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(LabelIndexField.LABEL_ID));
+    }
 
 
-  /**
-   * Tests get same results as
-   * http://musicbrainz.org/ws/1/label/?type=xml&amp;amp;query=%22Jockey%20Slut%22
-   *
-   * &amp;lt; at &amp;gt;throws Exception exeption
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsMmd1Xml() throws Exception {
+    public void testIssue66() throws Exception {
+        Results res = ss.search("dark", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        ResultsWriter writer = new LabelMmd1XmlWriter();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res);
+        pr.close();
+        String output = sw.toString();
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Dark Prism&amp;lt;/name&amp;gt;"));
 
-    Results res = ss.search("label:\"Jockey Slut\"", 0, 1);
-    ResultsWriter writer = new LabelMmd1XmlWriter();
-    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=\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
-    assertTrue(output.contains("type=\"Production\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Jockey Slut&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Slut, Jockey&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("begin=\"1993\""));
-    assertTrue(output.contains("end=\"2004\""));
-  }
+        writer = new LabelWriter();
+        sw = new StringWriter();
+        pr = new PrintWriter(sw);
+        writer.write(pr, res);
+        pr.close();
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Dark Prism&amp;lt;/name&amp;gt;"));
 
-  /**
-   * Tests get same results as
-   * http://musicbrainz.org/ws/1/label/?type=xml&amp;amp;query=%22Jockey%20Slut%22
-   *
-   * &amp;lt; at &amp;gt;throws Exception exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsXml() throws Exception {
+    }
 
-    Results res = ss.search("label:\"Jockey Slut\"", 0, 1);
-    ResultsWriter writer = ss.getMmd2Writer();
-    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("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
-    assertTrue(output.contains("id=\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
-    assertTrue(output.contains("type=\"Production\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Jockey Slut&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Slut, Jockey&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;alias&amp;gt;Jockeys&amp;lt;/alias&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;begin&amp;gt;1993&amp;lt;/begin"));
-    assertTrue(output.contains("&amp;lt;end&amp;gt;2004&amp;lt;/end&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;label-code&amp;gt;1234&amp;lt;/label-code&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;country&amp;gt;GB&amp;lt;/country&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;ended&amp;gt;true&amp;lt;/ended&amp;gt;"));
-    assertTrue(output.contains("dance&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;ipi-list&amp;gt;&amp;lt;ipi&amp;gt;1001&amp;lt;/ipi&amp;gt;&amp;lt;/ipi-list&amp;gt;"));
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsXmlWithUnknownCountry() throws Exception {
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/label/?type=xml&amp;amp;query=%22Jockey%20Slut%22
+     *
+     * &amp;lt; at &amp;gt;throws Exception exeption
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsMmd1Xml() throws Exception {
 
-    Results res = ss.search("laid:a539bb1e-f2e1-4b45-9db8-8053841e7503", 0, 1);
-    ResultsWriter writer = ss.getMmd2Writer();
-    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("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
-    assertTrue(output.contains("id=\"a539bb1e-f2e1-4b45-9db8-8053841e7503\""));
-    assertFalse(output.contains("&amp;lt;country&amp;gt;"));
-  }
+        Results res = ss.search("label:\"Jockey Slut\"", 0, 1);
+        ResultsWriter writer = new LabelMmd1XmlWriter();
+        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=\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
+        assertTrue(output.contains("type=\"Production\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Jockey Slut&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Slut, Jockey&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("begin=\"1993\""));
+        assertTrue(output.contains("end=\"2004\""));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsMMd1XmlWithUnknownType() throws Exception {
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/label/?type=xml&amp;amp;query=%22Jockey%20Slut%22
+     *
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsXml() throws Exception {
 
-    Results res = ss.search("blob", 0, 1);
-    ResultsWriter writer = new LabelMmd1XmlWriter();
-    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\""));
-    assertFalse(output.contains("label type"));
-  }
+        Results res = ss.search("label:\"Jockey Slut\"", 0, 1);
+        ResultsWriter writer = ss.getMmd2Writer();
+        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("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
+        assertTrue(output.contains("id=\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
+        assertTrue(output.contains("type=\"Production\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Jockey Slut&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Slut, Jockey&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;alias&amp;gt;Jockeys&amp;lt;/alias&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;begin&amp;gt;1993&amp;lt;/begin"));
+        assertTrue(output.contains("&amp;lt;end&amp;gt;2004&amp;lt;/end&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;label-code&amp;gt;1234&amp;lt;/label-code&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;country&amp;gt;GB&amp;lt;/country&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;ended&amp;gt;true&amp;lt;/ended&amp;gt;"));
+        assertTrue(output.contains("dance&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;ipi-list&amp;gt;&amp;lt;ipi&amp;gt;1001&amp;lt;/ipi&amp;gt;&amp;lt;/ipi-list&amp;gt;"));
+    }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJson() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsXmlWithUnknownCountry() throws Exception {
 
-    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
-    org.musicbrainz.search.servlet.mmd2.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("laid:a539bb1e-f2e1-4b45-9db8-8053841e7503", 0, 1);
+        ResultsWriter writer = ss.getMmd2Writer();
+        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("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
+        assertTrue(output.contains("id=\"a539bb1e-f2e1-4b45-9db8-8053841e7503\""));
+        assertFalse(output.contains("&amp;lt;country&amp;gt;"));
+    }
 
-    String output = sw.toString();
-    System.out.println("Json is" + output);
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsMMd1XmlWithUnknownType() throws Exception {
 
-    assertTrue(output.contains("id\":\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
-    assertTrue(output.contains("\"type\":\"Production\""));
-    assertTrue(output.contains("name\":\"Jockey Slut\""));
-    assertTrue(output.contains("\"sort-name\":\"Slut, Jockey\""));
-    assertTrue(output.contains("life-span\":{\"begin\":\"1993\""));
-    assertTrue(output.contains("\"label-code\":1234"));
-    assertTrue(output.contains("\"country\":\"GB\""));
-    assertTrue(output.contains("tag-list\":{\"tag\":[{\"count\":22,\"name\":\"dance\"}"));
-    assertTrue(output.contains("\"ended\":\"true\""));
-  }
+        Results res = ss.search("blob", 0, 1);
+        ResultsWriter writer = new LabelMmd1XmlWriter();
+        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\""));
+        assertFalse(output.contains("label type"));
+    }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNew() throws Exception {
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJson() throws Exception {
 
-    Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
-    org.musicbrainz.search.servlet.mmd2.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("label:\"Jockey Slut\"", 0, 10);
+        org.musicbrainz.search.servlet.mmd2.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 New is" + output);
+        String output = sw.toString();
+        System.out.println("Json is" + output);
 
-    assertTrue(output.contains("id\":\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
-    assertTrue(output.contains("\"type\":\"Production\""));
-    assertTrue(output.contains("name\":\"Jockey Slut\""));
-    assertTrue(output.contains("\"sort-name\":\"Slut, Jockey\""));
-    assertTrue(output.contains("life-span\":{\"begin\":\"1993\""));
-    assertTrue(output.contains("\"country\":\"GB\""));
-    assertTrue(output.contains("\"tags\":[{\"count\":22,\"name\":\"dance\"}]"));
-    assertTrue(output.contains("\"ended\":true"));
-    assertTrue(output.contains("\"ipis\":[\"1001\""));
-    assertTrue(output.contains("\"aliases\":[\"Jockeys\"]"));
-    assertTrue(output.contains("\"end\":\"2004\""));
-    assertTrue(output.contains("\"label-code\":1234"));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("id\":\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("\"type\":\"Production\""));
+        assertTrue(output.contains("name\":\"Jockey Slut\""));
+        assertTrue(output.contains("\"sort-name\":\"Slut, Jockey\""));
+        assertTrue(output.contains("life-span\":{\"begin\":\"1993\""));
+        assertTrue(output.contains("\"label-code\":1234"));
+        assertTrue(output.contains("\"country\":\"GB\""));
+        assertTrue(output.contains("tag-list\":{\"tag\":[{\"count\":22,\"name\":\"dance\"}"));
+        assertTrue(output.contains("\"ended\":\"true\""));
+    }
 
-  }
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNew() throws Exception {
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNewIdent() throws Exception {
+        Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
+        org.musicbrainz.search.servlet.mmd2.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("label:\"Jockey Slut\"", 0, 10);
-    org.musicbrainz.search.servlet.mmd2.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 is" + output);
 
-    String output = sw.toString();
-    System.out.println("Json New Ident is" + output);
-    assertTrue(output.contains("\"offset\" : 0"));
+        assertTrue(output.contains("id\":\"ff571ff4-04cb-4b9c-8a1c-354c330f863c\""));
+        assertTrue(output.contains("\"type\":\"Production\""));
+        assertTrue(output.contains("name\":\"Jockey Slut\""));
+        assertTrue(output.contains("\"sort-name\":\"Slut, Jockey\""));
+        assertTrue(output.contains("life-span\":{\"begin\":\"1993\""));
+        assertTrue(output.contains("\"country\":\"GB\""));
+        assertTrue(output.contains("\"tags\":[{\"count\":22,\"name\":\"dance\"}]"));
+        assertTrue(output.contains("\"ended\":true"));
+        assertTrue(output.contains("\"ipis\":[\"1001\""));
+        assertTrue(output.contains("\"aliases\":[{\"locale\":\"\",\"type\":\"\",\"primary\":\"false\",\"begin-date\":\"\",\"end-date\":\"\",\"value\":\"Jockeys\"}]"));
+        assertTrue(output.contains("\"end\":\"2004\""));
+        assertTrue(output.contains("\"label-code\":1234"));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
 
-  }
+    }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNewIdent() throws Exception {
+
+        Results res = ss.search("label:\"Jockey Slut\"", 0, 10);
+        org.musicbrainz.search.servlet.mmd2.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 Ident is" + output);
+        assertTrue(output.contains("\"offset\" : 0"));
+
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java2013-05-09 11:15:51 UTC (rev 13680)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java2013-05-09 14:50:05 UTC (rev 13681)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,52 +60,117 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             {
                 MbDocument doc = new MbDocument();
+
+                Label label = of.createLabel();
                 doc.addField(LabelIndexField.LABEL_ID, "ff571ff4-04cb-4b9c-8a1c-354c330f863c");
+                label.setId("ff571ff4-04cb-4b9c-8a1c-354c330f863c");
+
                 doc.addField(LabelIndexField.LABEL, "Jockey Slut");
+                label.setName("Jockey Slut");
+
                 doc.addField(LabelIndexField.SORTNAME, "Slut, Jockey");
+                label.setSortName("Slut, Jockey");
+
                 doc.addField(LabelIndexField.ALIAS, "Jockeys");
+                AliasList aliasList = of.createAliasList();
+                Alias alias = of.createAlias();
+                aliasList.getAlias().add(alias);
+                alias.setContent("Jockeys");
+                label.setAliasList(aliasList);
+
                 doc.addField(LabelIndexField.CODE, 1234);
+                label.setLabelCode(BigInteger.valueOf(1234));
+
                 doc.addField(LabelIndexField.BEGIN, "1993");
                 doc.addField(LabelIndexField.END, "2004");
                 doc.addField(LabelIndexField.ENDED, "true");
+                LifeSpan lifespan = of.createLifeSpan();
+                label.setLifeSpan(lifespan);
+                lifespan.setBegin("1993");
+                lifespan.setEnd("2004");
+                lifespan.setEnded("true");
+
                 doc.addField(LabelIndexField.TYPE, "Production");
+                label.setType("Production");
+
                 doc.addField(LabelIndexField.COUNTRY, "GB");
+                label.setCountry("GB");
+
                 doc.addField(LabelIndexField.TAG, "dance");
-                doc.addField(LabelIndexField.TAGCOUNT, "22");
+                TagList tagList = of.createTagList();
+                Tag tag = of.createTag();
+                tag.setName("dance");
+                tag.setCount(BigInteger.valueOf(22));
+                tagList.getTag().add(tag);
+                label.setTagList(tagList);
+
                 doc.addField(LabelIndexField.IPI, "1001");
+                IpiList ipiList = of.createIpiList();
+                ipiList.getIpi().add("1001");
+                label.setIpiList(ipiList);
 
+                doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
                 writer.addDocument(doc.getLuceneDocument());
             }
 
             {
                 MbDocument doc = new MbDocument();
+                Label label = of.createLabel();
                 doc.addField(LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7503");
+                label.setId("a539bb1e-f2e1-4b45-9db8-8053841e7503");
+
                 doc.addField(LabelIndexField.LABEL, "4AD");
+                label.setName("4AD");
+
                 doc.addField(LabelIndexField.SORTNAME, "4AD");
+                label.setSortName("4AD");
+
                 doc.addField(LabelIndexField.BEGIN, "1979");
                 doc.addField(LabelIndexField.CODE, 5807);
-                doc.addField(LabelIndexField.TYPE, LabelType.PRODUCTION.getName());
+                label.setLabelCode(BigInteger.valueOf(5807));
+
+                doc.addField(LabelIndexField.TYPE, "Production");
+                label.setType("Production");
+
                 doc.addField(LabelIndexField.COUNTRY, "unknown");
-
+                doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
                 writer.addDocument(doc.getLuceneDocument());
             }
 
             {
                 MbDocument doc = new MbDocument();
+                Label label = of.createLabel();
                 doc.addField(LabelIndexField.LABEL_ID, "a539bb1e-f2e1-4b45-9db8-8053841e7504");
+                label.setId("a539bb1e-f2e1-4b45-9db8-8053841e7504");
+
                 doc.addField(LabelIndexField.LABEL, "Dark Prism");
+                label.setName("Dark Prism");
+
                 doc.addField(LabelIndexField.SORTNAME, "Dark Prism");
+                label.setSortName("Dark Prism");
+
                 doc.addField(LabelIndexField.CODE, Index.NO_VALUE);
                 doc.addField(LabelIndexField.TYPE, LabelType.HOLDING.getName());
+                label.setType("holding");
+
+                doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
                 writer.addDocument(doc.getLuceneDocument());
             }
 
             {
                 MbDocument doc = new MbDocument();
+                Label label = of.createLabel();
                 doc.addField(LabelIndexField.LABEL_ID, "b539bb1e-f2e1-4b45-9db8-8053841e7504");
+                label.setId("b539bb1e-f2e1-4b45-9db8-8053841e7504");
+
                 doc.addField(LabelIndexField.LABEL, "blob");
+                label.setName("blob");
+
                 doc.addField(LabelIndexField.SORTNAME, "blob");
+                label.setSortName("blob");
+
                 doc.addField(LabelIndexField.TYPE, "unknown");
+                doc.addField(LabelIndexField.LABEL_STORE, MMDSerializer.serialize(label));
                 writer.addDocument(doc.getLuceneDocument());
             }
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-09T14:50:05</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18241">
    <title>[mb-commits] r13680 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/main/java/org/musicbrainz/search/servlet/mmd2servlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18241</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-09 11:15:51 +0000 (Thu, 09 May 2013)
New Revision: 13680

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.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/ArtistIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java
Log:
SEARCH-268:Add extended alias info to the ws search results

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,11 +109,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         " WHERE artist between ? AND ?");
 
         addPreparedStatement("ALIASES",
-                "SELECT artist_alias.artist as artist, n.name as alias, sn.name as alias_sortname " +
-                        " FROM artist_alias " +
-                        "  JOIN artist_name n ON (artist_alias.name = n.id) " +
-                        "  JOIN artist_name sn ON (artist_alias.sort_name = sn.id) " +
-                        " WHERE artist BETWEEN ? AND ?");
+                "SELECT a.artist as artist, n.name as alias, sn.name as alias_sortname, a.primary_for_locale, a.locale, att.name as type," +
+                        "a.begin_date_year, a.begin_date_month, a.begin_date_day, a.end_date_year, a.end_date_month, a.end_date_day" +
+                        " FROM artist_alias a" +
+                        "  JOIN artist_name n ON (a.name = n.id) " +
+                        "  JOIN artist_name sn ON (a.sort_name = sn.id) " +
+                        "  LEFT JOIN artist_alias_type att on (a.type=att.id)" +
+                        " WHERE artist BETWEEN ? AND ?" +
+                        " ORDER BY artist, alias, alias_sortname");
 
         addPreparedStatement("ARTISTCREDITS",
                         "SELECT artist as artist, n.name as artistcredit " +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -189,7 +192,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             int artistId = rs.getInt("artist");
             Set&amp;lt;Alias&amp;gt; list;
             if (!aliases.containsKey(artistId)) {
-                list = new HashSet&amp;lt;Alias&amp;gt;();
+                list = new LinkedHashSet&amp;lt;Alias&amp;gt;();
                 aliases.put(artistId, list);
             } else {
                 list = aliases.get(artistId);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -197,6 +200,28 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             Alias alias = of.createAlias();
             alias.setContent(rs.getString("alias"));
             alias.setSortName(rs.getString("alias_sortname"));
+            boolean isPrimary = rs.getBoolean("primary_for_locale");
+            if(isPrimary) {
+                alias.setPrimary("primary");
+            }
+            String locale = rs.getString("locale");
+            if(locale!=null) {
+                alias.setLocale(locale);
+            }
+            String type = rs.getString("type");
+            if(type!=null) {
+                alias.setType(type);
+            }
+
+            String begin = Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day"));
+            if(!Strings.isNullOrEmpty(begin))  {
+                alias.setBeginDate(begin);
+            }
+
+            String end = Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day"));
+            if(!Strings.isNullOrEmpty(end))  {
+                alias.setEndDate(end);
+            }
             list.add(alias);
         }
         rs.close();

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.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -345,7 +345,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "  last_updated timestamp," +
                 "  edits_pending integer NOT NULL DEFAULT 0," +
                 "  type                INTEGER," +
-                "  sort_name           INTEGER," +
+                "  sort_name           INTEGER NOT NULL," +
                 "  begin_date_year     SMALLINT," +
                 "  begin_date_month    SMALLINT," +
                 "  begin_date_day      SMALLINT," +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -986,7 +986,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "(16, 'DCC', 1992) "
         );
 
-        stmt.addBatch("INSERT INTO artist_alias_type (id, name) VALUES (1, 'Search hint')");
+        stmt.addBatch("INSERT INTO artist_alias_type (id, name) VALUES (1, 'Artist name')");
+        stmt.addBatch("INSERT INTO artist_alias_type (id, name) VALUES (2, 'Legal name')");
+        stmt.addBatch("INSERT INTO artist_alias_type (id, name) VALUES (3, 'Search hint')");
 
         stmt.addBatch("INSERT INTO label_alias_type (id, name) VALUES (1, 'Search hint')");
 

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,12 +6,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Test;
+import org.musicbrainz.mmd2.Alias;
+import org.musicbrainz.mmd2.AliasList;
 import org.musicbrainz.mmd2.Artist;
 import org.musicbrainz.mmd2.Release;
 
 import java.sql.Statement;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class ArtistIndexTest extends AbstractIndexTest {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,11 +60,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         stmt.addBatch("INSERT INTO artist_name (id, name) VALUES (5, 'Bunnymen Orchestra')");
         stmt.addBatch("INSERT INTO artist_name (id, name) VALUES (6, 'Buunymen, Echo And The')");
 
-        stmt.addBatch("INSERT INTO artist_alias (id, sort_name, type, artist, name, begin_date_year,begin_date_month,begin_date_day) " +
-                " VALUES (1, 6, 1, 16153, 2,1978,05,01)");
+        stmt.addBatch("INSERT INTO artist_alias (id, sort_name, type, artist, name, begin_date_year,begin_date_month,begin_date_day,primary_for_locale ) " +
+                " VALUES (1, 6, 1, 16153, 2,1978,05,01, false)");
 
-        stmt.addBatch("INSERT INTO artist_alias (id, artist, name) VALUES (2, 16153, 3)");
-        stmt.addBatch("INSERT INTO artist_alias (id, artist, name) VALUES (3, 16153, 4)");
+        stmt.addBatch("INSERT INTO artist_alias (id, artist, sort_name, name, primary_for_locale, type, end_date_year,end_date_month ) VALUES (2, 16153, 6, 3, null, null, 1984,09)");
+        stmt.addBatch("INSERT INTO artist_alias (id, artist, sort_name, name, primary_for_locale, locale, type ) VALUES (3, 16153, 6, 4, true, 'en',3)");
 
         stmt.addBatch("INSERT INTO artist_credit_name (artist_credit, position, artist, name) " +
                 " VALUES (1, 0, 16153, 5)");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -280,11 +283,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertEquals(2, ir.numDocs());
         {
             checkTerm(ir, ArtistIndexField.ALIAS, "and");
-            checkTermX(ir, ArtistIndexField.ALIAS, "bunnyman",1);
-            checkTermX(ir, ArtistIndexField.ALIAS, "bunnymen",2);
-            checkTermX(ir, ArtistIndexField.ALIAS, "buunymen",3); //From alias sortname
-            checkTermX(ir, ArtistIndexField.ALIAS, "echo",4);
-            checkTermX(ir, ArtistIndexField.ALIAS, "orchestra",5);
+            checkTermX(ir, ArtistIndexField.ALIAS, "bunnyman", 1);
+            checkTermX(ir, ArtistIndexField.ALIAS, "bunnymen", 2);
+            checkTermX(ir, ArtistIndexField.ALIAS, "buunymen", 3); //From alias sortname
+            checkTermX(ir, ArtistIndexField.ALIAS, "echo", 4);
+            checkTermX(ir, ArtistIndexField.ALIAS, "orchestra", 5);
 
         }
         ir.close();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -578,7 +581,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * &amp;lt; at &amp;gt;throws Exception exception
      */
     &amp;lt; at &amp;gt;Test
-    public void testStoredArtist() throws Exception {
+    public void testStoredArtist1() throws Exception {
 
         addArtistOne();
         RAMDirectory ramDir = new RAMDirectory();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -598,4 +601,57 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
         ir.close();
     }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredArtistWithAliases() throws Exception {
+
+        addArtistTwo();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
+            Document doc = ir.document(1);
+            Artist artist = (Artist) MMDSerializer.unserialize(doc.get(ArtistIndexField.ARTIST_STORE.getName()), Artist.class);
+            assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", artist.getId());
+            assertEquals("Echo &amp;amp; The Bunnymen", artist.getName());
+            assertEquals(null, artist.getCountry());
+            AliasList aliasList = artist.getAliasList();
+            assertNotNull(aliasList);
+            assertEquals(3, aliasList.getAlias().size());
+            Alias alias = aliasList.getAlias().get(0);
+            assertEquals("Echo &amp;amp; The Bunnyman", alias.getContent());
+            assertEquals("Buunymen, Echo And The", alias.getSortName());
+            assertEquals(null, alias.getPrimary());
+            assertEquals(null, alias.getLocale());
+            assertEquals(null, alias.getType());
+            assertEquals(null, alias.getBeginDate());
+            assertEquals("1984-09", alias.getEndDate());
+
+            alias = aliasList.getAlias().get(1);
+            assertEquals("Echo And The Bunnymen", alias.getContent());
+            assertEquals("Buunymen, Echo And The", alias.getSortName());
+            assertEquals("primary", alias.getPrimary());
+            assertEquals("en", alias.getLocale());
+            assertEquals("Search hint", alias.getType());
+            assertEquals(null, alias.getBeginDate());
+            assertEquals(null, alias.getEndDate());
+
+            alias = aliasList.getAlias().get(2);
+            assertEquals("Echo and The Bunnymen", alias.getContent());
+            assertEquals("Buunymen, Echo And The", alias.getSortName());
+            assertEquals(null, alias.getPrimary());
+            assertEquals(null, alias.getLocale());
+            assertEquals("Artist name", alias.getType());
+            assertEquals("1978-05-01", alias.getBeginDate());
+            assertEquals(null, alias.getEndDate());
+
+        }
+        ir.close();
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,7 +89,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         stmt.addBatch("INSERT INTO artist (id, gid, name, sort_name, comment)" +
                 " VALUES (16153, 'ccd4879c-5e88-4385-b131-bf65296bf245', 1, 1, 'a comment')");
-        stmt.addBatch("INSERT INTO artist_alias(id, artist, name, locale, edits_pending, last_updated) VALUES (1, 16153, 2, 'en',1,null)");
+        stmt.addBatch("INSERT INTO artist_alias(id, artist, name, sort_name, locale, edits_pending, last_updated) VALUES (1, 16153, 2,2, 'en',1,null)");
         stmt.addBatch("INSERT INTO artist_credit (id, name, artist_count, ref_count) VALUES (1, 1, 1, 1)");
         stmt.addBatch("INSERT INTO artist_credit_name (artist_credit, position, artist, name, join_phrase) " +
                 " VALUES (1, 0, 16153, 1, '')");

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -43,22 +43,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import java.util.Locale;
 
 
-public class ArtistWriter extends ResultsWriter
-{
+public class ArtistWriter extends ResultsWriter {
 
     /**
-     *
      * &amp;lt; at &amp;gt;param metadata
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;throws IOException
      */
-    public void write(Metadata metadata, Results results) throws IOException
-    {
+    public void write(Metadata metadata, Results results) throws IOException {
         ObjectFactory of = new ObjectFactory();
         ArtistList artistList = of.createArtistList();
 
-        for(Result result:results.results)
-        {
+        for (Result result : results.results) {
             result.setNormalizedScore(results.getMaxScore());
         }
         write(artistList.getArtist(), results);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -70,30 +66,64 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 
     /**
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;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);
         }
     }
 
     /**
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param result
      * &amp;lt; at &amp;gt;throws IOException
      */
-    public void write(List list, Result result) throws IOException
-    {
+    public void write(List list, Result result) throws IOException {
         MbDocument doc = result.getDoc();
         Artist artist = (Artist) MMDSerializer.unserialize(doc.get(ArtistIndexField.ARTIST_STORE), Artist.class);
         artist.setScore(String.valueOf(result.getNormalizedScore()));
         list.add(artist);
     }
+
+    /**
+     * Overriden to ensure all attributes are set for each alias
+     *
+     * &amp;lt; at &amp;gt;param metadata
+     */
+    &amp;lt; at &amp;gt;Override
+    public void adjustForJson(Metadata metadata) {
+
+        if (metadata.getArtistList().getArtist().size()&amp;gt;0) {
+            for(Artist artist:metadata.getArtistList().getArtist()) {
+                if(artist.getAliasList()!=null) {
+                    for (Alias alias : artist.getAliasList().getAlias()) {
+
+                        if (alias.getBeginDate() == null) {
+                            alias.setBeginDate("");
+                        }
+                        if (alias.getEndDate() == null) {
+                            alias.setEndDate("");
+                        }
+                        if (alias.getType() == null) {
+                            alias.setType("");
+                        }
+                        if (alias.getLocale() == null) {
+                            alias.setLocale("");
+                        }
+                        //On Xml output as primary, but in json they have changed to true/false
+                        if (alias.getPrimary() == null) {
+                            alias.setPrimary("false");
+                        }
+                        else {
+                            alias.setPrimary("true");
+                        }
+                    }
+                }
+            }
+        }
+
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -38,7 +38,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.musicbrainz.mmd2.Metadata;
 import org.musicbrainz.mmd2.ObjectFactory;
 import org.musicbrainz.search.servlet.ErrorMessage;
-import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 import org.musicbrainz.search.servlet.SearchServerServlet;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -132,6 +131,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public abstract void write(Metadata metadata, Results results) throws IOException;
 
     /**
+     * Can be overidden to allow fields that have no value and hecne unset in Xml to be set in Json
+     * because Json we expects values to be returned regardless of whether they are set, and there is a problem
+     * with json output if have multiple attributes and some are set and some are not (i.e alias attributes)
+     *
+     * &amp;lt; at &amp;gt;param metadata
+     */
+    public void adjustForJson(Metadata metadata) {
+
+    }
+
+    /**
      * Write the results to provider writer as Xml
      *
      *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -160,6 +170,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         else if(outputFormat.equals(SearchServerServlet.RESPONSE_JSON_NEW)) {
             try {
                 Metadata metadata = write(results);
+                adjustForJson(metadata);
                 Marshaller m = jsonContext.createMarshaller();
                 if(isPretty) {
                     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -173,6 +184,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         else if(outputFormat.equals(SearchServerServlet.RESPONSE_JSON)) {
             try {
                 Metadata metadata = write(results);
+                adjustForJson(metadata);
                 JSONMarshaller m = internalJsoncontext.createJSONMarshaller();
                 if(isPretty) {
                     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java2013-05-09 11:15:51 UTC (rev 13680)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -122,6 +122,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             AliasList aliasList = of.createAliasList();
             Alias alias = of.createAlias();
             alias.setContent("Echo And The Bunnymen");
+            alias.setSortName("Buunymen, Echo And The");
+            alias.setPrimary("primary");
+            alias.setLocale("en");
+            alias.setType("Artist name");
+            alias.setBeginDate("1978-05-01");
             aliasList.getAlias().add(alias);
 
             alias = of.createAlias();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -461,7 +466,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("&amp;lt;name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/name&amp;gt;"));
         assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/sort-name&amp;gt;"));
         assertTrue(output.contains("&amp;lt;life-span&amp;gt;&amp;lt;begin&amp;gt;1978&amp;lt;/begin&amp;gt;&amp;lt;/life-span&amp;gt;"));
-        assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo And The Bunnymen&amp;lt;/alias&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;alias locale=\"en\" sort-name=\"Buunymen, Echo And The\" type=\"Artist name\" primary=\"primary\" begin-date=\"1978-05-01\"&amp;gt;Echo And The Bunnymen&amp;lt;/alias&amp;gt;"));
         assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo &amp;amp;amp; The Bunnyman&amp;lt;/alias&amp;gt;"));
         assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo and The Bunymen&amp;lt;/alias&amp;gt;"));
         assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo &amp;amp;amp; The Bunymen&amp;lt;/alias&amp;gt;"));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -624,7 +629,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         String output = sw.toString();
         System.out.println("JSON New Pretty is" + output);
         assertTrue(output.contains("\"sort-name\" : \"Echo &amp;amp; The Bunnymen\""));
-        assertTrue(output.contains("\"aliases\" : [ \"Echo And The Bunnymen\", \"Echo &amp;amp; The Bunnyman\", \"Echo and The Bunymen\", \"Echo &amp;amp; The Bunymen\" ]"));
+        assertTrue(output.contains("\"type\" : \"Artist name\","));
+        assertTrue(output.contains("\"primary\" : \"true\","));
+        assertTrue(output.contains("\"begin-date\" : \"1978-05-01\","));
+        assertTrue(output.contains(" \"end-date\" : \"\","));
+        assertTrue(output.contains("\"value\" : \"Echo And The Bunnymen\""));
+        assertTrue(output.contains("\"locale\" : \"\","));
+        assertTrue(output.contains("\"type\" : \"\","));
+
     }
 
 }
\ No newline at end of file
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-09T11:15:52</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18240">
    <title>[mb-commits] r13679 - in search_server/trunk/index/src:main/java/org/musicbrainz/search/indextest/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18240</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-09 08:47:07 +0000 (Thu, 09 May 2013)
New Revision: 13679

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.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/ArtistIndexTest.java
Log:
SEARCH-219:Include alias sortnames when searching

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-08 16:09:27 UTC (rev 13678)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-09 08:47:07 UTC (rev 13679)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -109,9 +109,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         " WHERE artist between ? AND ?");
 
         addPreparedStatement("ALIASES",
-                "SELECT artist_alias.artist as artist, n.name as alias " +
+                "SELECT artist_alias.artist as artist, n.name as alias, sn.name as alias_sortname " +
                         " FROM artist_alias " +
                         "  JOIN artist_name n ON (artist_alias.name = n.id) " +
+                        "  JOIN artist_name sn ON (artist_alias.sort_name = sn.id) " +
                         " WHERE artist BETWEEN ? AND ?");
 
         addPreparedStatement("ARTISTCREDITS",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -165,6 +166,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
+        ObjectFactory of = new ObjectFactory();
+
         // Get Tags
         PreparedStatement st = getPreparedStatement("TAGS");
         st.setInt(1, min);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -176,22 +179,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         // IPI Codes
         Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes = loadIpiCodes(min, max);
 
-        //Aliases (and Artist Credits)
-        Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; aliases = new HashMap&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt;();
+        //Aliases
+        Map&amp;lt;Integer, Set&amp;lt;Alias&amp;gt;&amp;gt; aliases = new HashMap&amp;lt;Integer, Set&amp;lt;Alias&amp;gt;&amp;gt;();
         st = getPreparedStatement("ALIASES");
         st.setInt(1, min);
         st.setInt(2, max);
         rs = st.executeQuery();
         while (rs.next()) {
             int artistId = rs.getInt("artist");
-            Set&amp;lt;String&amp;gt; list;
+            Set&amp;lt;Alias&amp;gt; list;
             if (!aliases.containsKey(artistId)) {
-                list = new HashSet&amp;lt;String&amp;gt;();
+                list = new HashSet&amp;lt;Alias&amp;gt;();
                 aliases.put(artistId, list);
             } else {
                 list = aliases.get(artistId);
             }
-            list.add(rs.getString("alias"));
+            Alias alias = of.createAlias();
+            alias.setContent(rs.getString("alias"));
+            alias.setSortName(rs.getString("alias_sortname"));
+            list.add(alias);
         }
         rs.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -230,7 +236,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public Document documentFromResultSet(ResultSet rs,
                                           Map&amp;lt;Integer, List&amp;lt;Tag&amp;gt;&amp;gt; tags,
                                           Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes,
-                                          Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; aliases,
+                                          Map&amp;lt;Integer, Set&amp;lt;Alias&amp;gt;&amp;gt; aliases,
                                           Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; artistCredits) throws SQLException {
 
         MbDocument doc = new MbDocument();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -303,12 +309,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         if (aliases.containsKey(artistId)) {
             AliasList aliasList = of.createAliasList();
-            for (String aliasName : aliases.get(artistId)) {
-                doc.addField(ArtistIndexField.ALIAS, aliasName);
-
-                Alias alias = of.createAlias();
-                alias.setContent(aliasName);
-                aliasList.getAlias().add(alias);
+            for (Alias nextAlias : aliases.get(artistId)) {
+                doc.addField(ArtistIndexField.ALIAS, nextAlias.getContent());
+                if(!nextAlias.getSortName().equals(nextAlias.getContent())) {
+                    doc.addField(ArtistIndexField.ALIAS, nextAlias.getSortName());
+                }
+                aliasList.getAlias().add(nextAlias);
             }
             artist.setAliasList(aliasList);
         }

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.java2013-05-08 16:09:27 UTC (rev 13678)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java2013-05-09 08:47:07 UTC (rev 13679)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -341,19 +341,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "  id serial NOT NULL," +
                 "  artist integer NOT NULL," +
                 "  name integer NOT NULL," +
-                "  sort_name INTEGER," +
+                "  locale text," +
+                "  last_updated timestamp," +
+                "  edits_pending integer NOT NULL DEFAULT 0," +
                 "  type                INTEGER," +
+                "  sort_name           INTEGER," +
                 "  begin_date_year     SMALLINT," +
                 "  begin_date_month    SMALLINT," +
                 "  begin_date_day      SMALLINT," +
                 "  end_date_year       SMALLINT," +
                 "  end_date_month      SMALLINT," +
                 "  end_date_day        SMALLINT," +
-                "  locale text," +
-                "  last_updated timestamp," +
-                "  edits_pending integer NOT NULL DEFAULT 0" +
+                "  primary_for_locale  BOOLEAN"   +
                 ")");
-
         stmt.addBatch("CREATE TABLE artist_alias_type (" +
                 " id SERIAL,"  +
                 " name TEXT" +

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-08 16:09:27 UTC (rev 13678)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-09 08:47:07 UTC (rev 13679)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -270,7 +270,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * &amp;lt; at &amp;gt;throws Exception exception
      */
     &amp;lt; at &amp;gt;Test
-    public void testIndexArtistWithAlias() throws Exception {
+    public void testIndexArtistWithAliasAndAliasSortname() throws Exception {
 
         addArtistTwo();
         RAMDirectory ramDir = new RAMDirectory();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -280,11 +280,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertEquals(2, ir.numDocs());
         {
             checkTerm(ir, ArtistIndexField.ALIAS, "and");
+            checkTermX(ir, ArtistIndexField.ALIAS, "bunnyman",1);
+            checkTermX(ir, ArtistIndexField.ALIAS, "bunnymen",2);
+            checkTermX(ir, ArtistIndexField.ALIAS, "buunymen",3); //From alias sortname
+            checkTermX(ir, ArtistIndexField.ALIAS, "echo",4);
+            checkTermX(ir, ArtistIndexField.ALIAS, "orchestra",5);
 
         }
         ir.close();
     }
 
+
+
     /**
      * Checks zeroes are removed from date
      *
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-09T08:47:08</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18239">
    <title>[mb-commits] r13678 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/main/java/org/musicbrainz/search/servlet/mmd1servlet/src/main/java/org/musicbrainz/search/servlet/mmd2servlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18239</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-08 16:09:27 +0000 (Wed, 08 May 2013)
New Revision: 13678

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndexField.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ArtistMmd1XmlWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java
Log:
SEARCH-269:WS searches don't return aliases that match the artist name, fixed for artist

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,15 +19,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.index;
 
+import com.google.common.base.Strings;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.search.similarities.Similarity;
-import org.musicbrainz.mmd2.Tag;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.MusicbrainzSimilarity;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.nio.CharBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.nio.charset.Charset;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,11 +71,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         return super.getAnalyzer(ArtistIndexField.class);
     }
 
-&amp;lt; at &amp;gt;Override
-public IndexField getIdentifierField() {
-return ArtistIndexField.ID;
-}
-    
+    &amp;lt; at &amp;gt;Override
+    public IndexField getIdentifierField() {
+        return ArtistIndexField.ID;
+    }
+
     public int getMaxId() throws SQLException {
         Statement st = dbConnection.createStatement();
         ResultSet rs = st.executeQuery("SELECT MAX(id) FROM artist");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -82,18 +84,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     public int getNoOfRows(int maxId) throws SQLException {
-    PreparedStatement st = dbConnection.prepareStatement(
-    "SELECT count(*) FROM artist WHERE id &amp;lt;= ? AND gid &amp;lt;&amp;gt; ?::uuid");
-    st.setInt(1, maxId);
-    st.setString(2, DELETED_ARTIST_MBID);
+        PreparedStatement st = dbConnection.prepareStatement(
+                "SELECT count(*) FROM artist WHERE id &amp;lt;= ? AND gid &amp;lt;&amp;gt; ?::uuid");
+        st.setInt(1, maxId);
+        st.setString(2, DELETED_ARTIST_MBID);
         ResultSet rs = st.executeQuery();
         rs.next();
         return rs.getInt(1);
     }
 
     &amp;lt; at &amp;gt;Override
-    public Similarity getSimilarity()
-    {
+    public Similarity getSimilarity() {
         return new MusicbrainzSimilarity();
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -103,43 +104,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         addPreparedStatement("TAGS",
                 "SELECT artist_tag.artist, tag.name as tag, artist_tag.count as count " +
-                " FROM artist_tag " +
-                "  INNER JOIN tag ON tag=id " +
-                " WHERE artist between ? AND ?");
+                        " FROM artist_tag " +
+                        "  INNER JOIN tag ON tag=id " +
+                        " WHERE artist between ? AND ?");
 
         addPreparedStatement("ALIASES",
                 "SELECT artist_alias.artist as artist, n.name as alias " +
-                " FROM artist_alias " +
-                "  JOIN artist_name n ON (artist_alias.name = n.id) " +
-                " WHERE artist BETWEEN ? AND ? " +
-                "UNION " +
-                "SELECT artist as artist, n.name as alias " +
-                " FROM artist_credit_name " +
-                "  JOIN artist_name n ON n.id = artist_credit_name.name " +
-                " WHERE artist BETWEEN ? AND ? ");
+                        " FROM artist_alias " +
+                        "  JOIN artist_name n ON (artist_alias.name = n.id) " +
+                        " WHERE artist BETWEEN ? AND ?");
 
+        addPreparedStatement("ARTISTCREDITS",
+                        "SELECT artist as artist, n.name as artistcredit " +
+                        " FROM artist_credit_name " +
+                        "  JOIN artist_name n ON n.id = artist_credit_name.name " +
+                        " WHERE artist BETWEEN ? AND ? ");
 
+
         addPreparedStatement("ARTISTS",
                 "SELECT artist.id, gid, n0.name as name, n1.name as sort_name, " +
-                "  artist_type.name as type, begin_date_year, begin_date_month, begin_date_day, " +
-                "  end_date_year, end_date_month, end_date_day,ended, " +
-                "  comment, lower(i.code) as country, lower(gender.name) as gender " +
-                " FROM artist " +
-                "  LEFT JOIN artist_name n0 ON artist.name = n0.id " +
-                "  LEFT JOIN artist_name n1 ON artist.sort_name = n1.id " +
-                "  LEFT JOIN artist_type ON artist.type = artist_type.id " +
-                "  LEFT JOIN iso_3166_1 i on artist.area=i.area" +
-                "  LEFT JOIN gender ON artist.gender=gender.id " +
-                " WHERE artist.id BETWEEN ? AND ?");
+                        "  artist_type.name as type, begin_date_year, begin_date_month, begin_date_day, " +
+                        "  end_date_year, end_date_month, end_date_day,ended, " +
+                        "  comment, lower(i.code) as country, lower(gender.name) as gender " +
+                        " FROM artist " +
+                        "  LEFT JOIN artist_name n0 ON artist.name = n0.id " +
+                        "  LEFT JOIN artist_name n1 ON artist.sort_name = n1.id " +
+                        "  LEFT JOIN artist_type ON artist.type = artist_type.id " +
+                        "  LEFT JOIN iso_3166_1 i on artist.area=i.area" +
+                        "  LEFT JOIN gender ON artist.gender=gender.id " +
+                        " WHERE artist.id BETWEEN ? AND ?");
 
         addPreparedStatement("IPICODES",
                 "SELECT ipi, artist " +
-                " FROM artist_ipi  " +
-                " WHERE artist between ? AND ?");
+                        " FROM artist_ipi  " +
+                        " WHERE artist between ? AND ?");
 
     }
 
-    private  Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; loadIpiCodes(int min, int max) throws SQLException, IOException {
+    private Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; loadIpiCodes(int min, int max) throws SQLException, IOException {
         Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes = new HashMap&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt;();
         PreparedStatement st = getPreparedStatement("IPICODES");
         st.setInt(1, min);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -160,7 +162,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         rs.close();
         return ipiCodes;
     }
-    
+
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
         // Get Tags
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -168,19 +170,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         st.setInt(1, min);
         st.setInt(2, max);
         ResultSet rs = st.executeQuery();
-        Map&amp;lt;Integer,List&amp;lt;Tag&amp;gt;&amp;gt; tags = TagHelper.completeTagsFromDbResults(rs,"artist");
+        Map&amp;lt;Integer, List&amp;lt;Tag&amp;gt;&amp;gt; tags = TagHelper.completeTagsFromDbResults(rs, "artist");
         rs.close();
 
         // IPI Codes
-        Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes = loadIpiCodes(min,max);
-        
+        Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes = loadIpiCodes(min, max);
+
         //Aliases (and Artist Credits)
         Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; aliases = new HashMap&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt;();
         st = getPreparedStatement("ALIASES");
         st.setInt(1, min);
         st.setInt(2, max);
-        st.setInt(3, min);
-        st.setInt(4, max);
         rs = st.executeQuery();
         while (rs.next()) {
             int artistId = rs.getInt("artist");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -195,93 +195,162 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
         rs.close();
 
+        //Artist Credits)
+        Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; artistCredits = new HashMap&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt;();
+        st = getPreparedStatement("ARTISTCREDITS");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        rs = st.executeQuery();
+        while (rs.next()) {
+            int artistId = rs.getInt("artist");
+            Set&amp;lt;String&amp;gt; list;
+            if (!artistCredits.containsKey(artistId)) {
+                list = new HashSet&amp;lt;String&amp;gt;();
+                artistCredits.put(artistId, list);
+            } else {
+                list = artistCredits.get(artistId);
+            }
+            list.add(rs.getString("artistcredit"));
+        }
+        rs.close();
+
         st = getPreparedStatement("ARTISTS");
         st.setInt(1, min);
         st.setInt(2, max);
         rs = st.executeQuery();
         while (rs.next()) {
-            if(rs.getString("gid").equals(DELETED_ARTIST_MBID))
-            {
+            if (rs.getString("gid").equals(DELETED_ARTIST_MBID)) {
                 continue;
             }
-            indexWriter.addDocument(documentFromResultSet(rs, tags, ipiCodes, aliases));
+            indexWriter.addDocument(documentFromResultSet(rs, tags, ipiCodes, aliases, artistCredits));
         }
         rs.close();
     }
 
     public Document documentFromResultSet(ResultSet rs,
-                                          Map&amp;lt;Integer,List&amp;lt;Tag&amp;gt;&amp;gt; tags,
+                                          Map&amp;lt;Integer, List&amp;lt;Tag&amp;gt;&amp;gt; tags,
                                           Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; ipiCodes,
-                                          Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; aliases) throws SQLException {
+                                          Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; aliases,
+                                          Map&amp;lt;Integer, Set&amp;lt;String&amp;gt;&amp;gt; artistCredits) throws SQLException {
 
         MbDocument doc = new MbDocument();
+
+        ObjectFactory of = new ObjectFactory();
+        Artist artist = of.createArtist();
+
         int artistId = rs.getInt("id");
         String artistGuid = rs.getString("gid");
         doc.addField(ArtistIndexField.ID, artistId);
         doc.addField(ArtistIndexField.ARTIST_ID, artistGuid);
+        artist.setId(artistGuid);
 
         String artistName = rs.getString("name");
-        doc.addField(ArtistIndexField.ARTIST, artistName );
+        doc.addField(ArtistIndexField.ARTIST, artistName);
+        artist.setName(artistName);
 
         //Accented artist
-        doc.addField(ArtistIndexField.ARTIST_ACCENT, artistName );
+        doc.addField(ArtistIndexField.ARTIST_ACCENT, artistName);
 
         String sortName = rs.getString("sort_name");
         doc.addField(ArtistIndexField.SORTNAME, sortName);
+        artist.setSortName(sortName);
 
         String type = rs.getString("type");
         doc.addFieldOrUnknown(ArtistIndexField.TYPE, type);
+        if (!Strings.isNullOrEmpty(type)) {
+            artist.setType(type);
+        }
 
-        if(rs.getBoolean("ended")) {
-           doc.addFieldOrUnknown(ArtistIndexField.ENDED, "true");
+        boolean ended = rs.getBoolean("ended");
+        doc.addFieldOrUnknown(ArtistIndexField.ENDED, Boolean.toString(ended));
+
+        String begin = Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day"));
+        doc.addNonEmptyField(ArtistIndexField.BEGIN, begin);
+
+        String end = Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day"));
+                doc.addNonEmptyField(ArtistIndexField.END, end);
+
+        LifeSpan lifespan = of.createLifeSpan();
+        artist.setLifeSpan(lifespan);
+        if(!Strings.isNullOrEmpty(begin)) {
+            lifespan.setBegin(begin);
         }
-        else {
-            doc.addFieldOrUnknown(ArtistIndexField.ENDED, "false");
+        if(!Strings.isNullOrEmpty(end)) {
+            lifespan.setBegin(end);
         }
+        lifespan.setEnded(Boolean.toString(ended));
 
-        doc.addNonEmptyField(ArtistIndexField.BEGIN,
-                Utils.formatDate(rs.getInt("begin_date_year"), rs.getInt("begin_date_month"), rs.getInt("begin_date_day")));
+        String comment = rs.getString("comment");
+        doc.addFieldOrNoValue(ArtistIndexField.COMMENT, comment);
+        if (!Strings.isNullOrEmpty(comment)) {
+            artist.setDisambiguation(comment);
+        }
 
-        doc.addNonEmptyField(ArtistIndexField.END,
-                Utils.formatDate(rs.getInt("end_date_year"), rs.getInt("end_date_month"), rs.getInt("end_date_day")));
-
-        doc.addFieldOrNoValue(ArtistIndexField.COMMENT, rs.getString("comment"));
-        doc.addFieldOrUnknown(ArtistIndexField.COUNTRY, rs.getString("country"));
-
+        String country = rs.getString("country");
+        doc.addFieldOrUnknown(ArtistIndexField.COUNTRY, country);
+        if (!Strings.isNullOrEmpty(country)) {
+            artist.setCountry(country.toUpperCase(Locale.US));
+        }
         String gender = rs.getString("gender");
         if (gender != null) {
             doc.addField(ArtistIndexField.GENDER, gender);
+            artist.setGender(gender);
         } else {
-            if( (type!=null) &amp;amp;&amp;amp; (type.equalsIgnoreCase(ArtistType.PERSON.getName())) ) {
+            if ((type != null) &amp;amp;&amp;amp; (type.equalsIgnoreCase(ArtistType.PERSON.getName()))) {
                 doc.addField(ArtistIndexField.GENDER, Index.UNKNOWN);
             }
         }
 
         if (aliases.containsKey(artistId)) {
-            for (String alias : aliases.get(artistId)) {
-                //Ignore artist credits that are identical to artist name
-                if(!alias.equalsIgnoreCase(artistName)) {
-                    doc.addField(ArtistIndexField.ALIAS, alias);
-                }
+            AliasList aliasList = of.createAliasList();
+            for (String aliasName : aliases.get(artistId)) {
+                doc.addField(ArtistIndexField.ALIAS, aliasName);
+
+                Alias alias = of.createAlias();
+                alias.setContent(aliasName);
+                aliasList.getAlias().add(alias);
             }
+            artist.setAliasList(aliasList);
         }
+
+        //Artist Credits are added for search only
+        if (artistCredits.containsKey(artistId)) {
+            for (String artistCredit : artistCredits.get(artistId)) {
+
+                //Add alias even if same as artist
+                doc.addField(ArtistIndexField.ALIAS, artistCredit);
+            }
+        }
+
         addArtistInitialized(type, artistName, sortName, doc);
 
         if (tags.containsKey(artistId)) {
-            for (Tag tag : tags.get(artistId)) {
-                doc.addField(ArtistIndexField.TAG, tag.getName());
-                doc.addField(ArtistIndexField.TAGCOUNT, tag.getCount().toString());
+            TagList tagList = of.createTagList();
+            for (Tag nextTag : tags.get(artistId)) {
+                Tag tag = of.createTag();
+                doc.addField(ArtistIndexField.TAG, nextTag.getName());
+                tag.setName(nextTag.getName());
+                tag.setCount(new BigInteger(nextTag.getCount().toString()));
+                tagList.getTag().add(tag);
             }
+            artist.setTagList(tagList);
         }
 
         if (ipiCodes.containsKey(artistId)) {
+            IpiList ipiList = of.createIpiList();
             for (String ipiCode : ipiCodes.get(artistId)) {
                 doc.addField(ArtistIndexField.IPI, ipiCode);
+                ipiList.getIpi().add(ipiCode);
             }
+            artist.setIpiList(ipiList);
         }
 
 
         ArtistBoostDoc.boost(artistGuid, doc);
+
+        String store = MMDSerializer.serialize(artist);
+        doc.addField(ArtistIndexField.ARTIST_STORE, store);
+
         return doc.getLuceneDocument();
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -290,33 +359,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * can be latin encoded and has a sortname containing a comma indicating probably a real name rather than a
      * performance name
      *
+     * This is only used for searching, not returned in the list of aliases as output because it is not actually
+     * a real alias, just one we have added to help searching
+     *
      * &amp;lt; at &amp;gt;param type
      * &amp;lt; at &amp;gt;param artistName
      * &amp;lt; at &amp;gt;param sortName
      * &amp;lt; at &amp;gt;param doc
      */
-    private void addArtistInitialized(String type, String artistName, String sortName, MbDocument doc)
-    {
-        if(type==null || !type.equals(PERSON))
-        {
+
+    private void addArtistInitialized(String type, String artistName, String sortName, MbDocument doc) {
+        if (type == null || !type.equals(PERSON)) {
             return;
         }
 
-        try
-        {
+        try {
             latinEncoder.encode(CharBuffer.wrap(artistName));
-        }
-        catch(CharacterCodingException cdd)
-        {
+        } catch (CharacterCodingException cdd) {
             return;
         }
 
-        if(sortName.contains(","))
-        {
+        if (sortName.contains(",")) {
             String[] names = artistName.split(" ");
-            if(names.length&amp;gt;=2)
-            {
-                doc.addField(ArtistIndexField.ALIAS, names[0].substring(0,1) + ' ' + names[names.length - 1]);
+            if (names.length &amp;gt;= 2) {
+                doc.addField(ArtistIndexField.ALIAS, names[0].substring(0, 1) + ' ' + names[names.length - 1]);
             }
         }
     }

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndexField.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndexField.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -43,21 +43,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 public enum ArtistIndexField implements IndexField {
 
 ID    ("_id",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    ALIAS    ("alias",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    ALIAS    ("alias",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_ID    ("arid",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     ARTIST    ("artist",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzAnalyzer()),
     ARTIST_ACCENT   ("artistaccent",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzKeepAccentsAnalyzer()),
-    BEGIN    ("begin",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    COMMENT    ("comment",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    COUNTRY         ("country",     MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    END    ("end",MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    ENDED           ("ended",       MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    GENDER          ("gender",      MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    IPI             ("ipi",         MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    SORTNAME    ("sortname",MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    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()),
+    BEGIN    ("begin",MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    COMMENT    ("comment",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    COUNTRY         ("country",     MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    END    ("end",MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    ENDED           ("ended",       MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    GENDER          ("gender",      MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    IPI             ("ipi",         MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    SORTNAME    ("sortname",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    TAG        ("tag",    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    TYPE    ("type",MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    ARTIST_STORE    ("artiststore", MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
     ;
 
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -216,10 +216,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 
         if(rs.getBoolean("ended")) {
-            doc.addFieldOrUnknown(ArtistIndexField.ENDED, "true");
+            doc.addFieldOrUnknown(LabelIndexField.ENDED, "true");
         }
         else {
-            doc.addFieldOrUnknown(ArtistIndexField.ENDED, "false");
+            doc.addFieldOrUnknown(LabelIndexField.ENDED, "false");
         }
 
         doc.addNonEmptyField(LabelIndexField.BEGIN,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -251,7 +251,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         if (ipiCodes.containsKey(labelId)) {
             for (String ipiCode : ipiCodes.get(labelId)) {
-                doc.addField(ArtistIndexField.IPI, ipiCode);
+                doc.addField(LabelIndexField.IPI, ipiCode);
             }
         }
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,7 +19,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     ARTIST                  ("artist",              MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_NAME             ("artistname",    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_NAMECREDIT       ("creditname",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    ARTIST_CREDIT           ("artistcredit",        MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
     COMMENT            ("comment",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
     COUNTRY        ("country",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     DURATION    ("dur",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -44,8 +43,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     RELEASE_TYPE            ("type",                MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     RELEASEGROUP_ID        ("rgid",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     TAG                ("tag",            MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    TRACKNUM    ("tnum",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED, new KeywordAnalyzer()),
-    TRACK_ID                ("tid",            MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    TRACKNUM    ("tnum",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    TRACK_ID                ("tid",            MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     RECORDING_STORE     ("recordingstore",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
 
 

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.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -646,8 +646,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
         buildClock.suspend();
         storeClock.resume();
-        String json = MMDSerializer.serialize(release);
-        doc.addField(ReleaseIndexField.RELEASE_STORE, json);
+        String store = MMDSerializer.serialize(release);
+        doc.addField(ReleaseIndexField.RELEASE_STORE, store);
         storeClock.suspend();
         return doc.getLuceneDocument();
     }

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,6 +6,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Test;
+import org.musicbrainz.mmd2.Artist;
+import org.musicbrainz.mmd2.Release;
 
 import java.sql.Statement;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -123,20 +125,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertEquals(2, ir.numDocs());
         {
             Document doc = ir.document(1);
-            assertEquals(0, doc.getFields(ArtistIndexField.ALIAS.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST_ID.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.SORTNAME.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.BEGIN.getName()).length);
-            assertEquals(0, doc.getFields(ArtistIndexField.END.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.COMMENT.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.TYPE.getName()).length);
-
-            assertEquals("Farming Incident", doc.getField(ArtistIndexField.ARTIST.getName()).stringValue());
-            assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.getField(ArtistIndexField.ARTIST_ID.getName()).stringValue());
-            assertEquals("Farming Incident", doc.getField(ArtistIndexField.SORTNAME.getName()).stringValue());
-            assertEquals("1999-04", doc.getField(ArtistIndexField.BEGIN.getName()).stringValue());
-            assertEquals("Group", doc.getField(ArtistIndexField.TYPE.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.ARTIST, "farming");
+            checkTermX(ir, ArtistIndexField.ARTIST, "incident",1);
+            checkTerm(ir, ArtistIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            checkTerm(ir, ArtistIndexField.SORTNAME, "farming");
+            checkTermX(ir, ArtistIndexField.SORTNAME, "incident", 1);
+            checkTerm(ir, ArtistIndexField.BEGIN, "1999-04");
+            checkTerm(ir, ArtistIndexField.TYPE, "group");
         }
         ir.close();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -152,9 +147,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.TYPE.getName()).length);
-            assertEquals("Group", doc.getField(ArtistIndexField.TYPE.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.TYPE, "group");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -169,9 +162,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.COMMENT.getName()).length);
-            assertEquals("a comment", doc.getField(ArtistIndexField.COMMENT.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.COMMENT, "a");
+            checkTermX(ir, ArtistIndexField.COMMENT, "comment", 1);
+
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -186,9 +179,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             IndexReader ir = DirectoryReader.open(ramDir);
             assertEquals(2, ir.numDocs());
             {
-                Document doc = ir.document(1);
-                assertEquals(1, doc.getFields(ArtistIndexField.COUNTRY.getName()).length);
-                assertEquals("af", doc.getField(ArtistIndexField.COUNTRY.getName()).stringValue());
+                checkTerm(ir, ArtistIndexField.COUNTRY, "af");
             }
             ir.close();
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -204,9 +195,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 IndexReader ir = DirectoryReader.open(ramDir);
                 assertEquals(2, ir.numDocs());
                 {
+                    checkTerm(ir, ArtistIndexField.IPI, "10001");
                     Document doc = ir.document(1);
-                    assertEquals(1, doc.getFields(ArtistIndexField.IPI.getName()).length);
-                    assertEquals("10001", doc.getField(ArtistIndexField.IPI.getName()).stringValue());
                 }
                 ir.close();
             }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -221,9 +211,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             IndexReader ir = DirectoryReader.open(ramDir);
             assertEquals(2, ir.numDocs());
             {
-                Document doc = ir.document(1);
-                assertEquals(1, doc.getFields(ArtistIndexField.COUNTRY.getName()).length);
-                assertEquals("unknown", doc.getField(ArtistIndexField.COUNTRY.getName()).stringValue());
+                checkTerm(ir, ArtistIndexField.COUNTRY, "unknown");
             }
             ir.close();
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -238,9 +226,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.GENDER.getName()).length);
-            assertEquals("male", doc.getField(ArtistIndexField.GENDER.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.GENDER, "male");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -255,9 +241,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.GENDER.getName()).length);
-            assertEquals("unknown", doc.getField(ArtistIndexField.GENDER.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.GENDER, "unknown");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -295,22 +279,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(4, doc.getFields(ArtistIndexField.ALIAS.getName()).length); //aliases are searchable but not stored
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST_ID.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.SORTNAME.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.BEGIN.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.END.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.COMMENT.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.TYPE.getName()).length);
+            checkTerm(ir, ArtistIndexField.ALIAS, "and");
 
-            assertEquals("Echo &amp;amp; The Bunnymen", doc.getField(ArtistIndexField.ARTIST.getName()).stringValue());
-            assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", doc.getField(ArtistIndexField.ARTIST_ID.getName()).stringValue());
-            assertEquals("Echo &amp;amp; The Bunnymen", doc.getField(ArtistIndexField.SORTNAME.getName()).stringValue());
-            assertEquals("1978", doc.getField(ArtistIndexField.BEGIN.getName()).stringValue());
-            assertEquals("Group", doc.getField(ArtistIndexField.TYPE.getName()).stringValue());
-            assertEquals("a comment", doc.getField(ArtistIndexField.COMMENT.getName()).stringValue());
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -330,9 +300,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.BEGIN.getName()).length);
-            assertEquals("1978", doc.getField(ArtistIndexField.BEGIN.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.BEGIN, "1978");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -352,9 +320,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.ENDED.getName()).length);
-            assertEquals("true", doc.getField(ArtistIndexField.ENDED.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.ENDED, "true");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -375,9 +341,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.ENDED.getName()).length);
-            assertEquals("false", doc.getField(ArtistIndexField.ENDED.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.ENDED, "false");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -399,9 +363,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.END.getName()).length);
-            assertEquals("1995", doc.getField(ArtistIndexField.END.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.END, "1995");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -421,9 +383,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.TYPE.getName()).length);
-            assertEquals("Person", doc.getField(ArtistIndexField.TYPE.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.TYPE, "person");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -444,9 +404,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.COMMENT.getName()).length);
-            assertEquals("-", doc.getField(ArtistIndexField.COMMENT.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.COMMENT, "-");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -489,15 +447,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
+
+
             Document doc = ir.document(1);
             assertEquals(0, doc.getFields(ArtistIndexField.END.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.COMMENT.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.TYPE.getName()).length);
-
-            assertEquals("Siobhan Lynch", doc.getField(ArtistIndexField.ARTIST.getName()).stringValue());
-            assertEquals("ae8707b6-684c-4d4a-95c5-d117970a6dfe", doc.getField(ArtistIndexField.ARTIST_ID.getName()).stringValue());
-            assertEquals("Lynch, Siobhan", doc.getField(ArtistIndexField.SORTNAME.getName()).stringValue());
-            assertEquals("Person", doc.getField(ArtistIndexField.TYPE.getName()).stringValue());
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -517,11 +470,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.SORTNAME.getName()).length);
-            assertEquals("Siobhan Lynch", doc.getField(ArtistIndexField.ARTIST.getName()).stringValue());
-            assertEquals("Lynch, Siobhan", doc.getField(ArtistIndexField.SORTNAME.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.ARTIST, "lynch");
+            checkTermX(ir, ArtistIndexField.ARTIST, "siobhan", 1);
+
+            checkTerm(ir, ArtistIndexField.SORTNAME, "lynch");
+            checkTermX(ir, ArtistIndexField.SORTNAME, "siobhan",1);
+
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -542,12 +496,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.TAG.getName()).length);
-            assertEquals("Goth", doc.getField(ArtistIndexField.TAG.getName()).stringValue());
-            assertEquals(1, doc.getFields(ArtistIndexField.TAGCOUNT.getName()).length);
-            assertEquals("10", doc.getField(ArtistIndexField.TAGCOUNT.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.TAG, "goth");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -567,11 +516,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST.getName()).length);
-            assertEquals(1, doc.getFields(ArtistIndexField.ALIAS.getName()).length);
-            assertEquals("S Lynch", doc.getField(ArtistIndexField.ALIAS.getName()).stringValue());
+            checkTerm(ir, ArtistIndexField.ALIAS, "lynch");
+            checkTermX(ir, ArtistIndexField.ALIAS, "s", 1);
 
+
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -591,8 +539,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
+
             Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(ArtistIndexField.ARTIST.getName()).length);
             assertEquals(0, doc.getFields(ArtistIndexField.ALIAS.getName()).length);
         }
         ir.close();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -617,4 +565,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("12", doc.getField(MetaIndexField.SCHEMA_SEQUENCE.getName()).stringValue());
         }
     }
+
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredArtist() throws Exception {
+
+        addArtistOne();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
+            Document doc = ir.document(1);
+            Artist artist = (Artist) MMDSerializer.unserialize(doc.get(ArtistIndexField.ARTIST_STORE.getName()), Artist.class);
+            assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", artist.getId());
+            assertEquals("Farming Incident", artist.getName());
+            assertEquals("AF", artist.getCountry());
+
+
+        }
+        ir.close();
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ArtistMmd1XmlWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ArtistMmd1XmlWriter.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ArtistMmd1XmlWriter.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,10 +28,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.servlet.mmd1;
 
+import com.google.common.base.Strings;
 import com.jthink.brainz.mmd.*;
 import org.apache.commons.lang.StringUtils;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.ArtistIndexField;
+import org.musicbrainz.search.index.MMDSerializer;
+import org.musicbrainz.search.index.ReleaseIndexField;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -53,49 +56,40 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             MbDocument doc = result.getDoc();
             Artist artist = of.createArtist();
 
-            artist.setId(doc.get(ArtistIndexField.ARTIST_ID));
-
-            String artype = doc.get(ArtistIndexField.TYPE);
-            if (isNotUnknown(artype)) {
-                artist.setType(StringUtils.capitalize(artype));
-            }
-
             result.setNormalizedScore(results.getMaxScore());
             artist.getOtherAttributes().put(getScore(), String.valueOf(result.getNormalizedScore()));
 
-            String name = doc.get(ArtistIndexField.ARTIST);
-            if (name != null) {
-                artist.setName(name);
+            org.musicbrainz.mmd2.Artist artistv2
+                    = (org.musicbrainz.mmd2.Artist) MMDSerializer.unserialize(doc.get(ArtistIndexField.ARTIST_STORE), org.musicbrainz.mmd2.Artist.class);
+            artist.setId(artistv2.getId());
+            artist.setType(StringUtils.capitalize(artistv2.getType()));
+            artist.setName(artistv2.getName());
 
+            if(!Strings.isNullOrEmpty(artistv2.getSortName())) {
+                artist.setSortName(artistv2.getSortName());
             }
 
-            String sortname = doc.get(ArtistIndexField.SORTNAME);
-            if (sortname != null) {
-                artist.setSortName(sortname);
-
+            if(!Strings.isNullOrEmpty(artistv2.getDisambiguation())) {
+                artist.setDisambiguation(artistv2.getDisambiguation());
             }
 
-            String begin = doc.get(ArtistIndexField.BEGIN);
-            String end = doc.get(ArtistIndexField.END);
-            if (begin != null || end != null) {
-                LifeSpan lifespan = of.createLifeSpan();
-                if (begin != null) {
-                    lifespan.setBegin(begin);
+            if(artistv2.getLifeSpan()!=null) {
+                String begin = artistv2.getLifeSpan().getBegin();
+                String end = artistv2.getLifeSpan().getEnd();
+                if (begin != null || end != null) {
+                    LifeSpan lifespan = of.createLifeSpan();
+                    if (begin != null) {
+                        lifespan.setBegin(begin);
 
-                }
-                if (end != null) {
-                    lifespan.setEnd(end);
+                    }
+                    if (end != null) {
+                        lifespan.setEnd(end);
 
-                }
-                artist.setLifeSpan(lifespan);
-
+                    }
+                    artist.setLifeSpan(lifespan);
+               }
             }
 
-            String comment = doc.get(ArtistIndexField.COMMENT);
-            if (isNotNoValue(comment)) {
-                artist.setDisambiguation(comment);
-            }
-
             artistList.getArtist().add(artist);
 
         }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,6 +32,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.ArtistIndexField;
+import org.musicbrainz.search.index.MMDSerializer;
+import org.musicbrainz.search.index.ReleaseIndexField;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,108 +91,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      */
     public void write(List list, Result result) throws IOException
     {
-        ObjectFactory of = new ObjectFactory();
-
         MbDocument doc = result.getDoc();
-        Artist artist = of.createArtist();
-
-        artist.setId(doc.get(ArtistIndexField.ARTIST_ID));
+        Artist artist = (Artist) MMDSerializer.unserialize(doc.get(ArtistIndexField.ARTIST_STORE), Artist.class);
         artist.setScore(String.valueOf(result.getNormalizedScore()));
-
-        String artype = doc.get(ArtistIndexField.TYPE);
-        if (isNotUnknown(artype))
-        {
-            artist.setType(artype);
-        }
-
-        String gender = doc.get(ArtistIndexField.GENDER);
-        if (isNotUnknown(gender))
-        {
-            artist.setGender(gender);
-        }
-
-        String country = doc.get(ArtistIndexField.COUNTRY);
-        if (isNotUnknown(country))
-        {
-            artist.setCountry(country.toUpperCase(Locale.US));
-
-        }
-
-        String name = doc.get(ArtistIndexField.ARTIST);
-        if (name != null)
-        {
-            artist.setName(name);
-        }
-
-        String[] ipiCodes = doc.getValues(ArtistIndexField.IPI);
-        if (ipiCodes.length &amp;gt; 0)
-        {
-            IpiList ipiList = of.createIpiList();
-            for (int i = 0; i &amp;lt; ipiCodes.length; i++)
-            {
-                ipiList.getIpi().add(ipiCodes[i]);
-            }
-            artist.setIpiList(ipiList);
-        }
-
-        String sortname = doc.get(ArtistIndexField.SORTNAME);
-        if (sortname != null)
-        {
-            artist.setSortName(sortname);
-
-        }
-
-        String begin = doc.get(ArtistIndexField.BEGIN);
-        String end = doc.get(ArtistIndexField.END);
-        String ended = doc.get(ArtistIndexField.ENDED);
-
-        LifeSpan lifespan = of.createLifeSpan();
-        artist.setLifeSpan(lifespan);
-
-        if (begin != null)
-        {
-            lifespan.setBegin(begin);
-        }
-
-        if (end != null)
-        {
-            lifespan.setEnd(end);
-        }
-        lifespan.setEnded(ended);
-
-        String comment = doc.get(ArtistIndexField.COMMENT);
-        if (isNotNoValue(comment))
-        {
-            artist.setDisambiguation(comment);
-        }
-
-        String[] aliases = doc.getValues(ArtistIndexField.ALIAS);
-        if (aliases.length &amp;gt; 0)
-        {
-            AliasList aliasList = of.createAliasList();
-            for (int i = 0; i &amp;lt; aliases.length; i++)
-            {
-                Alias alias = of.createAlias();
-                alias.setContent(aliases[i]);
-                aliasList.getAlias().add(alias);
-            }
-            artist.setAliasList(aliasList);
-        }
-
-        String[] tags = doc.getValues(ArtistIndexField.TAG);
-        String[] tagCounts = doc.getValues(ArtistIndexField.TAGCOUNT);
-        if (tags.length &amp;gt; 0)
-        {
-            TagList tagList = of.createTagList();
-            for (int i = 0; i &amp;lt; tags.length; i++)
-            {
-                Tag tag = of.createTag();
-                tag.setName(tags[i]);
-                tag.setCount(new BigInteger(tagCounts[i]));
-                tagList.getTag().add(tag);
-            }
-            artist.setTagList(tagList);
-        }
         list.add(artist);
     }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -7,6 +7,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.math.BigInteger;
 import java.util.Date;
 
 import org.apache.lucene.analysis.Analyzer;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,592 +17,614 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Before;
 import org.junit.Test;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.LuceneVersion;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.MusicbrainzSimilarity;
-import org.musicbrainz.search.index.ArtistIndexField;
-import org.musicbrainz.search.index.ArtistType;
-import org.musicbrainz.search.index.DatabaseIndex;
-import org.musicbrainz.search.index.MetaIndexField;
+import org.musicbrainz.search.index.*;
 import org.musicbrainz.search.servlet.mmd1.ArtistMmd1XmlWriter;
 import org.musicbrainz.search.servlet.mmd1.Mmd1XmlWriter;
 import org.musicbrainz.search.servlet.mmd2.ResultsWriter;
+
 /**
  * Test retrieving artist from index and Outputting as Xml
  */
 public class FindArtistTest {
 
-  private AbstractSearchServer ss;
-  private AbstractDismaxSearchServer sd;
+    private AbstractSearchServer ss;
+    private AbstractDismaxSearchServer sd;
 
 
-  &amp;lt; at &amp;gt;Before
-  public void setUp() throws Exception {
-    RAMDirectory ramDir = new RAMDirectory();
-    Analyzer analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
-    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION,analyzer);
-    writerConfig.setSimilarity(new MusicbrainzSimilarity());
-    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+    &amp;lt; at &amp;gt;Before
+    public void setUp() throws Exception {
+        ObjectFactory of = new ObjectFactory();
+        RAMDirectory ramDir = new RAMDirectory();
+        Analyzer analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
+        IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+        writerConfig.setSimilarity(new MusicbrainzSimilarity());
+        IndexWriter writer = new IndexWriter(ramDir, writerConfig);
 
 
-    //General Purpose Artist
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST, "Farming Incident");
-      doc.addField(ArtistIndexField.SORTNAME, "Incident, Farming");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.ENDED, "true");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
-      doc.addField(ArtistIndexField.IPI,"1002");
+        //General Purpose Artist
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST, "Farming Incident");
+            doc.addField(ArtistIndexField.SORTNAME, "Incident, Farming");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.ENDED, "true");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            doc.addField(ArtistIndexField.IPI, "1001");
+            doc.addField(ArtistIndexField.IPI, "1002");
 
-      writer.addDocument(doc.getLuceneDocument());
+            Artist artist = of.createArtist();
+            artist.setId("4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Farming Incident");
+            artist.setSortName("Incident, Farming");
+            LifeSpan lifespan = of.createLifeSpan();
+            lifespan.setBegin("1999-04");
+            lifespan.setEnded("true");
+            artist.setLifeSpan(lifespan);
+            artist.setType("Group");
+            artist.setDisambiguation("the real one");
+            artist.setCountry("AF");
+            artist.setGender("male");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("thrash");
+            tag.setCount(BigInteger.valueOf(5));
+            tagList.getTag().add(tag);
+
+            tag = of.createTag();
+            tag.setName("güth");
+            tag.setCount(BigInteger.valueOf(11));
+            tagList.getTag().add(tag);
+            artist.setTagList(tagList);
+
+            IpiList ipiList = of.createIpiList();
+            ipiList.getIpi().add("1001");
+            ipiList.getIpi().add("1002");
+            artist.setIpiList(ipiList);
+
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        //Artist with &amp;amp; on name and aliases
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "ccd4879c-5e88-4385-b131-bf65296bf245");
+            doc.addField(ArtistIndexField.ARTIST, "Echo &amp;amp; The Bunnymen");
+            doc.addField(ArtistIndexField.SORTNAME, "Echo &amp;amp; The Bunnymen");
+            doc.addField(ArtistIndexField.BEGIN, "1978");
+            doc.addField(ArtistIndexField.COUNTRY, "unknown");
+            doc.addField(ArtistIndexField.TYPE, ArtistType.GROUP.getName());
+            doc.addField(ArtistIndexField.ALIAS, "Echo And The Bunnymen");
+            doc.addField(ArtistIndexField.ALIAS, "Echo &amp;amp; The Bunnyman");
+            doc.addField(ArtistIndexField.ALIAS, "Echo and The Bunymen");
+            doc.addField(ArtistIndexField.ALIAS, "Echo &amp;amp; The Bunymen");
+
+            Artist artist = of.createArtist();
+            artist.setId("ccd4879c-5e88-4385-b131-bf65296bf245");
+
+            artist.setName("Echo &amp;amp; The Bunnymen");
+            artist.setSortName("Echo &amp;amp; The Bunnymen");
+            LifeSpan lifespan = of.createLifeSpan();
+            lifespan.setBegin("1978");
+            artist.setLifeSpan(lifespan);
+            artist.setType("Group");
+
+            AliasList aliasList = of.createAliasList();
+            Alias alias = of.createAlias();
+            alias.setContent("Echo And The Bunnymen");
+            aliasList.getAlias().add(alias);
+
+            alias = of.createAlias();
+            alias.setContent("Echo &amp;amp; The Bunnyman");
+            aliasList.getAlias().add(alias);
+
+            alias = of.createAlias();
+            alias.setContent("Echo and The Bunymen");
+            aliasList.getAlias().add(alias);
+
+            alias = of.createAlias();
+            alias.setContent("Echo &amp;amp; The Bunymen");
+            aliasList.getAlias().add(alias);
+            artist.setAliasList(aliasList);
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        //Artist, type person unknown gender
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "dde4879c-5e88-4385-b131-bf65296bf245");
+            doc.addField(ArtistIndexField.ARTIST, "PJ Harvey");
+            doc.addField(ArtistIndexField.TYPE, "Person");
+            doc.addField(ArtistIndexField.GENDER, "unknown");
+
+            Artist artist = of.createArtist();
+            artist.setId("dde4879c-5e88-4385-b131-bf65296bf245");
+            artist.setName("PJ Harvey");
+            artist.setType("Person");
+
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+            doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        writer.close();
+        SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
+        ss = new ArtistSearch(searcherManager);
+        sd = new ArtistDismaxSearch(ss);
+
     }
 
-    //Artist with &amp;amp; on name and aliases
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "ccd4879c-5e88-4385-b131-bf65296bf245");
-      doc.addField(ArtistIndexField.ARTIST, "Echo &amp;amp; The Bunnymen");
-      doc.addField(ArtistIndexField.SORTNAME, "Echo &amp;amp; The Bunnymen");
-      doc.addField(ArtistIndexField.BEGIN, "1978");
-      doc.addField(ArtistIndexField.COUNTRY, "unknown");
-      doc.addField(ArtistIndexField.TYPE, ArtistType.GROUP.getName());
-      doc.addField(ArtistIndexField.ALIAS, "Echo And The Bunnymen");
-      doc.addField(ArtistIndexField.ALIAS, "Echo &amp;amp; The Bunnyman");
-      doc.addField(ArtistIndexField.ALIAS, "Echo and The Bunymen");
-      doc.addField(ArtistIndexField.ALIAS, "Echo &amp;amp; The Bunymen");
-      writer.addDocument(doc.getLuceneDocument());
+    protected String getArtistId(MbDocument doc) {
+        Artist artist = (Artist) MMDSerializer.unserialize(doc.get(ArtistIndexField.ARTIST_STORE), Artist.class);
+        return artist.getId();
     }
 
-    //Artist, type person unknown gender
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "dde4879c-5e88-4385-b131-bf65296bf245");
-      doc.addField(ArtistIndexField.ARTIST, "PJ Harvey");
-      doc.addField(ArtistIndexField.TYPE, ArtistType.PERSON.getName());
-      doc.addField(ArtistIndexField.GENDER, "unknown");
-      writer.addDocument(doc.getLuceneDocument());
+
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistById() throws Exception {
+        Results res = ss.search("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
     }
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
-      doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
-      writer.addDocument(doc.getLuceneDocument());
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByName() throws Exception {
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
     }
 
-    writer.close();
-    SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
-    ss = new ArtistSearch(searcherManager);
-    sd = new ArtistDismaxSearch(ss);
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxSingleTerm() throws Exception {
+        Results res = sd.search("Farming", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
+    }
 
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxPhrase() throws Exception {
+        Results res = sd.search("Farming Incident", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistById() throws Exception {
-    Results res = ss.search("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-    assertEquals("Farming Incident", doc.get(ArtistIndexField.ARTIST));
-    assertEquals("1999-04", doc.get(ArtistIndexField.BEGIN));
-    assertEquals("the real one", doc.get(ArtistIndexField.COMMENT));
-    assertNull(doc.get(ArtistIndexField.END));
-    assertNull(doc.get(ArtistIndexField.ALIAS));
-    assertEquals("Incident, Farming", doc.get(ArtistIndexField.SORTNAME));
-    assertEquals("Group", doc.get(ArtistIndexField.TYPE));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxFuzzy() throws Exception {
+        Results res = sd.search("Farmin", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByName() 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("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxSingleTerm() throws Exception {
-    Results res = sd.search("Farming", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistBySortName() throws Exception {
+        Results res = ss.search("sortname:\"Incident, Farming\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxPhrase() throws Exception {
-    Results res = sd.search("Farming Incident", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxFuzzy() throws Exception {
-    Results res = sd.search("Farmin", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistBySortName() throws Exception {
-    Results res = ss.search("sortname:\"Incident, Farming\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByType() throws Exception {
+        Results res = ss.search("type:\"group\"", 0, 10);
+        assertEquals(2, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByType() throws Exception {
-    Results res = ss.search("type:\"group\"", 0, 10);
-    assertEquals(2, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByIpi() throws Exception {
+        Results res = ss.search("ipi:1001", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByIpi() throws Exception {
-    Results res = ss.search("ipi:1001", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByNumericType() throws Exception {
-    Results res = ss.search("type:2", 0, 10);
-    assertEquals(2, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByNumericType() throws Exception {
+        Results res = ss.search("type:2", 0, 10);
+        assertEquals(2, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByBeginDate() throws Exception {
-    Results res = ss.search("begin:\"1999-04\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByEnded() throws Exception {
-    Results res = ss.search("ended:\"true\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByBeginDate() throws Exception {
+        Results res = ss.search("begin:\"1999-04\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByEndDate() throws Exception {
-    Results res = ss.search("end:\"1999-04\"", 0, 10);
-    assertEquals(0, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByEnded() throws Exception {
+        Results res = ss.search("ended:\"true\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByTypePerson() throws Exception {
-    Results res = ss.search("type:\"person\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByAlias() throws Exception {
-    Results res = ss.search("alias:\"Echo And The Bunnymen\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", doc.get(ArtistIndexField.ARTIST_ID));
 
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByEndDate() throws Exception {
+        Results res = ss.search("end:\"1999-04\"", 0, 10);
+        assertEquals(0, res.getTotalHits());
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByCountry() throws Exception {
-    Results res = ss.search("country:\"af\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-    assertEquals("Farming Incident", doc.get(ArtistIndexField.ARTIST));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByTypePerson() throws Exception {
+        Results res = ss.search("type:\"person\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("dde4879c-5e88-4385-b131-bf65296bf245", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistWithNoCountry() throws Exception {
-    Results res = ss.search("country:unknown", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistWithNoGender() throws Exception {
-    Results res = ss.search("gender:unknown", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("dde4879c-5e88-4385-b131-bf65296bf245", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByAlias() throws Exception {
+        Results res = ss.search("alias:\"Echo And The Bunnymen\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", getArtistId(res.results.get(0).getDoc()));
 
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByCountryUppercase() throws Exception {
-    Results res = ss.search("country:\"AF\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-    assertEquals("Farming Incident", doc.get(ArtistIndexField.ARTIST));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByGenderLowercase() throws Exception {
-    Results res = ss.search("gender:\"male\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-    assertEquals("Farming Incident", doc.get(ArtistIndexField.ARTIST));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByCountry() throws Exception {
+        Results res = ss.search("country:\"af\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByGenderTitlecase() throws Exception {
-    Results res = ss.search("gender:\"Male\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-    assertEquals("Farming Incident", doc.get(ArtistIndexField.ARTIST));
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByTag() throws Exception {
-    Results res = ss.search("tag:Thrash", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-    assertEquals("Farming Incident", doc.get(ArtistIndexField.ARTIST));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistWithNoCountry() throws Exception {
+        Results res = ss.search("country:unknown", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", getArtistId(res.results.get(0).getDoc()));
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByDefaultField() throws Exception {
+    }
 
-    //Matches on name field without it being specified
-    {
-      Results res = ss.search("\"Echo &amp;amp; The Bunnymen\"", 0, 10);
-      assertEquals(1, res.getTotalHits());
-      Result result = res.results.get(0);
-      MbDocument doc = result.getDoc();
-      assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", doc.get(ArtistIndexField.ARTIST_ID));
-      assertEquals("Echo &amp;amp; The Bunnymen", doc.get(ArtistIndexField.ARTIST));
-      assertEquals("1978", doc.get(ArtistIndexField.BEGIN));
-      assertEquals("Echo &amp;amp; The Bunnymen", doc.get(ArtistIndexField.SORTNAME));
-      assertEquals("group", doc.get(ArtistIndexField.TYPE));
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistWithNoGender() throws Exception {
+        Results res = ss.search("gender:unknown", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("dde4879c-5e88-4385-b131-bf65296bf245", getArtistId(res.results.get(0).getDoc()));
+
     }
 
-    //and alias field  field without it being specified
-    {
-      Results res = ss.search("\"Echo &amp;amp; The Bunnyman\"", 0, 10);
-      assertEquals(1, res.getTotalHits());
-      Result result = res.results.get(0);
-      MbDocument doc = result.getDoc();
-      assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", doc.get(ArtistIndexField.ARTIST_ID));
-      assertEquals("Echo &amp;amp; The Bunnymen", doc.get(ArtistIndexField.ARTIST));
-      assertEquals("1978", doc.get(ArtistIndexField.BEGIN));
-      assertEquals("Echo &amp;amp; The Bunnymen", doc.get(ArtistIndexField.SORTNAME));
-      assertEquals("group", doc.get(ArtistIndexField.TYPE));
+
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByCountryUppercase() throws Exception {
+        Results res = ss.search("country:\"AF\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
+
     }
 
-    //but doesn't search default fields if a field is specified
-    {
-      Results res = ss.search("type:\"Echo &amp;amp; The Bunnyman\"", 0, 10);
-      assertEquals(0, res.getTotalHits());
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByGenderLowercase() throws Exception {
+        Results res = ss.search("gender:\"male\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistByExcalamation() throws Exception {
-    Results res = ss.search("Farming\\!", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByGenderTitlecase() throws Exception {
+        Results res = ss.search("gender:\"Male\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  /**
-   * Tests get same results as
-   * http://musicbrainz.org/ws/1/artist/?type=xml&amp;amp;query=%22Farming%20Incident%22
-   *
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsMmd1Xml() throws Exception {
+    }
 
-    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
-    Mmd1XmlWriter v1Writer = new ArtistMmd1XmlWriter();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    v1Writer.write(pr, res);
-    pr.close();
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByTag() throws Exception {
+        Results res = ss.search("tag:Thrash", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-    String output = sw.toString();
-    System.out.println("Xml is" + output);
-    //assertTrue(output.contains("&amp;lt;artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));  group comes before id in output
-    //assertTrue(output.contains("&amp;lt;artist-list count=\"1\" offset=\"0\"&amp;gt;"));               offset comes before count in output
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("type=\"Group\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;life-span begin=\"1999-04\""));
-    assertFalse(output.contains("end"));
-    assertFalse(output.contains("alias"));
-    assertFalse(output.contains("disambugation"));
-  }
+    }
 
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByDefaultField() throws Exception {
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputXml() throws Exception {
+        //Matches on name field without it being specified
+        {
+            Results res = ss.search("\"Echo &amp;amp; The Bunnymen\"", 0, 10);
+            assertEquals(1, res.getTotalHits());
+            assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", getArtistId(res.results.get(0).getDoc()));
+        }
 
-    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
-    ResultsWriter v1Writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    v1Writer.write(pr, res);
-    pr.close();
+        //and alias field  field without it being specified
+        {
+            Results res = ss.search("\"Echo &amp;amp; The Bunnyman\"", 0, 10);
+            assertEquals(1, res.getTotalHits());
+            assertEquals("ccd4879c-5e88-4385-b131-bf65296bf245", getArtistId(res.results.get(0).getDoc()));
+        }
 
-    String output = sw.toString();
-    System.out.println("Xml1 is" + output);
-    assertTrue(output.contains("id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("type=\"Group\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;begin&amp;gt;1999-04&amp;lt;/begin&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;country&amp;gt;AF&amp;lt;/country&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;ended&amp;gt;true&amp;lt;/ended&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;gender&amp;gt;male&amp;lt;/gender&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;ipi-list&amp;gt;&amp;lt;ipi&amp;gt;1001&amp;lt;/ipi&amp;gt;&amp;lt;ipi&amp;gt;1002&amp;lt;/ipi&amp;gt;&amp;lt;/ipi-list&amp;gt;"));
-    assertTrue(output.contains("thrash&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("güth&amp;lt;/name&amp;gt;"));
-    assertFalse(output.contains("alias"));
-    assertFalse(output.contains("disambugation"));
-  }
+        //but doesn't search default fields if a field is specified
+        {
+            Results res = ss.search("type:\"Echo &amp;amp; The Bunnyman\"", 0, 10);
+            assertEquals(0, res.getTotalHits());
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputXml2() throws Exception {
+        }
+    }
 
-    Results res = ss.search("artist:\"Echo &amp;amp; the Bunnymen\"", 0, 1);
-    ResultsWriter v1Writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    v1Writer.write(pr, res);
-    pr.close();
-    String output = sw.toString();
-    System.out.println("Xml2 is" + output);
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("type=\"group\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;life-span&amp;gt;&amp;lt;begin&amp;gt;1978&amp;lt;/begin&amp;gt;&amp;lt;/life-span&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo And The Bunnymen&amp;lt;/alias&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo &amp;amp;amp; The Bunnyman&amp;lt;/alias&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo and The Bunymen&amp;lt;/alias&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo &amp;amp;amp; The Bunymen&amp;lt;/alias&amp;gt;"));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistByExcalamation() throws Exception {
+        Results res = ss.search("Farming\\!", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("4302e264-1cf0-4d1f-aca7-2a6f89e34b36", getArtistId(res.results.get(0).getDoc()));
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputXml3() throws Exception {
+    }
 
-    Results res = ss.search("artist:\"PJ Harvey\"", 0, 1);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res);
-    pr.close();
-    String output = sw.toString();
-    System.out.println("Xml3 is" + output);
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("type=\"person\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;PJ Harvey&amp;lt;/name&amp;gt;"));
-    assertFalse(output.contains("&amp;lt;gender&amp;gt;")); //Not shown because unknown
-  }
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/artist/?type=xml&amp;amp;query=%22Farming%20Incident%22
+     *
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsMmd1Xml() throws Exception {
 
-  /**
-   * Tests that &amp;amp; is converted to valid xml
-   *
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsMmd1XmlSpecialCharacters() throws Exception {
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
+        Mmd1XmlWriter v1Writer = new ArtistMmd1XmlWriter();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        v1Writer.write(pr, res);
+        pr.close();
 
-    Results res = ss.search("alias:\"Echo And The Bunnymen\"", 0, 1);
-    Mmd1XmlWriter v1Writer = ss.getMmd1Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    v1Writer.write(pr, res);
-    pr.close();
+        String output = sw.toString();
+        System.out.println("Xml is" + output);
+        //assertTrue(output.contains("&amp;lt;artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));  group comes before id in output
+        //assertTrue(output.contains("&amp;lt;artist-list count=\"1\" offset=\"0\"&amp;gt;"));               offset comes before count in output
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("type=\"Group\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;life-span begin=\"1999-04\""));
+        assertFalse(output.contains("end"));
+        assertFalse(output.contains("alias"));
+        assertFalse(output.contains("disambugation"));
+    }
 
-    String output = sw.toString();
-    //System.out.println("Xml is" + output);
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("type=\"Group\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/name&amp;gt;"));
-  }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJson() throws Exception {
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputXml() throws Exception {
 
-    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
-    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("artist:\"Farming Incident\"", 0, 1);
+        ResultsWriter v1Writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        v1Writer.write(pr, res);
+        pr.close();
 
-    String output = sw.toString();
-    System.out.println("Json is" + output);
+        String output = sw.toString();
+        System.out.println("Xml1 is" + output);
+        assertTrue(output.contains("id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("type=\"Group\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;begin&amp;gt;1999-04&amp;lt;/begin&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;country&amp;gt;AF&amp;lt;/country&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;ended&amp;gt;true&amp;lt;/ended&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;gender&amp;gt;male&amp;lt;/gender&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;ipi-list&amp;gt;&amp;lt;ipi&amp;gt;1001&amp;lt;/ipi&amp;gt;&amp;lt;ipi&amp;gt;1002&amp;lt;/ipi&amp;gt;&amp;lt;/ipi-list&amp;gt;"));
+        assertTrue(output.contains("thrash&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("güth&amp;lt;/name&amp;gt;"));
+        assertFalse(output.contains("alias"));
+        assertFalse(output.contains("disambugation"));
+    }
 
-    assertTrue(output.contains("id\":\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
-    assertTrue(output.contains("\"type\":\"Group\""));
-    assertTrue(output.contains("name\":\"Farming Incident\""));
-    assertTrue(output.contains("\"sort-name\":\"Incident, Farming\""));
-    assertTrue(output.contains("\"begin\":\"1999-04\""));
-    assertTrue(output.contains("\"ended\":\"true\""));
-    assertTrue(output.contains("\"country\":\"AF\""));
-    assertTrue(output.contains("\"gender\":\"male\""));
-    assertTrue(output.contains("\"tag\":[{\"count\":5,\"name\":\"thrash\"},{\"count\":11,\"name\":\"güth\"}"));
-  }
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputXml2() throws Exception {
 
+        Results res = ss.search("artist:\"Echo &amp;amp; the Bunnymen\"", 0, 1);
+        ResultsWriter v1Writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        v1Writer.write(pr, res);
+        pr.close();
+        String output = sw.toString();
+        System.out.println("Xml2 is" + output);
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("type=\"Group\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;life-span&amp;gt;&amp;lt;begin&amp;gt;1978&amp;lt;/begin&amp;gt;&amp;lt;/life-span&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo And The Bunnymen&amp;lt;/alias&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo &amp;amp;amp; The Bunnyman&amp;lt;/alias&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo and The Bunymen&amp;lt;/alias&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;alias&amp;gt;Echo &amp;amp;amp; The Bunymen&amp;lt;/alias&amp;gt;"));
+    }
 
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputXml3() throws Exception {
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonMultiple() throws Exception {
-    Results res = ss.search("artist:\"Farming Incident\" OR artist:\"Echo &amp;amp; The Bunnymen\"", 0, 2);
+        Results res = ss.search("artist:\"PJ Harvey\"", 0, 1);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res);
+        pr.close();
+        String output = sw.toString();
+        System.out.println("Xml3 is" + output);
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("type=\"Person\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;PJ Harvey&amp;lt;/name&amp;gt;"));
+        assertFalse(output.contains("&amp;lt;gender&amp;gt;")); //Not shown because unknown
+    }
 
-    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();
-    assertTrue(output.contains("\"score\":\"100\""));
-    assertTrue(output.contains("\"score\":\"31\""));
-  }
+    /**
+     * Tests that &amp;amp; is converted to valid xml
+     *
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsMmd1XmlSpecialCharacters() throws Exception {
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNew() throws Exception {
+        Results res = ss.search("alias:\"Echo And The Bunnymen\"", 0, 1);
+        Mmd1XmlWriter v1Writer = ss.getMmd1Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        v1Writer.write(pr, res);
+        pr.close();
 
-    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
-    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("Xml is" + output);
+        assertTrue(output.contains("count=\"1\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("type=\"Group\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Echo &amp;amp;amp; The Bunnymen&amp;lt;/name&amp;gt;"));
+    }
 
-    String output = sw.toString();
-    System.out.println("JNew is" + output);
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJson() throws Exception {
 
-    assertTrue(output.contains("id\":\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("\"type\":\"Group\""));
-    assertTrue(output.contains("name\":\"Farming Incident\""));
-    assertTrue(output.contains("\"sort-name\":\"Incident, Farming\""));
-    assertTrue(output.contains("\"begin\":\"1999-04\""));
-    assertTrue(output.contains("\"ended\":true"));
-    assertTrue(output.contains("\"country\":\"AF\""));
-    assertTrue(output.contains("\"gender\":\"male\""));
-    assertTrue(output.contains("\"tags\":[{"));
-    assertTrue(output.contains("\"count\":5"));
-    assertTrue(output.contains("\"name\":\"thrash\""));
-    assertTrue(output.contains("\"name\":\"güth\""));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0"));
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
+        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);
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNewPretty() throws Exception {
+        assertTrue(output.contains("id\":\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("\"type\":\"Group\""));
+        assertTrue(output.contains("name\":\"Farming Incident\""));
+        assertTrue(output.contains("\"sort-name\":\"Incident, Farming\""));
+        assertTrue(output.contains("\"begin\":\"1999-04\""));
+        assertTrue(output.contains("\"ended\":\"true\""));
+        assertTrue(output.contains("\"country\":\"AF\""));
+        assertTrue(output.contains("\"gender\":\"male\""));
+        assertTrue(output.contains("\"tag\":[{\"count\":5,\"name\":\"thrash\"},{\"count\":11,\"name\":\"güth\"}"));
+    }
 
-    Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
-    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("\"offset\" : 0"));
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonMultiple() throws Exception {
+        Results res = ss.search("artist:\"Farming Incident\" OR artist:\"Echo &amp;amp; The Bunnymen\"", 0, 2);
 
-  }
+        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();
+        assertTrue(output.contains("\"score\":\"100\""));
+        assertTrue(output.contains("\"score\":\"31\""));
+    }
 
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNew() throws Exception {
 
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW);
+        pr.close();
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNewPrettyWithAliases() throws Exception {
+        String output = sw.toString();
+        System.out.println("JNew is" + output);
 
-    Results res = ss.search("arid:ccd4879c-5e88-4385-b131-bf65296bf245", 0, 1);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW, true);
-    pr.close();
+        assertTrue(output.contains("id\":\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("\"type\":\"Group\""));
+        assertTrue(output.contains("name\":\"Farming Incident\""));
+        assertTrue(output.contains("\"sort-name\":\"Incident, Farming\""));
+        assertTrue(output.contains("\"begin\":\"1999-04\""));
+        assertTrue(output.contains("\"ended\":true"));
+        assertTrue(output.contains("\"country\":\"AF\""));
+        assertTrue(output.contains("\"gender\":\"male\""));
+        assertTrue(output.contains("\"tags\":[{"));
+        assertTrue(output.contains("\"count\":5"));
+        assertTrue(output.contains("\"name\":\"thrash\""));
+        assertTrue(output.contains("\"name\":\"güth\""));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0"));
 
-    String output = sw.toString();
-    System.out.println("JSON New Pretty is" + output);
-    assertTrue(output.contains("\"sort-name\" : \"Echo &amp;amp; The Bunnymen\""));
-    assertTrue(output.contains("\"aliases\" : [ \"Echo And The Bunnymen\", \"Echo &amp;amp; The Bunnyman\", \"Echo and The Bunymen\", \"Echo &amp;amp; The Bunymen\" ]"));
-  }
+    }
 
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNewPretty() throws Exception {
+
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 1);
+        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("\"offset\" : 0"));
+
+    }
+
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNewPrettyWithAliases() throws Exception {
+
+        Results res = ss.search("arid:ccd4879c-5e88-4385-b131-bf65296bf245", 0, 1);
+        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("\"sort-name\" : \"Echo &amp;amp; The Bunnymen\""));
+        assertTrue(output.contains("\"aliases\" : [ \"Echo And The Bunnymen\", \"Echo &amp;amp; The Bunnyman\", \"Echo and The Bunymen\", \"Echo &amp;amp; The Bunymen\" ]"));
+    }
+
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167Test.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2,6 +2,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import static org.junit.Assert.assertEquals;
 
+import java.math.BigInteger;
 import java.util.Date;
 
 import org.apache.lucene.analysis.Analyzer;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -17,11 +18,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Before;
 import org.junit.Test;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.LuceneVersion;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.MusicbrainzSimilarity;
 import org.musicbrainz.search.index.ArtistIndexField;
 import org.musicbrainz.search.index.DatabaseIndex;
+import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.index.MetaIndexField;
 
 /**
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,368 +32,467 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 public class IssueSearch167Test {
 
-  private AbstractDismaxSearchServer sd;
+    private AbstractDismaxSearchServer sd;
 
-  &amp;lt; at &amp;gt;Before
-  public void setUp() throws Exception {
-    RAMDirectory ramDir = new RAMDirectory();
-    Analyzer analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
-    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION,analyzer);
-    writerConfig.setSimilarity(new MusicbrainzSimilarity());
-    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+    &amp;lt; at &amp;gt;Before
+    public void setUp() throws Exception {
+        ObjectFactory of = new ObjectFactory();
+        RAMDirectory ramDir = new RAMDirectory();
+        Analyzer analyzer = DatabaseIndex.getAnalyzer(ArtistIndexField.class);
+        IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+        writerConfig.setSimilarity(new MusicbrainzSimilarity());
+        IndexWriter writer = new IndexWriter(ramDir, writerConfig);
 
 
-    //General Purpose Artist
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "11111111-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST_ACCENT, "Republica");
-      doc.addField(ArtistIndexField.ARTIST, "Republica");
-      doc.addField(ArtistIndexField.SORTNAME, "Republica");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
+        //General Purpose Artist
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "11111111-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST_ACCENT, "Republica");
+            doc.addField(ArtistIndexField.ARTIST, "Republica");
+            doc.addField(ArtistIndexField.SORTNAME, "Republica");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            doc.addField(ArtistIndexField.IPI, "1001");
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            Artist artist = of.createArtist();
+            artist.setId("11111111-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Republica");
+            artist.setSortName("Republica");
+            LifeSpan lifespan = of.createLifeSpan();
+            lifespan.setBegin("1999-04");
+            lifespan.setEnded("false");
+            artist.setLifeSpan(lifespan);
+            artist.setType("Group");
+            artist.setDisambiguation("the real one");
+            artist.setCountry("AF");
+            artist.setGender("male");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("thrash");
+            tag.setCount(BigInteger.valueOf(5));
+            tagList.getTag().add(tag);
 
-    //General Purpose Artist
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "22222222-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST_ACCENT, "República");
-      doc.addField(ArtistIndexField.ARTIST, "República");
-      doc.addField(ArtistIndexField.SORTNAME, "República");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
+            tag = of.createTag();
+            tag.setName("güth");
+            tag.setCount(BigInteger.valueOf(11));
+            tagList.getTag().add(tag);
+            artist.setTagList(tagList);
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            IpiList ipiList = of.createIpiList();
+            ipiList.getIpi().add("1001");
+            artist.setIpiList(ipiList);
 
-    //General Purpose Artist
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "33333333-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST_ACCENT, "Repúblice");
-      doc.addField(ArtistIndexField.ARTIST, "Repúblice");
-      doc.addField(ArtistIndexField.SORTNAME, "Repúblice");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+        //General Purpose Artist
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "22222222-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST_ACCENT, "República");
+            doc.addField(ArtistIndexField.ARTIST, "República");
+            doc.addField(ArtistIndexField.SORTNAME, "República");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            doc.addField(ArtistIndexField.IPI, "1001");
 
-    //General Purpose Artist
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "44444444-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST_ACCENT, "Repúblic");
-      doc.addField(ArtistIndexField.ARTIST, "Repúblic");
-      doc.addField(ArtistIndexField.SORTNAME, "Repúblic");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
+            Artist artist = of.createArtist();
+            artist.setId("22222222-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Republica");
+            artist.setSortName("Republica");
+            LifeSpan lifespan = of.createLifeSpan();
+            lifespan.setBegin("1999-04");
+            lifespan.setEnded("false");
+            artist.setLifeSpan(lifespan);
+            artist.setType("Group");
+            artist.setDisambiguation("the real one");
+            artist.setCountry("AF");
+            artist.setGender("male");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("thrash");
+            tag.setCount(BigInteger.valueOf(5));
+            tagList.getTag().add(tag);
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            tag = of.createTag();
+            tag.setName("güth");
+            tag.setCount(BigInteger.valueOf(11));
+            tagList.getTag().add(tag);
+            artist.setTagList(tagList);
 
-    //For Phrase Searching Tests
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "55555555-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST_ACCENT, "echo &amp;amp; the bunnymen");
-      doc.addField(ArtistIndexField.ARTIST, "echo &amp;amp; the bunnymen");
-      doc.addField(ArtistIndexField.SORTNAME, "bunnymen, echo");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
+            IpiList ipiList = of.createIpiList();
+            ipiList.getIpi().add("1001");
+            artist.setIpiList(ipiList);
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-    //For Phrase Searching Tests
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(ArtistIndexField.ARTIST_ID, "66666666-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(ArtistIndexField.ARTIST_ACCENT, "echobelly");
-      doc.addField(ArtistIndexField.ARTIST, "echobelly");
-      doc.addField(ArtistIndexField.SORTNAME, "echobelly");
-      doc.addField(ArtistIndexField.BEGIN, "1999-04");
-      doc.addField(ArtistIndexField.TYPE, "Group");
-      doc.addField(ArtistIndexField.COMMENT, "the real one");
-      doc.addField(ArtistIndexField.COUNTRY, "AF");
-      doc.addField(ArtistIndexField.GENDER, "male");
-      doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
-      doc.addField(ArtistIndexField.IPI,"1001");
+        //General Purpose Artist
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "33333333-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST_ACCENT, "Repúblice");
+            doc.addField(ArtistIndexField.ARTIST, "Repúblice");
+            doc.addField(ArtistIndexField.SORTNAME, "Repúblice");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            ;
+            doc.addField(ArtistIndexField.IPI, "1001");
 
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            Artist artist = of.createArtist();
+            artist.setId("33333333-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Repúblice");
+            artist.setSortName("Repúblice");
+            LifeSpan lifespan = of.createLifeSpan();
+            lifespan.setBegin("1999-04");
+            lifespan.setEnded("false");
+            artist.setLifeSpan(lifespan);
+            artist.setType("Group");
+            artist.setDisambiguation("the real one");
+            artist.setCountry("AF");
+            artist.setGender("male");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("thrash");
+            tag.setCount(BigInteger.valueOf(5));
+            tagList.getTag().add(tag);
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
-        doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
-      writer.addDocument(doc.getLuceneDocument());
-    }
+            tag = of.createTag();
+            tag.setName("güth");
+            tag.setCount(BigInteger.valueOf(11));
+            tagList.getTag().add(tag);
+            artist.setTagList(tagList);
 
-    writer.close();
-    SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
-    sd = new ArtistDismaxSearch(new ArtistSearch(searcherManager));
-  }
+            IpiList ipiList = of.createIpiList();
+            ipiList.getIpi().add("1001");
+            artist.setIpiList(ipiList);
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismax1() throws Exception {
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Republica");
-      TopDocs topdocs = searcher.search(q, 10);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue());
-        System.out.println(explain);
-      }
-      assertEquals(4, topdocs.scoreDocs.length);
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-      org.apache.lucene.document.Document doc  = searcher.doc(topdocs.scoreDocs[0].doc);
-      assertEquals("11111111-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-      doc  = searcher.doc(topdocs.scoreDocs[1].doc);
-      assertEquals("22222222-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-    } finally {
-      searcherManager.release(searcher);
+        //General Purpose Artist
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "44444444-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST_ACCENT, "Repúblic");
+            doc.addField(ArtistIndexField.ARTIST, "Repúblic");
+            doc.addField(ArtistIndexField.SORTNAME, "Repúblic");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            doc.addField(ArtistIndexField.IPI, "1001");
+
+            Artist artist = of.createArtist();
+            artist.setId("44444444-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Repúblic");
+            artist.setSortName("Repúblic");
+            LifeSpan lifespan = of.createLifeSpan();
+            lifespan.setBegin("1999-04");
+            lifespan.setEnded("false");
+            artist.setLifeSpan(lifespan);
+            artist.setType("Group");
+            artist.setDisambiguation("the real one");
+            artist.setCountry("AF");
+            artist.setGender("male");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("thrash");
+            tag.setCount(BigInteger.valueOf(5));
+            tagList.getTag().add(tag);
+
+            tag = of.createTag();
+            tag.setName("güth");
+            tag.setCount(BigInteger.valueOf(11));
+            tagList.getTag().add(tag);
+            artist.setTagList(tagList);
+
+            IpiList ipiList = of.createIpiList();
+            ipiList.getIpi().add("1001");
+            artist.setIpiList(ipiList);
+
+            doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        //For Phrase Searching Tests
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "55555555-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST_ACCENT, "echo &amp;amp; the bunnymen");
+            doc.addField(ArtistIndexField.ARTIST, "echo &amp;amp; the bunnymen");
+            doc.addField(ArtistIndexField.SORTNAME, "bunnymen, echo");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            doc.addField(ArtistIndexField.IPI, "1001");
+
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        //For Phrase Searching Tests
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(ArtistIndexField.ARTIST_ID, "66666666-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(ArtistIndexField.ARTIST_ACCENT, "echobelly");
+            doc.addField(ArtistIndexField.ARTIST, "echobelly");
+            doc.addField(ArtistIndexField.SORTNAME, "echobelly");
+            doc.addField(ArtistIndexField.BEGIN, "1999-04");
+            doc.addField(ArtistIndexField.TYPE, "Group");
+            doc.addField(ArtistIndexField.COMMENT, "the real one");
+            doc.addField(ArtistIndexField.COUNTRY, "AF");
+            doc.addField(ArtistIndexField.GENDER, "male");
+            doc.addField(ArtistIndexField.TAG, "thrash");
+            doc.addField(ArtistIndexField.TAG, "güth");
+            doc.addField(ArtistIndexField.IPI, "1001");
+
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+            doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        writer.close();
+        SearcherManager searcherManager = new SearcherManager(ramDir, new MusicBrainzSearcherFactory(ResourceType.ARTIST));
+        sd = new ArtistDismaxSearch(new ArtistSearch(searcherManager));
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismax2() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismax1() throws Exception {
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("República");
-      TopDocs topdocs = searcher.search(q, 10);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue());
-        System.out.println(explain);
-      }
-      assertEquals(4, topdocs.scoreDocs.length);
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Republica");
+            TopDocs topdocs = searcher.search(q, 10);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue());
+                System.out.println(explain);
+            }
+            assertEquals(4, topdocs.scoreDocs.length);
 
-      org.apache.lucene.document.Document doc  = searcher.doc(topdocs.scoreDocs[0].doc);
-      assertEquals("22222222-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-      doc  = searcher.doc(topdocs.scoreDocs[1].doc);
-      assertEquals("11111111-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-      doc  = searcher.doc(topdocs.scoreDocs[2].doc);
-      assertEquals("33333333-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-      doc  = searcher.doc(topdocs.scoreDocs[3].doc);
-      assertEquals("44444444-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-    } finally {
-      searcherManager.release(searcher);
+            org.apache.lucene.document.Document doc = searcher.doc(topdocs.scoreDocs[0].doc);
+            assertEquals("11111111-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+            doc = searcher.doc(topdocs.scoreDocs[1].doc);
+            assertEquals("22222222-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxFuzzy() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismax2() throws Exception {
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Repúblic");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(4, topdocs.scoreDocs.length);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue()+":"+explain);
-      }
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("República");
+            TopDocs topdocs = searcher.search(q, 10);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue());
+                System.out.println(explain);
+            }
+            assertEquals(4, topdocs.scoreDocs.length);
 
-      org.apache.lucene.document.Document doc  = searcher.doc(topdocs.scoreDocs[0].doc);
-      assertEquals("44444444-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-    } finally {
-      searcherManager.release(searcher);
+            org.apache.lucene.document.Document doc = searcher.doc(topdocs.scoreDocs[0].doc);
+            assertEquals("22222222-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+            doc = searcher.doc(topdocs.scoreDocs[1].doc);
+            assertEquals("11111111-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+            doc = searcher.doc(topdocs.scoreDocs[2].doc);
+            assertEquals("33333333-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+            doc = searcher.doc(topdocs.scoreDocs[3].doc);
+            assertEquals("44444444-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxWildcard() throws Exception {
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Repúb");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(4, topdocs.scoreDocs.length);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue()+":"+explain);
-      }
-    } finally {
-      searcherManager.release(searcher);
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxFuzzy() throws Exception {
+
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Repúblic");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(4, topdocs.scoreDocs.length);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue() + ":" + explain);
+            }
+
+            org.apache.lucene.document.Document doc = searcher.doc(topdocs.scoreDocs[0].doc);
+            assertEquals("44444444-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxTooShortForWildcard() throws Exception {
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Rep");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(0, topdocs.scoreDocs.length);
-    } finally {
-      searcherManager.release(searcher);
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxWildcard() throws Exception {
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Repúb");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(4, topdocs.scoreDocs.length);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue() + ":" + explain);
+            }
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxPhraseFuzzy() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxTooShortForWildcard() throws Exception {
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Rep");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(0, topdocs.scoreDocs.length);
+        } finally {
+            searcherManager.release(searcher);
+        }
+    }
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Echo bunneymen");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(2, topdocs.scoreDocs.length);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue()+":"+explain);
-      }
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxPhraseFuzzy() throws Exception {
 
-      org.apache.lucene.document.Document doc  = searcher.doc(topdocs.scoreDocs[0].doc);
-      assertEquals("55555555-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Echo bunneymen");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(2, topdocs.scoreDocs.length);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue() + ":" + explain);
+            }
 
-      doc  = searcher.doc(topdocs.scoreDocs[1].doc);
-      assertEquals("66666666-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-    } finally {
-      searcherManager.release(searcher);
+            org.apache.lucene.document.Document doc = searcher.doc(topdocs.scoreDocs[0].doc);
+            assertEquals("55555555-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+
+            doc = searcher.doc(topdocs.scoreDocs[1].doc);
+            assertEquals("66666666-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxPhraseFuzzy2() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxPhraseFuzzy2() throws Exception {
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Echo &amp;amp; the bunnymen");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(2, topdocs.scoreDocs.length);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue()+":"+explain);
-      }
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Echo &amp;amp; the bunnymen");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(2, topdocs.scoreDocs.length);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue() + ":" + explain);
+            }
 
-      org.apache.lucene.document.Document doc  = searcher.doc(topdocs.scoreDocs[0].doc);
-      assertEquals("55555555-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+            org.apache.lucene.document.Document doc = searcher.doc(topdocs.scoreDocs[0].doc);
+            assertEquals("55555555-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
 
-      doc  = searcher.doc(topdocs.scoreDocs[1].doc);
-      assertEquals("66666666-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-    } finally {
-      searcherManager.release(searcher);
+            doc = searcher.doc(topdocs.scoreDocs[1].doc);
+            assertEquals("66666666-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxWildcard2() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxWildcard2() throws Exception {
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Echo");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(2, topdocs.scoreDocs.length);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue()+":"+explain);
-      }
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Echo");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(2, topdocs.scoreDocs.length);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue() + ":" + explain);
+            }
 
-      org.apache.lucene.document.Document doc  = searcher.doc(topdocs.scoreDocs[0].doc);
-      //assertEquals("55555555-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+            org.apache.lucene.document.Document doc = searcher.doc(topdocs.scoreDocs[0].doc);
+            //assertEquals("55555555-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
 
-      doc  = searcher.doc(topdocs.scoreDocs[1].doc);
-      //assertEquals("66666666-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
-    } finally {
-      searcherManager.release(searcher);
+            doc = searcher.doc(topdocs.scoreDocs[1].doc);
+            //assertEquals("66666666-1cf0-4d1f-aca7-2a6f89e34b36", doc.get(ArtistIndexField.ARTIST_ID.getName()));
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxSpecialChars() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxSpecialChars() throws Exception {
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Republica/DC");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(2, topdocs.scoreDocs.length);
-      for(ScoreDoc match:topdocs.scoreDocs)
-      {
-        Explanation explain = searcher.explain(q, match.doc);
-        System.out.println("DocNo:"+match.doc+":"+match.score+":"+searcher.doc(match.doc).getField("arid").stringValue()+":"+explain);
-      }
-    } finally {
-      searcherManager.release(searcher);
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Republica/DC");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(2, topdocs.scoreDocs.length);
+            for (ScoreDoc match : topdocs.scoreDocs) {
+                Explanation explain = searcher.explain(q, match.doc);
+                System.out.println("DocNo:" + match.doc + ":" + match.score + ":" + searcher.doc(match.doc).getField("arid").stringValue() + ":" + explain);
+            }
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindArtistDismaxSpecialChars2() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testFindArtistDismaxSpecialChars2() throws Exception {
 
-    SearcherManager searcherManager = sd.getSearcherManager();
-    IndexSearcher searcher = searcherManager.acquire();
-    try {
-      Query q = sd.parseQuery("Republica-DC");
-      TopDocs topdocs = searcher.search(q, 10);
-      assertEquals(2, topdocs.scoreDocs.length);
-    } finally {
-      searcherManager.release(searcher);
+        SearcherManager searcherManager = sd.getSearcherManager();
+        IndexSearcher searcher = searcherManager.acquire();
+        try {
+            Query q = sd.parseQuery("Republica-DC");
+            TopDocs topdocs = searcher.search(q, 10);
+            assertEquals(2, topdocs.scoreDocs.length);
+        } finally {
+            searcherManager.release(searcher);
+        }
     }
-  }
 
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/ReloadIndexesTest.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,9 +54,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(ArtistIndexField.COUNTRY, "AF");
       doc.addField(ArtistIndexField.GENDER, "male");
       doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
-      doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
+      doc.addField(ArtistIndexField.TAG, "güth");;
       doc.addField(ArtistIndexField.IPI, "1001");
       writer.addDocument(doc.getLuceneDocument());
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -124,9 +122,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(ArtistIndexField.COUNTRY, "AF");
       doc.addField(ArtistIndexField.GENDER, "male");
       doc.addField(ArtistIndexField.TAG, "thrash");
-      doc.addField(ArtistIndexField.TAGCOUNT, "5");
       doc.addField(ArtistIndexField.TAG, "güth");
-      doc.addField(ArtistIndexField.TAGCOUNT, "11");
       doc.addField(ArtistIndexField.IPI, "1001");
       writer.addDocument(doc.getLuceneDocument());
     }

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java2013-05-02 20:38:05 UTC (rev 13677)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/SearchAll2Test.java2013-05-08 16:09:27 UTC (rev 13678)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,6 +8,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Before;
 import org.junit.Test;
+import org.musicbrainz.mmd2.*;
 import org.musicbrainz.search.LuceneVersion;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.analysis.MusicbrainzSimilarity;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -17,6 +18,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -48,6 +50,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;Before
     public void setUp() throws Exception
     {
+        ObjectFactory of = new ObjectFactory();
         {
             RAMDirectory ramDir = new RAMDirectory();
             Analyzer analyzer = DatabaseIndex.getAnalyzer(LabelIndexField.class);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -140,12 +143,41 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 doc.addField(ArtistIndexField.COUNTRY, "AF");
                 doc.addField(ArtistIndexField.GENDER, "male");
                 doc.addField(ArtistIndexField.TAG, "thrash");
-                doc.addField(ArtistIndexField.TAGCOUNT, "5");
                 doc.addField(ArtistIndexField.TAG, "güth");
-                doc.addField(ArtistIndexField.TAGCOUNT, "11");
                 doc.addField(ArtistIndexField.IPI, "1001");
                 doc.addField(ArtistIndexField.IPI, "1002");
 
+                Artist artist = of.createArtist();
+                artist.setId("4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+                artist.setName("Dark Incident");
+                artist.setSortName("Dark Incident");
+                LifeSpan lifespan = of.createLifeSpan();
+                lifespan.setBegin("1999-04");
+                lifespan.setEnded("true");
+                artist.setLifeSpan(lifespan);
+                artist.setType("Group");
+                artist.setDisambiguation("the real one");
+                artist.setCountry("AF");
+                artist.setGender("male");
+                TagList tagList = of.createTagList();
+                Tag tag = of.createTag();
+                tag.setName("thrash");
+                tag.setCount(BigInteger.valueOf(5));
+                tagList.getTag().add(tag);
+
+                tag = of.createTag();
+                tag.setName("güth");
+                tag.setCount(BigInteger.valueOf(11));
+                tagList.getTag().add(tag);
+                artist.setTagList(tagList);
+
+                IpiList ipiList = of.createIpiList();
+                ipiList.getIpi().add("1001");
+                ipiList.getIpi().add("1002");
+                artist.setIpiList(ipiList);
+
+                doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+
                 writer.addDocument(doc.getLuceneDocument());
             }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -157,8 +189,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 doc.addField(ArtistIndexField.SORTNAME, "dark,the");
                 doc.addField(ArtistIndexField.BEGIN, "1978");
                 doc.addField(ArtistIndexField.COUNTRY, "unknown");
-                doc.addField(ArtistIndexField.TYPE, ArtistType.GROUP.getName());
+                doc.addField(ArtistIndexField.TYPE, "Group");
                 doc.addField(ArtistIndexField.ALIAS, "The darkness");
+
+                Artist artist = of.createArtist();
+                artist.setId("ccd4879c-5e88-4385-b131-bf65296bf245");
+                artist.setName("The darkness");
+                artist.setSortName("dark,the");
+                LifeSpan lifespan = of.createLifeSpan();
+                lifespan.setBegin("1978");
+                artist.setLifeSpan(lifespan);
+                artist.setType("Group");
+
+                AliasList aliasList = of.createAliasList();
+                Alias alias = of.createAlias();
+                alias.setContent("The darkness");
+                aliasList.getAlias().add(alias);
+
+                doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
+
                 writer.addDocument(doc.getLuceneDocument());
             }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -169,6 +218,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 doc.addField(ArtistIndexField.ARTIST, "The dark place");
                 doc.addField(ArtistIndexField.TYPE, ArtistType.PERSON.getName());
                 doc.addField(ArtistIndexField.GENDER, "unknown");
+
+                Artist artist = of.createArtist();
+                artist.setId("dde4879c-5e88-4385-b131-bf65296bf245");
+                artist.setName("The dark place");
+                artist.setSortName("dark,the");
+                artist.setType("Person");
+
+                doc.addField(ArtistIndexField.ARTIST_STORE, MMDSerializer.serialize(artist));
                 writer.addDocument(doc.getLuceneDocument());
             }
 


_______________________________________________
MusicBrainz-commits mailing list
MusicBrainz-commits&amp;lt; at &amp;gt;lists.musicbrainz.org
http://lists.musicbrainz.org/mailman/listinfo/musicbrainz-commits&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-08T16:09:28</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18238">
    <title>[mb-commits] r13677 -search_server/trunk/index/src/main/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18238</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-02 20:38:05 +0000 (Thu, 02 May 2013)
New Revision: 13677

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
Log:
SEARCH-236:Now outputs SortName for Various Artist

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 16:10:43 UTC (rev 13676)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 20:38:05 UTC (rev 13677)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -901,6 +901,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         Artist       artist   = of.createArtist();
         artist.setId(VARIOUS_ARTISTS_GUID);
         artist.setName(VARIOUS_ARTISTS_NAME);
+        artist.setSortName(VARIOUS_ARTISTS_NAME);
         NameCredit   naCredit = of.createNameCredit();
         naCredit.setArtist(artist);
         ArtistCredit vaCredit = of.createArtistCredit();
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-02T20:38:05</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18237">
    <title>[mb-commits] r13676 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18237</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-02 16:10:43 +0000 (Thu, 02 May 2013)
New Revision: 13676

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/TrackWrapper.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
Log:
SEARCH-285:Added support for searching recording index by trackid (fieldname:tid)

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java2013-05-02 15:26:25 UTC (rev 13675)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java2013-05-02 16:10:43 UTC (rev 13676)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -205,7 +205,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         getDbConnection().createStatement().execute(
             "CREATE TEMPORARY TABLE tmp_track AS " +
-                "SELECT t.id, t.recording, t.length, tn.name as track_name, t.position as track_position, t.number as track_number, m.track_count, " +
+                "SELECT t.id, t.gid, t.recording, t.length, tn.name as track_name, t.position as track_position, t.number as track_number, m.track_count, " +
                 "  m.release as release_id, m.position as medium_position, mf.name as format " +
                 " FROM track t " +
                 "  INNER JOIN track_name tn ON t.name=tn.id" +

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 15:26:25 UTC (rev 13675)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 16:10:43 UTC (rev 13676)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -126,7 +126,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                             " WHERE recording between ? AND ?");
 
             addPreparedStatement("TRACKS",
-                    "SELECT id, track_name, length as duration, recording, track_position, track_number, track_count, " +
+                    "SELECT id, gid, track_name, length as duration, recording, track_position, track_number, track_count, " +
                             "  release_id, medium_position, format " +
                             " FROM tmp_track " +
                             " WHERE recording between ? AND ?");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -138,7 +138,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                             " AND   recording between ? AND ?");
 
             addPreparedStatement("TRACKS",
-                    "SELECT t.id, tn.name as track_name, t.length as duration, t.recording, t.position as track_position, t.number as track_number, m.track_count, " +
+                    "SELECT t.id, t.gid, tn.name as track_name, t.length as duration, t.recording, t.position as track_position, t.number as track_number, m.track_count, " +
                             "  m.release as release_id, m.position as medium_position,mf.name as format " +
                             " FROM track t " +
                             "  INNER JOIN track_name tn ON t.name=tn.id AND t.recording BETWEEN ? AND ?" +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -425,6 +425,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             }
             TrackWrapper tw = new TrackWrapper();
             tw.setTrackId(rs.getInt("id"));
+            tw.setTrackGuid(rs.getString("gid"));
             tw.setReleaseId(rs.getInt("release_id"));
             tw.setTrackCount(rs.getInt("track_count"));
             tw.setTrackPosition(rs.getInt("track_position"));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -742,6 +743,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 releaseList.getRelease().add(release);
 
                 if (release != null) {
+
+                    doc.addNonEmptyField(RecordingIndexField.TRACK_ID, trackWrapper.getTrackGuid());
                     ReleaseGroup rg = release.getReleaseGroup();
                     String primaryType = rg.getPrimaryType();
                     doc.addFieldOrUnknown(RecordingIndexField.RELEASEGROUP_ID, rg.getId());

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-02 15:26:25 UTC (rev 13675)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-02 16:10:43 UTC (rev 13676)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,6 +45,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     RELEASEGROUP_ID        ("rgid",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     TAG                ("tag",            MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     TRACKNUM    ("tnum",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED, new KeywordAnalyzer()),
+    TRACK_ID                ("tid",            MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     RECORDING_STORE     ("recordingstore",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
 
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/TrackWrapper.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/TrackWrapper.java2013-05-02 15:26:25 UTC (rev 13675)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/TrackWrapper.java2013-05-02 16:10:43 UTC (rev 13676)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5,6 +5,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 class TrackWrapper {
     private int     trackId;
+    private String  trackGuid;
     private int     trackPosition;
     private int     trackCount;
     private int     releaseId;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,4 +87,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public void setTrackNumber(String trackNumber) {
         this.trackNumber = trackNumber;
     }
+
+    public String getTrackGuid() {
+        return trackGuid;
+    }
+
+    public void setTrackGuid(String trackGuid) {
+        this.trackGuid = trackGuid;
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-02 15:26:25 UTC (rev 13675)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-02 16:10:43 UTC (rev 13676)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -81,8 +81,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 2, 491240, 1, 7)");
 
-        stmt.addBatch("INSERT INTO track (id, recording, medium, position, number, name, artist_credit, length) "
-                + " VALUES (1, 1, 1, 4, 'A4', 2, 1, 33100)");
+        stmt.addBatch("INSERT INTO track (id, gid, recording, medium, position, number, name, artist_credit, length) "
+                + " VALUES (1, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 1, 1, 4, 'A4', 2, 1, 33100)");
         stmt.addBatch("INSERT INTO recording (id, gid, name, artist_credit, length, comment)"
                 + " VALUES (1, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000, 'demo')");
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -137,8 +137,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "  language, script) " +
                 " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1)");
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 2, 491240, 1, 7)");
-        stmt.addBatch("INSERT INTO track (id, recording, medium, position, name, artist_credit, length) "
-                + " VALUES (1, 1, 1, 4, 1, 2, 33100)");
+        stmt.addBatch("INSERT INTO track (id, gid, recording, medium, position, name, artist_credit, length) "
+                + " VALUES (1, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 1, 1, 4, 1, 2, 33100)");
         stmt.addBatch("INSERT INTO recording (id, gid, name, artist_credit, length)"
                 + " VALUES (1, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000)");
         stmt.addBatch("INSERT INTO track_name (id, name) VALUES (1, 'Do It Clean')");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -177,8 +177,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "  language, script) " +
                 " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1)");
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format, name) VALUES (1, 2, 491240, 1, 7, null)");
-        stmt.addBatch("INSERT INTO track (id, recording, medium, position, name, artist_credit, length) "
-                + " VALUES (1, 1, 1, 7, 2, 1, 33100)");
+        stmt.addBatch("INSERT INTO track (id, gid, recording, medium, position, name, artist_credit, length) "
+                + " VALUES (1, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 1, 1, 7, 2, 1, 33100)");
         stmt.addBatch("INSERT INTO recording (id, gid, name, artist_credit, length)"
                 + " VALUES (1, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000)");
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -192,8 +192,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (2, 2, 491241, 1, 7)");
 
-        stmt.addBatch("INSERT INTO track (id, recording, medium, position, name, artist_credit, length) "
-                + " VALUES (2, 1, 2, 4, 2, 1, 33100)");
+        stmt.addBatch("INSERT INTO track (id, gid, recording, medium, position, name, artist_credit, length) "
+                + " VALUES (2, 'd3b8dbc9-c1ff-4743-9015-8d762819134e', 1, 2, 4, 2, 1, 33100)");
 
         stmt.addBatch("INSERT INTO track_name (id, name) VALUES (1, 'Do It Clean')");
         stmt.addBatch("INSERT INTO track_name (id, name) VALUES (2, 'Do It Cleans')");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -620,7 +620,26 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         ir.close();
     }
 
+    /**
+     * Basic test of all fields
+     *
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testTrackGuid() throws Exception {
 
+        addTrackOne();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+            checkTerm(ir, RecordingIndexField.TRACK_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
+        }
+        ir.close();
+    }
+
     /**
      * &amp;lt; at &amp;gt;throws Exception exception
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -842,7 +861,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals(null, release.getCountry());
             assertEquals("1950", release.getDate());
             ReleaseEventList rel = release.getReleaseEventList();
-            assertEquals(4,rel.getReleaseEvent().size());
+            assertEquals(4, rel.getReleaseEvent().size());
             assertEquals(null, release.getCountry());
             assertEquals("1950", release.getDate());
             assertEquals(null, rel.getReleaseEvent().get(0).getCountry());
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -873,6 +892,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertNotNull(medium);
             assertEquals(1, medium.getPosition().intValue());
             assertEquals("Vinyl", medium.getFormat());
+
+            Medium.TrackList trackList = medium.getTrackList();
+            assertNotNull(trackList);
+
+            assertNotNull(trackList.getDefTrack());
+
+            Medium.TrackList.Track track = trackList.getDefTrack().get(0);
+            assertEquals("Do It Cleans", track.getTitle());
+            assertNull(track.getPosition());  //We dont currently output this, but perhaps should
+            assertEquals("A4", track.getNumber());
+
         }
         ir.close();
     }

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-02 15:26:25 UTC (rev 13675)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-02 16:10:43 UTC (rev 13676)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -77,6 +77,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             recording.setReleaseList(releaseList);
             m.setFormat("Vinyl");
             track.setTitle("Gravitational Lens");
+            doc.addField(RecordingIndexField.TRACK_ID,"2d9e8ed6-3893-4d3b-aa7d-72e79609e386");
 
             release.setId("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
             release.setTitle("Our Glorious 5 Year Plan");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -463,6 +464,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
     }
 
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByTrackId() throws Exception {
+        Results res = ss.search("tid:2d9e8ed6-3893-4d3b-aa7d-72e79609e386", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
     &amp;lt; at &amp;gt;Test
     public void testOutputAsMmd1Xml() throws Exception {
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-02T16:10:44</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18236">
    <title>[mb-commits] r13675 - in search_server/trunk/index/src:main/java/org/musicbrainz/search/indextest/java/org/musicbrainz/search/index</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18236</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-02 15:26:25 +0000 (Thu, 02 May 2013)
New Revision: 13675

Added:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventComparator.java
Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.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/test/java/org/musicbrainz/search/index/AbstractIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
Log:
SEARCH-273:Addes sorting for release when have multiple release dates so orders by date, (code used by release and recording indexes)

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -132,8 +132,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
 
-    private void createReleaseTableUsingDb() throws SQLException
-    {
+    private void createReleaseTableUsingDb() throws SQLException {
         System.out.println("tmp_release     :Started at:" + Utils.formatCurrentTimeForOutput());
         StopWatch clock = new StopWatch();
         clock.start();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -170,7 +169,34 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         clock.reset();
     }
 
+    private void createReleaseEventsTableUsingDb() throws SQLException {
+        System.out.println("tmp_release_event     :Started at:" + Utils.formatCurrentTimeForOutput());
+        StopWatch clock = new StopWatch();
+        clock.start();
 
+        getDbConnection().createStatement().execute(
+                "CREATE TEMPORARY TABLE tmp_release_event AS " +
+                        " SELECT release, r2.code as country, " +
+                        "  date_year, date_month, date_day"+
+                        " FROM release_country r1 " +
+                        " LEFT JOIN iso_3166_1 r2 " +
+                        " ON r1.country = r2.area " +
+                        " UNION" +
+                        " SELECT release, null as country, " +
+                        "  date_year, date_month, date_day"+
+                        " FROM release_unknown_country r1 ");
+        clock.stop();
+        System.out.println("tmp_release_event     :Finished:" + Utils.formatClock(clock));
+        clock.reset();
+
+        clock.start();
+        getDbConnection().createStatement().execute(
+                "CREATE INDEX tmp_release_event_idx_release ON tmp_release_event (release) ");
+        clock.stop();
+        System.out.println("tmp_release_event     :Created Indexes:" + Utils.formatClock(clock));
+        clock.reset();
+    }
+
     private void createTrackTableUsingDb() throws SQLException
     {
         System.out.println("tmp_track       :Started at:" + Utils.formatCurrentTimeForOutput());
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -223,6 +249,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             }
 
             createReleaseTableUsingDb();
+            createReleaseEventsTableUsingDb();
         }
 
         if(

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -199,12 +199,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         " WHERE r1.id in ";
 
         releaseEvents =
-                " SELECT re.release as releaseKey, r2.code as country, " +
-                        "  date_year, date_month, date_day" +
-                        " FROM release_country re " +
-                        " LEFT JOIN iso_3166_1 r2 " +
-                        " ON re.country = r2.area " +
-                        " WHERE re.release in ";
+                " SELECT release, country, " +
+                        "   date_year, date_month, date_day"+
+                        " FROM tmp_release_event r " +
+                        " WHERE r.release in ";
 
         releaseSecondaryTypes =
                 "SELECT rg.name as type, r.id as releaseKey" +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -586,13 +584,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
         rs = stmt.executeQuery();
         while (rs.next()) {
-            int releaseKey = rs.getInt("releaseKey");
+            int releaseKey = rs.getInt("release");
             release = releases.get(releaseKey);
             if (release.getReleaseEventList() == null) {
                 release.setReleaseEventList(of.createReleaseEventList());
             }
             ReleaseEvent re = of.createReleaseEvent();
-            re.setDate(Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day")));
+            re.setDate(Strings.emptyToNull(Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day"))));
             re.setCountry((rs.getString("country")));
             release.getReleaseEventList().getReleaseEvent().add(re);
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -791,10 +789,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                     (release.getReleaseEventList().getReleaseEvent() != null)
                             ) {
                         for (ReleaseEvent re : release.getReleaseEventList().getReleaseEvent()) {
-                            doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, re.getDate());
-                            doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, re.getCountry());
+                            doc.addNonEmptyField(RecordingIndexField.RELEASE_DATE, re.getDate());
+                            doc.addNonEmptyField(RecordingIndexField.COUNTRY, re.getCountry());
                         }
-
+                        Collections.sort(release.getReleaseEventList().getReleaseEvent(), new ReleaseEventComparator());
                         ReleaseEvent firstReleaseEvent = release.getReleaseEventList().getReleaseEvent().get(0);
                         if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {
                             release.setDate(firstReleaseEvent.getDate());
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -802,7 +800,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
                             release.setCountry(firstReleaseEvent.getCountry());
                         }
-                        release.setCountry(firstReleaseEvent.getCountry());
 
                     } else {
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, null);

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.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,6 +29,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.index;
 
+import com.google.common.base.Strings;
 import org.musicbrainz.mmd2.ObjectFactory;
 import org.musicbrainz.mmd2.Release;
 import org.musicbrainz.mmd2.ReleaseEvent;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,7 +61,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             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")));
+            releaseEvent.setDate(Strings.emptyToNull(Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day"))));
             releaseEventList.add(releaseEvent);
         }
         return releaseEvents;

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.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -171,13 +171,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 " FROM tmp_release rl " +
                 " WHERE id BETWEEN ? AND ? ");
 
-        addPreparedStatement("RELEASE_COUNTRY",
-                " SELECT release, r2.code as country, " +
-                        "  date_year, date_month, date_day"+
-                        " FROM release_country r1 " +
-                        " LEFT JOIN iso_3166_1 r2 " +
-                        " ON r1.country = r2.area " +
-                        " WHERE release BETWEEN ? AND ? ");
+        addPreparedStatement("RELEASE_EVENTS",
+                " SELECT release, country, " +
+                "   date_year, date_month, date_day"+
+                " FROM tmp_release_event r1 " +
+                " WHERE release BETWEEN ? AND ? ");
 
         addPreparedStatement("TAGS",
                 "SELECT release_tag.release, tag.name as tag, release_tag.count as count " +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -264,7 +262,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     private Map&amp;lt;Integer, List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; loadReleaseEvents(int min, int max) throws SQLException, IOException {
 
         // Get Release Country
-        PreparedStatement st = getPreparedStatement("RELEASE_COUNTRY");
+        PreparedStatement st = getPreparedStatement("RELEASE_EVENTS");
         st.setInt(1, min);
         st.setInt(2, max);
         ResultSet rs = st.executeQuery();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -623,12 +621,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             for (ReleaseEvent releaseEvent : releaseEvents.get(id)) {
 
                 String nextCountry  = releaseEvent.getCountry();
-                doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY,nextCountry);
+                doc.addNonEmptyField(ReleaseIndexField.COUNTRY,nextCountry);
 
                 String nextDate     = releaseEvent.getDate();
-                doc.addFieldOrUnknown(ReleaseIndexField.DATE, nextDate );
+                doc.addNonEmptyField(ReleaseIndexField.DATE, nextDate );
                 rel.getReleaseEvent().add(releaseEvent);
             }
+            //Sorted so always listed in date order, and so earliest release is used for backwards compatabilty
+            Collections.sort(rel.getReleaseEvent(), new ReleaseEventComparator());
             release.setReleaseEventList(rel);
 
             //backwards compatibility

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.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -104,7 +104,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             //Drop tables, if they exist
             try {
                 Statement stmt = conn.createStatement();
-                stmt.addBatch("DROP TABLE country");
+                stmt.addBatch("DROP TABLE area");
+                stmt.addBatch("DROP TABLE area_type");
+                stmt.addBatch("DROP TABLE area_gid_redirect");
+                stmt.addBatch("DROP TABLE iso_3166_1");
+                stmt.addBatch("DROP TABLE iso_3166_2");
+                stmt.addBatch("DROP TABLE iso_3166_3");
+                stmt.addBatch("DROP TABLE area_alias_type");
+                stmt.addBatch("DROP TABLE area_alias");
                 stmt.addBatch("DROP TABLE tag");
 
                 stmt.addBatch("DROP TABLE artist");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -139,8 +146,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 stmt.addBatch("DROP TABLE language");
                 stmt.addBatch("DROP TABLE script");
                 stmt.addBatch("DROP TABLE release_tag");
+                stmt.addBatch("DROP TABLE release_country");
+                stmt.addBatch("DROP TABLE release_unknown_country");
 
-
                 stmt.addBatch("DROP TABLE release_group");
                 stmt.addBatch("DROP TABLE release_group_primary_type");
                 stmt.addBatch("DROP TABLE release_group_secondary_type_join");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -566,10 +574,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 "(" +
                 "  release integer NOT NULL," +
                 "  country integer NOT NULL," +
-                "  date_year smallint NOT NULL," +
-                "  date_month smallint NOT NULL," +
-                "  date_day smallint NOT NULL" +
+                "  date_year smallint," +
+                "  date_month smallint," +
+                "  date_day smallint" +
                 ")");
+
+        stmt.addBatch("CREATE TABLE release_unknown_country" +
+                "(" +
+                "  release integer NOT NULL," +
+                "  date_year smallint," +
+                "  date_month smallint," +
+                "  date_day smallint" +
+                ")");
     }
 
     protected void setupReleaseGroupTables(Statement stmt) throws Exception {

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -13,6 +13,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import java.sql.Statement;
 
 import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 public class RecordingIndexTest extends AbstractIndexTest {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -68,6 +69,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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) values (491240, 222)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (222, 'Albania')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (222, 'AF')");
+
+        stmt.addBatch("INSERT INTO release_country (release, country) values (491240, 2)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (2, 'Afghanistan')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (2, 'AN')");
+
+        stmt.addBatch("INSERT INTO release_unknown_country (release, date_year) values (491240, 1950)");
+
         stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 2, 491240, 1, 7)");
 
         stmt.addBatch("INSERT INTO track (id, recording, medium, position, number, name, artist_credit, length) "
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -379,7 +390,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            checkTerm(ir, RecordingIndexField.COUNTRY, "gb");
+            checkTerm(ir, RecordingIndexField.COUNTRY, "af");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -399,7 +410,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            checkTerm(ir, RecordingIndexField.RELEASE_DATE, "1970-01-01");
+            checkTerm(ir, RecordingIndexField.RELEASE_DATE, "1950");
 
         }
         ir.close();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -828,8 +839,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("Crocodiles (bonus disc)", release.getTitle());
             assertEquals("Official", release.getStatus());
             assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
-            assertEquals("GB", release.getCountry());
-            assertEquals("1970-01-01", release.getDate());
+            assertEquals(null, release.getCountry());
+            assertEquals("1950", release.getDate());
+            ReleaseEventList rel = release.getReleaseEventList();
+            assertEquals(4,rel.getReleaseEvent().size());
+            assertEquals(null, release.getCountry());
+            assertEquals("1950", release.getDate());
+            assertEquals(null, rel.getReleaseEvent().get(0).getCountry());
+            assertEquals("1950", rel.getReleaseEvent().get(0).getDate());
+            assertEquals("GB", rel.getReleaseEvent().get(1).getCountry());
+            assertEquals("1970-01-01", rel.getReleaseEvent().get(1).getDate());
+            assertEquals("AF", rel.getReleaseEvent().get(2).getCountry());
+            assertEquals(null, rel.getReleaseEvent().get(2).getDate());
+            assertEquals("AN", rel.getReleaseEvent().get(3).getCountry());
+            assertEquals(null, rel.getReleaseEvent().get(3).getDate());
 
             ReleaseGroup releaseGroup = release.getReleaseGroup();
             assertNotNull(releaseGroup);

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.java2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-02 15:26:25 UTC (rev 13675)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -7,6 +7,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.junit.Test;
 import org.musicbrainz.mmd2.ArtistCredit;
 import org.musicbrainz.mmd2.Release;
+import org.musicbrainz.mmd2.ReleaseEventList;
 
 import java.sql.Statement;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -138,6 +139,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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) values (491240, 222)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (222, 'Albania')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (222, 'AF')");
+
+        stmt.addBatch("INSERT INTO release_country (release, country) values (491240, 2)");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (2, 'Afghanistan')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (2, 'AN')");
+
+        stmt.addBatch("INSERT INTO release_unknown_country (release, date_year) values (491240, 1950)");
+
+
         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)");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -896,10 +908,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
             assertEquals("Crocodiles (bonus disc)", release.getTitle());
             assertEquals("B00005NTQ7", release.getAsin());
-            assertEquals("GB", release.getCountry());
-            assertEquals("1970-01-01", release.getDate());
+            ReleaseEventList rel = release.getReleaseEventList();
+            assertNotNull(rel);
+            assertEquals(4,rel.getReleaseEvent().size());
+            assertEquals(null, release.getCountry());
+            assertEquals("1950", release.getDate());
+            assertEquals(null, rel.getReleaseEvent().get(0).getCountry());
+            assertEquals("1950", rel.getReleaseEvent().get(0).getDate());
+            assertEquals("GB", rel.getReleaseEvent().get(1).getCountry());
+            assertEquals("1970-01-01", rel.getReleaseEvent().get(1).getDate());
+            assertEquals("AF", rel.getReleaseEvent().get(2).getCountry());
+            assertEquals(null, rel.getReleaseEvent().get(2).getDate());
+            assertEquals("AN", rel.getReleaseEvent().get(3).getCountry());
+            assertEquals(null, rel.getReleaseEvent().get(3).getDate());
 
-
         }
         ir.close();
     }
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-02T15:26:26</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18235">
    <title>[mb-commits] r13674 - in search_server/trunk/servlet/src:main/resources test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18235</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-02 12:08:28 +0000 (Thu, 02 May 2013)
New Revision: 13674

Modified:
   search_server/trunk/servlet/src/main/resources/oxml.xml
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
Log:
SEARCH-273:Collpase Release_Event-List and rename Release-Event to release-events for newjson output

Modified: search_server/trunk/servlet/src/main/resources/oxml.xml
===================================================================
--- search_server/trunk/servlet/src/main/resources/oxml.xml2013-05-02 11:26:08 UTC (rev 13673)
+++ search_server/trunk/servlet/src/main/resources/oxml.xml2013-05-02 12:08:28 UTC (rev 13674)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -141,6 +141,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 &amp;lt;xml-element java-attribute="mediumList" xml-path="."/&amp;gt;
             &amp;lt;/java-attributes&amp;gt;
         &amp;lt;/java-type&amp;gt;
+        &amp;lt;java-type name="Release"&amp;gt;
+            &amp;lt;java-attributes&amp;gt;
+                &amp;lt;xml-element java-attribute="releaseEventList" xml-path="."/&amp;gt;
+            &amp;lt;/java-attributes&amp;gt;
+        &amp;lt;/java-type&amp;gt;
         &amp;lt;java-type name="Recording"&amp;gt;
             &amp;lt;java-attributes&amp;gt;
                 &amp;lt;xml-element java-attribute="isrcList" xml-path="."/&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -314,5 +319,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                 &amp;lt;xml-element java-attribute="relation" name="relations"/&amp;gt;
             &amp;lt;/java-attributes&amp;gt;
         &amp;lt;/java-type&amp;gt;
+        &amp;lt;java-type name="ReleaseEventList"&amp;gt;
+            &amp;lt;java-attributes&amp;gt;
+                &amp;lt;xml-element java-attribute="releaseEvent" name="release-events"/&amp;gt;
+            &amp;lt;/java-attributes&amp;gt;
+        &amp;lt;/java-type&amp;gt;
     &amp;lt;/java-types&amp;gt;
 &amp;lt;/xml-bindings&amp;gt;

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-02 11:26:08 UTC (rev 13673)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-02 12:08:28 UTC (rev 13674)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,7 +59,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             doc.addField(RecordingIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
             doc.addField(RecordingIndexField.RELEASE, "Our Glorious 5 Year Plan");
-            doc.addField(RecordingIndexField.COUNTRY, "UK");
 
 
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -81,7 +80,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
             release.setId("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
             release.setTitle("Our Glorious 5 Year Plan");
-            release.setCountry("UK");
 
             doc.addField(RecordingIndexField.PUID, "1d9e8ed6-3893-4d3b-aa7d-72e79609e386");
             PuidList puidList = of.createPuidList();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -144,9 +142,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             ml.setTrackCount(BigInteger.valueOf(10));
             doc.addField(RecordingIndexField.RELEASE_STATUS, "Official");
             doc.addField(RecordingIndexField.RELEASE_DATE, "1970-01-01");
+            doc.addField(RecordingIndexField.COUNTRY, "UK");
             release.setStatus("Official");
             release.setDate("1970-01-01");
-
+            release.setCountry("UK");
+            ReleaseEventList rel = of.createReleaseEventList();
+            ReleaseEvent     re  = of.createReleaseEvent();
+            re.setCountry("UK");
+            re.setDate("1970-01-01");
+            rel.getReleaseEvent().add(re);
+            release.setReleaseEventList(rel);
             doc.addField(RecordingIndexField.ISRC, "123456789");
             doc.addField(RecordingIndexField.ISRC, "abcdefghi");
             IsrcList isrcList = of.createIsrcList();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -529,6 +534,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("indie&amp;lt;/name&amp;gt;"));
         assertTrue(output.contains("&amp;lt;track&amp;gt;&amp;lt;number&amp;gt;A4&amp;lt;/number&amp;gt;&amp;lt;title&amp;gt;Gravitational Lens&amp;lt;/title&amp;gt;&amp;lt;length&amp;gt;233000&amp;lt;/length&amp;gt;&amp;lt;artist-credit&amp;gt;&amp;lt;name-credit&amp;gt;&amp;lt;artist id=\"2302e264-1cf0-4d1f-aca7-2a6f89e34b36\"&amp;gt;&amp;lt;name&amp;gt;Pig Incident&amp;lt;/name&amp;gt;&amp;lt;sort-name&amp;gt;Incident, Pig&amp;lt;/sort-name&amp;gt;&amp;lt;/artist&amp;gt;&amp;lt;/name-credit&amp;gt;&amp;lt;/artist-credit&amp;gt;&amp;lt;/track&amp;gt;"));
         assertTrue(output.contains("&amp;lt;puid-list&amp;gt;&amp;lt;puid id=\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"/&amp;gt;&amp;lt;/puid-list&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;release-event&amp;gt;&amp;lt;country&amp;gt;UK&amp;lt;/country&amp;gt;&amp;lt;date&amp;gt;1970-01-01&amp;lt;/date&amp;gt;&amp;lt;/release-event&amp;gt;&amp;lt;/release-event-list&amp;gt;"));
     }
 
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -563,6 +569,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"tag\":[{\"count\":101,\"name\":\"indie\"}"));
         assertTrue(output.contains("\"puid-list\":{\"puid\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"}]}"));
         assertTrue(output.contains("\"artist-credit\":{\"name-credit\":[{\"artist\":{\"id\":\"89ad4ac3-39f7-470e-963a-56509c546377\",\"name\":\"Various Artists\"}"));
+        assertTrue(output.contains("\"release-event-list\":{\"release-event\":[{\"country\":\"UK\",\"date\":\"1970-01-01\"}]}"));
     }
 
     &amp;lt; at &amp;gt;Test
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -597,7 +604,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"length\":234000"));
         assertTrue(output.contains("\"position\":1"));
         assertTrue(output.contains("\"track-count\":10"));
-
+        assertTrue(output.contains("\"secondary-types\":[\"Compilation\"]}"));
+        assertTrue(output.contains("\"release-events\":[{\"country\":\"UK\",\"date\":\"1970-01-01\"}]"));
     }
 
     &amp;lt; at &amp;gt;Test

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.java2013-05-02 11:26:08 UTC (rev 13673)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java2013-05-02 12:08:28 UTC (rev 13674)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -805,7 +805,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"asin\":\"B00004Y6O9\""));
         assertTrue(output.contains("\"track-count\":17"));
         assertTrue(output.contains("\"secondary-type-list\":{\"secondary-type\":[\"Live\",\"Compilation\"]}}"));
-
+        assertTrue(output.contains("\"release-event-list\":{\"release-event\":[{\"country\":\"GB\",\"date\":\"2005\"}]}"));
     }
 
     &amp;lt; at &amp;gt;Test
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -838,7 +838,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertTrue(output.contains("\"label-info\""));
         assertTrue(output.contains("\"catalog-number\":\"WRATHCD-25\""));
         assertTrue(output.contains("\"primary-type\":\"Album\""));
-        assertTrue(output.contains(""));
+        assertTrue(output.contains("\"release-events\":[{\"country\":\"GB\",\"date\":\"2005\"}]"));
+        assertTrue(output.contains("\"secondary-types\":[\"Live\",\"Compilation\"]}"));
     }
 
     &amp;lt; at &amp;gt;Test
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-02T12:08:28</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18234">
    <title>[mb-commits] r13673 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexservlet/src/main/java/org/musicbrainz/search/servlet/mmd2servlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18234</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-02 11:26:08 +0000 (Thu, 02 May 2013)
New Revision: 13673

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/RecordingIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/WorkWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java
Log:
Schema Changes:Artist Credit fix

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.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/MMDSerializer.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -23,8 +23,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import com.sun.jersey.api.json.JSONJAXBContext;
 import com.sun.jersey.api.json.JSONMarshaller;
 import com.sun.jersey.api.json.JSONUnmarshaller;
+import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
+import org.musicbrainz.mmd2.Metadata;
 
+import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import java.io.IOException;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.HashMap;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,67 +39,57 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 /**
  * 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.
+ * the original class and little difference in space as stored fields are compressed by lucene anyway.
  */
 public class MMDSerializer {
 
-    static final JSONJAXBContext jsoncontext = initJsonContext();
 
+    static final JAXBContext            context                 = initContext();
+    static final NamespacePrefixMapper prefixMapper            = new PreferredMapper();
 
-    /**
-     * &amp;lt; at &amp;gt;return context for marshalling as JSON in a way that allows unmarshaling
-     */
-    private static JSONJAXBContext initJsonContext() {
-        Map&amp;lt;String, String&amp;gt; nsMap = new HashMap&amp;lt;String, String&amp;gt;();
-        nsMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");
-        nsMap.put("http://musicbrainz.org/ns/mmd-2.0#", "mmd");
-        nsMap.put("http://musicbrainz.org/ns/ext#-2.0", "ext");
-
-
+    private static JAXBContext initContext() {
         try {
-            return new JSONJAXBContext(JSONConfiguration.mapped().rootUnwrapping(false).xml2JsonNs(nsMap).build()
-                    ,
-                    "org.musicbrainz.mmd2");
+            return JAXBContext.newInstance("org.musicbrainz.mmd2");
         }
         catch (JAXBException ex) {
-            //Unable to initialize jaxb context, should never happen
+            //Unable to initilize jaxb context, should never happen
             throw new RuntimeException(ex);
         }
     }
 
+    public static class PreferredMapper extends NamespacePrefixMapper {
+        &amp;lt; at &amp;gt;Override
+        public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
+            if(namespaceUri.equals("http://musicbrainz.org/ns/ext#-2.0"))
+            {
+                return "ext";
+            }
+            return null;
+        }
+    }
 
-    /**
-     * Serialize using json, the most compact solution
-     *
-     * &amp;lt; at &amp;gt;param object
-     * &amp;lt; at &amp;gt;return
-     */
-    public static String serialize(Object object) {
+    public static String serialize(Object o) {
         try {
-
             StringWriter sw = new StringWriter();
-            JSONMarshaller m = jsoncontext.createJSONMarshaller();
-            m.marshallToJSON(object, sw);
+            Marshaller m = context.createMarshaller();
+            m.setProperty("com.sun.xml.bind.namespacePrefixMapper", prefixMapper);
+            m.marshal(o, sw);
             return sw.toString();
-
         }
         catch (JAXBException je) {
             throw new RuntimeException(je);
         }
     }
 
-
     public static Object unserialize(String string, Class classType) {
         try {
-            JSONUnmarshaller m = jsoncontext.createJSONUnmarshaller();
-            return m.unmarshalFromJSON(new StringReader(string), classType);
+            Unmarshaller m = context.createUnmarshaller();
+            //m.setProperty("com.sun.xml.bind.namespacePrefixMapper", prefixMapper);
+            return m.unmarshal(new StringReader(string));
 
         }
         catch (JAXBException ex) {
             throw new RuntimeException(ex);
         }
     }
-
 }

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -50,6 +50,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     private StopWatch trackArtistClock = new StopWatch();
     private StopWatch releaseClock = new StopWatch();
     private StopWatch recordingClock = new StopWatch();
+    private StopWatch buildClock = new StopWatch();
+    private StopWatch storeClock = new StopWatch();
 
 
     private final static int QUANTIZED_DURATION = 2000;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -63,6 +65,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         trackArtistClock.start();
         releaseClock.start();
         recordingClock.start();
+        buildClock.start();
+        storeClock.start();
         trackClock.suspend();
         isrcClock.suspend();
         puidClock.suspend();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -70,6 +74,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         releaseClock.suspend();
         recordingClock.suspend();
         trackArtistClock.suspend();
+        buildClock.suspend();
+        storeClock.suspend();
     }
 
     public RecordingIndex() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -226,6 +232,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         System.out.println(this.getName() + ":Puids Queries " + Utils.formatClock(puidClock));
         System.out.println(this.getName() + ":Releases Queries " + Utils.formatClock(releaseClock));
         System.out.println(this.getName() + ":Recording Queries " + Utils.formatClock(recordingClock));
+        System.out.println(this.getName() + ":Build Index " + Utils.formatClock(buildClock));
+        System.out.println(this.getName() + ":Build Store " + Utils.formatClock(storeClock));
 
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -563,7 +571,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             release.setMediumList(ml);
 
             if (rs.getInt("artist_credit") == VARIOUS_ARTIST_CREDIT_ID) {
-                ArtistCredit ac = of.createArtistCredit();
+                ArtistCredit ac = createVariousArtistsCredit();
                 release.setArtistCredit(ac);
             }
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -631,11 +639,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         st.setInt(2, max);
         recordingClock.resume();
         ResultSet rs = st.executeQuery();
+        recordingClock.suspend();
         while (rs.next()) {
             indexWriter.addDocument(documentFromResultSet(rs, puids, tags, isrcs, artistCredits, trackArtistCredits, tracks, releases));
         }
         rs.close();
-        recordingClock.suspend();
+
     }
 
     public Document documentFromResultSet(ResultSet rs,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -647,6 +656,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                           Map&amp;lt;Integer, List&amp;lt;TrackWrapper&amp;gt;&amp;gt; tracks,
                                           Map&amp;lt;Integer, Release&amp;gt; releases) throws SQLException {
 
+        buildClock.resume();
         Set&amp;lt;Integer&amp;gt; durations = new HashSet&amp;lt;Integer&amp;gt;();
         Set&amp;lt;Integer&amp;gt; qdurs = new HashSet&amp;lt;Integer&amp;gt;();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -873,7 +883,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             doc.addNonEmptyField(RecordingIndexField.RECORDING, next);
         }
 
+        buildClock.suspend();
+        storeClock.resume();
         doc.addField(RecordingIndexField.RECORDING_STORE, MMDSerializer.serialize(recording));
+        storeClock.suspend();
         return doc.getLuceneDocument();
     }
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,7 +45,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     RELEASEGROUP_ID        ("rgid",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     TAG                ("tag",            MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     TRACKNUM    ("tnum",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED, new KeywordAnalyzer()),
-
     RECORDING_STORE     ("recordingstore",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
 
 

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.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,7 +29,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -51,6 +50,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     private StopWatch puidClock = new StopWatch();
     private StopWatch artistClock = new StopWatch();
     private StopWatch releaseClock = new StopWatch();
+    private StopWatch buildClock = new StopWatch();
+    private StopWatch storeClock = new StopWatch();
 
     public static final String INDEX_NAME = "release";
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -61,11 +62,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         puidClock.start();
         artistClock.start();
         releaseClock.start();
+        buildClock.start();
+        storeClock.start();
         labelClock.suspend();
         mediumClock.suspend();
         puidClock.suspend();
         artistClock.suspend();
         releaseClock.suspend();
+        buildClock.suspend();
+        storeClock.suspend();
     }
 
     public ReleaseIndex() {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -192,6 +197,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             System.out.println(this.getName()+":Artists Queries "  + Utils.formatClock(artistClock));
             System.out.println(this.getName()+":Puids Queries "    + Utils.formatClock(puidClock));
             System.out.println(this.getName()+":Releases Queries " + Utils.formatClock(releaseClock));
+            System.out.println(this.getName() + ":Build Index " + Utils.formatClock(buildClock));
+            System.out.println(this.getName() + ":Build Store " + Utils.formatClock(storeClock));
 
         }
         catch(Exception ex)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -393,8 +400,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                           Map&amp;lt;Integer,List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;&amp;gt; mediums,
                                           Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; puids,
                                           Map&amp;lt;Integer, ArtistCreditWrapper&amp;gt; artistCredits) throws SQLException {
+        buildClock.resume();
+
         MbDocument doc = new MbDocument();
-
         ObjectFactory of = new ObjectFactory();
         Release release = of.createRelease();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -610,7 +618,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             release.setTagList(tagList);
         }
 
-        System.out.println("ReleaseEventsCheck");
         if (releaseEvents.containsKey(id)) {
             ReleaseEventList rel = of.createReleaseEventList();
             for (ReleaseEvent releaseEvent : releaseEvents.get(id)) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -624,11 +631,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             }
             release.setReleaseEventList(rel);
 
-            //backwards compatability
-            System.out.println("ReleaseCountryCheck");
+            //backwards compatibility
             ReleaseEvent firstReleaseEvent = rel.getReleaseEvent().get(0);
             if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
-                System.out.println("ReleaseCountry1");
                 release.setCountry(firstReleaseEvent.getCountry());
             }
             if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -639,10 +644,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY, null);
             doc.addFieldOrUnknown(ReleaseIndexField.DATE, null );
         }
-
-
-        doc.addField(ReleaseIndexField.RELEASE_STORE, MMDSerializer.serialize(release));
-
+        buildClock.suspend();
+        storeClock.resume();
+        String json = MMDSerializer.serialize(release);
+        doc.addField(ReleaseIndexField.RELEASE_STORE, json);
+        storeClock.suspend();
         return doc.getLuceneDocument();
     }
 

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/LabelWriter.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -53,13 +53,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;throws IOException
      */
-    public void write(Metadata metadata, Results results) throws IOException
-    {
+    public void write(Metadata metadata, Results results) throws IOException {
         ObjectFactory of = new ObjectFactory();
         LabelList labelList = of.createLabelList();
 
-        for(Result result:results.results)
-        {
+        for (Result result : results.results) {
             result.setNormalizedScore(results.getMaxScore());
         }
         write(labelList.getLabel(), results);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -76,10 +74,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;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);
         }
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -91,93 +87,90 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * &amp;lt; at &amp;gt;param result
      * &amp;lt; at &amp;gt;throws IOException
      */
-    public void write(List list, Result result) throws IOException
-    {
+    public void write(List list, Result result) throws IOException {
         ObjectFactory of = new ObjectFactory();
-            MbDocument doc = result.getDoc();
-            Label label = of.createLabel();
-            label.setId(doc.get(LabelIndexField.LABEL_ID));
-            String type = doc.get(LabelIndexField.TYPE);
-            if (isNotUnknown(type)){
-                label.setType(type);
-            }
-            label.setScore(String.valueOf(result.getNormalizedScore()));
-            String name = doc.get(LabelIndexField.LABEL);
-            if (name != null) {
-                label.setName(name);
-            }
+        MbDocument doc = result.getDoc();
+        Label label = of.createLabel();
+        label.setId(doc.get(LabelIndexField.LABEL_ID));
+        String type = doc.get(LabelIndexField.TYPE);
+        if (isNotUnknown(type)) {
+            label.setType(type);
+        }
+        label.setScore(String.valueOf(result.getNormalizedScore()));
+        String name = doc.get(LabelIndexField.LABEL);
+        if (name != null) {
+            label.setName(name);
+        }
 
-            String[] ipiCodes = doc.getValues(LabelIndexField.IPI);
-            if (ipiCodes.length &amp;gt; 0) {
-                IpiList ipiList = of.createIpiList();
-                for (int i = 0; i &amp;lt; ipiCodes.length; i++) {
-                    ipiList.getIpi().add(ipiCodes[i]);
-                }
-                label.setIpiList(ipiList);
+        String[] ipiCodes = doc.getValues(LabelIndexField.IPI);
+        if (ipiCodes.length &amp;gt; 0) {
+            IpiList ipiList = of.createIpiList();
+            for (int i = 0; i &amp;lt; ipiCodes.length; i++) {
+                ipiList.getIpi().add(ipiCodes[i]);
             }
+            label.setIpiList(ipiList);
+        }
 
-            String code = doc.get(LabelIndexField.CODE);
-            if (isNotNoValue(code)) {
-                label.setLabelCode(new BigInteger(code));
-            }
+        String code = doc.get(LabelIndexField.CODE);
+        if (isNotNoValue(code)) {
+            label.setLabelCode(new BigInteger(code));
+        }
 
-            String countryCode = doc.get(LabelIndexField.COUNTRY);
-            if (isNotUnknown(countryCode)){
-                label.setCountry(countryCode.toUpperCase(Locale.US));
-            }
+        String countryCode = doc.get(LabelIndexField.COUNTRY);
+        if (isNotUnknown(countryCode)) {
+            label.setCountry(countryCode.toUpperCase(Locale.US));
+        }
 
-            String sortname = doc.get(LabelIndexField.SORTNAME);
-            if (sortname != null) {
-                label.setSortName(sortname);
-            }
+        String sortname = doc.get(LabelIndexField.SORTNAME);
+        if (sortname != null) {
+            label.setSortName(sortname);
+        }
 
-            String begin = doc.get(LabelIndexField.BEGIN);
-            String end = doc.get(LabelIndexField.END);
-            String ended = doc.get(LabelIndexField.ENDED);
+        String begin = doc.get(LabelIndexField.BEGIN);
+        String end = doc.get(LabelIndexField.END);
+        String ended = doc.get(LabelIndexField.ENDED);
 
-            LifeSpan lifespan = of.createLifeSpan();
-            label.setLifeSpan(lifespan);
+        LifeSpan lifespan = of.createLifeSpan();
+        label.setLifeSpan(lifespan);
 
-            if (begin != null) {
-                lifespan.setBegin(begin);
-            }
+        if (begin != null) {
+            lifespan.setBegin(begin);
+        }
 
-            if (end != null) {
-                lifespan.setEnd(end);
-            }
-            lifespan.setEnded(ended);
+        if (end != null) {
+            lifespan.setEnd(end);
+        }
+        lifespan.setEnded(ended);
 
-            String comment = doc.get(LabelIndexField.COMMENT);
-            if (isNotNoValue(comment)) {
-                label.setDisambiguation(comment);
-            }
+        String comment = doc.get(LabelIndexField.COMMENT);
+        if (isNotNoValue(comment)) {
+            label.setDisambiguation(comment);
+        }
 
-            String[] aliases = doc.getValues(LabelIndexField.ALIAS);
-            if(aliases.length&amp;gt;0)
-            {
-                AliasList aliasList = of.createAliasList();
-                for(int i = 0;i&amp;lt;aliases.length;i++) {
-                    Alias alias = of.createAlias();
-                    alias.setContent(aliases[i]);
-                    aliasList.getAlias().add(alias);
-                }
-                label.setAliasList(aliasList);
+        String[] aliases = doc.getValues(LabelIndexField.ALIAS);
+        if (aliases.length &amp;gt; 0) {
+            AliasList aliasList = of.createAliasList();
+            for (int i = 0; i &amp;lt; aliases.length; i++) {
+                Alias alias = of.createAlias();
+                alias.setContent(aliases[i]);
+                aliasList.getAlias().add(alias);
             }
+            label.setAliasList(aliasList);
+        }
 
-            String[] tags       = doc.getValues(LabelIndexField.TAG);
-            String[] tagCounts  = doc.getValues(LabelIndexField.TAGCOUNT);
-            if(tags.length&amp;gt;0)
-            {
-                TagList tagList = of.createTagList();
-                for(int i = 0;i&amp;lt;tags.length;i++) {
-                    Tag tag = of.createTag();
-                    tag.setName(tags[i]);
-                    tag.setCount(new BigInteger(tagCounts[i]));
-                    tagList.getTag().add(tag);
-                }
-                label.setTagList(tagList);
+        String[] tags = doc.getValues(LabelIndexField.TAG);
+        String[] tagCounts = doc.getValues(LabelIndexField.TAGCOUNT);
+        if (tags.length &amp;gt; 0) {
+            TagList tagList = of.createTagList();
+            for (int i = 0; i &amp;lt; tags.length; i++) {
+                Tag tag = of.createTag();
+                tag.setName(tags[i]);
+                tag.setCount(new BigInteger(tagCounts[i]));
+                tagList.getTag().add(tag);
             }
-            list.add(label);
+            label.setTagList(tagList);
+        }
+        list.add(label);
 
     }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseGroupWriter.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -43,18 +43,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 
     /**
-     *
      * &amp;lt; at &amp;gt;param metadata
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;throws IOException
      */
-    public void write(Metadata metadata, Results results) throws IOException
-    {
+    public void write(Metadata metadata, Results results) throws IOException {
         ObjectFactory of = new ObjectFactory();
         ReleaseGroupList releaseGroupList = of.createReleaseGroupList();
 
-        for(Result result:results.results)
-        {
+        for (Result result : results.results) {
             result.setNormalizedScore(results.getMaxScore());
         }
         write(releaseGroupList.getReleaseGroup(), results);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -65,98 +62,90 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     /**
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;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);
         }
     }
 
     /**
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param result
      * &amp;lt; at &amp;gt;throws IOException
      */
-    public void write(List list, Result result) throws IOException
-    {
+    public void write(List list, Result result) throws IOException {
         ObjectFactory of = new ObjectFactory();
-        ReleaseGroupList releaseGroupList = of.createReleaseGroupList();
 
-            MbDocument doc = result.getDoc();
-            ReleaseGroup releaseGroup = of.createReleaseGroup();
-            releaseGroup.setId(doc.get(ReleaseGroupIndexField.RELEASEGROUP_ID));
-            releaseGroup.setScore(String.valueOf(result.getNormalizedScore()));
-            String name = doc.get(ReleaseGroupIndexField.RELEASEGROUP);
-            if (name != null) {
-                releaseGroup.setTitle(name);
-            }
+        MbDocument doc = result.getDoc();
+        ReleaseGroup releaseGroup = of.createReleaseGroup();
+        releaseGroup.setId(doc.get(ReleaseGroupIndexField.RELEASEGROUP_ID));
+        releaseGroup.setScore(String.valueOf(result.getNormalizedScore()));
+        String name = doc.get(ReleaseGroupIndexField.RELEASEGROUP);
+        if (name != null) {
+            releaseGroup.setTitle(name);
+        }
 
-            String comment = doc.get(ReleaseGroupIndexField.COMMENT);
-            if (isNotNoValue(comment)) {
-                releaseGroup.setDisambiguation(comment);
-            }
+        String comment = doc.get(ReleaseGroupIndexField.COMMENT);
+        if (isNotNoValue(comment)) {
+            releaseGroup.setDisambiguation(comment);
+        }
 
-            String type = doc.get(ReleaseGroupIndexField.TYPE);
-            if(isNotUnknown(type)) {
-                releaseGroup.setType(type);
-            }
+        String type = doc.get(ReleaseGroupIndexField.TYPE);
+        if (isNotUnknown(type)) {
+            releaseGroup.setType(type);
+        }
 
-            String primaryType = doc.get(ReleaseGroupIndexField.PRIMARY_TYPE);
-            if(isNotUnknown(primaryType )) {
-                releaseGroup.setPrimaryType(primaryType );
-            }
+        String primaryType = doc.get(ReleaseGroupIndexField.PRIMARY_TYPE);
+        if (isNotUnknown(primaryType)) {
+            releaseGroup.setPrimaryType(primaryType);
+        }
 
-            String[] secondaryTypes = doc.getValues(ReleaseGroupIndexField.SECONDARY_TYPE);
-            if(secondaryTypes.length&amp;gt;0) {
-                SecondaryTypeList stl = of.createSecondaryTypeList();
-                for(int i =0; i&amp;lt; secondaryTypes.length; i++) {
-                    stl.getSecondaryType().add(secondaryTypes[i]);
-                }
-                releaseGroup.setSecondaryTypeList(stl);
+        String[] secondaryTypes = doc.getValues(ReleaseGroupIndexField.SECONDARY_TYPE);
+        if (secondaryTypes.length &amp;gt; 0) {
+            SecondaryTypeList stl = of.createSecondaryTypeList();
+            for (int i = 0; i &amp;lt; secondaryTypes.length; i++) {
+                stl.getSecondaryType().add(secondaryTypes[i]);
             }
-            
-            if(doc.get(ReleaseGroupIndexField.ARTIST_CREDIT)!=null) {
-                ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseGroupIndexField.ARTIST_CREDIT));
-                releaseGroup.setArtistCredit(ac);
-            }
+            releaseGroup.setSecondaryTypeList(stl);
+        }
 
-            String[] releaseIds          = doc.getValues(ReleaseGroupIndexField.RELEASE_ID);
-            String[] releaseNames        = doc.getValues(ReleaseGroupIndexField.RELEASE);
-            String[] releaseStatuses     = doc.getValues(ReleaseGroupIndexField.RELEASESTATUS);
+        if (doc.get(ReleaseGroupIndexField.ARTIST_CREDIT) != null) {
+            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseGroupIndexField.ARTIST_CREDIT));
+            releaseGroup.setArtistCredit(ac);
+        }
 
-            ReleaseList releaseList = of.createReleaseList();
-            releaseList.setCount(BigInteger.valueOf(releaseIds.length));
-            for(int i =0; i&amp;lt; releaseIds.length; i++) {
-                Release release = of.createRelease();
-                release.setId(releaseIds[i]);
-                release.setTitle(releaseNames[i]);
-                release.setStatus(releaseStatuses[i]);
+        String[] releaseIds = doc.getValues(ReleaseGroupIndexField.RELEASE_ID);
+        String[] releaseNames = doc.getValues(ReleaseGroupIndexField.RELEASE);
+        String[] releaseStatuses = doc.getValues(ReleaseGroupIndexField.RELEASESTATUS);
 
-                releaseList.getRelease().add(release);
-            }
-            releaseGroup.setReleaseList(releaseList);
-            releaseGroupList.getReleaseGroup().add(releaseGroup);
+        ReleaseList releaseList = of.createReleaseList();
+        releaseList.setCount(BigInteger.valueOf(releaseIds.length));
+        for (int i = 0; i &amp;lt; releaseIds.length; i++) {
+            Release release = of.createRelease();
+            release.setId(releaseIds[i]);
+            release.setTitle(releaseNames[i]);
+            release.setStatus(releaseStatuses[i]);
 
-            String[] tags       = doc.getValues(ReleaseGroupIndexField.TAG);
-            String[] tagCounts  = doc.getValues(ReleaseGroupIndexField.TAGCOUNT);
-            if(tags.length&amp;gt;0)
-            {
-                TagList tagList = of.createTagList();
-                for(int i = 0;i&amp;lt;tags.length;i++) {
-                    Tag tag = of.createTag();
-                    tag.setName(tags[i]);
-                    tag.setCount(new BigInteger(tagCounts[i]));
-                    tagList.getTag().add(tag);
-                }
-                releaseGroup.setTagList(tagList);
+            releaseList.getRelease().add(release);
+        }
+        releaseGroup.setReleaseList(releaseList);
+
+        String[] tags = doc.getValues(ReleaseGroupIndexField.TAG);
+        String[] tagCounts = doc.getValues(ReleaseGroupIndexField.TAGCOUNT);
+        if (tags.length &amp;gt; 0) {
+            TagList tagList = of.createTagList();
+            for (int i = 0; i &amp;lt; tags.length; i++) {
+                Tag tag = of.createTag();
+                tag.setName(tags[i]);
+                tag.setCount(new BigInteger(tagCounts[i]));
+                tagList.getTag().add(tag);
             }
-            list.add(releaseGroup);
+            releaseGroup.setTagList(tagList);
         }
+        list.add(releaseGroup);
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/WorkWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/WorkWriter.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/WorkWriter.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -90,7 +90,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     {
 
         ObjectFactory of = new ObjectFactory();
-        WorkList workList = of.createWorkList();
 
         MbDocument doc = result.getDoc();
         Work work = of.createWork();

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java2013-05-01 19:20:38 UTC (rev 13672)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java2013-05-02 11:26:08 UTC (rev 13673)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -70,7 +70,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt; at &amp;gt;Test
     public void testOutputAsXml() throws Exception {
 
-        Results res = ss.search("rid:7ca7782b-a602-448b-b108-bb881a7be2d6", 0, 10);
+       /* Results res = ss.search("rid:7ca7782b-a602-448b-b108-bb881a7be2d6", 0, 10);
         ResultsWriter writer = ss.getMmd2Writer();
         StringWriter sw = new StringWriter();
         PrintWriter pr = new PrintWriter(sw);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -80,6 +80,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         System.out.println("Xml is" + output);
         assertTrue(output.contains("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
         assertTrue(output.contains("id=\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
+        */
         //IllegalAccessError control char converted toString() apostrophe
         //assertTrue(output.contains("&amp;lt;title&amp;gt;I Don't Dance&amp;lt;/title"));
     }
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-02T11:26:08</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18233">
    <title>[mb-commits] r13672 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18233</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-01 19:20:38 +0000 (Wed, 01 May 2013)
New Revision: 13672

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java
Log:
SchemaChnages:More stuff for release and recordings

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-01 15:40:23 UTC (rev 13671)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-01 19:20:38 UTC (rev 13672)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -749,6 +749,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         String type = ReleaseGroupHelper.calculateOldTypeFromPrimaryType(primaryType,
                                 rg.getSecondaryTypeList().getSecondaryType());
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_TYPE, type);
+                        rg.setType(type);
                     } else {
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_TYPE, release.getReleaseGroup().getPrimaryType());
                     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -783,6 +784,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                             doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, re.getDate());
                             doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, re.getCountry());
                         }
+
+                        ReleaseEvent firstReleaseEvent = release.getReleaseEventList().getReleaseEvent().get(0);
+                        if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {
+                            release.setDate(firstReleaseEvent.getDate());
+                        }
+                        if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
+                            release.setCountry(firstReleaseEvent.getCountry());
+                        }
+                        release.setCountry(firstReleaseEvent.getCountry());
+
                     } else {
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, null);
                         doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, null);

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.java2013-05-01 15:40:23 UTC (rev 13671)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-01 19:20:38 UTC (rev 13672)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -610,6 +610,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             release.setTagList(tagList);
         }
 
+        System.out.println("ReleaseEventsCheck");
         if (releaseEvents.containsKey(id)) {
             ReleaseEventList rel = of.createReleaseEventList();
             for (ReleaseEvent releaseEvent : releaseEvents.get(id)) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -624,8 +625,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             release.setReleaseEventList(rel);
 
             //backwards compatability
+            System.out.println("ReleaseCountryCheck");
             ReleaseEvent firstReleaseEvent = rel.getReleaseEvent().get(0);
             if (!Strings.isNullOrEmpty(firstReleaseEvent.getCountry())) {
+                System.out.println("ReleaseCountry1");
                 release.setCountry(firstReleaseEvent.getCountry());
             }
             if (!Strings.isNullOrEmpty(firstReleaseEvent.getDate())) {

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-01 15:40:23 UTC (rev 13671)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-01 19:20:38 UTC (rev 13672)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,9 +8,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Test;
-import org.musicbrainz.mmd2.ArtistCredit;
-import org.musicbrainz.mmd2.Recording;
-import org.musicbrainz.mmd2.Release;
+import org.musicbrainz.mmd2.*;
 
 import java.sql.Statement;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -691,7 +689,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     /**
-     * Test tracknum
+     * Test Free Text Track Number
      *
      * &amp;lt; at &amp;gt;throws Exception exception
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -711,7 +709,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     /**
-     * Test tracknum
+     * Test Track Position
      *
      * &amp;lt; at &amp;gt;throws Exception exception
      */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -725,9 +723,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.TRACKNUM.getName()).length);
-     //       assertEquals(4, NumericUtils.prefixCodedToInt(doc.getField(RecordingIndexField.TRACKNUM.getName()).stringValue()));
+            checkTerm(ir, RecordingIndexField.TRACKNUM, 4);
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -796,11 +792,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             checkTerm(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
             checkTerm(ir, RecordingIndexField.POSITION, "1");
 
-            checkTermX(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134f",1);
+            checkTermX(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134f", 1);
             checkTermX(ir, RecordingIndexField.RELEASE_TYPE, "single",1);
             checkTermX(ir, RecordingIndexField.RELEASE_STATUS, "promotion",1);
-            //checkTermX(ir, RecordingIndexField.POSITION, "1",1);
-
             checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
             checkTerm(ir, RecordingIndexField.TRACKNUM, 4);
             checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -808,4 +802,55 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
         ir.close();
     }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredRecording() throws Exception {
+
+        addTrackOne();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
+            Document doc = ir.document(1);
+            Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE.getName()), Recording.class);
+            assertEquals("2f250ed2-6285-40f1-aa2a-14f1c05e9765", recording.getId());
+            assertEquals("Do It Clean", recording.getTitle());
+
+            ReleaseList releaseList = recording.getReleaseList();
+            Release     release     = releaseList.getRelease().get(0);
+            assertNotNull(release);
+            assertEquals("Crocodiles (bonus disc)", release.getTitle());
+            assertEquals("Official", release.getStatus());
+            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
+            assertEquals("GB", release.getCountry());
+            assertEquals("1970-01-01", release.getDate());
+
+            ReleaseGroup releaseGroup = release.getReleaseGroup();
+            assertNotNull(releaseGroup);
+            assertEquals("efd2ace2-b3b9-305f-8a53-9803595c0e37",releaseGroup.getId());
+            assertEquals("Compilation",releaseGroup.getType());
+            assertEquals("Album",releaseGroup.getPrimaryType());
+
+            SecondaryTypeList secondaryTypeList = releaseGroup.getSecondaryTypeList();
+            assertNotNull(secondaryTypeList);
+            assertEquals("Compilation",secondaryTypeList.getSecondaryType().get(0));
+            assertEquals("Interview",secondaryTypeList.getSecondaryType().get(1));
+
+            MediumList mediumList = release.getMediumList();
+            assertNotNull(mediumList);
+            assertEquals(2,mediumList.getTrackCount().intValue());
+
+            Medium medium = mediumList.getMedium().get(0);
+            assertNotNull(medium);
+            assertEquals(1, medium.getPosition().intValue());
+            assertEquals("Vinyl", medium.getFormat());
+        }
+        ir.close();
+    }
 }
\ No newline at end of file

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.java2013-05-01 15:40:23 UTC (rev 13671)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-01 19:20:38 UTC (rev 13672)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -259,7 +259,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
             checkTerm(ir, ReleaseIndexField.RELEASE, "bonus");
             checkTerm(ir, ReleaseIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
             checkTerm(ir, ReleaseIndexField.TYPE, "ep");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -852,4 +851,56 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
         ir.close();
     }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredRelease1() throws Exception {
+
+        addReleaseOne();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
+            Document doc = ir.document(1);
+            Release release = (Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE.getName()), Release.class);
+            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
+            assertEquals("Crocodiles (bonus disc)", release.getTitle());
+            assertEquals("B00005NTQ7", release.getAsin());
+
+
+        }
+        ir.close();
+    }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testStoredRelease2() throws Exception {
+
+        addReleaseThree();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+
+            Document doc = ir.document(1);
+            Release release = (Release) MMDSerializer.unserialize(doc.get(ReleaseIndexField.RELEASE_STORE.getName()), Release.class);
+            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", release.getId());
+            assertEquals("Crocodiles (bonus disc)", release.getTitle());
+            assertEquals("B00005NTQ7", release.getAsin());
+            assertEquals("GB", release.getCountry());
+            assertEquals("1970-01-01", release.getDate());
+
+
+        }
+        ir.close();
+    }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java2013-05-01 15:40:23 UTC (rev 13671)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java2013-05-01 19:20:38 UTC (rev 13672)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -25,124 +25,63 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-/**
- * Assumes an index has been built stored and in the data folder, I've picked a fairly obscure bside so hopefully
- * will not get added to another release
- */
-public class IssueSearch240Test
-{
+public class IssueSearch240Test {
 
 
-  private AbstractSearchServer ss;
-  private AbstractDismaxSearchServer sd;
+    private AbstractSearchServer ss;
+    private AbstractDismaxSearchServer sd;
 
 
+    &amp;lt; at &amp;gt;Before
+    public void setUp() throws Exception {
+        ObjectFactory of = new ObjectFactory();
 
-  &amp;lt; at &amp;gt;Before
-  public void setUp() throws Exception {
-    ObjectFactory of = new ObjectFactory();
+        RAMDirectory ramDir = new RAMDirectory();
+        Analyzer analyzer = DatabaseIndex.getAnalyzer(RecordingIndexField.class);
+        IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+        IndexWriter writer = new IndexWriter(ramDir, writerConfig);
 
-    RAMDirectory ramDir = new RAMDirectory();
-    Analyzer analyzer = DatabaseIndex.getAnalyzer(RecordingIndexField.class);
-    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION,analyzer);
-    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+        {
+            MbDocument doc = new MbDocument();
+            Recording recording = of.createRecording();
+            doc.addField(RecordingIndexField.RECORDING_ID, "7ca7782b-a602-448b-b108-bb881a7be2d6");
+            recording.setId("7ca7782b-a602-448b-b108-bb881a7be2d6");
+            doc.addField(RecordingIndexField.RECORDING, "I Don\u001at Dance");
+            recording.setTitle("I Don\u001at Dance");
+            doc.addField(RecordingIndexField.RECORDING_STORE, MMDSerializer.serialize(recording));
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(RecordingIndexField.RECORDING_ID, "7ca7782b-a602-448b-b108-bb881a7be2d6");
-      doc.addField(RecordingIndexField.RECORDING, "I Don\u001at Dance");
-      doc.addField(RecordingIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
-      doc.addField(RecordingIndexField.RELEASE, "Our Glorious 5 Year Plan");
-      doc.addField(RecordingIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(RecordingIndexField.ARTIST, "Farming Incident");
-      doc.addField(RecordingIndexField.ARTIST_NAME, "Farming Incident");
-      doc.addField(RecordingIndexField.PUID, "1d9e8ed6-3893-4d3b-aa7d-72e79609e386");
-      doc.addField(RecordingIndexField.COMMENT, "demo");
-      doc.addField(RecordingIndexField.COUNTRY, "UK");
-      doc.addField(RecordingIndexField.FORMAT, "Vinyl");
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+            doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
+            writer.addDocument(doc.getLuceneDocument());
+        }
 
-      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(RecordingIndexField.ARTIST_CREDIT, MMDSerializer.serialize(ac));
+        writer.close();
+        SearcherManager searcherManager = new SearcherManager(ramDir,
+                new MusicBrainzSearcherFactory(ResourceType.RECORDING));
+        ss = new RecordingSearch(searcherManager);
+        sd = new RecordingDismaxSearch(ss);
+    }
 
-      //Track Artist different to Recording Artist
-      ac = of.createArtistCredit();
-      nc = of.createNameCredit();
-      artist = of.createArtist();
-      artist.setId("2302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-      artist.setName("Pig Incident");
-      artist.setSortName("Incident, Pig");
-      nc.setArtist(artist);
-      ac.getNameCredit().add(nc);
 
-      doc.addNumericField(RecordingIndexField.DURATION, 234000);
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsXml() throws Exception {
 
-      doc.addNumericField(RecordingIndexField.QUANTIZED_DURATION, (234000 / 2000));
-      doc.addNumericField(RecordingIndexField.NUM_TRACKS,10);
-      doc.addNumericField(RecordingIndexField.NUM_TRACKS_RELEASE,10);
-      doc.addNumericField(RecordingIndexField.TRACKNUM, 5);
-      doc.addField(RecordingIndexField.NUMBER, "A4");
-      doc.addField(RecordingIndexField.RECORDING, "Gravitational Lens");
-      doc.addField(RecordingIndexField.RELEASEGROUP_ID, "4444e264-1cf0-4d1f-aca7-2a6f89e34b36");
-
-      doc.addField(RecordingIndexField.POSITION, "1");
-      doc.addField(RecordingIndexField.RELEASE_TYPE, "Compilation");
-      doc.addField(RecordingIndexField.RELEASE_PRIMARY_TYPE, "Album");
-      doc.addField(RecordingIndexField.RELEASE_SECONDARY_TYPE, "Compilation");
-
-      SecondaryTypeList stl = of.createSecondaryTypeList();
-      stl.getSecondaryType().add("Compilation");
-
-      doc.addField(RecordingIndexField.RELEASE_STATUS, "Official");
-      doc.addField(RecordingIndexField.RELEASE_DATE, "1970-01-01");
-      doc.addField(RecordingIndexField.ISRC, "123456789");
-      doc.addField(RecordingIndexField.ISRC, "abcdefghi");
-      doc.addNumericField(RecordingIndexField.DURATION, 233000);
-
-      doc.addField(RecordingIndexField.TAG, "indie");
-      doc.addField(RecordingIndexField.RELEASE_AC_VA,"1");
-      writer.addDocument(doc.getLuceneDocument());
-
+        Results res = ss.search("rid:7ca7782b-a602-448b-b108-bb881a7be2d6", 0, 10);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_XML);
+        pr.close();
+        String output = sw.toString();
+        System.out.println("Xml is" + output);
+        assertTrue(output.contains("xmlns:ext=\"http://musicbrainz.org/ns/ext#-2.0\""));
+        assertTrue(output.contains("id=\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
+        //IllegalAccessError control char converted toString() apostrophe
+        //assertTrue(output.contains("&amp;lt;title&amp;gt;I Don't Dance&amp;lt;/title"));
     }
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
-      doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
-      writer.addDocument(doc.getLuceneDocument());
-    }
-
-    writer.close();
-    SearcherManager searcherManager = new SearcherManager(ramDir,
-        new MusicBrainzSearcherFactory(ResourceType.RECORDING));
-    ss = new RecordingSearch(searcherManager);
-    sd = new RecordingDismaxSearch(ss);
-  }
-
-
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsXml() throws Exception {
-
-    Results res = ss.search("rid:7ca7782b-a602-448b-b108-bb881a7be2d6", 0, 10);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res,SearchServerServlet.RESPONSE_XML);
-    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=\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    //IllegalAccessError control char convetted toString() apostrophe
-    //assertTrue(output.contains("&amp;lt;title&amp;gt;I Don't Dance&amp;lt;/title"));
-  }
-
 }
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-01T19:21:00</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18232">
    <title>[mb-commits] r13671 - in search_server/trunk:index/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/indexservlet/src/main/java/org/musicbrainz/search/servletservlet/src/main/java/org/musicbrainz/search/servlet/mmd1servlet/src/main/java/org/musicbrainz/search/servlet/mmd2servlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18232</link>
    <description>&lt;pre&gt;Author: ijabz
Date: 2013-05-01 15:40:23 +0000 (Wed, 01 May 2013)
New Revision: 13671

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.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/RecordingIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/TrackMmd1XmlWriter.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/RecordingWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java
Log:
Changes to Recording for Schema Changes

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -19,6 +19,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.index;
 
+import com.google.common.base.Strings;
 import org.apache.commons.lang.time.StopWatch;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.document.Document;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,6 +36,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 public class RecordingIndex extends DatabaseIndex {
 
+    private static final String VARIOUS_ARTISTS_GUID = "89ad4ac3-39f7-470e-963a-56509c546377";
+    private static final String VARIOUS_ARTISTS_NAME = "Various Artists";
+
     private static final int VARIOUS_ARTIST_CREDIT_ID = 1;
 
     public static final String INDEX_NAME = "recording";
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -190,7 +194,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         releaseEvents =
                 " SELECT re.release as releaseKey, r2.code as country, " +
-                        "  date_year, date_month, date_day"+
+                        "  date_year, date_month, date_day" +
                         " FROM release_country re " +
                         " LEFT JOIN iso_3166_1 r2 " +
                         " ON re.country = r2.area " +
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -470,6 +474,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         return stmt;
 
     }
+
     /**
      * Create the release secondary types statement
      *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -509,11 +514,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         Map&amp;lt;Integer, Release&amp;gt; releases = new HashMap&amp;lt;Integer, Release&amp;gt;();
         ObjectFactory of = new ObjectFactory();
 
-    try {
-    releaseClock.resume();
-    } catch (IllegalStateException e) {
-    System.out.println("Warning: IllegalStateException during StopWatch.resume");
-    }
+        try {
+            releaseClock.resume();
+        } catch (IllegalStateException e) {
+            System.out.println("Warning: IllegalStateException during StopWatch.resume");
+        }
 
         // Add all the releaseKeys to a set to prevent duplicates
         Set&amp;lt;Integer&amp;gt; releaseKeys = new HashSet&amp;lt;Integer&amp;gt;();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -601,12 +606,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             }
             rg.getSecondaryTypeList().getSecondaryType().add(rs.getString("type"));
         }
-        
-    try {
-    releaseClock.suspend();
-    } catch (IllegalStateException e) {
-    System.out.println("Warning: IllegalStateException during StopWatch.resume");
-    }
+
+        try {
+            releaseClock.suspend();
+        } catch (IllegalStateException e) {
+            System.out.println("Warning: IllegalStateException during StopWatch.resume");
+        }
         return releases;
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -650,96 +655,135 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         int id = rs.getInt("recordingId");
 
         MbDocument doc = new MbDocument();
+        ObjectFactory of = new ObjectFactory();
+        Recording recording = of.createRecording();
+
         doc.addField(RecordingIndexField.ID, id);
-        doc.addField(RecordingIndexField.RECORDING_ID, rs.getString("trackid"));
+
+        String guid = rs.getString("trackid");
+        doc.addField(RecordingIndexField.RECORDING_ID, guid);
+        recording.setId(guid);
+
         String recordingName = rs.getString("trackname");
         //Just add an accent version for recording name not track names
         doc.addField(RecordingIndexField.RECORDING_ACCENT, recordingName);
+        recording.setTitle(recordingName);
 
         trackNames.add(recordingName.toLowerCase(Locale.UK));
-        doc.addNonEmptyField(RecordingIndexField.RECORDING_OUTPUT, recordingName);  //Output
         int recordingDuration = rs.getInt("duration");
         if (recordingDuration &amp;gt; 0) {
             durations.add(recordingDuration);
-            doc.addNumericField(RecordingIndexField.RECORDING_DURATION_OUTPUT, recordingDuration);
+            recording.setLength(BigInteger.valueOf(recordingDuration));
         }
 
-        doc.addFieldOrNoValue(RecordingIndexField.COMMENT, rs.getString("comment"));
+        String comment = rs.getString("comment");
+        doc.addFieldOrNoValue(RecordingIndexField.COMMENT, comment);
+        if (!Strings.isNullOrEmpty(comment)) {
+            recording.setDisambiguation(comment);
+        }
 
         if (puids.containsKey(id)) {
+            PuidList puidList = of.createPuidList();
             // Add each puid for recording
-            for (String puid : puids.get(id)) {
-                doc.addField(RecordingIndexField.PUID, puid);
+            for (String nextPuid : puids.get(id)) {
+                doc.addField(RecordingIndexField.PUID, nextPuid);
+                Puid puid = of.createPuid();
+                puid.setId(nextPuid);
+                puidList.getPuid().add(puid);
             }
+            recording.setPuidList(puidList);
         }
 
         if (isrcs.containsKey(id)) {
-            // For each credit artist for this recording
-            for (String isrc : isrcs.get(id)) {
-                doc.addField(RecordingIndexField.ISRC, isrc);
+            IsrcList isrcList = of.createIsrcList();
+            for (String nextIsrc : isrcs.get(id)) {
+                doc.addField(RecordingIndexField.ISRC, nextIsrc);
+                Isrc isrc = of.createIsrc();
+                isrc.setId(nextIsrc);
+                isrcList.getIsrc().add(isrc);
             }
-        }
-        else {
+            recording.setIsrcList(isrcList);
+        } else {
             doc.addFieldOrNoValue(RecordingIndexField.ISRC, null);
         }
 
         //Recording Artist Credit
         ArtistCreditWrapper ac = artistCredits.get(id);
         if (ac != null) {
-            ArtistCreditHelper.buildIndexFieldsFromArtistCredit
+            ArtistCreditHelper.buildIndexFieldsOnlyFromArtistCredit
                     (doc,
                             ac.getArtistCredit(),
                             RecordingIndexField.ARTIST,
                             RecordingIndexField.ARTIST_NAMECREDIT,
                             RecordingIndexField.ARTIST_ID,
-                            RecordingIndexField.ARTIST_NAME,
-                            RecordingIndexField.ARTIST_CREDIT);
+                            RecordingIndexField.ARTIST_NAME);
+            recording.setArtistCredit(ac.getArtistCredit());
         } else {
             System.out.println("\nNo artist credit found for recording:" + rs.getString("trackid"));
         }
+
         if (tracks.containsKey(id)) {
-            // For each track for this recording
-            for (TrackWrapper track : tracks.get(id)) {
-                Release release = releases.get(track.getReleaseId());
+
+            ReleaseList releaseList = of.createReleaseList();
+            recording.setReleaseList(releaseList);
+
+            // For each track that uses recording
+            for (TrackWrapper trackWrapper : tracks.get(id)) {
+                //Set the release details for this track
+                Release release = releases.get(trackWrapper.getReleaseId());
+                releaseList.getRelease().add(release);
+
                 if (release != null) {
                     ReleaseGroup rg = release.getReleaseGroup();
                     String primaryType = rg.getPrimaryType();
-                    doc.addFieldOrUnknown(RecordingIndexField.RELEASEGROUP_ID,rg.getId());
+                    doc.addFieldOrUnknown(RecordingIndexField.RELEASEGROUP_ID, rg.getId());
                     doc.addFieldOrUnknown(RecordingIndexField.RELEASE_PRIMARY_TYPE, primaryType);
                     if (
                             (rg.getSecondaryTypeList() != null) &amp;amp;&amp;amp;
-                            (rg.getSecondaryTypeList().getSecondaryType() != null) 
-                       ) {
+                                    (rg.getSecondaryTypeList().getSecondaryType() != null)
+                            ) {
                         for (String secondaryType : rg.getSecondaryTypeList().getSecondaryType()) {
                             doc.addField(RecordingIndexField.RELEASE_SECONDARY_TYPE, secondaryType);
                         }
-                        doc.addField(RecordingIndexField.SECONDARY_TYPE_OUTPUT, 
-                                MMDSerializer.serialize(rg.getSecondaryTypeList()));
+
                         String type = ReleaseGroupHelper.calculateOldTypeFromPrimaryType(primaryType,
                                 rg.getSecondaryTypeList().getSecondaryType());
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_TYPE, type);
-                    }
-                    else {
+                    } else {
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_TYPE, release.getReleaseGroup().getPrimaryType());
-                        doc.addField(RecordingIndexField.SECONDARY_TYPE_OUTPUT,Index.NO_VALUE);
                     }
 
-                    doc.addNumericField(RecordingIndexField.NUM_TRACKS, track.getTrackCount());
-                    doc.addNumericField(RecordingIndexField.TRACKNUM, track.getTrackPosition());
-                    doc.addFieldOrNoValue(RecordingIndexField.NUMBER, track.getTrackNumber());
+                    doc.addNumericField(RecordingIndexField.NUM_TRACKS, trackWrapper.getTrackCount());
+                    doc.addNumericField(RecordingIndexField.TRACKNUM, trackWrapper.getTrackPosition());
+                    doc.addFieldOrNoValue(RecordingIndexField.NUMBER, trackWrapper.getTrackNumber());
+                    org.musicbrainz.mmd2.Medium.TrackList.Track track = of.createMediumTrackListTrack();
+                    track.setTitle(trackWrapper.getTrackName());
+                    track.setLength(BigInteger.valueOf(trackWrapper.getDuration()));
+                    track.setNumber(trackWrapper.getTrackNumber());
+
+                    Medium medium = of.createMedium();
+                    medium.setPosition(BigInteger.valueOf(trackWrapper.getMediumPosition()));
+                    medium.setFormat(trackWrapper.getMediumFormat());
+
+                    Medium.TrackList tl  = of.createMediumTrackList();
+                    tl.setCount(BigInteger.valueOf(trackWrapper.getTrackCount()));
+                    tl.setOffset(BigInteger.valueOf(trackWrapper.getTrackPosition()  - 1));
+
+                    release.getMediumList().getMedium().add(medium);
+                    medium.setTrackList(tl);
+                    tl.getDefTrack().add(track);
+
                     doc.addFieldOrNoValue(RecordingIndexField.RELEASE_STATUS, release.getStatus());
 
-                    if(
-                            (release.getReleaseEventList()!=null) &amp;amp;&amp;amp;
-                            (release.getReleaseEventList().getReleaseEvent()!=null)
-                      ) {
-                        for(ReleaseEvent re:release.getReleaseEventList().getReleaseEvent())
-                        {
+                    if (
+                            (release.getReleaseEventList() != null) &amp;amp;&amp;amp;
+                                    (release.getReleaseEventList().getReleaseEvent() != null)
+                            ) {
+                        for (ReleaseEvent re : release.getReleaseEventList().getReleaseEvent()) {
                             doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, re.getDate());
                             doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, re.getCountry());
                         }
-                    }
-                    else  {
+                    } else {
                         doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, null);
                         doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, null);
                     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -748,29 +792,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                     doc.addField(RecordingIndexField.RELEASE_ID, release.getId());
                     doc.addField(RecordingIndexField.RELEASE, release.getTitle());
                     doc.addNumericField(RecordingIndexField.NUM_TRACKS_RELEASE, release.getMediumList().getTrackCount().intValue());
-                    int trackDuration = track.getDuration();
-                    if (trackDuration &amp;gt; 0) {
-                        //So can be displayed in output
-                        doc.addNumericField(RecordingIndexField.TRACK_DURATION_OUTPUT, trackDuration);
-                        durations.add(trackDuration);
-                    } else {
-                        doc.addField(RecordingIndexField.TRACK_DURATION_OUTPUT, Index.NO_VALUE);
-                    }
 
+
                     //Is Various Artist Release
                     if (release.getArtistCredit() != null) {
                         doc.addField(RecordingIndexField.RELEASE_AC_VA, "1");
                     } else {
                         doc.addField(RecordingIndexField.RELEASE_AC_VA, Index.NO_VALUE);
                     }
-                    // Added to TRACK_OUTPUT for outputting xml,
-                    doc.addField(RecordingIndexField.TRACK_OUTPUT, track.getTrackName());
-                    trackNames.add(track.getTrackName().toLowerCase(Locale.UK));
-                    doc.addField(RecordingIndexField.POSITION, String.valueOf(track.getMediumPosition()));
-                    doc.addFieldOrNoValue(RecordingIndexField.FORMAT, track.getMediumFormat());
+                    trackNames.add(trackWrapper.getTrackName().toLowerCase(Locale.UK));
+                    doc.addField(RecordingIndexField.POSITION, String.valueOf(trackWrapper.getMediumPosition()));
+                    doc.addFieldOrNoValue(RecordingIndexField.FORMAT, trackWrapper.getMediumFormat());
 
                     //Get Artist Credit for Track
-                    ArtistCreditWrapper taw = trackArtistCredits.get(track.getTrackId());
+                    ArtistCreditWrapper taw = trackArtistCredits.get(trackWrapper.getTrackId());
                     //If different to the Artist Credit for the recording
                     if (taw != null &amp;amp;&amp;amp;
                             (
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -778,41 +813,39 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                                             (taw.getArtistCreditId() != ac.getArtistCreditId())
                             )
                             ) {
-                        ArtistCreditHelper.buildIndexFieldsFromArtistCredit
+                        ArtistCreditHelper.buildIndexFieldsOnlyFromArtistCredit
                                 (doc,
                                         taw.getArtistCredit(),
                                         RecordingIndexField.ARTIST,
                                         RecordingIndexField.ARTIST_NAMECREDIT,
                                         RecordingIndexField.ARTIST_ID,
-                                        RecordingIndexField.ARTIST_NAME,
-                                        RecordingIndexField.TRACK_ARTIST_CREDIT);
-                    } else {
-                        doc.addField(RecordingIndexField.TRACK_ARTIST_CREDIT, Index.NO_VALUE);
+                                        RecordingIndexField.ARTIST_NAME);
+                        track.setArtistCredit(ac.getArtistCredit());
                     }
                 }
             }
-        }
-        else {
+        } else {
             doc.addFieldOrNoValue(RecordingIndexField.RELEASE_TYPE, "standalone");
         }
 
         if (tags.containsKey(id)) {
-            for (Tag tag : tags.get(id)) {
-                doc.addField(RecordingIndexField.TAG, tag.getName());
-                doc.addField(RecordingIndexField.TAGCOUNT, tag.getCount().toString());
+            TagList tagList = of.createTagList();
+            for (Tag nextTag : tags.get(id)) {
+                Tag tag = of.createTag();
+                doc.addField(RecordingIndexField.TAG, nextTag.getName());
+                tag.setName(nextTag.getName());
+                tag.setCount(new BigInteger(nextTag.getCount().toString()));
+                tagList.getTag().add(tag);
             }
+            recording.setTagList(tagList);
         }
 
         //If we have no recording length in the recording itself or the track length then we add this value so
         //they can search for recordings/tracks with no length
-        if (durations.size() == 0)
-
-        {
+        if (durations.size() == 0) {
             doc.addField(RecordingIndexField.DURATION, Index.NO_VALUE);
             doc.addField(RecordingIndexField.QUANTIZED_DURATION, Index.NO_VALUE);
-        } else
-
-        {
+        } else {
             for (Integer dur : durations) {
                 doc.addNumericField(RecordingIndexField.DURATION, dur);
                 qdurs.add(dur / QUANTIZED_DURATION);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -825,15 +858,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         }
 
         //Allow searching of all unique recording/track names
-        for (
-                String next
-                : trackNames)
-
-        {
+        for (String next : trackNames) {
             doc.addNonEmptyField(RecordingIndexField.RECORDING, next);
         }
 
+        doc.addField(RecordingIndexField.RECORDING_STORE, MMDSerializer.serialize(recording));
         return doc.getLuceneDocument();
     }
 
+    /**
+     * Create various artist credits
+     *
+     * &amp;lt; at &amp;gt;return
+     */
+    private ArtistCredit createVariousArtistsCredit()
+    {
+        ObjectFactory of = new ObjectFactory();
+        Artist       artist   = of.createArtist();
+        artist.setId(VARIOUS_ARTISTS_GUID);
+        artist.setName(VARIOUS_ARTISTS_NAME);
+        NameCredit   naCredit = of.createNameCredit();
+        naCredit.setArtist(artist);
+        ArtistCredit vaCredit = of.createArtistCredit();
+        vaCredit.getNameCredit().add(naCredit);
+        return vaCredit;
+    }
+
 }

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndexField.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -14,46 +14,41 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 public enum RecordingIndexField implements IndexField {
 
-    ID                      ("_id",            MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    ID                      ("_id",            MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     ARTIST_ID        ("arid",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     ARTIST                  ("artist",              MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_NAME             ("artistname",    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_NAMECREDIT       ("creditname",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     ARTIST_CREDIT           ("artistcredit",        MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    COMMENT            ("comment",        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED),
-    COUNTRY        ("country",        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    DURATION    ("dur",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    FORMAT        ("format",        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    ISRC            ("isrc",        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    NUM_TRACKS              ("tracks",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    NUM_TRACKS_RELEASE      ("tracksrelease",       MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    POSITION                ("position",    MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    NUMBER                  ("number",        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS),
-    PUID            ("puid",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    COMMENT            ("comment",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED),
+    COUNTRY        ("country",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    DURATION    ("dur",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    FORMAT        ("format",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    ISRC            ("isrc",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    NUM_TRACKS              ("tracks",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    NUM_TRACKS_RELEASE      ("tracksrelease",       MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    POSITION                ("position",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    NUMBER                  ("number",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS),
+    PUID            ("puid",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     QUANTIZED_DURATION    ("qdur",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     RECORDING_ID            ("rid",            MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    RECORDING               ("recording",    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    RECORDING               ("recording",    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     RECORDING_ACCENT        ("recordingaccent",     MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzKeepAccentsAnalyzer()),
-    RECORDING_OUTPUT        ("recordingoutput",     MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    RELEASE    ("release",        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new TitleWithPosGapAnalyzer()),
-    RELEASE_DATE        ("date",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    RELEASE    ("release",        MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new TitleWithPosGapAnalyzer()),
+    RELEASE_DATE        ("date",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
     RELEASE_AC_VA           ("release_ac_va",       MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    RELEASE_ID    ("reid",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    RELEASE_PRIMARY_TYPE    ("primarytype",    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    RELEASE_SECONDARY_TYPE  ("secondarytype",       MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    RELEASE_STATUS          ("status",              MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    RELEASE_TYPE            ("type",                MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
-    RELEASEGROUP_ID        ("rgid",    MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
-    SECONDARY_TYPE_OUTPUT   ("secondarytypeoutput", MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    TAG                ("tag",            MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
-    TAGCOUNT                ("tagcount",        MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
+    RELEASE_ID    ("reid",        MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    RELEASE_PRIMARY_TYPE    ("primarytype",    MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    RELEASE_SECONDARY_TYPE  ("secondarytype",       MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    RELEASE_STATUS          ("status",              MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    RELEASE_TYPE            ("type",                MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    RELEASEGROUP_ID        ("rgid",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    TAG                ("tag",            MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
     TRACKNUM    ("tnum",        MusicBrainzFieldTypes.TEXT_STORED_NOT_ANALYZED, new KeywordAnalyzer()),
-    TRACK_ARTIST_CREDIT     ("trackartistcredit",   MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    TRACK_OUTPUT            ("trackoutput",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    TRACK_DURATION_OUTPUT   ("trackdur",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
-    RECORDING_DURATION_OUTPUT("recordingdur",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
 
+    RECORDING_STORE     ("recordingstore",    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
 
+
     ;
 
     private String name;

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.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,9 +33,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     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_NOT_STORED_ANALYZED, new TitleAnalyzer()),
+    RELEASE    ("release",    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new TitleAnalyzer()),
     RELEASE_ACCENT      ("releaseaccent",   MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED, new MusicbrainzKeepAccentsAnalyzer()),
-    RELEASE_ID    ("reid",    MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
+    RELEASE_ID    ("reid",    MusicBrainzFieldTypes.TEXT_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()),

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -9,6 +9,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Test;
 import org.musicbrainz.mmd2.ArtistCredit;
+import org.musicbrainz.mmd2.Recording;
+import org.musicbrainz.mmd2.Release;
 
 import java.sql.Statement;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -240,24 +242,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.TRACK_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_ID.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_STATUS.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.ISRC.getName()).length);
-            assertEquals("2f250ed2-6285-40f1-aa2a-14f1c05e9765", doc.getField(RecordingIndexField.RECORDING_ID.getName()).stringValue());
-            assertEquals("Crocodiles (bonus disc)", doc.getField(RecordingIndexField.RELEASE.getName()).stringValue());
-            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", doc.getField(RecordingIndexField.RELEASE_ID.getName()).stringValue());
-            assertEquals(2, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.NUM_TRACKS.getName()).stringValue())));
-            assertEquals(4, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.TRACKNUM.getName()).stringValue())));
-            assertEquals(2, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.NUM_TRACKS_RELEASE.getName()).stringValue())));
-            assertEquals(33000, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.RECORDING_DURATION_OUTPUT.getName()).stringValue())));
-            assertEquals("Compilation", doc.getField(RecordingIndexField.RELEASE_TYPE.getName()).stringValue());
-            assertEquals("Official", doc.getField(RecordingIndexField.RELEASE_STATUS.getName()).stringValue());
-            assertEquals("FRAAA9000038", doc.getField(RecordingIndexField.ISRC.getName()).stringValue());
-            assertEquals("1", doc.getField(RecordingIndexField.POSITION.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RECORDING_ID, "2f250ed2-6285-40f1-aa2a-14f1c05e9765");
+            checkTerm(ir, RecordingIndexField.RELEASE_TYPE, "compilation");
+            checkTerm(ir, RecordingIndexField.RELEASE_STATUS, "official");
+            checkTerm(ir, RecordingIndexField.ISRC, "fraaa9000038");
+            checkTerm(ir, RecordingIndexField.RELEASE, "bonus");
+            checkTerm(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
+            checkTerm(ir, RecordingIndexField.POSITION, "1");
+            checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
+            checkTerm(ir, RecordingIndexField.TRACKNUM, 4);
+            checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -277,24 +271,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.TRACK_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_ID.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_STATUS.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.ISRC.getName()).length);
-            assertEquals("2f250ed2-6285-40f1-aa2a-14f1c05e9765", doc.getField(RecordingIndexField.RECORDING_ID.getName()).stringValue());
-            assertEquals("Crocodiles (bonus disc)", doc.getField(RecordingIndexField.RELEASE.getName()).stringValue());
-            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", doc.getField(RecordingIndexField.RELEASE_ID.getName()).stringValue());
-            assertEquals(2, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.NUM_TRACKS.getName()).stringValue())));
-            assertEquals(4, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.TRACKNUM.getName()).stringValue())));
-            assertEquals(2, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.NUM_TRACKS_RELEASE.getName()).stringValue())));
-            assertEquals(33000, NumericUtils.prefixCodedToInt(new BytesRef(doc.getField(RecordingIndexField.RECORDING_DURATION_OUTPUT.getName()).stringValue())));
-            assertEquals("Compilation", doc.getField(RecordingIndexField.RELEASE_TYPE.getName()).stringValue());
-            assertEquals("Official", doc.getField(RecordingIndexField.RELEASE_STATUS.getName()).stringValue());
-            assertEquals("FRAAA9000038", doc.getField(RecordingIndexField.ISRC.getName()).stringValue());
-            assertEquals("1", doc.getField(RecordingIndexField.POSITION.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RECORDING_ID, "2f250ed2-6285-40f1-aa2a-14f1c05e9765");
+            checkTerm(ir, RecordingIndexField.RELEASE_TYPE, "compilation");
+            checkTerm(ir, RecordingIndexField.RELEASE_STATUS, "official");
+            checkTerm(ir, RecordingIndexField.ISRC, "fraaa9000038");
+            checkTerm(ir, RecordingIndexField.RELEASE, "bonus");
+            checkTerm(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
+            checkTerm(ir, RecordingIndexField.POSITION, "1");
+            checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
+            checkTerm(ir, RecordingIndexField.TRACKNUM, 4);
+            checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -314,14 +300,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            //assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_ID.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals(0, doc.getFields(RecordingIndexField.RELEASE_STATUS.getName()).length);
-            assertEquals(0, doc.getFields(RecordingIndexField.RELEASE.getName()).length);
-            assertEquals("2f250ed2-6285-40f1-aa2a-14f1c05e9765", doc.getField(RecordingIndexField.RECORDING_ID.getName()).stringValue());
-            assertEquals("standalone", doc.getField(RecordingIndexField.RELEASE_TYPE.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RECORDING_ID, "2f250ed2-6285-40f1-aa2a-14f1c05e9765");
+            checkTerm(ir, RecordingIndexField.RELEASE_TYPE, "standalone");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -341,9 +321,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASEGROUP_ID.getName()).length);
-            assertEquals("efd2ace2-b3b9-305f-8a53-9803595c0e37", doc.getField(RecordingIndexField.RELEASEGROUP_ID.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RELEASEGROUP_ID, "efd2ace2-b3b9-305f-8a53-9803595c0e37");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -364,10 +342,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals("Compilation", doc.getField(RecordingIndexField.RELEASE_TYPE.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RELEASE_TYPE, "compilation");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -387,10 +362,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_PRIMARY_TYPE.getName()).length);
-            assertEquals("Album", doc.getField(RecordingIndexField.RELEASE_PRIMARY_TYPE.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RELEASE_PRIMARY_TYPE, "album");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -409,10 +381,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.COUNTRY.getName()).length);
-            assertEquals("GB", doc.getField(RecordingIndexField.COUNTRY.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.COUNTRY, "gb");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -432,10 +401,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_DATE.getName()).length);
-            assertEquals("1970-01-01", doc.getField(RecordingIndexField.RELEASE_DATE.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RELEASE_DATE, "1970-01-01");
+
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -458,7 +425,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         {
             Document doc = ir.document(1);
 
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(ReleaseGroupIndexField.ARTIST_CREDIT.getName()));
+            Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE.getName()), Recording.class);
+            ArtistCredit ac = recording.getArtistCredit();
             assertNotNull(ac);
             assertEquals("Echo and The Bunnymen", ac.getNameCredit().get(0).getArtist().getSortName());
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -480,10 +448,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals("-", doc.getField(RecordingIndexField.RELEASE_TYPE.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RELEASE_TYPE, "-");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -503,10 +468,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_STATUS.getName()).length);
-            assertEquals("-", doc.getField(RecordingIndexField.RELEASE_STATUS.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.RELEASE_STATUS, "-");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -526,7 +488,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         {
             Document doc = ir.document(1);
 
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.ARTIST_CREDIT.getName()));
+            Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE.getName()), Recording.class);
+            ArtistCredit ac = recording.getArtistCredit();
             assertNotNull(ac);
             assertNull(ac.getNameCredit().get(0).getArtist().getDisambiguation());
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -548,7 +511,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         {
             Document doc = ir.document(1);
 
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.ARTIST_CREDIT.getName()));
+            Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE.getName()), Recording.class);
+            ArtistCredit ac = recording.getArtistCredit();
             assertNotNull(ac);
             assertEquals("a comment", ac.getNameCredit().get(0).getArtist().getDisambiguation());
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -570,10 +534,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         {
             Document doc = ir.document(1);
 
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.ARTIST_CREDIT.getName()));
+            Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE.getName()), Recording.class);
+            ArtistCredit ac = recording.getArtistCredit();
             assertNotNull(ac);
             assertEquals("Echo &amp;amp; The Bunnymen", ac.getNameCredit().get(0).getArtist().getName());
-            assertTrue(doc.get(RecordingIndexField.TRACK_ARTIST_CREDIT.getName()).equals("-"));
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -593,14 +557,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         {
             Document doc = ir.document(1);
 
-            ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.ARTIST_CREDIT.getName()));
+
+            Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE.getName()), Recording.class);
+            ArtistCredit ac = recording.getArtistCredit();
             assertNotNull(ac);
             assertEquals("Echo &amp;amp; The Bunnymen", ac.getNameCredit().get(0).getArtist().getName());
 
-            assertFalse(doc.get(RecordingIndexField.TRACK_ARTIST_CREDIT.getName()).equals("-"));
-            ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.TRACK_ARTIST_CREDIT.getName()));
+
+            ac = recording.getReleaseList().getRelease().get(0).getMediumList().getMedium().get(0).getTrackList().getDefTrack().get(0).getArtistCredit();
             assertNotNull(ac);
-            assertEquals("Pixies", ac.getNameCredit().get(0).getArtist().getName());
+            assertEquals("Echo &amp;amp; The Bunnymen", ac.getNameCredit().get(0).getArtist().getName());
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -618,35 +584,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals("punk", doc.getField(RecordingIndexField.TAG.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.TAG, "punk");
         }
         ir.close();
     }
 
-    /**
-     * &amp;lt; at &amp;gt;throws Exception exception
-     */
-    &amp;lt; at &amp;gt;Test
-    public void testTrackName() throws Exception {
 
-        addTrackOne();
-        RAMDirectory ramDir = new RAMDirectory();
-        createIndex(ramDir);
 
-        IndexReader ir = DirectoryReader.open(ramDir);
-        assertEquals(2, ir.numDocs());
-        {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals("Do It Clean", doc.getField(RecordingIndexField.RECORDING_OUTPUT.getName()).stringValue());
-            assertEquals(1, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.TRACK_OUTPUT.getName()).length);
-            assertEquals("Do It Cleans", doc.getField(RecordingIndexField.TRACK_OUTPUT.getName()).stringValue());
-        }
-        ir.close();
-    }
-
     /**
      * Basic test of all fields
      *
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -662,9 +606,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(2, doc.getFields(RecordingIndexField.ISRC.getName()).length);
-            assertEquals("FRAAA9000038", doc.getField(RecordingIndexField.ISRC.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.ISRC, "fraaa9000038");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -683,9 +625,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.ISRC.getName()).length);
-            assertEquals("-", doc.getField(RecordingIndexField.ISRC.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.ISRC, "-");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -705,9 +645,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.PUID.getName()).length);
-            assertEquals("efd2ace2-b3b9-305f-8a53-9803595c0e38", doc.getField(RecordingIndexField.PUID.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.PUID, "efd2ace2-b3b9-305f-8a53-9803595c0e38");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -727,9 +665,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.PUID.getName()).length);
-            assertEquals("efd2ace2-b3b9-305f-8a53-9803595c0e38", doc.getField(RecordingIndexField.PUID.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.PUID, "efd2ace2-b3b9-305f-8a53-9803595c0e38");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -749,9 +685,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.COMMENT.getName()).length);
-            assertEquals("demo", doc.getField(RecordingIndexField.COMMENT.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.COMMENT, "demo");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -771,9 +705,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.NUMBER.getName()).length);
-            assertEquals("A4", doc.getField(RecordingIndexField.NUMBER.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.NUMBER, "a4");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -814,9 +746,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.FORMAT.getName()).length);
-            assertEquals("Vinyl", doc.getField(RecordingIndexField.FORMAT.getName()).stringValue());
+            checkTerm(ir, RecordingIndexField.FORMAT, "vinyl");
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -858,34 +788,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            Document doc = ir.document(1);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.TRACK_OUTPUT.getName()).length);
-            assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_ID.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.RELEASE_TYPE.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.RELEASE.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.RELEASE_STATUS.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.TRACKNUM.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.NUM_TRACKS.getName()).length);
-            assertEquals(2, doc.getFields(RecordingIndexField.ISRC.getName()).length);
-            assertEquals("2f250ed2-6285-40f1-aa2a-14f1c05e9765", doc.getField(RecordingIndexField.RECORDING_ID.getName()).stringValue());
-            assertEquals("Crocodiles (bonus disc)", doc.getFields(RecordingIndexField.RELEASE.getName())[0].stringValue());
-            assertEquals("Crocodiles", doc.getFields(RecordingIndexField.RELEASE.getName())[1].stringValue());
-            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134e", doc.getFields(RecordingIndexField.RELEASE_ID.getName())[0].stringValue());
-            assertEquals("c3b8dbc9-c1ff-4743-9015-8d762819134f", doc.getFields(RecordingIndexField.RELEASE_ID.getName())[1].stringValue());
-            //assertEquals(2, NumericUtils.prefixCodedToInt(doc.getField(RecordingIndexField.NUM_TRACKS.getName()).stringValue()));
-            //assertEquals(7, NumericUtils.prefixCodedToInt(doc.getFields(RecordingIndexField.TRACKNUM.getName())[0].stringValue()));
-            //assertEquals(4, NumericUtils.prefixCodedToInt(doc.getFields(RecordingIndexField.TRACKNUM.getName())[1].stringValue()));
-            //assertEquals(2, NumericUtils.prefixCodedToInt(doc.getField(RecordingIndexField.NUM_TRACKS_RELEASE.getName()).stringValue()));
-            //assertEquals(33000, NumericUtils.prefixCodedToInt(doc.getField(RecordingIndexField.RECORDING_DURATION_OUTPUT.getName()).stringValue()));
-            assertEquals("Album", doc.getFields(RecordingIndexField.RELEASE_TYPE.getName())[0].stringValue());
-            assertEquals("Single", doc.getFields(RecordingIndexField.RELEASE_TYPE.getName())[1].stringValue());
-            assertEquals("Official", doc.getFields(RecordingIndexField.RELEASE_STATUS.getName())[0].stringValue());
-            assertEquals("Promotion", doc.getFields(RecordingIndexField.RELEASE_STATUS.getName())[1].stringValue());
+            checkTerm(ir, RecordingIndexField.RECORDING_ID, "2f250ed2-6285-40f1-aa2a-14f1c05e9765");
+            checkTerm(ir, RecordingIndexField.RELEASE_TYPE, "album");
+            checkTerm(ir, RecordingIndexField.RELEASE_STATUS, "official");
+            checkTerm(ir, RecordingIndexField.ISRC, "fraaa9000038");
+            checkTerm(ir, RecordingIndexField.RELEASE, "bonus");
+            checkTerm(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134e");
+            checkTerm(ir, RecordingIndexField.POSITION, "1");
 
-            assertEquals("FRAAA9000038", doc.getField(RecordingIndexField.ISRC.getName()).stringValue());
-            assertEquals("1", doc.getFields(RecordingIndexField.POSITION.getName())[0].stringValue());
-            assertEquals("1", doc.getFields(RecordingIndexField.POSITION.getName())[1].stringValue());
+            checkTermX(ir, RecordingIndexField.RELEASE_ID, "c3b8dbc9-c1ff-4743-9015-8d762819134f",1);
+            checkTermX(ir, RecordingIndexField.RELEASE_TYPE, "single",1);
+            checkTermX(ir, RecordingIndexField.RELEASE_STATUS, "promotion",1);
+            //checkTermX(ir, RecordingIndexField.POSITION, "1",1);
+
+            checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
+            checkTerm(ir, RecordingIndexField.TRACKNUM, 4);
+            checkTerm(ir, RecordingIndexField.NUM_TRACKS_RELEASE, 2);
+
         }
         ir.close();
     }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/RecordingSearch.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,7 +45,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   &amp;lt; at &amp;gt;Override
   protected String printExplainHeader(Document doc) throws IOException, ParseException {
     return doc.get(RecordingIndexField.RECORDING_ID.getName()) + ':'
-        + doc.get(RecordingIndexField.RECORDING_OUTPUT.getName()) + '\n';
+        + doc.get(RecordingIndexField.RECORDING.getName()) + '\n';
   }
 
     /**

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/TrackMmd1XmlWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/TrackMmd1XmlWriter.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/TrackMmd1XmlWriter.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,6 +28,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 package org.musicbrainz.search.servlet.mmd1;
 
+import com.google.common.base.Strings;
 import com.jthink.brainz.mmd.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.lucene.util.BytesRef;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,7 +36,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.musicbrainz.mmd2.ArtistCredit;
 import org.musicbrainz.search.MbDocument;
 import org.musicbrainz.search.index.ArtistCreditHelper;
+import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.index.RecordingIndexField;
+import org.musicbrainz.search.index.ReleaseIndexField;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -55,69 +58,51 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         for (Result result : results.results) {
             MbDocument doc = result.getDoc();
             Track track = of.createTrack();
-
-            track.setId(doc.get(RecordingIndexField.RECORDING_ID));
-
             result.setNormalizedScore(results.getMaxScore());
             track.getOtherAttributes().put(getScore(), String.valueOf(result.getNormalizedScore()));
 
-            String name = doc.get(RecordingIndexField.RECORDING_OUTPUT);
 
-            if (name != null) {
-                track.setTitle(name);
+            org.musicbrainz.mmd2.Recording recordingv2
+                    = (org.musicbrainz.mmd2.Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE), org.musicbrainz.mmd2.Recording.class);
+
+            track.setId(recordingv2.getId());
+
+            if (!Strings.isNullOrEmpty(recordingv2.getTitle())) {
+                track.setTitle(recordingv2.getTitle());
             }
 
-            String duration = doc.get(RecordingIndexField.DURATION);
-            if (isNotNoValue(duration)) {
-                track.setDuration(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(duration))));
+            if (recordingv2.getLength()!=null) {
+                track.setDuration(recordingv2.getLength());
             }
 
-            if(doc.get(RecordingIndexField.ARTIST_CREDIT)!=null) {
-                ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.ARTIST_CREDIT));
-                if (ac.getNameCredit().size()&amp;gt;0) {
+            ArtistCredit acv2 = recordingv2.getArtistCredit();
+            if(acv2!=null) {
+                if (acv2.getNameCredit().size() &amp;gt; 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());
                     track.setArtist(artist);
                 }
             }
 
-
-            String[] releaseIds         = doc.getValues(RecordingIndexField.RELEASE_ID);
-            String[] releaseTypes       = doc.getValues(RecordingIndexField.RELEASE_TYPE);
-            String[] numTracks          = doc.getValues(RecordingIndexField.NUM_TRACKS_RELEASE);
-            String[] trackNos           = doc.getValues(RecordingIndexField.TRACKNUM);
-            String[] releases           = doc.getValues(RecordingIndexField.RELEASE);
-
-            ReleaseList releaseList = of.createReleaseList();
-            for (int i = 0; i &amp;lt; releaseIds.length; i++) {
-                String releaseName = releases[i];
-                if (releaseName != null) {
+            if(recordingv2.getReleaseList()!=null) {
+                ReleaseList releaseList = of.createReleaseList();
+                for(org.musicbrainz.mmd2.Release releasev2:recordingv2.getReleaseList().getRelease()) {
                     Release release = of.createRelease();
-                    release.setId(releaseIds[i]);
-                    release.setTitle(releaseName);
+                    release.setId(releasev2.getId());
+                    release.setTitle(releasev2.getTitle());
+                    release.getType().add(StringUtils.capitalize(releasev2.getReleaseGroup().getType()));
 
-                    String type = releaseTypes[i];
-                    if (isNotNoValue(type)) {
-                        release.getType().add(StringUtils.capitalize(type));
-                    }
-
-                    String trackNo = trackNos[i];
-                    String tracks  = numTracks[i];
-                    if (trackNo != null) {
-                        TrackList releaseTrackList = of.createTrackList();
-                        releaseTrackList.setOffset(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(trackNo)) - 1));
-                        if (tracks != null) {
-                            releaseTrackList.setCount(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(tracks))));
-                        }
-                        release.setTrackList(releaseTrackList);
-                    }
+                    TrackList releaseTrackList = of.createTrackList();
+                    releaseTrackList.setOffset(releasev2.getMediumList().getMedium().get(0).getTrackList().getOffset());
+                    releaseTrackList.setCount(releasev2.getMediumList().getMedium().get(0).getTrackList().getCount());
+                    release.setTrackList(releaseTrackList);
                     releaseList.getRelease().add(release);
                 }
+                track.setReleaseList(releaseList);
+                trackList.getTrack().add(track);
             }
-            track.setReleaseList(releaseList);
-            trackList.getTrack().add(track);
         }
         trackList.setCount(BigInteger.valueOf(results.getTotalHits()));
         trackList.setOffset(BigInteger.valueOf(results.getOffset()));

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/RecordingWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/RecordingWriter.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/RecordingWriter.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,6 +35,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.musicbrainz.search.index.ArtistCreditHelper;
 import org.musicbrainz.search.index.MMDSerializer;
 import org.musicbrainz.search.index.RecordingIndexField;
+import org.musicbrainz.search.index.ReleaseIndexField;
 import org.musicbrainz.search.servlet.Result;
 import org.musicbrainz.search.servlet.Results;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,29 +46,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 public class RecordingWriter extends ResultsWriter {
 
-    private static final String VARIOUS_ARTISTS_GUID = "89ad4ac3-39f7-470e-963a-56509c546377";
-    private static final String VARIOUS_ARTISTS_NAME = "Various Artists";
 
     /**
-     * Create various artist credits
      *
-     * &amp;lt; at &amp;gt;return
-     */
-    private ArtistCredit createVariousArtistsCredit()
-    {
-        ObjectFactory of = new ObjectFactory();
-        Artist       artist   = of.createArtist();
-        artist.setId(VARIOUS_ARTISTS_GUID);
-        artist.setName(VARIOUS_ARTISTS_NAME);
-        NameCredit   naCredit = of.createNameCredit();
-        naCredit.setArtist(artist);
-        ArtistCredit vaCredit = of.createArtistCredit();
-        vaCredit.getNameCredit().add(naCredit);
-        return vaCredit;
-    }
-
-    /**
-     *
      * &amp;lt; at &amp;gt;param metadata
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;throws IOException
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -110,177 +91,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      */
     public void write(List list, Result result) throws IOException
     {
-        ObjectFactory of = new ObjectFactory();
-        RecordingList recordingList = of.createRecordingList();
-
-            MbDocument doc = result.getDoc();
-            Recording recording = of.createRecording();
-
-            recording.setId(doc.get(RecordingIndexField.RECORDING_ID));
-            recording.setScore(String.valueOf(result.getNormalizedScore()));
-            String name = doc.get(RecordingIndexField.RECORDING_OUTPUT);
-
-            if (name != null) {
-                recording.setTitle(name);
-            }
-
-            String comment = doc.get(RecordingIndexField.COMMENT);
-            if (isNotNoValue(comment)) {
-                recording.setDisambiguation(comment);
-            }
-
-            String duration = doc.get(RecordingIndexField.RECORDING_DURATION_OUTPUT);
-            if (duration != null) {
-                recording.setLength(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(duration))));
-            }
-
-            String[] isrcs              = doc.getValues(RecordingIndexField.ISRC);
-            if(isrcs.length&amp;gt;0) {
-                IsrcList isrcList = of.createIsrcList();
-                for (int i = 0; i &amp;lt; isrcs.length; i++) {
-                    if (isNotNoValue(isrcs[i])) {
-                        Isrc isrc = of.createIsrc();
-                        isrc.setId(isrcs[i]);
-                        isrcList.getIsrc().add(isrc);
-                    }
-                }
-                if(isrcList.getIsrc().size()&amp;gt;0) {
-                    recording.setIsrcList(isrcList);
-                }
-            }
-
-            String[] puids              = doc.getValues(RecordingIndexField.PUID);
-            if(puids.length&amp;gt;0) {
-                PuidList puidList = of.createPuidList();
-                for (int i = 0; i &amp;lt; puids.length; i++) {
-                    Puid puid = of.createPuid();
-                    puid.setId(puids[i]);
-                    puidList.getPuid().add(puid);
-                }
-                recording.setPuidList(puidList);
-            }
-
-            if(doc.get(RecordingIndexField.ARTIST_CREDIT)!=null) {
-                ArtistCredit ac = ArtistCreditHelper.unserialize(doc.get(RecordingIndexField.ARTIST_CREDIT));
-                recording.setArtistCredit(ac);
-            }
-
-            String[] releaseNames       = doc.getValues(RecordingIndexField.RELEASE);
-
-            if(releaseNames.length&amp;gt;0)
-            {
-                String[] rgTypes                = doc.getValues(RecordingIndexField.RELEASE_TYPE);
-                String[] rgIds                  = doc.getValues(RecordingIndexField.RELEASEGROUP_ID);
-                String[] rgPrimaryTypes         = doc.getValues(RecordingIndexField.RELEASE_PRIMARY_TYPE);
-                String[] rgSecondaryTypes       = doc.getValues(RecordingIndexField.SECONDARY_TYPE_OUTPUT);
-                String[] releaseIds             = doc.getValues(RecordingIndexField.RELEASE_ID);
-                String[] releaseStatus          = doc.getValues(RecordingIndexField.RELEASE_STATUS);
-                String[] releaseCountry         = doc.getValues(RecordingIndexField.COUNTRY);
-                String[] releaseDate            = doc.getValues(RecordingIndexField.RELEASE_DATE);
-                String[] trackPos               = doc.getValues(RecordingIndexField.TRACKNUM);
-                String[] trackNos               = doc.getValues(RecordingIndexField.NUMBER);
-                String[] numTracks              = doc.getValues(RecordingIndexField.NUM_TRACKS);
-                String[] trackName              = doc.getValues(RecordingIndexField.TRACK_OUTPUT);
-                String[] mediumPos              = doc.getValues(RecordingIndexField.POSITION);
-                String[] numTracksRelease       = doc.getValues(RecordingIndexField.NUM_TRACKS_RELEASE);
-                String[] releaseVA              = doc.getValues(RecordingIndexField.RELEASE_AC_VA);
-                String[] mediumFormat           = doc.getValues(RecordingIndexField.FORMAT);
-                String[] trackArtistCredits     = doc.getValues(RecordingIndexField.TRACK_ARTIST_CREDIT);
-                String[] trackDurations         = doc.getValues(RecordingIndexField.TRACK_DURATION_OUTPUT);
-
-                ReleaseList releaseList = of.createReleaseList();
-                for(int i=0;i&amp;lt;releaseNames.length;i++) {
-
-                    Release release = of.createRelease();
-                    release.setId(releaseIds[i]);
-                    release.setTitle(releaseNames[i]);
-                    if (isNotNoValue(releaseStatus[i])) {
-                        release.setStatus(releaseStatus[i]);
-                    }
-
-
-                    if (isNotNoValue(releaseDate[i])) {
-                        release.setDate(releaseDate[i].toLowerCase(Locale.US));
-                    }
-
-                    if (isNotNoValue(releaseCountry[i])) {
-                        release.setCountry(releaseCountry[i]);
-                    }
-
-                    if (isNotNoValue(releaseVA[i])) {
-                        release.setArtistCredit(createVariousArtistsCredit());
-                    }
-
-                    ReleaseGroup rg = of.createReleaseGroup();
-                    release.setReleaseGroup(rg);
-                    if (isNotUnknown(rgIds[i])) {
-                        rg.setId(rgIds[i]);
-                    }
-
-                    if (isNotNoValue(rgTypes[i])) {
-                        rg.setType(rgTypes[i]);
-                    }
-
-                    if(isNotUnknown(rgPrimaryTypes[i])) {
-                        rg.setPrimaryType(rgPrimaryTypes[i]);
-                    }
-
-                    if(isNotNoValue(rgSecondaryTypes[i])) {
-                        SecondaryTypeList stl = (SecondaryTypeList)MMDSerializer
-                                .unserialize(rgSecondaryTypes[i],SecondaryTypeList.class);
-                        release.getReleaseGroup().setSecondaryTypeList(stl);
-                    }
-
-                    org.musicbrainz.mmd2.Medium.TrackList.Track track = of.createMediumTrackListTrack();
-                    track.setTitle(trackName[i]);
-
-                    if (isNotNoValue(trackNos[i])) {
-                        track.setNumber(trackNos[i]);
-                    }
-
-                    if (isNotNoValue(trackDurations[i])) {
-                        track.setLength(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(trackDurations[i]))));
-                    }
-
-                    if (isNotNoValue(trackArtistCredits[i])) {
-                        ArtistCredit tac = ArtistCreditHelper.unserialize(trackArtistCredits[i]);
-                        track.setArtistCredit(tac);
-                    }
-
-                    org.musicbrainz.mmd2.Medium.TrackList releaseTrackList = of.createMediumTrackList();
-                    releaseTrackList.setOffset(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(trackPos[i])) - 1));
-                    releaseTrackList.setCount(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(numTracks[i]))));
-                    releaseTrackList.getDefTrack().add(track);
-                    Medium medium = of.createMedium();
-                    medium.setPosition(new BigInteger(mediumPos[i]));
-                    medium.setTrackList(releaseTrackList);
-                    if(isNotNoValue(mediumFormat[i]))
-                    {
-                        medium.setFormat(mediumFormat[i]);
-                    }
-                    MediumList mediumList = of.createMediumList();
-                    mediumList.setTrackCount(BigInteger.valueOf(NumericUtils.prefixCodedToInt(new BytesRef(numTracksRelease[i]))));
-                    mediumList.getMedium().add(medium);
-                    release.setMediumList(mediumList);
-                    releaseList.getRelease().add(release);
-                }
-                recording.setReleaseList(releaseList);
-            }
-
-            String[] tags       = doc.getValues(RecordingIndexField.TAG);
-            String[] tagCounts  = doc.getValues(RecordingIndexField.TAGCOUNT);
-            if(tags.length&amp;gt;0)
-            {
-                TagList tagList = of.createTagList();
-                for(int i = 0;i&amp;lt;tags.length;i++) {
-                    Tag tag = of.createTag();
-                    tag.setName(tags[i]);
-                    tag.setCount(new BigInteger(tagCounts[i]));
-                    tagList.getTag().add(tag);
-                }
-                recording.setTagList(tagList);
-            }
-
-            list.add(recording);
+        MbDocument doc = result.getDoc();
+        Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE), Recording.class);
+        recording.setScore(String.valueOf(result.getNormalizedScore()));
+        list.add(recording);
     }
 }
\ No newline at end of file

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindRecordingTest.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5,6 +5,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.math.BigInteger;
 import java.util.Date;
 
 import org.apache.lucene.analysis.Analyzer;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,17 +17,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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.SecondaryTypeList;
+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.MMDSerializer;
-import org.musicbrainz.search.index.MetaIndexField;
-import org.musicbrainz.search.index.RecordingIndexField;
+import org.musicbrainz.search.index.*;
 import org.musicbrainz.search.servlet.mmd1.TrackMmd1XmlWriter;
 
 /**
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,620 +30,588 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 public class FindRecordingTest {
 
 
-  private AbstractSearchServer ss;
-  private AbstractDismaxSearchServer sd;
+    private AbstractSearchServer ss;
+    private AbstractDismaxSearchServer sd;
 
 
+    &amp;lt; at &amp;gt;Before
+    public void setUp() throws Exception {
+        ObjectFactory of = new ObjectFactory();
 
-  &amp;lt; at &amp;gt;Before
-  public void setUp() throws Exception {
-    ObjectFactory of = new ObjectFactory();
+        RAMDirectory ramDir = new RAMDirectory();
+        Analyzer analyzer = DatabaseIndex.getAnalyzer(RecordingIndexField.class);
+        IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION, analyzer);
+        IndexWriter writer = new IndexWriter(ramDir, writerConfig);
 
-    RAMDirectory ramDir = new RAMDirectory();
-    Analyzer analyzer = DatabaseIndex.getAnalyzer(RecordingIndexField.class);
-    IndexWriterConfig writerConfig = new IndexWriterConfig(LuceneVersion.LUCENE_VERSION,analyzer);
-    IndexWriter writer = new IndexWriter(ramDir, writerConfig);
+        {
+            MbDocument doc = new MbDocument();
+            Recording recording = of.createRecording();
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(RecordingIndexField.RECORDING_ID, "7ca7782b-a602-448b-b108-bb881a7be2d6");
-      doc.addField(RecordingIndexField.RECORDING, "Gravitational Lenz");
-      doc.addField(RecordingIndexField.RECORDING_OUTPUT, "Gravitational Lenz");
-      doc.addField(RecordingIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
-      doc.addField(RecordingIndexField.RELEASE, "Our Glorious 5 Year Plan");
-      doc.addField(RecordingIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-      doc.addField(RecordingIndexField.ARTIST, "Farming Incident");
-      doc.addField(RecordingIndexField.ARTIST_NAME, "Farming Incident");
-      doc.addField(RecordingIndexField.PUID, "1d9e8ed6-3893-4d3b-aa7d-72e79609e386");
-      doc.addField(RecordingIndexField.COMMENT, "demo");
-      doc.addField(RecordingIndexField.COUNTRY, "UK");
-      doc.addField(RecordingIndexField.FORMAT, "Vinyl");
+            doc.addField(RecordingIndexField.RECORDING_ID, "7ca7782b-a602-448b-b108-bb881a7be2d6");
+            recording.setId("7ca7782b-a602-448b-b108-bb881a7be2d6");
 
+            doc.addField(RecordingIndexField.RECORDING, "Gravitational Lenz");
+            doc.addField(RecordingIndexField.RECORDING, "Gravitational Lens");
+            recording.setTitle("Gravitational Lenz");
 
-      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(RecordingIndexField.ARTIST_CREDIT, MMDSerializer.serialize(ac));
+            doc.addField(RecordingIndexField.COMMENT, "demo");
+            recording.setDisambiguation("demo");
 
-      //Track Artist different to Recording Artist
-      ac = of.createArtistCredit();
-      nc = of.createNameCredit();
-      artist = of.createArtist();
-      artist.setId("2302e264-1cf0-4d1f-aca7-2a6f89e34b36");
-      artist.setName("Pig Incident");
-      artist.setSortName("Incident, Pig");
-      nc.setArtist(artist);
-      ac.getNameCredit().add(nc);
-      doc.addField(RecordingIndexField.TRACK_ARTIST_CREDIT, MMDSerializer.serialize(ac));
+            doc.addField(RecordingIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
+            doc.addField(RecordingIndexField.RELEASE, "Our Glorious 5 Year Plan");
+            doc.addField(RecordingIndexField.COUNTRY, "UK");
 
-      doc.addNumericField(RecordingIndexField.DURATION, 234000);
-      doc.addNumericField(RecordingIndexField.RECORDING_DURATION_OUTPUT, 234000);
 
-      doc.addNumericField(RecordingIndexField.QUANTIZED_DURATION, (234000 / 2000));
-      doc.addNumericField(RecordingIndexField.NUM_TRACKS,10);
-      doc.addNumericField(RecordingIndexField.NUM_TRACKS_RELEASE,10);
-      doc.addNumericField(RecordingIndexField.TRACKNUM, 5);
-      doc.addField(RecordingIndexField.NUMBER, "A4");
-      doc.addField(RecordingIndexField.TRACK_OUTPUT, "Gravitational Lens");
-      doc.addField(RecordingIndexField.RECORDING, "Gravitational Lens");
-      doc.addField(RecordingIndexField.RELEASEGROUP_ID, "4444e264-1cf0-4d1f-aca7-2a6f89e34b36");
 
-      doc.addField(RecordingIndexField.POSITION, "1");
-      doc.addField(RecordingIndexField.RELEASE_TYPE, "Compilation");
-      doc.addField(RecordingIndexField.RELEASE_PRIMARY_TYPE, "Album");
-      doc.addField(RecordingIndexField.RELEASE_SECONDARY_TYPE, "Compilation");
+            doc.addField(RecordingIndexField.FORMAT, "Vinyl");
+            ReleaseList releaseList = of.createReleaseList();
+            Release release = of.createRelease();
+            MediumList ml = of.createMediumList();
+            Medium m = of.createMedium();
+            Medium.TrackList trackList = of.createMediumTrackList();
+            releaseList.getRelease().add(release);
+            release.setMediumList(ml);
+            ml.getMedium().add(m);
+            m.setTrackList(trackList);
+            Medium.TrackList.Track track = of.createMediumTrackListTrack();
+            trackList.getDefTrack().add(track);
+            recording.setReleaseList(releaseList);
+            m.setFormat("Vinyl");
+            track.setTitle("Gravitational Lens");
 
-      SecondaryTypeList stl = of.createSecondaryTypeList();
-      stl.getSecondaryType().add("Compilation");
-      doc.addField(RecordingIndexField.SECONDARY_TYPE_OUTPUT, MMDSerializer.serialize(stl));
+            release.setId("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
+            release.setTitle("Our Glorious 5 Year Plan");
+            release.setCountry("UK");
 
-      doc.addField(RecordingIndexField.RELEASE_STATUS, "Official");
-      doc.addField(RecordingIndexField.RELEASE_DATE, "1970-01-01");
-      doc.addField(RecordingIndexField.ISRC, "123456789");
-      doc.addField(RecordingIndexField.ISRC, "abcdefghi");
-      doc.addNumericField(RecordingIndexField.DURATION, 233000);
-      doc.addNumericField(RecordingIndexField.TRACK_DURATION_OUTPUT, 233000);
+            doc.addField(RecordingIndexField.PUID, "1d9e8ed6-3893-4d3b-aa7d-72e79609e386");
+            PuidList puidList = of.createPuidList();
+            Puid puid = of.createPuid();
+            puid.setId("1d9e8ed6-3893-4d3b-aa7d-72e79609e386");
+            puidList.getPuid().add(puid);
+            recording.setPuidList(puidList);
 
-      doc.addField(RecordingIndexField.TAG, "indie");
-      doc.addField(RecordingIndexField.TAGCOUNT, "101");
-      doc.addField(RecordingIndexField.RELEASE_AC_VA,"1");
-      writer.addDocument(doc.getLuceneDocument());
+            doc.addField(RecordingIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(RecordingIndexField.ARTIST, "Farming Incident");
+            doc.addField(RecordingIndexField.ARTIST_NAME, "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);
+            recording.setArtistCredit(ac);
+
+            //Track Artist different to Recording Artist
+            ac = of.createArtistCredit();
+            nc = of.createNameCredit();
+            artist = of.createArtist();
+            artist.setId("2302e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            artist.setName("Pig Incident");
+            artist.setSortName("Incident, Pig");
+            nc.setArtist(artist);
+            ac.getNameCredit().add(nc);
+            track.setArtistCredit(ac);
+
+            doc.addNumericField(RecordingIndexField.DURATION, 234000);
+            recording.setLength(BigInteger.valueOf(234000));
+
+            doc.addField(RecordingIndexField.RELEASEGROUP_ID, "4444e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            doc.addField(RecordingIndexField.POSITION, "1");
+            doc.addField(RecordingIndexField.RELEASE_TYPE, "Compilation");
+            doc.addField(RecordingIndexField.RELEASE_PRIMARY_TYPE, "Album");
+            doc.addField(RecordingIndexField.RELEASE_SECONDARY_TYPE, "Compilation");
+            ReleaseGroup rg = of.createReleaseGroup();
+            rg.setId("4444e264-1cf0-4d1f-aca7-2a6f89e34b36");
+            rg.setType("Compilation");
+            rg.setPrimaryType("Album");
+            SecondaryTypeList slt = of.createSecondaryTypeList();
+            slt.getSecondaryType().add("Compilation");
+            rg.setSecondaryTypeList(slt);
+            release.setReleaseGroup(rg);
+            m.setPosition(BigInteger.valueOf(1));
+
+            doc.addNumericField(RecordingIndexField.QUANTIZED_DURATION, (234000 / 2000));
+            doc.addNumericField(RecordingIndexField.NUM_TRACKS, 10);
+            doc.addNumericField(RecordingIndexField.NUM_TRACKS_RELEASE, 10);
+            doc.addNumericField(RecordingIndexField.TRACKNUM, 5);
+            doc.addField(RecordingIndexField.NUMBER, "A4");
+            trackList.setCount(BigInteger.valueOf(10));
+            trackList.setOffset(BigInteger.valueOf(4));
+            track.setNumber("A4");
+            track.setLength(BigInteger.valueOf(233000));
+            ml.setTrackCount(BigInteger.valueOf(10));
+            doc.addField(RecordingIndexField.RELEASE_STATUS, "Official");
+            doc.addField(RecordingIndexField.RELEASE_DATE, "1970-01-01");
+            release.setStatus("Official");
+            release.setDate("1970-01-01");
+
+            doc.addField(RecordingIndexField.ISRC, "123456789");
+            doc.addField(RecordingIndexField.ISRC, "abcdefghi");
+            IsrcList isrcList = of.createIsrcList();
+            recording.setIsrcList(isrcList);
+            Isrc isrc1 = of.createIsrc();
+            isrc1.setId("123456789");
+            Isrc isrc2 = of.createIsrc();
+            isrc2.setId("abcdefghi");
+
+            isrcList.getIsrc().add(isrc1);
+            isrcList.getIsrc().add(isrc2);
+
+
+            doc.addNumericField(RecordingIndexField.DURATION, 233000);
+
+
+            doc.addField(RecordingIndexField.TAG, "indie");
+            TagList tagList = of.createTagList();
+            Tag tag = of.createTag();
+            tag.setName("indie");
+            tag.setCount(new BigInteger("101"));
+            tagList.getTag().add(tag);
+            release.setTagList(tagList);
+
+            doc.addField(RecordingIndexField.RELEASE_AC_VA, "1");
+            Artist vaArtist = of.createArtist();
+            vaArtist.setId("89ad4ac3-39f7-470e-963a-56509c546377");
+            vaArtist.setName("Various Artists");
+            NameCredit   naCredit = of.createNameCredit();
+            naCredit.setArtist(vaArtist);
+            ArtistCredit vaCredit = of.createArtistCredit();
+            vaCredit.getNameCredit().add(naCredit);
+            release.setArtistCredit(vaCredit);
+
+            doc.addField(RecordingIndexField.RECORDING_STORE, MMDSerializer.serialize(recording));
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        {
+            MbDocument doc = new MbDocument();
+            doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
+            doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
+            writer.addDocument(doc.getLuceneDocument());
+        }
+
+        writer.close();
+        SearcherManager searcherManager = new SearcherManager(ramDir,
+                new MusicBrainzSearcherFactory(ResourceType.RECORDING));
+        ss = new RecordingSearch(searcherManager);
+        sd = new RecordingDismaxSearch(ss);
     }
 
-    {
-      MbDocument doc = new MbDocument();
-      doc.addField(MetaIndexField.META, MetaIndexField.META_VALUE);
-      doc.addNumericField(MetaIndexField.LAST_UPDATED, new Date().getTime());
-      writer.addDocument(doc.getLuceneDocument());
+    protected String getRecordingId(MbDocument doc) {
+        Recording recording = (Recording) MMDSerializer.unserialize(doc.get(RecordingIndexField.RECORDING_STORE), Recording.class);
+        return recording.getId();
     }
 
-    writer.close();
-    SearcherManager searcherManager = new SearcherManager(ramDir,
-        new MusicBrainzSearcherFactory(ResourceType.RECORDING));
-    ss = new RecordingSearch(searcherManager);
-    sd = new RecordingDismaxSearch(ss);
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByV1TrackField() throws Exception {
+        Results res = ss.search("track:\"Gravitational Lenz\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByV1TrackField() throws Exception {
-    Results res = ss.search("track:\"Gravitational Lenz\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
 
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecording() throws Exception {
+        Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecording() throws Exception {
-    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-    assertEquals("Gravitational Lens", doc.get(RecordingIndexField.TRACK_OUTPUT));
-    assertEquals("123456789", doc.get(RecordingIndexField.ISRC));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingDismax1() throws Exception {
+        Results res = sd.search("Gravitational", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingDismax1() throws Exception {
-    Results res = sd.search("Gravitational", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingDismax2() throws Exception {
+        Results res = sd.search("Glorious", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingDismax2() throws Exception {
-    Results res = sd.search("Glorious", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingDismax3() throws Exception {
+        Results res = sd.search("Farming Incident", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingDismax3() throws Exception {
-    Results res = sd.search("Farming Incident", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByV1TrackId() throws Exception {
+        Results res = ss.search("trid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByV1TrackId() throws Exception {
-    Results res = ss.search("trid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingById() throws Exception {
+        Results res = ss.search("rid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingById() throws Exception {
-    Results res = ss.search("rid:\"7ca7782b-a602-448b-b108-bb881a7be2d6\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseId() throws Exception {
+        Results res = ss.search("reid:\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseId() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByDemo() throws Exception {
+        Results res = ss.search("comment:\"demo\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByDemo() 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("demo", doc.get(RecordingIndexField.COMMENT));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByArtistId() throws Exception {
+        Results res = ss.search("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByArtistId() throws Exception {
-    Results res = ss.search("arid:\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    public void testFindRecordingByArtistName() throws Exception {
+        Results res = ss.search("artist:\"Farming Incident\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  public void testFindRecordingByArtistName() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    /**
+     * Searches recording field, which should include names of associated tracks)
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByTrackName() throws Exception {
+        Results res = ss.search("recording:\"Gravitational Lens\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  /** Searches recording field, which should include names of associated tracks) */
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByTrackName() throws Exception {
-    Results res = ss.search("recording:\"Gravitational Lens\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseType() throws Exception {
+        Results res = ss.search("type:\"compilation\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseType() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByPrimaryReleaseType() throws Exception {
+        Results res = ss.search("primarytype:\"album\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByPrimaryReleaseType() throws Exception {
-    Results res = ss.search("primarytype:\"album\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingBySecondaryReleaseType() throws Exception {
+        Results res = ss.search("secondarytype:\"compilation\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingBySecondaryReleaseType() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseGroupId() throws Exception {
+        Results res = ss.search("rgid:\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseGroupId() throws Exception {
-    Results res = ss.search("rgid:\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseCountry() throws Exception {
+        Results res = ss.search("country:UK", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseCountry() throws Exception {
-    Results res = ss.search("country:UK", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseFormat() throws Exception {
+        Results res = ss.search("format:Vinyl", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseFormat() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseTypeNumeric() throws Exception {
+        Results res = ss.search("type:\"4\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseTypeNumeric() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByNumberOfTracksOnMediumOnRelease() throws Exception {
+        Results res = ss.search("tracks:10", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByNumberOfTracksOnMediumOnRelease() throws Exception {
-    Results res = ss.search("tracks:10", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByNumberOfTracksOnRelease() throws Exception {
+        Results res = ss.search("tracksrelease:10", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByNumberOfTracksOnRelease() throws Exception {
-    Results res = ss.search("tracksrelease:10", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByDuration() throws Exception {
+        Results res = ss.search("dur:234000", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByDuration() throws Exception {
-    Results res = ss.search("dur:234000", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByDuration2() throws Exception {
+        Results res = ss.search("dur:234000", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByDuration2() throws Exception {
-    Results res = ss.search("dur:234000", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByISRC() throws Exception {
+        Results res = ss.search("isrc:123456789", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByISRC() throws Exception {
-    Results res = ss.search("isrc:123456789", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByNonNumericDuration() throws Exception {
+        Results res = ss.search("dur:fred", 0, 10);
+        assertEquals(0, res.getTotalHits());
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByNonNumericDuration() throws Exception {
-    Results res = ss.search("dur:fred", 0, 10);
-    assertEquals(0, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByTag() throws Exception {
+        Results res = ss.search("tag:indie", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByTag() throws Exception {
-    Results res = ss.search("tag:indie", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByDurationRange() throws Exception {
+        Results res = ss.search("dur:[87 TO 240000]", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByDurationRange() throws Exception {
-    Results res = ss.search("dur:[87 TO 240000]", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByQdur() throws Exception {
+        Results res = ss.search("qdur:117", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByQdur() throws Exception {
-    Results res = ss.search("qdur:117", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByTrackPosition() throws Exception {
+        Results res = ss.search("tnum:5", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByTrackPosition() throws Exception {
-    Results res = ss.search("tnum:5", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByTrackNumber() throws Exception {
+        Results res = ss.search("number:A4", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByTrackNumber() throws Exception {
-    Results res = ss.search("number:A4", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByPosition() throws Exception {
+        Results res = ss.search("position:1", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByPosition() throws Exception {
-    Results res = ss.search("position:1", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseStatus() throws Exception {
+        Results res = ss.search("status:Official", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseStatus() 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("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByReleaseDate() throws Exception {
+        Results res = ss.search("date:1970-01-01", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByReleaseDate() throws Exception {
-    Results res = ss.search("date:1970-01-01", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByDefault() throws Exception {
+        Results res = ss.search("\"Gravitational Lenz\"", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByDefault() throws Exception {
-    Results res = ss.search("\"Gravitational Lenz\"", 0, 10);
-    assertEquals(1, res.getTotalHits());
-    Result result = res.results.get(0);
-    MbDocument doc = result.getDoc();
-    assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", doc.get(RecordingIndexField.RECORDING_ID));
-    assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(RecordingIndexField.RELEASE_ID));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(5, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.TRACKNUM))));
-    assertEquals("Our Glorious 5 Year Plan", doc.get(RecordingIndexField.RELEASE));
-    assertEquals(234000, NumericUtils.prefixCodedToInt(new BytesRef(doc.get(RecordingIndexField.DURATION))));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testNumericRangeQuery() throws Exception {
+        Results res = ss.search("tracks:[1 TO 10]", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testNumericRangeQuery() throws Exception {
-    Results res = ss.search("tracks:[1 TO 10]", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindRecordingByPuid() throws Exception {
+        Results res = ss.search("puid:1d9e8ed6-3893-4d3b-aa7d-72e79609e386", 0, 10);
+        assertEquals(1, res.getTotalHits());
+        assertEquals("7ca7782b-a602-448b-b108-bb881a7be2d6", getRecordingId(res.results.get(0).getDoc()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindRecordingByPuid() throws Exception {
-    Results res = ss.search("puid:1d9e8ed6-3893-4d3b-aa7d-72e79609e386", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
 
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsMmd1Xml() throws Exception {
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsMmd1Xml() throws Exception {
+        Results res = ss.search("track:\"Gravitational Lenz\"", 0, 10);
+        ResultsWriter writer = new TrackMmd1XmlWriter();
+        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("&amp;lt;track id=\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
+        assertTrue(output.contains("&amp;lt;title&amp;gt;Gravitational Lenz&amp;lt;/title&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;duration&amp;gt;234000&amp;lt;/duration&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("type=\"Compilation\""));
+        assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386"));
+        assertTrue(output.contains("&amp;lt;title&amp;gt;Our Glorious 5 Year Plan&amp;lt;/title&amp;gt;"));
+        assertTrue(output.contains("offset=\"4\""));
+        assertTrue(output.contains("count=\"10\""));
+    }
 
-    Results res = ss.search("track:\"Gravitational Lenz\"", 0, 10);
-    ResultsWriter writer = new TrackMmd1XmlWriter();
-    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("&amp;lt;track id=\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
-    assertTrue(output.contains("&amp;lt;title&amp;gt;Gravitational Lenz&amp;lt;/title&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;duration&amp;gt;234000&amp;lt;/duration&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("type=\"Compilation\""));
-    assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386"));
-    assertTrue(output.contains("&amp;lt;title&amp;gt;Our Glorious 5 Year Plan&amp;lt;/title&amp;gt;"));
-    assertTrue(output.contains("offset=\"4\""));
-    assertTrue(output.contains("count=\"10\""));
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testOutputAsXml() throws Exception {
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsXml() throws Exception {
+        Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
+        ResultsWriter writer = ss.getMmd2Writer();
+        StringWriter sw = new StringWriter();
+        PrintWriter pr = new PrintWriter(sw);
+        writer.write(pr, res, SearchServerServlet.RESPONSE_XML);
+        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=\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("id=\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
+        assertTrue(output.contains("&amp;lt;title&amp;gt;Gravitational Lenz&amp;lt;/title&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;disambiguation&amp;gt;demo&amp;lt;/disambiguation&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;length&amp;gt;234000&amp;lt;/length&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("release id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
+        assertTrue(output.contains("type=\"Compilation\""));
+        assertTrue(output.contains("&amp;lt;primary-type&amp;gt;Album"));
+        assertTrue(output.contains("&amp;lt;secondary-type&amp;gt;Compilation"));
+        assertTrue(output.contains("offset=\"4\""));
+        assertTrue(output.contains("count=\"10\""));
+        assertTrue(output.contains("offset=\"0\""));
+        assertTrue(output.contains("count=\"1\""));
 
-    Results res = ss.search("recording:\"Gravitational Lenz\"", 0, 10);
-    ResultsWriter writer = ss.getMmd2Writer();
-    StringWriter sw = new StringWriter();
-    PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res,SearchServerServlet.RESPONSE_XML);
-    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=\"4444e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("id=\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
-    assertTrue(output.contains("&amp;lt;title&amp;gt;Gravitational Lenz&amp;lt;/title&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;disambiguation&amp;gt;demo&amp;lt;/disambiguation&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;length&amp;gt;234000&amp;lt;/length&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("release id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
-    assertTrue(output.contains("type=\"Compilation\""));
-    assertTrue(output.contains("&amp;lt;primary-type&amp;gt;Album"));
-    assertTrue(output.contains("&amp;lt;secondary-type&amp;gt;Compilation"));
-    assertTrue(output.contains("offset=\"4\""));
-    assertTrue(output.contains("count=\"10\""));
-    assertTrue(output.contains("offset=\"0\""));
-    assertTrue(output.contains("count=\"1\""));
-    assertTrue(output.contains("&amp;lt;country&amp;gt;UK&amp;lt;/country&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;format&amp;gt;Vinyl&amp;lt;/format&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;isrc id=\"123456789\"/&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;isrc id=\"abcdefghi\"/&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;primary-type&amp;gt;Album&amp;lt;/primary-type&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;title&amp;gt;Gravitational Lens&amp;lt;/title&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;status&amp;gt;Official&amp;lt;/status&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;date&amp;gt;1970-01-01&amp;lt;/date&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;track-count&amp;gt;10&amp;lt;/track-count&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;artist-credit&amp;gt;&amp;lt;name-credit&amp;gt;&amp;lt;artist id=\"89ad4ac3-39f7-470e-963a-56509c546377\"&amp;gt;&amp;lt;name&amp;gt;Various Artists&amp;lt;/name&amp;gt;&amp;lt;/artist&amp;gt;&amp;lt;/name-credit&amp;gt;&amp;lt;/artist-credit&amp;gt;"));
-    assertTrue(output.contains("indie&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;track&amp;gt;&amp;lt;number&amp;gt;A4&amp;lt;/number&amp;gt;&amp;lt;title&amp;gt;Gravitational Lens&amp;lt;/title&amp;gt;&amp;lt;length&amp;gt;233000&amp;lt;/length&amp;gt;&amp;lt;artist-credit&amp;gt;&amp;lt;name-credit&amp;gt;&amp;lt;artist id=\"2302e264-1cf0-4d1f-aca7-2a6f89e34b36\"&amp;gt;&amp;lt;name&amp;gt;Pig Incident&amp;lt;/name&amp;gt;&amp;lt;sort-name&amp;gt;Incident, Pig&amp;lt;/sort-name&amp;gt;&amp;lt;/artist&amp;gt;&amp;lt;/name-credit&amp;gt;&amp;lt;/artist-credit&amp;gt;&amp;lt;/track&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;puid-list&amp;gt;&amp;lt;puid id=\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"/&amp;gt;&amp;lt;/puid-list&amp;gt;"));
-  }
+        assertTrue(output.contains("&amp;lt;country&amp;gt;UK&amp;lt;/country&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;format&amp;gt;Vinyl&amp;lt;/format&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;isrc id=\"123456789\"/&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;isrc id=\"abcdefghi\"/&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;primary-type&amp;gt;Album&amp;lt;/primary-type&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;title&amp;gt;Gravitational Lens&amp;lt;/title&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;status&amp;gt;Official&amp;lt;/status&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;date&amp;gt;1970-01-01&amp;lt;/date&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;track-count&amp;gt;10&amp;lt;/track-count&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;artist-credit&amp;gt;&amp;lt;name-credit&amp;gt;&amp;lt;artist id=\"89ad4ac3-39f7-470e-963a-56509c546377\"&amp;gt;&amp;lt;name&amp;gt;Various Artists&amp;lt;/name&amp;gt;&amp;lt;/artist&amp;gt;&amp;lt;/name-credit&amp;gt;&amp;lt;/artist-credit&amp;gt;"));
+        assertTrue(output.contains("indie&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;track&amp;gt;&amp;lt;number&amp;gt;A4&amp;lt;/number&amp;gt;&amp;lt;title&amp;gt;Gravitational Lens&amp;lt;/title&amp;gt;&amp;lt;length&amp;gt;233000&amp;lt;/length&amp;gt;&amp;lt;artist-credit&amp;gt;&amp;lt;name-credit&amp;gt;&amp;lt;artist id=\"2302e264-1cf0-4d1f-aca7-2a6f89e34b36\"&amp;gt;&amp;lt;name&amp;gt;Pig Incident&amp;lt;/name&amp;gt;&amp;lt;sort-name&amp;gt;Incident, Pig&amp;lt;/sort-name&amp;gt;&amp;lt;/artist&amp;gt;&amp;lt;/name-credit&amp;gt;&amp;lt;/artist-credit&amp;gt;&amp;lt;/track&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;puid-list&amp;gt;&amp;lt;puid id=\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"/&amp;gt;&amp;lt;/puid-list&amp;gt;"));
+    }
 
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJson() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJson() throws Exception {
 
-    Results res = ss.search("recording:\"Gravitational Lenz\"", 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("recording:\"Gravitational Lenz\"", 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\":\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
-    assertTrue(output.contains("\"score\":\"100\""));
-    assertTrue(output.contains("\"type\":\"Compilation\""));
-    assertTrue(output.contains("title\":\"Gravitational Lenz\""));
-    assertTrue(output.contains("\"length\":234000"));
-    assertTrue(output.contains("\"isrc\":[{\"id\":\"123456789"));
-    assertTrue(output.contains("\"position\":1"));
-    assertTrue(output.contains("\"status\":\"Official\""));
-    assertTrue(output.contains("\"track-count\":10"));
-    assertTrue(output.contains("format\":\"Vinyl\""));
-    assertTrue(output.contains("country\":\"UK\""));
-    assertTrue(output.contains("\"primary-type\":\"Album\""));
-    assertTrue(output.contains("{\"secondary-type\":[\"Compilation\"]}}"));
-    assertTrue(output.contains("\"tag\":[{\"count\":101,\"name\":\"indie\"}"));
-    assertTrue(output.contains("\"puid-list\":{\"puid\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"}]}"));
-    assertTrue(output.contains("\"artist-credit\":{\"name-credit\":[{\"artist\":{\"id\":\"89ad4ac3-39f7-470e-963a-56509c546377\",\"name\":\"Various Artists\"}"));
-  }
+        assertTrue(output.contains("id\":\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("\"score\":\"100\""));
+        assertTrue(output.contains("\"type\":\"Compilation\""));
+        assertTrue(output.contains("title\":\"Gravitational Lenz\""));
+        assertTrue(output.contains("\"length\":234000"));
+        assertTrue(output.contains("\"isrc\":[{\"id\":\"123456789"));
+        assertTrue(output.contains("\"position\":1"));
+        assertTrue(output.contains("\"status\":\"Official\""));
+        assertTrue(output.contains("\"track-count\":10"));
+        assertTrue(output.contains("format\":\"Vinyl\""));
+        assertTrue(output.contains("country\":\"UK\""));
+        assertTrue(output.contains("\"primary-type\":\"Album\""));
+        assertTrue(output.contains("{\"secondary-type\":[\"Compilation\"]}}"));
+        assertTrue(output.contains("\"tag\":[{\"count\":101,\"name\":\"indie\"}"));
+        assertTrue(output.contains("\"puid-list\":{\"puid\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"}]}"));
+        assertTrue(output.contains("\"artist-credit\":{\"name-credit\":[{\"artist\":{\"id\":\"89ad4ac3-39f7-470e-963a-56509c546377\",\"name\":\"Various Artists\"}"));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNew() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNew() throws Exception {
 
-    Results res = ss.search("recording:\"Gravitational Lenz\"", 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("recording:\"Gravitational Lenz\"", 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\":\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
-    assertTrue(output.contains("\"score\":\"100\""));
-    assertTrue(output.contains("title\":\"Gravitational Lenz\""));
-    assertTrue(output.contains("\"isrcs\":[{\"id\":\"123456789"));
-    assertTrue(output.contains("\"status\":\"Official\""));
-    assertTrue(output.contains("format\":\"Vinyl\""));
-    assertTrue(output.contains("\"position\":1,\"format\":\"Vinyl\""));
-    assertTrue(output.contains("\"releases\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
-    assertTrue(output.contains("country\":\"UK\""));
-    assertTrue(output.contains("\"primary-type\":\"Album\""));
-    assertTrue(output.contains("\"secondary-types\":[\"Compilation\"]}"));
-    assertTrue(output.contains("\"tags\":[{\"count\":101,\"name\":\"indie\"}"));
-    assertTrue(output.contains("puids\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"}"));
-    assertTrue(output.contains("\"artist-credit\":[{\"artist\":{\"id\":\"89ad4ac3-39f7-470e-963a-56509c546377\",\"name\":\"Various Artists\"}}"));
-    assertTrue(output.contains("\"count\":1"));
-    assertTrue(output.contains("\"offset\":0,"));
-    assertTrue(output.contains("\"length\":234000"));
-    assertTrue(output.contains("\"position\":1"));
-    assertTrue(output.contains("\"track-count\":10"));
+        assertTrue(output.contains("id\":\"7ca7782b-a602-448b-b108-bb881a7be2d6\""));
+        assertTrue(output.contains("\"score\":\"100\""));
+        assertTrue(output.contains("title\":\"Gravitational Lenz\""));
+        assertTrue(output.contains("\"isrcs\":[{\"id\":\"123456789"));
+        assertTrue(output.contains("\"status\":\"Official\""));
+        assertTrue(output.contains("format\":\"Vinyl\""));
+        assertTrue(output.contains("\"position\":1,\"format\":\"Vinyl\""));
+        assertTrue(output.contains("\"releases\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e386\""));
+        assertTrue(output.contains("country\":\"UK\""));
+        assertTrue(output.contains("\"primary-type\":\"Album\""));
+        assertTrue(output.contains("\"secondary-types\":[\"Compilation\"]}"));
+        assertTrue(output.contains("\"tags\":[{\"count\":101,\"name\":\"indie\"}"));
+        assertTrue(output.contains("puids\":[{\"id\":\"1d9e8ed6-3893-4d3b-aa7d-72e79609e386\"}"));
+        assertTrue(output.contains("\"artist-credit\":[{\"artist\":{\"id\":\"89ad4ac3-39f7-470e-963a-56509c546377\",\"name\":\"Various Artists\"}}"));
+        assertTrue(output.contains("\"count\":1"));
+        assertTrue(output.contains("\"offset\":0,"));
+        assertTrue(output.contains("\"length\":234000"));
+        assertTrue(output.contains("\"position\":1"));
+        assertTrue(output.contains("\"track-count\":10"));
 
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNewPretty() throws Exception {
+    &amp;lt; at &amp;gt;Test
+    public void testOutputJsonNewPretty() throws Exception {
 
-    Results res = ss.search("recording:\"Gravitational Lenz\"", 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("recording:\"Gravitational Lenz\"", 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("\"offset\" : 0"));
-  }
+        String output = sw.toString();
+        System.out.println("Json New Pretty is" + output);
+        assertTrue(output.contains("\"offset\" : 0"));
+    }
 }

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch167RecordingTest.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,9 +45,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(RecordingIndexField.COMMENT, "the real one");
       doc.addField(RecordingIndexField.COUNTRY, "AF");
       doc.addField(RecordingIndexField.TAG, "thrash");
-      doc.addField(RecordingIndexField.TAGCOUNT, "5");
       doc.addField(RecordingIndexField.TAG, "güth");
-      doc.addField(RecordingIndexField.TAGCOUNT, "11");
       writer.addDocument(doc.getLuceneDocument());
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,9 +57,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(RecordingIndexField.COMMENT, "the real one");
       doc.addField(RecordingIndexField.COUNTRY, "AF");
       doc.addField(RecordingIndexField.TAG, "thrash");
-      doc.addField(RecordingIndexField.TAGCOUNT, "5");
       doc.addField(RecordingIndexField.TAG, "güth");
-      doc.addField(RecordingIndexField.TAGCOUNT, "11");
       writer.addDocument(doc.getLuceneDocument());
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -73,9 +69,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(RecordingIndexField.COMMENT, "the real one");
       doc.addField(RecordingIndexField.COUNTRY, "AF");
       doc.addField(RecordingIndexField.TAG, "thrash");
-      doc.addField(RecordingIndexField.TAGCOUNT, "5");
       doc.addField(RecordingIndexField.TAG, "güth");
-      doc.addField(RecordingIndexField.TAGCOUNT, "11");
       writer.addDocument(doc.getLuceneDocument());
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -87,9 +81,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(RecordingIndexField.COMMENT, "the real one");
       doc.addField(RecordingIndexField.COUNTRY, "AF");
       doc.addField(RecordingIndexField.TAG, "thrash");
-      doc.addField(RecordingIndexField.TAGCOUNT, "5");
       doc.addField(RecordingIndexField.TAG, "güth");
-      doc.addField(RecordingIndexField.TAGCOUNT, "11");
       writer.addDocument(doc.getLuceneDocument());
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -101,9 +93,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(RecordingIndexField.COMMENT, "the real one");
       doc.addField(RecordingIndexField.COUNTRY, "AF");
       doc.addField(RecordingIndexField.TAG, "thrash");
-      doc.addField(RecordingIndexField.TAGCOUNT, "5");
       doc.addField(RecordingIndexField.TAG, "güth");
-      doc.addField(RecordingIndexField.TAGCOUNT, "11");
       writer.addDocument(doc.getLuceneDocument());
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -115,9 +105,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       doc.addField(RecordingIndexField.COMMENT, "the real one");
       doc.addField(RecordingIndexField.COUNTRY, "AF");
       doc.addField(RecordingIndexField.TAG, "thrash");
-      doc.addField(RecordingIndexField.TAGCOUNT, "5");
       doc.addField(RecordingIndexField.TAG, "güth");
-      doc.addField(RecordingIndexField.TAGCOUNT, "11");
       writer.addDocument(doc.getLuceneDocument());
     }
 

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java2013-05-01 10:22:17 UTC (rev 13670)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/IssueSearch240Test.java2013-05-01 15:40:23 UTC (rev 13671)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -51,7 +51,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       MbDocument doc = new MbDocument();
       doc.addField(RecordingIndexField.RECORDING_ID, "7ca7782b-a602-448b-b108-bb881a7be2d6");
       doc.addField(RecordingIndexField.RECORDING, "I Don\u001at Dance");
-      doc.addField(RecordingIndexField.RECORDING_OUTPUT, "I Don\u001at Dance");
       doc.addField(RecordingIndexField.RELEASE_ID, "1d9e8ed6-3893-4d3b-aa7d-6cd79609e386");
       doc.addField(RecordingIndexField.RELEASE, "Our Glorious 5 Year Plan");
       doc.addField(RecordingIndexField.ARTIST_ID, "4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -81,17 +80,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       artist.setSortName("Incident, Pig");
       nc.setArtist(artist);
       ac.getNameCredit().add(nc);
-      doc.addField(RecordingIndexField.TRACK_ARTIST_CREDIT, MMDSerializer.serialize(ac));
 
       doc.addNumericField(RecordingIndexField.DURATION, 234000);
-      doc.addNumericField(RecordingIndexField.RECORDING_DURATION_OUTPUT, 234000);
 
       doc.addNumericField(RecordingIndexField.QUANTIZED_DURATION, (234000 / 2000));
       doc.addNumericField(RecordingIndexField.NUM_TRACKS,10);
       doc.addNumericField(RecordingIndexField.NUM_TRACKS_RELEASE,10);
       doc.addNumericField(RecordingIndexField.TRACKNUM, 5);
       doc.addField(RecordingIndexField.NUMBER, "A4");
-      doc.addField(RecordingIndexField.TRACK_OUTPUT, "Gravitational Lens");
       doc.addField(RecordingIndexField.RECORDING, "Gravitational Lens");
       doc.addField(RecordingIndexField.RELEASEGROUP_ID, "4444e264-1cf0-4d1f-aca7-2a6f89e34b36");
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -102,17 +98,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
       SecondaryTypeList stl = of.createSecondaryTypeList();
       stl.getSecondaryType().add("Compilation");
-      doc.addField(RecordingIndexField.SECONDARY_TYPE_OUTPUT, MMDSerializer.serialize(stl));
 
       doc.addField(RecordingIndexField.RELEASE_STATUS, "Official");
       doc.addField(RecordingIndexField.RELEASE_DATE, "1970-01-01");
       doc.addField(RecordingIndexField.ISRC, "123456789");
       doc.addField(RecordingIndexField.ISRC, "abcdefghi");
       doc.addNumericField(RecordingIndexField.DURATION, 233000);
-      doc.addNumericField(RecordingIndexField.TRACK_DURATION_OUTPUT, 233000);
 
       doc.addField(RecordingIndexField.TAG, "indie");
-      doc.addField(RecordingIndexField.TAGCOUNT, "101");
       doc.addField(RecordingIndexField.RELEASE_AC_VA,"1");
       writer.addDocument(doc.getLuceneDocument());
 


_______________________________________________
MusicBrainz-commits mailing list
MusicBrainz-commits&amp;lt; at &amp;gt;lists.musicbrainz.org
http://lists.musicbrainz.org/mailman/listinfo/musicbrainz-commits&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-01T15:40:31</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18231">
    <title>[mb-commits] r13670 - in search_server/trunk: indexindex/src/main/java/org/musicbrainz/search/indexindex/src/test/java/org/musicbrainz/search/index servletservlet/src/main/java/org/musicbrainz/search/servlet/mmd1servlet/src/main/java/org/musicbrainz/search/servlet/mmd2servlet/src/test/java/org/musicbrainz/search/servlet</title>
    <link>http://comments.gmane.org/gmane.comp.audio.musicbrainz.cvs/18231</link>
    <description>&lt;pre&gt;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.xml2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/pom.xml2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -91,7 +91,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;groupId&amp;gt;com.sun.jersey&amp;lt;/groupId&amp;gt;
       &amp;lt;artifactId&amp;gt;jersey-json&amp;lt;/artifactId&amp;gt;
       &amp;lt;version&amp;gt;1.1.4&amp;lt;/version&amp;gt;
-    &amp;lt;/dependency&amp;gt;  
+    &amp;lt;/dependency&amp;gt;
+    &amp;lt;dependency&amp;gt;
+       &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt;
+       &amp;lt;artifactId&amp;gt;guava&amp;lt;/artifactId&amp;gt;
+       &amp;lt;version&amp;gt;14.0.1&amp;lt;/version&amp;gt;
+    &amp;lt;/dependency&amp;gt;
   &amp;lt;/dependencies&amp;gt;
    &amp;lt;build&amp;gt;
     &amp;lt;pluginManagement&amp;gt;

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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistCreditHelper.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -188,4 +188,42 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         }
     }
+
+    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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/MMDSerializer.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,7 +32,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 
 /**
- * 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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,6 +31,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 import org.musicbrainz.mmd2.ObjectFactory;
 import org.musicbrainz.mmd2.Release;
+import org.musicbrainz.mmd2.ReleaseEvent;
 import org.musicbrainz.mmd2.Tag;
 
 import java.math.BigInteger;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -43,21 +44,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 public class ReleaseEventHelper {
 
-    public static Map&amp;lt;Integer,List&amp;lt;Release&amp;gt;&amp;gt; completeReleaseEventsFromDbResults(ResultSet rs,
+    public static Map&amp;lt;Integer,List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; completeReleaseEventsFromDbResults(ResultSet rs,
                                                                   String entityKey) throws SQLException {
-        Map&amp;lt;Integer, List&amp;lt;Release&amp;gt;&amp;gt; releaseEvents = new HashMap&amp;lt;Integer, List&amp;lt;Release&amp;gt;&amp;gt;();
+        Map&amp;lt;Integer, List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; releaseEvents = new HashMap&amp;lt;Integer, List&amp;lt;ReleaseEvent&amp;gt;&amp;gt;();
         ObjectFactory of = new ObjectFactory();
-        List&amp;lt;Release&amp;gt; releaseEventList;
+        List&amp;lt;ReleaseEvent&amp;gt; releaseEventList;
         while (rs.next()) {
             int entityId = rs.getInt(entityKey);
             if (!releaseEvents.containsKey(entityId)) {
-                releaseEventList = new ArrayList&amp;lt;Release&amp;gt;();
+                releaseEventList = new ArrayList&amp;lt;ReleaseEvent&amp;gt;();
                 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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,15 +28,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 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.*;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -252,15 +254,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
     }
 
-    private Map&amp;lt;Integer, List&amp;lt;Release&amp;gt;&amp;gt; loadReleaseEvents(int min, int max) throws SQLException, IOException {
+    private Map&amp;lt;Integer, List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; 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&amp;lt;Integer,List&amp;lt;Release&amp;gt;&amp;gt; releaseEvents = ReleaseEventHelper.completeReleaseEventsFromDbResults(rs,"release");
+        Map&amp;lt;Integer,List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; releaseEvents = ReleaseEventHelper.completeReleaseEventsFromDbResults(rs,"release");
         rs.close();
         return releaseEvents;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -269,7 +270,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
         Map&amp;lt;Integer, List&amp;lt;Tag&amp;gt;&amp;gt; tags                        = loadTags(min, max);
-        Map&amp;lt;Integer, List&amp;lt;Release&amp;gt;&amp;gt; releaseEvents           = loadReleaseEvents(min, max);
+        Map&amp;lt;Integer, List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; releaseEvents      = loadReleaseEvents(min, max);
 
         //A particular release can have multiple catalog nos, labels when released as an imprint, typically used
         //by major labels
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -387,103 +388,194 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     public Document documentFromResultSet(ResultSet rs,
                                           Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; secondaryTypes,
                                           Map&amp;lt;Integer,List&amp;lt;Tag&amp;gt;&amp;gt; tags,
-                                          Map&amp;lt;Integer,List&amp;lt;Release&amp;gt;&amp;gt; releaseEvents,
+                                          Map&amp;lt;Integer,List&amp;lt;ReleaseEvent&amp;gt;&amp;gt; releaseEvents,
                                           Map&amp;lt;Integer,List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;&amp;gt; labelInfo,
                                           Map&amp;lt;Integer,List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;&amp;gt; mediums,
                                           Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; puids,
                                           Map&amp;lt;Integer, ArtistCreditWrapper&amp;gt; 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 &amp;amp;&amp;amp; !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 &amp;amp;&amp;amp; !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 &amp;amp;&amp;amp; !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 &amp;amp;&amp;amp; !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 &amp;amp;&amp;amp; !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 &amp;amp;&amp;amp; !comment.isEmpty()) {
+            release.setDisambiguation(comment);
+        }
+
         if (labelInfo.containsKey(id)) {
+            LabelInfoList labelInfoList = of.createLabelInfoList();
             for (List&amp;lt;String&amp;gt; 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 &amp;amp;&amp;amp; !entry.get(0).isEmpty()) {
+                    label.setId(entry.get(0));
+                }
+
                 doc.addFieldOrNoValue(ReleaseIndexField.LABEL, entry.get(1));
+                if(entry.get(1)!=null &amp;amp;&amp;amp; !entry.get(1).isEmpty()) {
+                    label.setName(entry.get(1));
+                }
+
                 doc.addFieldOrUnknown(ReleaseIndexField.CATALOG_NO, entry.get(2));
+                if(entry.get(2)!=null &amp;amp;&amp;amp; !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&amp;lt;String&amp;gt; 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 &amp;amp;&amp;amp; !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);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -493,36 +585,61 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -11,38 +11,38 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3,6 +3,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -61,7 +62,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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
      *
      * &amp;lt; at &amp;gt;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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,6 +6,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import org.apache.lucene.util.NumericUtils;
 import org.junit.Test;
 import org.musicbrainz.mmd2.ArtistCredit;
+import org.musicbrainz.mmd2.Release;
 
 import java.sql.Statement;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -96,6 +97,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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)");
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -127,6 +133,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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)");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -162,6 +173,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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)");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -240,16 +260,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -267,13 +284,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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 &amp;amp; The Bunnymen", ac.getNameCredit().get(0).getArtist().getName());
-            assertEquals(null, ac.getNameCredit().get(0).getJoinphrase());
-
         }
         ir.close();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -292,10 +308,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -334,7 +349,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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());
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -354,9 +370,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -374,10 +388,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -395,10 +406,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -416,10 +424,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -437,9 +442,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -457,9 +460,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -477,9 +478,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -497,10 +496,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -519,9 +515,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -539,10 +533,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -560,10 +551,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -581,10 +569,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -602,10 +587,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -623,10 +605,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -644,10 +623,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -664,10 +640,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -684,10 +657,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -696,6 +666,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      * &amp;lt; at &amp;gt;throws Exception exception
      */
     &amp;lt; at &amp;gt;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();
+    }
+
+    /**
+     * &amp;lt; at &amp;gt;throws Exception exception
+     */
+    &amp;lt; at &amp;gt;Test
     public void testIndexReleaseDiscIds() throws Exception {
 
         addReleaseThree();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -705,10 +693,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -726,10 +711,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -747,22 +729,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -781,11 +753,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -840,9 +811,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -860,20 +829,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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();
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -888,10 +848,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         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.xml2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/pom.xml2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -49,9 +49,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;version&amp;gt;4.1.0&amp;lt;/version&amp;gt;
      &amp;lt;/dependency&amp;gt;
     &amp;lt;dependency&amp;gt;
-          &amp;lt;groupId&amp;gt;org.apache.lucene&amp;lt;/groupId&amp;gt;
-          &amp;lt;artifactId&amp;gt;lucene-queryparser&amp;lt;/artifactId&amp;gt;
-          &amp;lt;version&amp;gt;4.1.0&amp;lt;/version&amp;gt;
+      &amp;lt;groupId&amp;gt;org.apache.lucene&amp;lt;/groupId&amp;gt;
+      &amp;lt;artifactId&amp;gt;lucene-queryparser&amp;lt;/artifactId&amp;gt;
+      &amp;lt;version&amp;gt;4.1.0&amp;lt;/version&amp;gt;
     &amp;lt;/dependency&amp;gt;
     &amp;lt;dependency&amp;gt;
       &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -87,6 +87,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;version&amp;gt;1.12&amp;lt;/version&amp;gt;
     &amp;lt;/dependency&amp;gt;
     &amp;lt;dependency&amp;gt;
+      &amp;lt;groupId&amp;gt;com.google.guava&amp;lt;/groupId&amp;gt;
+      &amp;lt;artifactId&amp;gt;guava&amp;lt;/artifactId&amp;gt;
+      &amp;lt;version&amp;gt;14.0.1&amp;lt;/version&amp;gt;
+    &amp;lt;/dependency&amp;gt;
+    &amp;lt;dependency&amp;gt;
       &amp;lt;groupId&amp;gt;org.musicbrainz.search&amp;lt;/groupId&amp;gt;
       &amp;lt;artifactId&amp;gt;index&amp;lt;/artifactId&amp;gt;
       &amp;lt;version&amp;gt;2.0-SNAPSHOT&amp;lt;/version&amp;gt;

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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd1/ReleaseMmd1XmlWriter.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,13 +28,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 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;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,163 +65,148 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
         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 &amp;gt; 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 &amp;lt; 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()&amp;gt;0) {
+            ArtistCredit acv2 = releasev2.getArtistCredit();
+            if(acv2!=null) {
+                if (acv2.getNameCredit().size() &amp;gt; 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&amp;gt;0)
-            {
-                int numDiscs = 0;
-                for(int i=0;i&amp;lt;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&amp;gt;0)
+            for(Medium mediumv2:mediumListv2.getMedium())
             {
-                int numTracks = 0;
-                for(int i=0;i&amp;lt;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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -29,12 +29,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -42,25 +42,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 import java.io.IOException;
 import java.math.BigInteger;
 import java.util.List;
-import java.util.Locale;
 
 
 public class ReleaseWriter extends ResultsWriter {
 
 
     /**
-     *
      * &amp;lt; at &amp;gt;param metadata
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;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);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -71,214 +67,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     }
 
     /**
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param results
      * &amp;lt; at &amp;gt;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);
         }
     }
 
     /**
-     *
      * &amp;lt; at &amp;gt;param list
      * &amp;lt; at &amp;gt;param result
      * &amp;lt; at &amp;gt;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&amp;gt;0) {
-                SecondaryTypeList stl = of.createSecondaryTypeList();
-                for(int i =0; i&amp;lt; 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&amp;lt;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()&amp;gt;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 &amp;gt; 0) {
-                LabelInfoList labelInfoList = of.createLabelInfoList();
-                String[] catnos = doc.getValues(ReleaseIndexField.CATALOG_NO);
-                String[] labelIds = doc.getValues(ReleaseIndexField.LABEL_ID);
-                for (int i = 0; i &amp;lt; 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 &amp;lt; 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&amp;gt;0)
-            {
-                TagList tagList = of.createTagList();
-                for(int i = 0;i&amp;lt;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.java2013-04-30 21:40:48 UTC (rev 13669)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java2013-05-01 10:22:17 UTC (rev 13670)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3,16 +3,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -20,19 +21,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 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;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -42,304 +34,361 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 public class FindReleaseTest {
 
-  private AbstractSearchServer ss;
-  private AbstractDismaxSearchServer sd;
+    protected void checkTerm(IndexReader ir, IndexField field, String value) throws IOException {
 
-  &amp;lt; at &amp;gt;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");
+    &amp;lt; at &amp;gt;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&amp;lt;ResourceType, IndexSearcher&amp;gt; searchers = new HashMap&amp;lt;ResourceType, IndexSearcher&amp;gt;();
-    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);
-  }
 
-  &amp;lt; at &amp;gt;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");
 
-  &amp;lt; at &amp;gt;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");
 
-  &amp;lt; at &amp;gt;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);
 
-  &amp;lt; at &amp;gt;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);
 
-  &amp;lt; at &amp;gt;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));
 
-  &amp;lt; at &amp;gt;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");
 
-  &amp;lt; at &amp;gt;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());
+        }
 
-  &amp;lt; at &amp;gt;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());
+        }
 
-  &amp;lt; at &amp;gt;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&amp;lt;ResourceType, IndexSearcher&amp;gt; searchers = new HashMap&amp;lt;ResourceType, IndexSearcher&amp;gt;();
+        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);
+    }
 
-  &amp;lt; at &amp;gt;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();
+    }
 
     &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
+
+    }
+
+    &amp;lt; at &amp;gt;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()));
+    }
+
+    &amp;lt; at &amp;gt;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()));
     }
 
     &amp;lt; at &amp;gt;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()));
     }
 
     &amp;lt; at &amp;gt;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()));
     }
 
     /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -355,13 +404,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     */
 
     &amp;lt; at &amp;gt;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()));
     }
 
     /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -375,556 +421,448 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
         assertEquals("Wrath Records", doc.get(ReleaseIndexField.LABEL));
     }
     */
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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
-   *
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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
+     *
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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
-   *
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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
+     *
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testFindReleaseWithNotKnownBarcode() throws Exception {
-    Results res = ss.search("barcode:\\-", 0, 10);
-    assertEquals(0, res.getTotalHits());
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;Test
+    public void testFindReleaseWithNotKnownBarcode() throws Exception {
+        Results res = ss.search("barcode:\\-", 0, 10);
+        assertEquals(0, res.getTotalHits());
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /*
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /*
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  /**
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;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));
-  }
+    /**
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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()));
+    }
 
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;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));
+    &amp;lt; at &amp;gt;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()));
 
-  }
+    }
 
-  &amp;lt; at &amp;gt;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));
-  }
+    &amp;lt; at &amp;gt;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()));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindReleaseByNumberofMediums() throws Exception {
-    Results res = ss.search("mediums:2", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindReleaseByNumberofMediums() throws Exception {
+        Results res = ss.search("mediums:2", 0, 10);
+        assertEquals(1, res.getTotalHits());
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindReleaseByLabelId() throws Exception {
-    Results res = ss.search("laid:c1dfaf9c-d498-4f6c-b040-f7714315fcea", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testFindReleaseByLabelId() throws Exception {
+        Results res = ss.search("laid:c1dfaf9c-d498-4f6c-b040-f7714315fcea", 0, 10);
+        assertEquals(1, res.getTotalHits());
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testNumericRangeQuery() throws Exception {
-    Results res = ss.search("tracksmedium:[7 TO 17]", 0, 10);
-    assertEquals(2, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;Test
+    public void testNumericRangeQuery() throws Exception {
+        Results res = ss.search("tracksmedium:[7 TO 17]", 0, 10);
+        assertEquals(2, res.getTotalHits());
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindReleaseByPuid() throws Exception {
-    Results res = ss.search("puid:668f3a22-03e8-e3cd-55e4-2e9a0906419a", 0, 10);
-    assertEquals(1, res.getTotalHits());
-  }
+    &amp;lt; at &amp;gt;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&amp;amp;query=%22Our%20Glorious%205%20Year%20Plan%22
-   *
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsMmdv1Xml() throws Exception {
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/release/?type=xml&amp;amp;query=%22Our%20Glorious%205%20Year%20Plan%22
+     *
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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("&amp;lt;title&amp;gt;Our Glorious 5 Year Plan&amp;lt;/title&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("&amp;lt;disc-list count=\"3\""));
-    assertTrue(output.contains("&amp;lt;track-list count=\"17\""));
-    assertTrue(output.contains("date=\"2005\""));
-    assertTrue(output.contains("country=\"GB\""));
-    assertTrue(output.contains("format=\"Vinyl\""));
-    assertTrue(output.contains("&amp;lt;asin&amp;gt;B00004Y6O9&amp;lt;/asin&amp;gt;"));
+        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("&amp;lt;title&amp;gt;Our Glorious 5 Year Plan&amp;lt;/title&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("&amp;lt;disc-list count=\"3\""));
+        assertTrue(output.contains("&amp;lt;track-list count=\"17\""));
+        assertTrue(output.contains("date=\"2005\""));
+        assertTrue(output.contains("country=\"GB\""));
+        assertTrue(output.contains("format=\"Vinyl\""));
+        assertTrue(output.contains("&amp;lt;asin&amp;gt;B00004Y6O9&amp;lt;/asin&amp;gt;"));
 
-    assertTrue(output.contains("&amp;lt;label&amp;gt;&amp;lt;name&amp;gt;Wrath Records&amp;lt;/name&amp;gt;&amp;lt;/label&amp;gt;"));
-    assertTrue(output.contains("catalog-number=\"WRATHCD-25\""));
+        assertTrue(output.contains("&amp;lt;label&amp;gt;&amp;lt;name&amp;gt;Wrath Records&amp;lt;/name&amp;gt;&amp;lt;/label&amp;gt;"));
+        assertTrue(output.contains("catalog-number=\"WRATHCD-25\""));
 
-  }
+    }
 
-  /**
-   * Tests get same results as
-   * http://musicbrainz.org/ws/1/release/?type=xml&amp;amp;query=%22Our%20Glorious%205%20Year%20Plan%22
-   *
-   * &amp;lt; at &amp;gt;throws Exception
-   */
-  &amp;lt; at &amp;gt;Test
-  public void testOutputAsXml() throws Exception {
+    /**
+     * Tests get same results as
+     * http://musicbrainz.org/ws/1/release/?type=xml&amp;amp;query=%22Our%20Glorious%205%20Year%20Plan%22
+     *
+     * &amp;lt; at &amp;gt;throws Exception
+     */
+    &amp;lt; at &amp;gt;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("&amp;lt;language&amp;gt;eng&amp;lt;/language&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;script&amp;gt;Latn&amp;lt;/script&amp;gt;"));
-    assertTrue(output.contains("type=\"Compilation\""));
-    assertTrue(output.contains("&amp;lt;primary-type&amp;gt;Album&amp;lt;/primary-type&amp;gt;"));
+        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("&amp;lt;language&amp;gt;eng&amp;lt;/language&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;script&amp;gt;Latn&amp;lt;/script&amp;gt;"));
+        assertTrue(output.contains("type=\"Compilation\""));
+        assertTrue(output.contains("&amp;lt;primary-type&amp;gt;Album&amp;lt;/primary-type&amp;gt;"));
 
-    assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e333\""));
-    assertTrue(output.contains("&amp;lt;title&amp;gt;Our Glorious 5 Year Plan&amp;lt;/title&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;disambiguation&amp;gt;demo&amp;lt;/disambiguation&amp;gt;"));
-    assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
-    assertTrue(output.contains("&amp;lt;disc-list count=\"1\""));
-    assertTrue(output.contains("&amp;lt;track-list count=\"10\""));
-    assertTrue(output.contains("&amp;lt;date&amp;gt;2005&amp;lt;/date&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;country&amp;gt;GB&amp;lt;/country&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;format&amp;gt;Vinyl&amp;lt;/format&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;asin&amp;gt;B00004Y6O9&amp;lt;/asin&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;track-count&amp;gt;17&amp;lt;/track-count&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Wrath Records&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;label id=\"c1dfaf9c-d498-4f6c-b040-f7714315fcea\"&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;Major Records&amp;lt;/name&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;catalog-number&amp;gt;WRATHCD-25&amp;lt;/catalog-number&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;medium-list count=\"2\"&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;secondary-type&amp;gt;Live&amp;lt;/secondary-type&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;secondary-type&amp;gt;Compilation&amp;lt;/secondary-type&amp;gt;"));
-    assertTrue(output.contains("&amp;lt;name&amp;gt;punk&amp;lt;/name&amp;gt;"));
-  }
+        assertTrue(output.contains("id=\"1d9e8ed6-3893-4d3b-aa7d-6cd79609e333\""));
+        assertTrue(output.contains("&amp;lt;title&amp;gt;Our Glorious 5 Year Plan&amp;lt;/title&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Farming Incident&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;sort-name&amp;gt;Incident, Farming&amp;lt;/sort-name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;disambiguation&amp;gt;demo&amp;lt;/disambiguation&amp;gt;"));
+        assertTrue(output.contains("artist id=\"4302e264-1cf0-4d1f-aca7-2a6f89e34b36\""));
+        assertTrue(output.contains("&amp;lt;disc-list count=\"1\""));
+        assertTrue(output.contains("&amp;lt;track-list count=\"10\""));
+        assertTrue(output.contains("&amp;lt;date&amp;gt;2005&amp;lt;/date&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;country&amp;gt;GB&amp;lt;/country&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;format&amp;gt;Vinyl&amp;lt;/format&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;asin&amp;gt;B00004Y6O9&amp;lt;/asin&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;track-count&amp;gt;17&amp;lt;/track-count&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Wrath Records&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;label id=\"c1dfaf9c-d498-4f6c-b040-f7714315fcea\"&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;Major Records&amp;lt;/name&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;catalog-number&amp;gt;WRATHCD-25&amp;lt;/catalog-number&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;medium-list count=\"2\"&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;secondary-type&amp;gt;Live&amp;lt;/secondary-type&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;secondary-type&amp;gt;Compilation&amp;lt;/secondary-type&amp;gt;"));
+        assertTrue(output.contains("&amp;lt;name&amp;gt;punk&amp;lt;/name&amp;gt;"));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJson() throws Exception {
+    &amp;lt; at &amp;gt;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\"]}}"));
 
-  }
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNew() throws Exception {
+    &amp;lt; at &amp;gt;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(""));
+    }
 
-  &amp;lt; at &amp;gt;Test
-  public void testOutputJsonNewPretty() throws Exception {
+    &amp;lt; at &amp;gt;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"));
+    }
 
 
-  &amp;lt; at &amp;gt;Test
-  public void testFindReleaseByTag() throws Exception {
+    &amp;lt; at &amp;gt;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
&lt;/pre&gt;</description>
    <dc:creator>root&lt; at &gt;musicbrainz.org</dc:creator>
    <dc:date>2013-05-01T10:22:28</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.audio.musicbrainz.cvs">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.audio.musicbrainz.cvs</link>
  </textinput>
</rdf:RDF>
