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

[email protected] Tue, 30 Apr 2013 12:09:36 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1UX9NI-0005qe-AP@wiley>
Author: ijabz
Date: 2013-04-30 12:09:34 +0000 (Tue, 30 Apr 2013)
New Revision: 13666

Added:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java
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/CommonTables.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/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/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/RecordingIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/RecordingWriter.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:
Schema Changes:Basic Indexing compatible with new schema.

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -123,12 +123,12 @@
                 "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(iso_code) as country, lower(gender.name) as gender " +
+                "  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 country ON artist.country = country.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 ?");
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -113,7 +113,7 @@
             "CREATE TEMPORARY TABLE tmp_release_puid AS " +
             "  SELECT m.release, rp.recording, p.puid " +
             "  FROM medium m " +
-            "    INNER JOIN track t ON t.tracklist = m.tracklist " +
+            "    INNER JOIN track t ON t.medium = m.id " +
             "    INNER JOIN recording_puid rp ON rp.recording = t.recording " +
             "    INNER JOIN puid p ON rp.puid = p.id");
         clock.stop();
@@ -141,24 +141,22 @@
         getDbConnection().createStatement().execute(
             "CREATE TEMPORARY TABLE tmp_release AS " +
                 "SELECT r.id, r.gid, rn.name as name, " +
-                "  barcode, country.iso_code as country, " +
-                "  date_year, date_month, date_day, rgt.name as type, rg.id as rg_id, rg.gid as rg_gid, rm.amazon_asin, " +
+                "  barcode, " +
+                "  rgt.name as type, rg.id as rg_id, rg.gid as rg_gid, rm.amazon_asin, " +
                 "  language.iso_code_3 as language, language.iso_code_2t as language_2t, script.iso_code as script, rs.name as status, " +
-                "  sum(tr.track_count) as tracks," +
+                "  sum(m.track_count) as tracks," +
                 "  r.artist_credit," +
                 "  r.comment" +
                 " FROM release r " +
                 "  LEFT JOIN release_meta rm ON r.id = rm.id " +
                 "  LEFT JOIN release_group rg ON rg.id = r.release_group " +
                 "  LEFT JOIN release_group_primary_type rgt  ON rg.type = rgt.id " +
-                "  LEFT JOIN country ON r.country=country.id " +
                 "  LEFT JOIN release_name rn ON r.name = rn.id " +
                 "  LEFT JOIN release_status rs ON r.status = rs.id " +
                 "  LEFT JOIN language ON r.language=language.id " +
                 "  LEFT JOIN script ON r.script=script.id " +
                 "  LEFT JOIN medium m ON m.release=r.id" +
-                "  LEFT JOIN tracklist tr ON m.tracklist=tr.id " +
-                " GROUP BY r.id,r.gid,rn.name,barcode,country.iso_code,date_year,date_month,date_day,rgt.name,rg.id, rg.gid," +
+                " GROUP BY r.id,r.gid,rn.name,barcode,rgt.name,rg.id, rg.gid," +
                 "  rm.amazon_asin, language.iso_code_3, language.iso_code_2t, script.iso_code,rs.name,r.artist_credit, r.comment");
         clock.stop();
         System.out.println("tmp_release     :Finished:" + Utils.formatClock(clock));
@@ -181,12 +179,11 @@
 
         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, tl.track_count, " +
+                "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, " +
                 "  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" +
-                "  INNER JOIN tracklist tl ON t.tracklist=tl.id " +
-                "  INNER JOIN medium m ON m.tracklist=tl.id " +
+                "  INNER JOIN medium m ON t.medium=m.id " +
                 "  LEFT JOIN  medium_format mf ON m.format=mf.id ");
 
         clock.stop();

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.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/LabelIndex.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -105,12 +105,12 @@
                 "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, " +
                 "  end_date_year, end_date_month, end_date_day, ended," +
-                "  comment, label_code, lower(iso_code) as country " +
+                "  comment, label_code, lower(i.code) as country " +
                 " FROM label " +
                 "  LEFT JOIN label_name n0 ON label.name = n0.id " +
                 "  LEFT JOIN label_name n1 ON label.sort_name = n1.id " +
                 "  LEFT JOIN label_type ON label.type = label_type.id " +
-                "  LEFT JOIN country ON label.country = country.id " +
+                "  LEFT JOIN iso_3166_1 i on label.area=i.area" +
                 " WHERE label.id BETWEEN ? AND ?");
 
         addPreparedStatement("IPICODES",

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -99,6 +99,7 @@
     }
 
     String releases;
+    String releaseEvents;
     String releaseSecondaryTypes;
 
     @Override
@@ -127,12 +128,11 @@
                             " 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, tl.track_count, " +
