[mb-commits] r13636 - 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] Wed, 27 Feb 2013 11:16:01 +0000
Newsgroups gmane.comp.audio.musicbrainz.cvs
Message-ID <E1UAezR-00012w-4n@wiley>
Author: ijabz
Date: 2013-02-27 11:15:57 +0000 (Wed, 27 Feb 2013)
New Revision: 13636

Modified:
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java
   search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java
   search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java
   search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java
   search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java
Log:
#SEARCH-217:Allow searching and displaying of folksnomy tags for the release entity

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java	2013-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseGroupIndex.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -216,7 +216,7 @@
     }
 
     /**
-     * Load Tags
+     * Load Artist Credits
      *
      * @param min
      * @param max
@@ -337,8 +337,8 @@
 
          if (tags.containsKey(id)) {
             for (Tag tag : tags.get(id)) {
-                doc.addField(LabelIndexField.TAG, tag.getName());
-                doc.addField(LabelIndexField.TAGCOUNT, tag.getCount().toString());
+                doc.addField(ReleaseGroupIndexField.TAG, tag.getName());
+                doc.addField(ReleaseGroupIndexField.TAGCOUNT, tag.getCount().toString());
             }
         }
 

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-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndex.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -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.Tag;
 import org.musicbrainz.search.MbDocument;
 
 import java.io.IOException;
@@ -163,6 +164,11 @@
                 " FROM tmp_release rl " +
                 " WHERE id BETWEEN ? AND ? ");
 
+        addPreparedStatement("TAGS",
+                "SELECT release_tag.release, tag.name as tag, release_tag.count as count " +
+                        " FROM release_tag " +
+                        "  INNER JOIN tag ON tag=id " +
+                        " WHERE release between ? AND ?");
 
     }
 
@@ -216,9 +222,33 @@
         return secondaryTypes;
     }
 
+    /**
+     * Load Tags
+     *
+     * @param min
+     * @param max
+     * @return
+     * @throws SQLException
+     * @throws IOException
+     */
+    private Map<Integer, List<Tag>> loadTags(int min, int max) throws SQLException, IOException {
 
+        // Get Tags
+        PreparedStatement st = getPreparedStatement("TAGS");
+        st.setInt(1, min);
+        st.setInt(2, max);
+        ResultSet rs = st.executeQuery();
+        Map<Integer,List<Tag>> tags = TagHelper.completeTagsFromDbResults(rs,"release");
+        rs.close();
+        return tags;
+
+    }
+
+
     public void indexData(IndexWriter indexWriter, int min, int max) throws SQLException, IOException {
 
+        Map<Integer, List<Tag>> tags                        = loadTags(min, max);
+
         //A particular release can have multiple catalog nos, labels when released as an imprint, typically used
         //by major labels
         labelClock.resume();
@@ -327,13 +357,14 @@
         rs = st.executeQuery();
         releaseClock.suspend();
         while (rs.next()) {
-            indexWriter.addDocument(documentFromResultSet(rs, secondaryTypes, labelInfo, mediums, puidWrapper, artistCredits));
+            indexWriter.addDocument(documentFromResultSet(rs, secondaryTypes, tags, labelInfo, mediums, puidWrapper, artistCredits));
         }
         rs.close();
     }
 
     public Document documentFromResultSet(ResultSet rs,
                                           Map<Integer, List<String>> secondaryTypes,
+                                          Map<Integer,List<Tag>> tags,
                                           Map<Integer,List<List<String>>> labelInfo,
                                           Map<Integer,List<List<String>>> mediums,
                                           Map<Integer, List<String>> puids,
@@ -454,6 +485,13 @@
             System.out.println("\nNo artist credit found for release:"+rs.getString("gid"));
         }
 
