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

[email protected] Thu, 02 May 2013 15:26:26 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1UXvOs-0004Nu-4X@wiley>
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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/CommonTables.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -132,8 +132,7 @@
     }
 
 
-    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();
@@ -170,7 +169,34 @@
         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());
@@ -223,6 +249,7 @@
             }
 
             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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/RecordingIndex.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -199,12 +199,10 @@
                         " 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" +
@@ -586,13 +584,13 @@
         }
         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);
         }
@@ -791,10 +789,10 @@
                                     (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());
@@ -802,7 +800,6 @@
                         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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseEventHelper.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -29,6 +29,7 @@
 
 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;
@@ -60,7 +61,7 @@
 
             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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -171,13 +171,11 @@
                 " 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 " +
@@ -264,7 +262,7 @@
     private Map<Integer, List<ReleaseEvent>> 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();
@@ -623,12 +621,14 @@
             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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -104,7 +104,14 @@
             //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");
@@ -139,8 +146,9 @@
                 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");
@@ -566,10 +574,18 @@
                 "(" +
                 "  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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/RecordingIndexTest.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -13,6 +13,7 @@
 import java.sql.Statement;
 
 import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 public class RecordingIndexTest extends AbstractIndexTest {
 
@@ -68,6 +69,16 @@
         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) "
@@ -379,7 +390,7 @@
         IndexReader ir = DirectoryReader.open(ramDir);
         assertEquals(2, ir.numDocs());
         {
-            checkTerm(ir, RecordingIndexField.COUNTRY, "gb");
+            checkTerm(ir, RecordingIndexField.COUNTRY, "af");
         }
         ir.close();
     }
@@ -399,7 +410,7 @@
         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();
@@ -828,8 +839,20 @@
             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.java	2013-05-02 12:08:28 UTC (rev 13674)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-05-02 15:26:25 UTC (rev 13675)
@@ -7,6 +7,7 @@
 import org.junit.Test;
 import org.musicbrainz.mmd2.ArtistCredit;
 import org.musicbrainz.mmd2.Release;
+import org.musicbrainz.mmd2.ReleaseEventList;
 
 import java.sql.Statement;
 
@@ -138,6 +139,17 @@
         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)");
@@ -896,10 +908,20 @@
             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();
     }