[mb-commits] r13696 - 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 servlet/src/main/resources servlet/src/test/java/org/musicbrainz/search/servlet
[email protected] Wed, 05 Jun 2013 04:51:08 +0000
| Newsgroups | gmane.comp.audio.musicbrainz.cvs |
|---|---|
| Message-ID | <E1Uk5gi-0006xA-GX@wiley> |
Author: ijabz
Date: 2013-06-05 04:51:08 +0000 (Wed, 05 Jun 2013)
New Revision: 13696
Modified:
search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndex.java
search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndexField.java
search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AreaIndexTest.java
search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AreaDismaxSearch.java
search_server/trunk/servlet/src/main/resources/oxml.xml
search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAreaTest.java
Log:
SEARCH-301:Search for Area by ISO 3166 code
Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndex.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndex.java 2013-06-04 20:54:22 UTC (rev 13695)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndex.java 2013-06-05 04:51:08 UTC (rev 13696)
@@ -101,6 +101,14 @@
" WHERE area BETWEEN ? AND ?" +
" ORDER BY area, alias, alias_sortname");
+ addPreparedStatement("ISO1",
+ "SELECT area, code from iso_3166_1 WHERE area BETWEEN ? AND ? ORDER BY area, code");
+
+ addPreparedStatement("ISO2",
+ "SELECT area, code from iso_3166_2 WHERE area BETWEEN ? AND ? ORDER BY area, code");
+
+ addPreparedStatement("ISO3",
+ "SELECT area, code from iso_3166_3 WHERE area BETWEEN ? AND ? ORDER BY area, code");
}
@@ -152,19 +160,79 @@
}
rs.close();
+ //Iso1Code
+ Map<Integer, Iso31661CodeList> iso1 = new HashMap<Integer, Iso31661CodeList>();
+ st = getPreparedStatement("ISO1");
+ st.setInt(1, min);
+ st.setInt(2, max);
+ rs = st.executeQuery();
+ while (rs.next()) {
+ int areaId = rs.getInt("area");
+ Iso31661CodeList iso1List;
+ if(!iso1.containsKey(areaId)) {
+ iso1List = of.createIso31661CodeList();
+ iso1.put(areaId, iso1List);
+ }
+ else {
+ iso1List = iso1.get(areaId);
+ }
+ iso1List.getIso31661Code().add(rs.getString("code"));
+ }
+
+ //Iso2Code
+ Map<Integer, Iso31662CodeList> iso2 = new HashMap<Integer, Iso31662CodeList>();
+ st = getPreparedStatement("ISO2");
+ st.setInt(1, min);
+ st.setInt(2, max);
+ rs = st.executeQuery();
+ while (rs.next()) {
+ int areaId = rs.getInt("area");
+ Iso31662CodeList iso2List;
+ if(!iso2.containsKey(areaId)) {
+ iso2List = of.createIso31662CodeList();
+ iso2.put(areaId, iso2List);
+ }
+ else {
+ iso2List = iso2.get(areaId);
+ }
+ iso2List.getIso31662Code().add(rs.getString("code"));
+ }
+
+ //Iso3Code
+ Map<Integer, Iso31663CodeList> iso3 = new HashMap<Integer, Iso31663CodeList>();
+ st = getPreparedStatement("ISO3");
+ st.setInt(1, min);
+ st.setInt(2, max);
+ rs = st.executeQuery();
+ while (rs.next()) {
+ int areaId = rs.getInt("area");
+ Iso31663CodeList iso3List;
+ if(!iso3.containsKey(areaId)) {
+ iso3List = of.createIso31663CodeList();
+ iso3.put(areaId, iso3List);
+ }
+ else {
+ iso3List = iso3.get(areaId);
+ }
+ iso3List.getIso31663Code().add(rs.getString("code"));
+ }
+
st = getPreparedStatement("AREA");
st.setInt(1, min);
st.setInt(2, max);
rs = st.executeQuery();
while (rs.next()) {
- indexWriter.addDocument(documentFromResultSet(rs, aliases));
+ indexWriter.addDocument(documentFromResultSet(rs, aliases, iso1, iso2, iso3));
}
rs.close();
}
public Document documentFromResultSet(ResultSet rs,
- Map<Integer, Set<Alias>> aliases) throws SQLException {
+ Map<Integer, Set<Alias>> aliases,
+ Map<Integer, Iso31661CodeList> iso1,
+ Map<Integer, Iso31662CodeList> iso2,
+ Map<Integer, Iso31663CodeList> iso3) throws SQLException {
MbDocument doc = new MbDocument();
ObjectFactory of = new ObjectFactory();
@@ -226,6 +294,31 @@
area.setAliasList(aliasList);
}
+ if(iso1.containsKey(areaId)) {
+ area.setIso31661CodeList(iso1.get(areaId));
+ for(String iso:iso1.get(areaId).getIso31661Code()) {
+ doc.addField(AreaIndexField.ISO, iso);
+ doc.addField(AreaIndexField.ISO1, iso);
+ }
+
+ }
+
+ if(iso2.containsKey(areaId)) {
+ area.setIso31662CodeList(iso2.get(areaId));
+ for(String iso:iso2.get(areaId).getIso31662Code()) {
+ doc.addField(AreaIndexField.ISO, iso);
+ doc.addField(AreaIndexField.ISO2, iso);
+ }
+ }
+
+ if(iso3.containsKey(areaId)) {
+ area.setIso31663CodeList(iso3.get(areaId));
+ for(String iso:iso3.get(areaId).getIso31663Code()) {
+ doc.addField(AreaIndexField.ISO, iso);
+ doc.addField(AreaIndexField.ISO3, iso);
+ }
+ }
+
String store = MMDSerializer.serialize(areaList);
doc.addField(AreaIndexField.AREA_STORE, store);
return doc.getLuceneDocument();
Modified: search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndexField.java
===================================================================
--- search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndexField.java 2013-06-04 20:54:22 UTC (rev 13695)
+++ search_server/trunk/index/src/main/java/org/musicbrainz/search/index/AreaIndexField.java 2013-06-05 04:51:08 UTC (rev 13696)
@@ -48,6 +48,10 @@
END ("end", MusicBrainzFieldTypes.TEXT_NOT_STORED_NOT_ANALYZED_NO_NORMS, new KeywordAnalyzer()),
ENDED ("ended", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
SORTNAME ("sortname", MusicBrainzFieldTypes.TEXT_STORED_ANALYZED, new MusicbrainzAnalyzer()),
+ ISO ("iso", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+ ISO1 ("iso1", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+ ISO2 ("iso2", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
+ ISO3 ("iso3", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
TYPE ("type", MusicBrainzFieldTypes.TEXT_NOT_STORED_ANALYZED_NO_NORMS, new CaseInsensitiveKeywordAnalyzer()),
AREA_STORE ("areastore", MusicBrainzFieldTypes.TEXT_STORED_NOT_INDEXED),
;
Modified: search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AreaIndexTest.java
===================================================================
--- search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AreaIndexTest.java 2013-06-04 20:54:22 UTC (rev 13695)
+++ search_server/trunk/index/src/test/java/org/musicbrainz/search/index/AreaIndexTest.java 2013-06-05 04:51:08 UTC (rev 13696)
@@ -40,7 +40,10 @@
stmt.addBatch("INSERT INTO area (id, gid,name,sort_name, type, begin_date_year, end_date_year) VALUES (1, 'aa95182f-df0a-3ad6-8bfb-4b63482cd276', 'Afghanistan','Afghanistan',1,1830,2020)");
stmt.addBatch("INSERT INTO area_type(id, name) VALUES (1, 'Country')");
stmt.addBatch("INSERT INTO area_alias (id, area, sort_name, name, primary_for_locale, locale, type ) VALUES (3, 1, 'Afghan', 'Afghany', true, 'en',1)");
-
+ stmt.addBatch("INSERT INTO iso_3166_1(area, code) VALUES (1,'AF')");
+ stmt.addBatch("INSERT INTO iso_3166_2(area, code) VALUES (1,'North')");
+ stmt.addBatch("INSERT INTO iso_3166_2(area, code) VALUES (1,'West')");
+ stmt.addBatch("INSERT INTO iso_3166_3(area, code) VALUES (1,'Kabu')");
stmt.executeBatch();
stmt.close();
}
@@ -142,6 +145,70 @@
}
@Test
+ public void testIndexAreaIso1() throws Exception {
+
+ addAreaOne();
+ RAMDirectory ramDir = new RAMDirectory();
+ createIndex(ramDir);
+
+ IndexReader ir = DirectoryReader.open(ramDir);
+ assertEquals(2, ir.numDocs());
+ {
+ checkTerm(ir, AreaIndexField.ISO1, "af");
+
+ }
+ ir.close();
+ }
+
+ @Test
+ public void testIndexAreaIso2() throws Exception {
+
+ addAreaOne();
+ RAMDirectory ramDir = new RAMDirectory();
+ createIndex(ramDir);
+
+ IndexReader ir = DirectoryReader.open(ramDir);
+ assertEquals(2, ir.numDocs());
+ {
+ checkTerm(ir, AreaIndexField.ISO2, "north");
+
+ }
+ ir.close();
+ }
+
+ @Test
+ public void testIndexAreaIso3() throws Exception {
+
+ addAreaOne();
+ RAMDirectory ramDir = new RAMDirectory();
+ createIndex(ramDir);
+
+ IndexReader ir = DirectoryReader.open(ramDir);
+ assertEquals(2, ir.numDocs());
+ {
+ checkTerm(ir, AreaIndexField.ISO3, "kabu");
+
+ }
+ ir.close();
+ }
+
+ @Test
+ public void testIndexAreaIso() throws Exception {
+
+ addAreaOne();
+ RAMDirectory ramDir = new RAMDirectory();
+ createIndex(ramDir);
+
+ IndexReader ir = DirectoryReader.open(ramDir);
+ assertEquals(2, ir.numDocs());
+ {
+ checkTerm(ir, AreaIndexField.ISO, "af");
+
+ }
+ ir.close();
+ }
+
+ @Test
public void testStoredIndexArea() throws Exception {
addAreaOne();
@@ -174,6 +241,17 @@
assertEquals("2020",lifeSpan.getEnd());
assertEquals("false",lifeSpan.getEnded());
+ assertNotNull(area.getIso31661CodeList());
+ assertEquals("AF", area.getIso31661CodeList().getIso31661Code().get(0));
+
+ assertNotNull(area.getIso31662CodeList());
+ assertEquals("North", area.getIso31662CodeList().getIso31662Code().get(0));
+ assertEquals("West", area.getIso31662CodeList().getIso31662Code().get(1));
+
+ assertNotNull(area.getIso31663CodeList());
+ assertEquals("Kabu", area.getIso31663CodeList().getIso31663Code().get(0));
+
+
}
ir.close();
}
Modified: search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AreaDismaxSearch.java
===================================================================
--- search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AreaDismaxSearch.java 2013-06-04 20:54:22 UTC (rev 13695)
+++ search_server/trunk/servlet/src/main/java/org/musicbrainz/search/servlet/AreaDismaxSearch.java 2013-06-05 04:51:08 UTC (rev 13696)
@@ -41,7 +41,9 @@
Map<String, DismaxAlias.AliasField> fieldBoosts = new HashMap<String, DismaxAlias.AliasField>(3);
fieldBoosts.put(AreaIndexField.AREA.getName(), new DismaxAlias.AliasField(true, 1.3f));
fieldBoosts.put(AreaIndexField.SORTNAME.getName(), new DismaxAlias.AliasField(true, 1.1f));
- //fieldBoosts.put(AreaIndexField.ALIAS.getName(), new DismaxAlias.AliasField(true, 0.9f));
+ fieldBoosts.put(AreaIndexField.ALIAS.getName(), new DismaxAlias.AliasField(true, 0.9f));
+ fieldBoosts.put(AreaIndexField.ISO.getName(), new DismaxAlias.AliasField(true, 0.9f));
+
DismaxAlias dismaxAlias = new DismaxAlias();
dismaxAlias.setFields(fieldBoosts);
dismaxAlias.setTie(0.1f);
Modified: search_server/trunk/servlet/src/main/resources/oxml.xml
===================================================================
--- search_server/trunk/servlet/src/main/resources/oxml.xml 2013-06-04 20:54:22 UTC (rev 13695)
+++ search_server/trunk/servlet/src/main/resources/oxml.xml 2013-06-05 04:51:08 UTC (rev 13696)
@@ -38,6 +38,16 @@
<xml-element java-attribute="iso31661CodeList" xml-path="."/>
</java-attributes>
</java-type>
+ <java-type name="DefAreaElementInner">
+ <java-attributes>
+ <xml-element java-attribute="iso31662CodeList" xml-path="."/>
+ </java-attributes>
+ </java-type>
+ <java-type name="DefAreaElementInner">
+ <java-attributes>
+ <xml-element java-attribute="iso31663CodeList" xml-path="."/>
+ </java-attributes>
+ </java-type>
<java-type name="Metadata">
<java-attributes>
<xml-element java-attribute="releaseList" xml-path="."/>
@@ -353,5 +363,15 @@
<xml-element java-attribute="iso31661Code" name="iso-3166-1-codes"/>
</java-attributes>
</java-type>
+ <java-type name="Iso31662CodeList">
+ <java-attributes>
+ <xml-element java-attribute="iso31662Code" name="iso-3166-2-codes"/>
+ </java-attributes>
+ </java-type>
+ <java-type name="Iso31663CodeList">
+ <java-attributes>
+ <xml-element java-attribute="iso31663Code" name="iso-3166-3-codes"/>
+ </java-attributes>
+ </java-type>
</java-types>
</xml-bindings>
Modified: search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAreaTest.java
===================================================================
--- search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAreaTest.java 2013-06-04 20:54:22 UTC (rev 13695)
+++ search_server/trunk/servlet/src/test/java/org/musicbrainz/search/servlet/FindAreaTest.java 2013-06-05 04:51:08 UTC (rev 13696)
@@ -71,14 +71,32 @@
lifespan.setEnd("2004");
lifespan.setEnded("true");
- /*
- doc.addField(AreaIndexField.CODE, 1234);
- area.setAreaCode(BigInteger.valueOf(1234));
+ doc.addField(AreaIndexField.TYPE,"Country");
+ area.setType("Country");
- */
- area.setType("Country");
+ Iso31661CodeList iso1 = of.createIso31661CodeList();
+ iso1.getIso31661Code().add("AF");
+ doc.addField(AreaIndexField.ISO1,"AF");
+ doc.addField(AreaIndexField.ISO,"AF");
+ area.setIso31661CodeList(iso1);
+
+ Iso31662CodeList iso2 = of.createIso31662CodeList();
+ iso2.getIso31662Code().add("North");
+ doc.addField(AreaIndexField.ISO2,"North");
+ doc.addField(AreaIndexField.ISO,"North");
+
+ area.setIso31662CodeList(iso2);
+
+ Iso31663CodeList iso3 = of.createIso31663CodeList();
+ iso3.getIso31663Code().add("Kabu");
+ doc.addField(AreaIndexField.ISO3,"Kabu");
+ doc.addField(AreaIndexField.ISO,"Kabu");
+
+ area.setIso31663CodeList(iso3);
+
+
AreaList areaList = of.createAreaList();
areaList.getArea().add(area);
doc.addField(AreaIndexField.AREA_STORE, MMDSerializer.serialize(areaList));
@@ -144,6 +162,16 @@
}
@Test
+ public void testFindAreaByType() throws Exception {
+ Results res = ss.search("type:\"Country\"", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
+
+ @Test
public void testFindAreaByBegin() throws Exception {
Results res = ss.search("begin:1993", 0, 10);
assertEquals(1, res.getTotalHits());
@@ -174,6 +202,47 @@
}
@Test
+ public void testFindAreaByIso1() throws Exception {
+ Results res = ss.search("iso1:af", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
+
+ @Test
+ public void testFindAreaByIso2() throws Exception {
+ Results res = ss.search("iso2:north", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
+
+
+ @Test
+ public void testFindAreaByIso3() throws Exception {
+ Results res = ss.search("iso3:kabu", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
+
+ @Test
+ public void testFindAreaByIso() throws Exception {
+ Results res = ss.search("iso:af", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
+
+ @Test
public void testFindAreaByDismax1() throws Exception {
Results res = sd.search("Afghanistan", 0, 10);
assertEquals(1, res.getTotalHits());
@@ -183,7 +252,25 @@
assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
}
+ @Test
+ public void testFindAreaByDismax2() throws Exception {
+ Results res = sd.search("afghany", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
+ @Test
+ public void testFindAreaByDismax3() throws Exception {
+ Results res = sd.search("af", 0, 10);
+ assertEquals(1, res.getTotalHits());
+ Result result = res.results.get(0);
+ MbDocument doc = result.getDoc();
+ assertEquals("ff571ff4-04cb-4b9c-8a1c-354c330f863c", doc.get(AreaIndexField.AREA_ID));
+ assertEquals("Afghanistan", doc.get(AreaIndexField.AREA));
+ }
/**
* Tests get same results as
* http://musicbrainz.org/ws/1/area/?type=xml&query=%22Jockey%20Slut%22
@@ -213,9 +300,27 @@
assertTrue(output.contains("<begin>1993</begin"));
assertTrue(output.contains("<end>2004</end>"));
assertTrue(output.contains("<ended>true</ended>"));
+ assertTrue(output.contains("<iso-3166-1-code-list><iso-3166-1-code>AF</iso-3166-1-code>"));
+ assertTrue(output.contains("<iso-3166-2-code-list><iso-3166-2-code>North</iso-3166-2-code>"));
+ assertTrue(output.contains("<iso-3166-3-code-list><iso-3166-3-code>Kabu</iso-3166-3-code>"));
+
}
+ @Test
+ public void testOutputAsXmlIdent() throws Exception {
+
+ Results res = ss.search("area:\"Afghanistan\"", 0, 1);
+ ResultsWriter writer = ss.getMmd2Writer();
+ StringWriter sw = new StringWriter();
+ PrintWriter pr = new PrintWriter(sw);
+ writer.write(pr, res, SearchServerServlet.RESPONSE_XML, true);
+ pr.close();
+ String output = sw.toString();
+ System.out.println("Xml is" + output);
+ assertTrue(output.contains("count=\"1\""));
+ }
+
/**
* @throws Exception exception
*/
@@ -238,9 +343,11 @@
assertTrue(output.contains("\"type\":\"Country\""));
assertTrue(output.contains("name\":\"Afghanistan\""));
assertTrue(output.contains("\"sort-name\":\"Afghanistan\""));
-
assertTrue(output.contains("life-span\":{\"begin\":\"1993\""));
assertTrue(output.contains("\"ended\":\"true\""));
+ assertTrue(output.contains("\"iso-3166-1-code-list\":{\"iso-3166-1-code\":[\"AF\"]}"));
+ assertTrue(output.contains("\"iso-3166-2-code-list\":{\"iso-3166-2-code\":[\"North\"]}"));
+ assertTrue(output.contains("\"iso-3166-3-code-list\":{\"iso-3166-3-code\":[\"Kabu\"]}"));
}
@@ -268,7 +375,28 @@
assertTrue(output.contains("life-span\":{\"begin\":\"1993\""));
assertTrue(output.contains("\"ended\":true"));
assertTrue(output.contains("\"end\":\"2004\""));
+ assertTrue(output.contains("\"iso-3166-1-codes\":[\"AF\"]"));
+ assertTrue(output.contains("\"iso-3166-2-codes\":[\"North\"]"));
+ assertTrue(output.contains("\"iso-3166-3-codes\":[\"Kabu\"]"));
+ }
+ /**
+ * @throws Exception exception
+ */
+ @Test
+ public void testOutputJsonNewIdent() throws Exception {
+
+ Results res = ss.search("area:\"Afghanistan\"", 0, 10);
+ org.musicbrainz.search.servlet.mmd2.ResultsWriter writer = ss.getMmd2Writer();
+ StringWriter sw = new StringWriter();
+ PrintWriter pr = new PrintWriter(sw);
+ writer.write(pr, res, SearchServerServlet.RESPONSE_JSON_NEW, true);
+ pr.close();
+
+ String output = sw.toString();
+ System.out.println("Json New Ident is" + output);
+ assertTrue(output.contains("\"offset\" : 0"));
+
}
}
\ No newline at end of file