+        if (tags.containsKey(id)) {
+            for (Tag tag : tags.get(id)) {
+                doc.addField(ReleaseIndexField.TAG, tag.getName());
+                doc.addField(ReleaseIndexField.TAGCOUNT, tag.getCount().toString());
+            }
+        }
+
         return doc.getLuceneDocument();
     }
 

Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java	2013-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/ReleaseIndexField.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -40,6 +40,8 @@
     SCRIPT			    ("script",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new CaseInsensitiveKeywordAnalyzer()),
     SECONDARY_TYPE      ("secondarytype",   MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     STATUS		        ("status",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+    TAG		            ("tag",		        MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzWithPosGapAnalyzer()),
+    TAGCOUNT            ("tagcount",	    MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
     TYPE		        ("type",		    MusicBrainzFieldTypes.TEXT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
     ;
 

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-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AbstractIndexTest.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -128,7 +128,9 @@
                 stmt.addBatch("DROP TABLE tracklist");
                 stmt.addBatch("DROP TABLE language");
                 stmt.addBatch("DROP TABLE script");
+                stmt.addBatch("DROP TABLE release_tag");
 
+
                 stmt.addBatch("DROP TABLE release_group");
                 stmt.addBatch("DROP TABLE release_group_primary_type");
                 stmt.addBatch("DROP TABLE release_group_secondary_type_join");
@@ -492,6 +494,14 @@
                 "  name character varying(100) NOT NULL," +
                 "  frequency integer NOT NULL DEFAULT 0" +
                 ")");
+
+        stmt.addBatch("CREATE TABLE release_tag" +
+                "(" +
+                "  release integer NOT NULL," +
+                "  tag integer NOT NULL," +
+                "  count integer NOT NULL," +
+                "  last_updated timestamp" +
+                ")");
     }
 
     protected void setupReleaseGroupTables(Statement stmt) throws Exception {

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-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/ReleaseIndexTest.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -168,7 +168,10 @@
         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 tag (id, name, ref_count) VALUES (1, 'punk', 2)");
+        stmt.addBatch("INSERT INTO release_tag (release, tag, count) VALUES (491240, 1, 10)");
 
+
         stmt.executeBatch();
         stmt.close();
     }
@@ -873,4 +876,22 @@
         }
         ir.close();
     }
+
+    @Test
+    public void testIndexReleaseWithTag() throws Exception {
+
+        addReleaseFour();
+        RAMDirectory ramDir = new RAMDirectory();
+        createIndex(ramDir);
+
+        IndexReader ir = DirectoryReader.open(ramDir);
+        assertEquals(2, ir.numDocs());
+        {
+            Document doc = ir.document(1);
+            assertEquals(1, doc.getFields(ReleaseIndexField.RELEASE.getName()).length);
+            assertEquals(1, doc.getFields(ReleaseIndexField.TAG.getName()).length);
+            assertEquals("punk", doc.getField(ReleaseGroupIndexField.TAG.getName()).stringValue());
+        }
+        ir.close();
+    }
 }
\ No newline at end of file

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-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/mmd2/ReleaseWriter.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -199,6 +199,21 @@
                 mediumList.setCount(BigInteger.valueOf(formats.length));
                 release.setMediumList(mediumList);
             }
+
+            String[] tags       = doc.getValues(ReleaseIndexField.TAG);
+            String[] tagCounts  = doc.getValues(ReleaseIndexField.TAGCOUNT);
+            if(tags.length>0)
+            {
+                TagList tagList = of.createTagList();
+                for(int i = 0;i<tags.length;i++) {
+                    Tag tag = of.createTag();
+                    tag.setName(tags[i]);
+                    tag.setCount(new BigInteger(tagCounts[i]));
+                    tagList.getTag().add(tag);
+                }
+                release.setTagList(tagList);
+            }
+
             releaseList.getRelease().add(release);
         }
         releaseList.setCount(BigInteger.valueOf(results.totalHits));

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-02-27 10:29:09 UTC (rev 13635)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindReleaseTest.java	2013-02-27 11:15:57 UTC (rev 13636)
@@ -69,9 +69,11 @@
     doc.addField(ReleaseIndexField.COMMENT, "demo");
     doc.addField(ReleaseIndexField.SECONDARY_TYPE, "Live");
     doc.addField(ReleaseIndexField.SECONDARY_TYPE, "Compilation");
+    doc.addField(ReleaseIndexField.TAG, "punk");
+    doc.addField(ReleaseIndexField.TAGCOUNT, "10");
 
 
-    ArtistCredit ac = of.createArtistCredit();
+      ArtistCredit ac = of.createArtistCredit();
     NameCredit nc = of.createNameCredit();
     Artist artist = of.createArtist();
     artist.setId("4302e264-1cf0-4d1f-aca7-2a6f89e34b36");
@@ -777,6 +779,7 @@
     assertTrue(output.contains("<catalog-number>WRATHCD25</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>"));
   }
 
   @Test
@@ -853,6 +856,19 @@
     String output = sw.toString();
     System.out.println("Json New  Pretty is" + output);
     assertTrue(output.contains("\"count\" : 1"));
+  }
 
+
+  @Test
+  public void testFindReleaseByTag() throws Exception {
+        Results res = ss.search("tag:punk", 0, 10);
+        assertEquals(1, res.totalHits);
+        Result result = res.results.get(0);
+        MbDocument doc = result.doc;
+        assertEquals("1d9e8ed6-3893-4d3b-aa7d-6cd79609e386", doc.get(ReleaseIndexField.RELEASE_ID));
+        assertEquals("punk", doc.get(ReleaseIndexField.TAG));
+        assertEquals("10", doc.get(ReleaseIndexField.TAGCOUNT));
+
   }
+
 }
\ No newline at end of file