[mb-commits] r13680 - 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] Thu, 09 May 2013 11:15:52 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1UaOpE-0007Fd-2y@wiley>
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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ArtistIndex.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -109,11 +109,14 @@
                         " 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 " +
@@ -189,7 +192,7 @@
             int artistId = rs.getInt("artist");
             Set<Alias> list;
             if (!aliases.containsKey(artistId)) {
-                list = new HashSet<Alias>();
+                list = new LinkedHashSet<Alias>();
                 aliases.put(artistId, list);
             } else {
                 list = aliases.get(artistId);
@@ -197,6 +200,28 @@
             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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -345,7 +345,7 @@
                 "  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," +
@@ -986,7 +986,9 @@
                 "(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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ArtistIndexTest.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -6,12 +6,15 @@
 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 {
 
@@ -57,11 +60,11 @@
         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)");
@@ -280,11 +283,11 @@
         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();
@@ -578,7 +581,7 @@
      * @throws Exception exception
      */
     @Test
-    public void testStoredArtist() throws Exception {
+    public void testStoredArtist1() throws Exception {
 
         addArtistOne();
         RAMDirectory ramDir = new RAMDirectory();
@@ -598,4 +601,57 @@
         }
         ir.close();
     }
+
+    /**
+     * @throws Exception exception
+     */
+    @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 & 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 & 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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseGroupIndexTest.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -89,7 +89,7 @@
 
         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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ArtistWriter.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -43,22 +43,18 @@
 import java.util.Locale;
 
 
-public class ArtistWriter extends ResultsWriter
-{
+public class ArtistWriter extends ResultsWriter {
 
     /**
-     *
      * @param metadata
      * @param results
      * @throws IOException
      */
-    public void write(Metadata metadata, Results results) throws IOException
-    {
+    public void write(Metadata metadata, Results results) throws IOException {
         ObjectFactory of = new ObjectFactory();
         ArtistList artistList = of.createArtistList();
 
-        for(Result result:results.results)
-        {
+        for (Result result : results.results) {
             result.setNormalizedScore(results.getMaxScore());
         }
         write(artistList.getArtist(), results);
@@ -70,30 +66,64 @@
 
 
     /**
-     *
      * @param list
      * @param results
      * @throws IOException
      */
-    public void write(List list, Results results) throws IOException
-    {
-        for (Result result : results.results)
-        {
+    public void write(List list, Results results) throws IOException {
+        for (Result result : results.results) {
             write(list, result);
         }
     }
 
     /**
-     *
      * @param list
      * @param result
      * @throws IOException
      */
-    public void write(List list, Result result) throws IOException
-    {
+    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
+     *
+     * @param metadata
+     */
+    @Override
+    public void adjustForJson(Metadata metadata) {
+
+        if (metadata.getArtistList().getArtist().size()>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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ResultsWriter.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -38,7 +38,6 @@
 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;
 
@@ -132,6 +131,17 @@
     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)
+     *
+     * @param metadata
+     */
+    public void adjustForJson(Metadata metadata) {
+
+    }
+
+    /**
      * Write the results to provider writer as Xml
      *
      *
@@ -160,6 +170,7 @@
         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);
@@ -173,6 +184,7 @@
         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.java	2013-05-09 08:47:07 UTC (rev 13679)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindArtistTest.java	2013-05-09 11:15:51 UTC (rev 13680)
@@ -122,6 +122,11 @@
             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();
@@ -461,7 +466,7 @@
         assertTrue(output.contains("<name>Echo &amp; The Bunnymen</name>"));
         assertTrue(output.contains("<sort-name>Echo &amp; The Bunnymen</sort-name>"));
         assertTrue(output.contains("<life-span><begin>1978</begin></life-span>"));
-        assertTrue(output.contains("<alias>Echo And The Bunnymen</alias>"));
+        assertTrue(output.contains("<alias locale=\"en\" sort-name=\"Buunymen, Echo And The\" type=\"Artist name\" primary=\"primary\" begin-date=\"1978-05-01\">Echo And The Bunnymen</alias>"));
         assertTrue(output.contains("<alias>Echo &amp; The Bunnyman</alias>"));
         assertTrue(output.contains("<alias>Echo and The Bunymen</alias>"));
         assertTrue(output.contains("<alias>Echo &amp; The Bunymen</alias>"));
@@ -624,7 +629,14 @@
         String output = sw.toString();
         System.out.println("JSON New Pretty is" + output);
         assertTrue(output.contains("\"sort-name\" : \"Echo & The Bunnymen\""));
-        assertTrue(output.contains("\"aliases\" : [ \"Echo And The Bunnymen\", \"Echo & The Bunnyman\", \"Echo and The Bunymen\", \"Echo & 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