Ticket #2132: AddNodeRangeSearch.patch

File AddNodeRangeSearch.patch, 2.0 KB (added by xeen, 13 years ago)

Fix exception and add node range search (e.g. nodes:10-20)

  • src/org/openstreetmap/josm/actions/search/SearchCompiler.java

     
    270270        }
    271271        @Override public String toString() {return "nodes="+count;}
    272272    }
     273   
     274    private static class NodeCountRange extends Match {
     275        private int minCount;
     276        private int maxCount;
     277        public NodeCountRange(int minCount, int maxCount) {
     278            if(maxCount < minCount) {
     279                this.minCount = maxCount;
     280                this.maxCount = minCount;
     281            } else {
     282                this.minCount = minCount;
     283                this.maxCount = maxCount;
     284            }
     285        }
     286        @Override public boolean match(OsmPrimitive osm) {
     287            if(!(osm instanceof Way)) return false;
     288            int size = ((Way)osm).nodes.size();
     289            return (size >= minCount) && (size <= maxCount);
     290        }
     291        @Override public String toString() {return "nodes="+minCount+"-"+maxCount;}
     292    }
    273293
    274294    private static class Modified extends Match {
    275295        @Override public boolean match(OsmPrimitive osm) {
     
    397417        } else if (key.equals("user")) {
    398418            return new UserMatch(value);
    399419        } else if (key.equals("nodes")) {
    400             return new NodeCount(Integer.parseInt(value));
     420            try {
     421                return new NodeCount(Integer.parseInt(value));
     422            } catch(Exception x) {}
     423       
     424            try {
     425                String[] range = value.split("-", 2);
     426                return new NodeCountRange(Integer.parseInt(range[0]), Integer.parseInt(range[1]));
     427            } catch(Exception x) {}
     428           
     429            return new NodeCount(0);
    401430        } else if (key.equals("id")) {
    402431            try {
    403432                return new Id(Long.parseLong(value));