Changeset 8250 in josm
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
r8220 r8250 397 397 .addKeyword("child <i>expr</i>", "child ", tr("all children of objects matching the expression"), "child building") 398 398 .addKeyword("parent <i>expr</i>", "parent ", tr("all parents of objects matching the expression"), "parent bus_stop") 399 .addKeyword("nth:<i>7</i>", "nth: ", tr("n-th member of relation and/or n-th node of way"), "nth:5 (child type:relation)" )399 .addKeyword("nth:<i>7</i>", "nth: ", tr("n-th member of relation and/or n-th node of way"), "nth:5 (child type:relation)", "nth:-1") 400 400 .addKeyword("nth%:<i>7</i>", "nth%: ", tr("every n-th member of relation and/or every n-th node of way"), "nth%:100 (child waterway)") 401 401 , GBC.eol()); -
trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
r8231 r8250 846 846 847 847 private Nth(int nth, boolean modulo) throws ParseError { 848 if (nth <= 0) {849 throw new ParseError(tr("Positive integer expected"));850 }851 848 this.nth = nth; 852 849 this.modulo = modulo; … … 856 853 public boolean match(OsmPrimitive osm) { 857 854 for (OsmPrimitive p : osm.getReferrers()) { 858 Integer idx = null; 855 final int idx; 856 final int maxIndex; 859 857 if (p instanceof Way) { 860 858 Way w = (Way) p; 861 859 idx = w.getNodes().indexOf(osm); 860 maxIndex = w.getNodesCount(); 862 861 } else if (p instanceof Relation) { 863 862 Relation r = (Relation) p; 864 863 idx = r.getMemberPrimitivesList().indexOf(osm); 865 } 866 if (idx != null) { 867 if (idx.intValue() == nth || (modulo && idx.intValue() % nth == 0)) { 868 return true; 869 } 870 } 864 maxIndex = r.getMembersCount(); 865 } else { 866 continue; 867 } 868 if (nth < 0 && idx - maxIndex == nth) { 869 return true; 870 } else if (idx == nth || (modulo && idx % nth == 0)) 871 return true; 871 872 } 872 873 return false; 874 } 875 876 @Override 877 public String toString() { 878 return "Nth{nth=" + nth + ", modulo=" + modulo + '}'; 873 879 } 874 880 } -
trunk/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
r7937 r8250 1 1 package org.openstreetmap.josm.actions.search; 2 2 3 import org.hamcrest.CoreMatchers; 3 4 import org.junit.Assert; 4 5 import org.junit.Before; 5 6 import org.junit.Test; 6 7 import org.openstreetmap.josm.JOSMFixture; 8 import org.openstreetmap.josm.data.coor.LatLon; 9 import org.openstreetmap.josm.data.osm.DataSet; 7 10 import org.openstreetmap.josm.data.osm.Node; 8 11 import org.openstreetmap.josm.data.osm.OsmPrimitive; 12 import org.openstreetmap.josm.data.osm.Way; 9 13 10 14 public class SearchCompilerTest { … … 63 67 64 68 } 69 70 @Test 71 public void testNth() throws Exception { 72 final DataSet dataSet = new DataSet(); 73 final Way way = new Way(); 74 final Node node0 = new Node(new LatLon(1, 1)); 75 final Node node1 = new Node(new LatLon(2, 2)); 76 final Node node2 = new Node(new LatLon(3, 3)); 77 dataSet.addPrimitive(way); 78 dataSet.addPrimitive(node0); 79 dataSet.addPrimitive(node1); 80 dataSet.addPrimitive(node2); 81 way.addNode(node0); 82 way.addNode(node1); 83 way.addNode(node2); 84 Assert.assertFalse(SearchCompiler.compile("nth:2", false, false).match(node1)); 85 Assert.assertTrue(SearchCompiler.compile("nth:1", false, false).match(node1)); 86 Assert.assertFalse(SearchCompiler.compile("nth:0", false, false).match(node1)); 87 Assert.assertTrue(SearchCompiler.compile("nth:0", false, false).match(node0)); 88 Assert.assertTrue(SearchCompiler.compile("nth:2", false, false).match(node2)); 89 Assert.assertTrue(SearchCompiler.compile("nth:-1", false, false).match(node2)); 90 Assert.assertTrue(SearchCompiler.compile("nth:-2", false, false).match(node1)); 91 Assert.assertTrue(SearchCompiler.compile("nth:-3", false, false).match(node0)); 92 } 93 94 @Test 95 public void testNthParseNegative() throws Exception { 96 Assert.assertThat(SearchCompiler.compile("nth:-1", false, false).toString(), CoreMatchers.is("Nth{nth=-1, modulo=false}")); 97 98 } 65 99 }
Note:
See TracChangeset
for help on using the changeset viewer.