+                    "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, " +
                             "  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 ?" +
-                            "  INNER JOIN tracklist tl ON t.tracklist=tl.id " +
-                            "  INNER JOIN medium m ON m.tracklist=tl.id " +
+                            "  INNER JOIN medium m ON t.medium=m.id " +
                             "  LEFT JOIN  medium_format mf ON m.format=mf.id "
             );
         }
@@ -184,10 +184,18 @@
         releases =
                 "SELECT " +
                         "  id as releaseKey, gid as releaseid, name as releasename, type, " +
-                        "  status, date_year, date_month, date_day, tracks,artist_credit, country,rg_gid " +
+                        "  status, tracks,artist_credit, rg_gid " +
                         " FROM tmp_release r1 " +
                         " 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 ";
+
         releaseSecondaryTypes =
                 "SELECT rg.name as type, r.id as releaseKey" +
                         " FROM tmp_release r " +
@@ -446,6 +454,22 @@
 
     }
 
+    private PreparedStatement createReleaseEventStatement(int noOfElements) throws SQLException {
+        StringBuilder inClause = new StringBuilder();
+        boolean firstValue = true;
+        for (int i = 0; i < noOfElements; i++) {
+            if (firstValue) {
+                firstValue = false;
+            } else {
+                inClause.append(',');
+            }
+            inClause.append('?');
+        }
+        PreparedStatement stmt = dbConnection.prepareStatement(
+                releaseEvents + "(" + inClause.toString() + ')');
+        return stmt;
+
+    }
     /**
      * Create the release secondary types statement
      *
@@ -529,8 +553,6 @@
             rg.setId(rs.getString("rg_gid"));
             release.setReleaseGroup(rg);
             release.setStatus(rs.getString("status"));
-            release.setCountry(rs.getString("country"));
-            release.setDate(Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day")));
             ml.setTrackCount(BigInteger.valueOf(rs.getInt("tracks")));
             release.setReleaseGroup(rg);
             release.setMediumList(ml);
@@ -542,7 +564,27 @@
         }
         rs.close();
 
+        //Add ReleaseEvents for each Release
+        stmt = createReleaseEventStatement(releaseKeys.size());
+        count = 1;
+        for (Integer key : releaseKeys) {
+            stmt.setInt(count, key);
+            count++;
+        }
+        rs = stmt.executeQuery();
+        while (rs.next()) {
+            int releaseKey = rs.getInt("releaseKey");
+            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.setCountry((rs.getString("country")));
+            release.getReleaseEventList().getReleaseEvent().add(re);
+        }
 
+        //Add secondary types of the releasegroup that each release is part of
         stmt = createReleaseSecondaryTypesStatement(releaseKeys.size());
         count = 1;
         for (Integer key : releaseKeys) {
@@ -686,8 +728,23 @@
                     doc.addNumericField(RecordingIndexField.TRACKNUM, track.getTrackPosition());
                     doc.addFieldOrNoValue(RecordingIndexField.NUMBER, track.getTrackNumber());
                     doc.addFieldOrNoValue(RecordingIndexField.RELEASE_STATUS, release.getStatus());
-                    doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, release.getDate());
-                    doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, release.getCountry());
+
+                    if(
+                            (release.getReleaseEventList()!=null) &&
+                            (release.getReleaseEventList().getReleaseEvent()!=null)
+                      ) {
+                        for(ReleaseEvent re:release.getReleaseEventList().getReleaseEvent())
+                        {
+                            doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, re.getDate());
+                            doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, re.getCountry());
+                        }
+                    }
+                    else  {
+                        doc.addFieldOrNoValue(RecordingIndexField.RELEASE_DATE, null);
+                        doc.addFieldOrNoValue(RecordingIndexField.COUNTRY, null);
+                    }
+
+
                     doc.addField(RecordingIndexField.RELEASE_ID, release.getId());
                     doc.addField(RecordingIndexField.RELEASE, release.getTitle());
                     doc.addNumericField(RecordingIndexField.NUM_TRACKS_RELEASE, release.getMediumList().getTrackCount().intValue());

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -32,6 +32,7 @@
 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.search.MbDocument;
 
@@ -108,7 +109,7 @@
             addPreparedStatement("PUIDS",
                 "SELECT m.release, p.puid " +
                 "FROM medium m " +
-                " INNER JOIN track t ON (t.tracklist=m.tracklist AND m.release BETWEEN ? AND ?) " +
+                " INNER JOIN track t ON (t.medium=m.id AND m.release BETWEEN ? AND ?) " +
                 " INNER JOIN recording_puid rp ON rp.recording = t.recording " +
                 " INNER JOIN puid p ON rp.puid=p.id");
         }
@@ -121,13 +122,12 @@
                " WHERE rl.release BETWEEN ? AND ?");
 
         addPreparedStatement("MEDIUMS",
-              "SELECT m.release as releaseId, mf.name as format, tr.track_count as numTracksOnMedium, count(mc.id) as discidsOnMedium " +
+              "SELECT m.release as releaseId, mf.name as format, m.track_count as numTracksOnMedium, count(mc.id) as discidsOnMedium " +
               " FROM medium m " +
               "  LEFT JOIN medium_format mf ON m.format=mf.id " +
-              "  LEFT JOIN tracklist tr ON m.tracklist=tr.id " +
               "  LEFT JOIN medium_cdtoc mc ON mc.medium=m.id "  +
               " WHERE m.release BETWEEN ? AND ? " +
-              " GROUP BY m.release, m.position, m.id, mf.name, tr.track_count" +
+              " GROUP BY m.release, m.position, m.id, mf.name, m.track_count" +
               " ORDER BY m.release, m.position, m.id "
         );
 
@@ -158,12 +158,20 @@
 
         addPreparedStatement("RELEASES",
                 " SELECT id, gid, name, " +
-                "  barcode, country, " +
-                "  date_year, date_month, date_day, type, rg_gid, amazon_asin, " +
+                "  barcode, " +
+                "  type, rg_gid, amazon_asin, " +
                 "  language, language_2t, script, status, comment " +
                 " 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("TAGS",
                 "SELECT release_tag.release, tag.name as tag, release_tag.count as count " +
                         " FROM release_tag " +
@@ -244,10 +252,24 @@
 
     }
 
+    private Map<Integer, List<Release>> loadReleaseEvents(int min, int max) throws SQLException, IOException {
 
+        // Get Release Country
+        PreparedStatement st = getPreparedStatement("RELEASE_COUNTRY");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        //TODO Will Become ReleaseEvent when MMD updated
+        Map<Integer,List<Release>> releaseEvents = ReleaseEventHelper.completeReleaseEventsFromDbResults(rs,"release");
+        rs.close();
+        return releaseEvents;
+
+    }
+
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
         Map<Integer, List<Tag>> tags                        = loadTags(min, max);
+        Map<Integer, List<Release>> releaseEvents           = loadReleaseEvents(min, max);
 
         //A particular release can have multiple catalog nos, labels when released as an imprint, typically used
         //by major labels
@@ -357,7 +379,7 @@
         rs = st.executeQuery();
         releaseClock.suspend();
         while (rs.next()) {
-            indexWriter.addDocument(documentFromResultSet(rs, secondaryTypes, tags, labelInfo, mediums, puidWrapper, artistCredits));
+            indexWriter.addDocument(documentFromResultSet(rs, secondaryTypes, tags, releaseEvents, labelInfo, mediums, puidWrapper, artistCredits));
         }
         rs.close();
     }
@@ -365,6 +387,7 @@
     public Document documentFromResultSet(ResultSet rs,
                                           Map<Integer, List<String>> secondaryTypes,
                                           Map<Integer,List<Tag>> tags,
+                                          Map<Integer,List<Release>> releaseEvents,
                                           Map<Integer,List<List<String>>> labelInfo,
                                           Map<Integer,List<List<String>>> mediums,
                                           Map<Integer, List<String>> puids,
@@ -391,10 +414,8 @@
         doc.addNonEmptyField(ReleaseIndexField.RELEASEGROUP_ID, rs.getString("rg_gid"));
         doc.addFieldOrUnknown(ReleaseIndexField.STATUS, rs.getString("status"));
 
-        doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY, rs.getString("country"));
-        doc.addNonEmptyField(ReleaseIndexField.DATE,
-                Utils.formatDate(rs.getInt("date_year"), rs.getInt("date_month"), rs.getInt("date_day")));
 
+
         String barcode = rs.getString("barcode");
         if(barcode==null) {
             doc.addField(ReleaseIndexField.BARCODE,Index.NO_VALUE);
@@ -492,7 +513,17 @@
             }
         }
 
+        if (releaseEvents.containsKey(id)) {
+            for (Release releaseEvent : releaseEvents.get(id)) {
+                doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY, releaseEvent.getCountry());
+                doc.addFieldOrUnknown(ReleaseIndexField.DATE, releaseEvent.getDate());
+            }
+        }
+        else {
+            doc.addFieldOrUnknown(ReleaseIndexField.COUNTRY, null);
+            doc.addFieldOrUnknown(ReleaseIndexField.DATE, null);
+        }
         return doc.getLuceneDocument();
     }
 
-}
+}
\ No newline at end of file

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -214,12 +214,63 @@
     }
 
     protected void setupCommonTables(Statement stmt) throws Exception {
-        stmt.addBatch("CREATE TABLE country (" +
-                "  id serial NOT NULL," +
-                "  iso_code character varying(2) NOT NULL," +
-                "  name character varying(100) NOT NULL" +
-                ")");
 
+        stmt.addBatch("CREATE TABLE area_type (id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL);");
+
+
+        stmt.addBatch("CREATE TABLE area (id          INTEGER PRIMARY KEY," +
+                "                   gid               uuid," +
+                "                   name              VARCHAR ," +
+                "                   sort_name         VARCHAR ," +
+                "                   type              INTEGER," +
+                "                   edits_pending     INTEGER NOT NULL DEFAULT 0," +
+                "                   last_updated      TIMESTAMP," +
+                "                   begin_date_year   SMALLINT," +
+                "                   begin_date_month  SMALLINT," +
+                "                   begin_date_day    SMALLINT," +
+                "                   end_date_year     SMALLINT," +
+                "                   end_date_month    SMALLINT," +
+                "                   end_date_day      SMALLINT," +
+                "                   ended             BOOLEAN NOT NULL DEFAULT FALSE" +
+                "                   );");
+
+        stmt.addBatch("CREATE TABLE area_gid_redirect (" +
+                "    gid UUID NOT NULL PRIMARY KEY," +
+                "    new_id INTEGER NOT NULL," +
+                "    created TIMESTAMP" +
+                ");");
+
+        stmt.addBatch("CREATE TABLE iso_3166_1 (area      INTEGER NOT NULL," +
+                "                         code      CHAR(2) PRIMARY KEY);" +
+                "");
+
+        stmt.addBatch("CREATE TABLE iso_3166_2 (area      INTEGER NOT NULL," +
+                "                         code      VARCHAR(10) PRIMARY KEY);");
+
+        stmt.addBatch("CREATE TABLE iso_3166_3 (area      INTEGER NOT NULL," +
+                "                         code      CHAR(4) PRIMARY KEY);");
+
+
+        stmt.addBatch("CREATE TABLE area_alias_type (id SERIAL PRIMARY KEY, name TEXT NOT NULL);");
+
+
+        stmt.addBatch("CREATE TABLE area_alias (id            SERIAL PRIMARY KEY," +
+                "                         area                INTEGER NOT NULL," +
+                "                         name                VARCHAR NOT NULL," +
+                "                         locale              TEXT," +
+                "                         edits_pending       INTEGER NOT NULL DEFAULT 0 ," +
+                "                         last_updated        TIMESTAMP," +
+                "                         type                INTEGER," +
+                "                         sort_name           VARCHAR 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," +
+                "                         primary_for_locale  BOOLEAN NOT NULL DEFAULT false"+
+                ");");
+
         stmt.addBatch("CREATE TABLE tag (" +
                 "  id serial NOT NULL," +
                 "  name character varying(255) NOT NULL," +
@@ -242,7 +293,9 @@
                 "  end_date_month integer," +
                 "  end_date_day integer," +
                 "  type integer," +
-                "  country integer," +
+                "  area integer," +
+                "  begin_area integer," +
+                "  end_area integer," +
                 "  gender integer," +
                 "  comment character varying(255)," +
                 "  last_updated timestamp," +
@@ -338,7 +391,7 @@
                 "  end_date_day integer," +
                 "  label_code integer," +
                 "  type integer," +
-                "  country integer," +
+                "  area integer," +
                 "  comment character varying(255)," +
                 "  last_updated timestamp," +
                 "  edits_pending integer DEFAULT 0," +
@@ -403,12 +456,8 @@
                 "  release_group integer NOT NULL," +
                 "  status integer," +
                 "  packaging integer," +
-                "  country integer," +
                 "  language integer," +
                 "  script integer," +
-                "  date_year integer," +
-                "  date_month integer," +
-                "  date_day integer," +
                 "  barcode character varying(255)," +
                 "  comment character varying(255)," +
                 "  last_updated timestamp," +
@@ -440,7 +489,7 @@
 
         stmt.addBatch("CREATE TABLE medium (" +
                 "  id serial NOT NULL," +
-                "  tracklist integer NOT NULL," +
+                "  track_count integer NOT NULL," +
                 "  release integer NOT NULL," +
                 "  position integer NOT NULL," +
                 "  format integer," +
@@ -502,6 +551,15 @@
                 "  count integer NOT NULL," +
                 "  last_updated timestamp" +
                 ")");
+
+        stmt.addBatch("CREATE TABLE release_country" +
+                "(" +
+                "  release integer NOT NULL," +
+                "  country integer NOT NULL," +
+                "  date_year smallint NOT NULL," +
+                "  date_month smallint NOT NULL," +
+                "  date_day smallint NOT NULL" +
+                ")");
     }
 
     protected void setupReleaseGroupTables(Statement stmt) throws Exception {
@@ -549,9 +607,10 @@
                 ")");
 
         stmt.addBatch("CREATE TABLE track (" +
-                "  id serial NOT NULL," +
+                "  id serial," +
+                "  gid uuid," +
                 "  recording integer NOT NULL," +
-                "  tracklist integer NOT NULL," +
+                "  medium integer NOT NULL," +
                 "  position integer NOT NULL," +
                 "  number text, " +
                 "  name integer NOT NULL," +

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.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -34,10 +34,11 @@
         Statement stmt = conn.createStatement();
 
         stmt.addBatch("INSERT INTO artist_name (id, name) VALUES (1, 'Farming Incident')");
-        stmt.addBatch("INSERT INTO artist (id, name, gid, sort_name, begin_date_year, begin_date_month, type, gender, country,ended)" +
+        stmt.addBatch("INSERT INTO artist (id, name, gid, sort_name, begin_date_year, begin_date_month, type, gender, area,ended)" +
             " VALUES (521316, 1, '4302e264-1cf0-4d1f-aca7-2a6f89e34b36', 1, 1999, 4, 2, 1, 1,true)");
         stmt.addBatch("INSERT INTO artist_ipi (artist,ipi) values(521316,'10001')");
-        stmt.addBatch("INSERT INTO country (id, iso_code, name) VALUES (1, 'AF', 'Afghanistan')");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (1, 'Afghanistan')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (1, 'AF')");
 
         stmt.executeBatch();
         stmt.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.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/LabelIndexTest.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -60,12 +60,12 @@
     private void addLabelTwo() throws Exception {
 
         Statement stmt = conn.createStatement();
-		
-	stmt.addBatch("INSERT INTO country (id, iso_code, name) VALUES (38, 'CA','Canada')");
-	stmt.addBatch("INSERT INTO label_name (id, name) VALUES (3, 'MusicBrainz Data Testing Label')");
-	stmt.addBatch("INSERT INTO label_name (id, name) VALUES (4, 'Data Testing Label, MusicBrainz')");
-		
-        stmt.addBatch("INSERT INTO label(id, gid, name, sort_name, type, label_code, country, comment, " + 
+
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (38, 'Canada')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (38, 'CA')");
+	    stmt.addBatch("INSERT INTO label_name (id, name) VALUES (3, 'MusicBrainz Data Testing Label')");
+	    stmt.addBatch("INSERT INTO label_name (id, name) VALUES (4, 'Data Testing Label, MusicBrainz')");
+		stmt.addBatch("INSERT INTO label(id, gid, name, sort_name, type, label_code, area, comment, " +
 					"	begin_date_year, begin_date_month, begin_date_day, end_date_year, end_date_month,ended) " +
 					"VALUES (2, 'd8caa692-704d-412b-a410-4fbcf5b9c796', 3, 4, 1, 0099998, 38, 'DO NOT EDIT THIS LABEL', " +
 					"	2009, 1, 1, 2009, 4,false)");
@@ -82,12 +82,13 @@
     private void addLabelThree() throws Exception {
 
         Statement stmt = conn.createStatement();
-		
-		stmt.addBatch("INSERT INTO country (id, iso_code, name) VALUES (1, 'AF','Afghanistan')");
-		stmt.addBatch("INSERT INTO label_name (id, name) VALUES (1, '4AD')");
+
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (1, 'Afghanistan')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (1, 'AF')");
+        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, country, ended)" +
+        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)");
 

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -60,13 +60,17 @@
         stmt.addBatch("INSERT INTO release_group_secondary_type_join (release_group, secondary_type) VALUES (491240,2)");
 
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, country, " +
-                "  language, script, date_year, date_month, date_day) " +
-                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1, 1, 1970, 1, 1)");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (1, 1, 491240, 1, 7)");
-        stmt.addBatch("INSERT INTO tracklist (id, track_count) VALUES (1, 2)");
+        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 track (id, recording, tracklist, position, number, name, artist_credit, length) "
+        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 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 recording (id, gid, name, artist_credit, length, comment)"
                 + " VALUES (1, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000, 'demo')");
@@ -80,7 +84,8 @@
         stmt.addBatch("INSERT INTO puid (id, puid) VALUES (1, 'efd2ace2-b3b9-305f-8a53-9803595c0e38')");
         stmt.addBatch("INSERT INTO recording_puid (id, puid, recording) VALUES (1, 1, 1)");
 
-        stmt.addBatch("INSERT INTO country (id, iso_code, name) VALUES (1, 'UK','United Kingdom')");
+        stmt.addBatch("INSERT INTO area (id, name) VALUES (1, 'United Kingdom')");
+        stmt.addBatch("INSERT INTO iso_3166_1 (area, code) VALUES (1, 'UK')");
 
         stmt.executeBatch();
         stmt.close();
@@ -117,12 +122,11 @@
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit)" +
                 " VALUES (491240, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 1, 1)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, packaging, country, " +
-                "  language, script, date_year, date_month, date_day) " +
-                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1, 1, 1, 1)");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (1, 1, 491240, 1, 7)");
-        stmt.addBatch("INSERT INTO tracklist (id, track_count) VALUES (1, 2)");
-        stmt.addBatch("INSERT INTO track (id, recording, tracklist, position, name, artist_credit, length) "
+        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 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 recording (id, gid, name, artist_credit, length)"
                 + " VALUES (1, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000)");
@@ -158,26 +162,28 @@
                 " VALUES (491240, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 1, 1, 1)");
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit, type)" +
                 " VALUES (491243, 'efd2ace2-b3b9-305f-8a53-9803595c0e67', 2, 1, 2)");
-
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, country, " +
-                "  language, script, date_year, date_month, date_day) " +
-                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1, 1, 1970, 1, 1)");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format, name) VALUES (1, 1, 491240, 1, 7, null)");
-        stmt.addBatch("INSERT INTO tracklist (id, track_count) VALUES (1, 2)");
-
-        stmt.addBatch("INSERT INTO track (id, recording, tracklist, position, name, artist_credit, length) "
+        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 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 recording (id, gid, name, artist_credit, length)"
                 + " VALUES (1, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, country, " +
-                "  language, script, date_year, date_month, date_day) " +
-                " VALUES (491241, 'c3b8dbc9-c1ff-4743-9015-8d762819134f', 1, 1, 491243, 2, 1, 1, 1, 1970, 1, 1)");
 
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (2, 2, 491241, 1, 7)");
-        stmt.addBatch("INSERT INTO tracklist (id, track_count) VALUES (2, 2)");
-        stmt.addBatch("INSERT INTO track (id, recording, tracklist, position, name, artist_credit, length) "
+
+        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, " +
+                "  language, script) " +
+                " VALUES (491241, 'c3b8dbc9-c1ff-4743-9015-8d762819134f', 1, 1, 491243, 2, 1, 1)");
+
+
+
+        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_name (id, name) VALUES (1, 'Do It Clean')");
         stmt.addBatch("INSERT INTO track_name (id, name) VALUES (2, 'Do It Cleans')");
 
@@ -186,7 +192,6 @@
 
         stmt.addBatch("INSERT INTO puid (id, puid) VALUES (1, 'efd2ace2-b3b9-305f-8a53-9803595c0e38')");
         stmt.addBatch("INSERT INTO recording_puid (id, puid, recording) VALUES (1, 1, 1)");
-
         stmt.executeBatch();
         stmt.close();
     }
@@ -407,7 +412,7 @@
             Document doc = ir.document(1);
             assertEquals(1, doc.getFields(RecordingIndexField.RECORDING_OUTPUT.getName()).length);
             assertEquals(1, doc.getFields(RecordingIndexField.COUNTRY.getName()).length);
-            assertEquals("UK", doc.getField(RecordingIndexField.COUNTRY.getName()).stringValue());
+            assertEquals("GB", doc.getField(RecordingIndexField.COUNTRY.getName()).stringValue());
         }
         ir.close();
     }

Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -53,21 +53,21 @@
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit, type) " +
                 " VALUES (491240, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 1, 1, 3)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, country, " +
-                "  language, script, date_year, date_month, date_day,comment) " +
-                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1, 1, 1, 1, 1,'demo')");
+        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, " +
+                "  language, script, comment) " +
+                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1,'demo')");
         stmt.addBatch("INSERT INTO release_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (1, 1, 491240, 1, 7)");
+        stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 1, 491240, 1, 7)");
         stmt.addBatch("INSERT INTO medium_cdtoc (id, medium, cdtoc) VALUES (1, 1, 1)");
         stmt.addBatch("INSERT INTO puid (id, puid) VALUES (1, 'efd2ace2-b3b9-305f-8a53-9803595c0e38')");
         stmt.addBatch("INSERT INTO recording_puid (id, puid, recording) VALUES (1, 1, 2)");
-        stmt.addBatch("INSERT INTO tracklist (id, track_count) VALUES (1, 1)");
-        stmt.addBatch("INSERT INTO track (id, recording, tracklist, position, name, artist_credit, length) "
+
+        stmt.addBatch("INSERT INTO track (id, recording, medium, position, name, artist_credit, length) "
                         + " VALUES (1, 2, 1, 4, 2, 1, 33100)");
+
         stmt.addBatch("INSERT INTO recording(id, gid, name, artist_credit, length)"
                         + " VALUES (2, '2f250ed2-6285-40f1-aa2a-14f1c05e9765', 1, 1, 33000)");
 
-
         stmt.executeBatch();
         stmt.close();
     }
@@ -93,11 +93,11 @@
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit)" +
                 " VALUES (491240, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 1, 1)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, country, " +
+        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, 1)");
+                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1)");
         stmt.addBatch("INSERT INTO release_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position) VALUES (1, 1, 491240, 1)");
+        stmt.addBatch("INSERT INTO medium (id, track_count, release, position) VALUES (1, 1, 491240, 1)");
 
         stmt.executeBatch();
         stmt.close();
@@ -124,14 +124,13 @@
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit)" +
                 " VALUES (491240, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 1, 1)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, packaging, country, " +
-                "  language, script, date_year, date_month, date_day) " +
-                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1, 1, 1, 1)");
+        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_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (1, 1, 491240, 1, 7)");
+        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)");
         stmt.addBatch("INSERT INTO medium_cdtoc (id, medium, cdtoc) VALUES (2, 1, 3)");
-        stmt.addBatch("INSERT INTO tracklist (id, track_count) VALUES (1, 10)");
         stmt.executeBatch();
         stmt.close();
     }
@@ -160,14 +159,14 @@
         stmt.addBatch("INSERT INTO release_group_secondary_type_join (release_group, secondary_type) VALUES (491240,1)");
         stmt.addBatch("INSERT INTO release_group_secondary_type_join (release_group, secondary_type) VALUES (491240,2)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, country, " +
-                "language, script, date_year, date_month, date_day) " +
-                "  VALUES (491240,'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 1, 28, 1, 1, 1)");
+        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 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)");
         stmt.addBatch("INSERT INTO release_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (1, 1, 491240, 1, 7)");
+        stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 1, 491240, 1, 7)");
         stmt.addBatch("INSERT INTO tag (id, name, ref_count) VALUES (1, 'punk', 2)");
         stmt.addBatch("INSERT INTO release_tag (release, tag, count) VALUES (491240, 1, 10)");
 
@@ -199,22 +198,26 @@
         stmt.addBatch("INSERT INTO release_group (id, gid, name, artist_credit) " +
                 " VALUES (491240, 'efd2ace2-b3b9-305f-8a53-9803595c0e37', 1, 1)");
 
-        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, country, " +
-                "  language, script, date_year, date_month, date_day, barcode) " +
-                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 221, 1, 28, 1970, 1, 1, '5060180310066')");
+        stmt.addBatch("INSERT INTO release (id, gid, name, artist_credit, release_group, status, packaging, " +
+                "  language, script, barcode) " +
+                " VALUES (491240, 'c3b8dbc9-c1ff-4743-9015-8d762819134e', 2, 1, 491240, 1, 1, 1, 28,'5060180310066')");
         stmt.addBatch("INSERT INTO language (id, iso_code_3, iso_code_2t, iso_code_2b, iso_code_2, name, frequency) " +
         	" VALUES (1, null, 'end', 'eng', 'en', 'English', 1)");
         stmt.addBatch("INSERT INTO script (id, iso_code, iso_number, name, frequency) VALUES (28, 'Latn' , 215, 'Latin', 4)");
-        stmt.addBatch("INSERT INTO country (id, iso_code, name) VALUES (221, 'GB', 'United Kingdom')");
 
+        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 label_name (id, name) VALUES (1, 'korova')");
 
-        stmt.addBatch("INSERT INTO label (id, gid, name, sort_name, country) " +
+        stmt.addBatch("INSERT INTO label (id, gid, name, sort_name,area) " +
                 " VALUES (1, 'a539bb1e-f2e1-4b45-9db8-8053841e7503', 1, 1, 1)");
+
         stmt.addBatch("INSERT INTO release_label (id, release, label, catalog_number) VALUES (1, 491240, 1, 'ECHO1')");
-
         stmt.addBatch("INSERT INTO release_meta (id, amazon_asin) VALUES (491240, 'B00005NTQ7')");
-        stmt.addBatch("INSERT INTO medium (id, tracklist, release, position, format) VALUES (1, 1, 491240, 1, 7)");
+        stmt.addBatch("INSERT INTO medium (id, track_count, release, position, format) VALUES (1, 1, 491240, 1, 7)");
 
         stmt.executeBatch();
         stmt.close();
@@ -518,7 +521,7 @@
         {
             Document doc = ir.document(1);
             assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
-            assertEquals(0, doc.getFields(ReleaseIndexField.DATE.getName()).length);
+            assertEquals(1, doc.getFields(ReleaseIndexField.DATE.getName()).length);
         }
         ir.close();
     }
@@ -781,8 +784,6 @@
             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.DATE.getName()).length);
-            assertEquals(0, doc.getFields(ReleaseIndexField.CATALOG_NO.getName()).length);
             assertEquals(0, doc.getFields(ReleaseIndexField.LABEL.getName()).length);
             assertEquals(1, doc.getFields(ReleaseIndexField.FORMAT.getName()).length);
         }

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.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/RecordingWriter.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -198,6 +198,7 @@
                         release.setStatus(releaseStatus[i]);
                     }
 
+
                     if (isNotNoValue(releaseDate[i])) {
                         release.setDate(releaseDate[i].toLowerCase(Locale.US));
                     }

Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -140,15 +140,39 @@
                 release.setStatus(status);
             }
 
-            String country = doc.get(ReleaseIndexField.COUNTRY);
-            if (isNotUnknown(country)){
+            String[] countrys = doc.getValues(ReleaseIndexField.COUNTRY);
+            String[] dates    = doc.getValues(ReleaseIndexField.DATE);
+            ReleaseEventList rel = of.createReleaseEventList();
+            for(int i=0;i<countrys.length; i++)
+            {
+                String nextCountry = countrys[i];
+                String nextDate = dates[i];
+                if(isNotUnknown(nextCountry) || isNotUnknown(nextDate))
+                {
+                    ReleaseEvent re = of.createReleaseEvent();
+                    if(isNotUnknown(nextCountry))
+                    {
+                        re.setCountry(nextCountry);
+                    }
+                    if(isNotUnknown(nextDate))
+                    {
+                        re.setDate(nextDate);
+                    }
+                    rel.getReleaseEvent().add(re);
+                }
+            }
+            if(rel.getReleaseEvent().size()>0) {
+                release.setReleaseEventList(rel);
+            }
 
-                release.setCountry(country);
+            //For backwards compatability
+            if (isNotUnknown(countrys[0])){
+
+                release.setCountry(countrys[0]);
             }
+            if (isNotUnknown(dates[0])){
 
-            String date = doc.get(ReleaseIndexField.DATE);
-            if (date != null) {
-                release.setDate(date);
+                release.setDate(dates[0]);
             }
 
             String barcode = doc.get(ReleaseIndexField.BARCODE);

Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2013-04-25 20:54:39 UTC (rev 13665)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2013-04-30 12:09:34 UTC (rev 13666)
@@ -802,7 +802,7 @@
     ResultsWriter writer = ss.getMmd2Writer();
     StringWriter sw = new StringWriter();
     PrintWriter pr = new PrintWriter(sw);
-    writer.write(pr, res, SearchServerServlet.RESPONSE_XML);
+    writer.write(pr, res, SearchServerServlet.RESPONSE_XML, true);
     pr.close();
     String output = sw.toString();
     System.out.println("Xml is" + output);
@@ -828,12 +828,14 @@
     assertTrue(output.contains("<format>Vinyl</format>"));
     assertTrue(output.contains("<asin>B00004Y6O9</asin>"));
     assertTrue(output.contains("<track-count>17</track-count>"));
-    assertTrue(output.contains("<label><name>Wrath Records</name></label>"));
-    assertTrue(output.contains("<label id=\"c1dfaf9c-d498-4f6c-b040-f7714315fcea\"><name>Major Records</name></label>"));
+    assertTrue(output.contains("<name>Wrath Records</name>"));
+    assertTrue(output.contains("<label id=\"c1dfaf9c-d498-4f6c-b040-f7714315fcea\">"));
+    assertTrue(output.contains("<name>Major Records</name>"));
     assertTrue(output.contains("<catalog-number>WRATHCD-25</catalog-number>"));
     assertTrue(output.contains("<medium-list count=\"2\">"));
-    assertTrue(output.contains("<secondary-type-list><secondary-type>Live</secondary-type><secondary-type>Compilation</secondary-type></secondary-type-list>"));
-    assertTrue(output.contains("<tag-list><tag count=\"10\"><name>punk</name></tag></tag-list>"));
+    assertTrue(output.contains("<secondary-type>Live</secondary-type>"));
+    assertTrue(output.contains("<secondary-type>Compilation</secondary-type>"));
+    assertTrue(output.contains("<name>punk</name>"));
   }
 
   @Test