package se.kodapan.osm.domain.root.indexed; import junit.framework.TestCase; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import se.kodapan.osm.domain.OsmObject; import se.kodapan.osm.domain.Way; import se.kodapan.osm.domain.root.PojoRoot; import se.kodapan.osm.parser.xml.instantiated.InstantiatedOsmXmlParser; import java.util.Map; /** * @author kalle * @since 2013-10-20 02:23 */ public class TestIndexedRoot extends TestCase { public void test() throws Exception { PojoRoot root = new PojoRoot(); IndexedRoot<Query> index = IndexedRoot.newInstance(root); index.open(); InstantiatedOsmXmlParser parser = InstantiatedOsmXmlParser.newInstance(); parser.setRoot(index); parser.parse(getClass().getResourceAsStream("/fjallbacka.osm.xml")); index.commit(); assertEquals(36393, root.getNodes().size()); assertEquals(4103, root.getWays().size()); assertEquals(87, root.getRelations().size()); Map<OsmObject, Float> hits = index.search(new MatchAllDocsQuery()); assertEquals(root.getNodes().size() + root.getWays().size() + root.getRelations().size(), hits.size()); Way building = index.getWay(198568340l); BooleanQuery bq; // not matching geographically bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("building").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5952395).setWestLongitude(11.2786132) .setNorthLatitude(58.595755).setEastLongitude(11.2791668) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertFalse(hits.keySet().contains(building)); // encloses the building but search for highway bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("highway").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5948092).setWestLongitude(11.279312) .setNorthLatitude(58.5951071).setEastLongitude(11.2802286) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertFalse(hits.keySet().contains(building)); // encloses the building bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("building").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5948092).setWestLongitude(11.279312) .setNorthLatitude(58.5951071).setEastLongitude(11.2802286) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertTrue(hits.keySet().contains(building)); // encloses south west corner of building bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("building").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5948159).setWestLongitude(11.2794345) .setNorthLatitude(58.5949187).setEastLongitude(11.2795752) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertTrue(hits.keySet().contains(building)); // encloses north east corner of building bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("building").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5949749).setWestLongitude(11.279869) .setNorthLatitude(58.5950411).setEastLongitude(11.280004) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertTrue(hits.keySet().contains(building)); // encloses north west corner of building bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("building").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5949784).setWestLongitude(11.2794515) .setNorthLatitude(58.5950735).setEastLongitude(11.2795888) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertTrue(hits.keySet().contains(building)); // encloses south east corner of building bq = new BooleanQuery(); bq.add(index.getQueryFactories().containsTagKeyQueryFactory().setKey("building").build(), BooleanClause.Occur.MUST); bq.add(index.getQueryFactories().wayEnvelopeQueryFactory() .setSouthLatitude(58.5948425).setWestLongitude(11.2799007) .setNorthLatitude(58.5949016).setEastLongitude(11.2800471) .build(), BooleanClause.Occur.MUST); hits = index.search(bq); assertTrue(hits.keySet().contains(building)); index.close(); } }