Ticket #2602: josm.child-parent-search.2.patch

File josm.child-parent-search.2.patch, 4.1 KB (added by Matt, 16 years ago)

A better patch for parent/child relationship search.

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

     
    1111import java.util.regex.Pattern;
    1212import java.util.regex.PatternSyntaxException;
    1313
     14import org.openstreetmap.josm.Main;
    1415import org.openstreetmap.josm.data.osm.Node;
    1516import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1617import org.openstreetmap.josm.data.osm.Relation;
     18import org.openstreetmap.josm.data.osm.RelationMember;
    1719import org.openstreetmap.josm.data.osm.User;
    1820import org.openstreetmap.josm.data.osm.Way;
     21import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
    1922import org.openstreetmap.josm.tools.DateUtils;
    2023
    2124/**
     
    319322        }
    320323        @Override public String toString() {return "untagged";}
    321324    }
     325       
     326    private static class Parent extends Match {
     327        private final Match child;
     328        public Parent(Match m) { child = m; }
     329        @Override public boolean match(OsmPrimitive osm) throws ParseError {
     330            boolean isParent = false;
     331            if (osm instanceof Way) {
     332                for (Node n : ((Way)osm).nodes)
     333                    isParent |= child.match(n);
     334            } else if (osm instanceof Relation) {
     335                for (RelationMember member : ((Relation)osm).members) {
     336                    if (member.member != null)
     337                        isParent |= child.match(member.member);
     338                }
     339            }
     340            return isParent;
     341        }
     342        @Override public String toString() {return "parentof(" + child + ")";}
     343    }
    322344
     345    private static class Child extends Match {
     346        private final Match parent;
     347        public Child(Match m) { parent = m; }
     348        @Override public boolean match(OsmPrimitive osm) throws ParseError {
     349            boolean isChild = false;
     350            CollectBackReferencesVisitor backRefs = new CollectBackReferencesVisitor(Main.ds);
     351            osm.visit(backRefs);
     352            for (OsmPrimitive p : backRefs.data) {
     353                isChild |= parent.match(p);
     354            }
     355            return isChild;
     356        }
     357        @Override public String toString() {return "childof(" + parent + ")";}
     358    }
     359
    323360    public static class ParseError extends Exception {
    324361        public ParseError(String msg) {
    325362            super(msg);
     
    387424        return parsePat();
    388425    }
    389426
    390     private Match parsePat() {
     427    private Match parsePat() throws ParseError {
    391428        String tok = tokenizer.readText();
    392429
    393430        if (tokenizer.readIfEqual(":")) {
     
    407444            return new Untagged();
    408445        } else if (tok.equals("selected")) {
    409446            return new Selected();
     447        } else if (tok.equals("child")) {
     448            return new Child(parseParens());
     449        } else if (tok.equals("parent")) {
     450            return new Parent(parseParens());
    410451        } else {
    411452            return new Any(tok);
    412453        }
  • src/org/openstreetmap/josm/actions/search/SearchAction.java

     
    9393                + "<li>"+tr("<b>selected</b> - all selected objects")+"</li>"
    9494                + "<li>"+tr("<b>incomplete</b> - all incomplete objects")+"</li>"
    9595                + "<li>"+tr("<b>untagged</b> - all untagged objects")+"</li>"
     96                + "<li>"+tr("<b>child <i>expr</i></b> - all children of objects matching the expression")+"</li>"
     97                + "<li>"+tr("<b>parent <i>expr</i></b> - all parents of objects matching the expression")+"</li>"
    9698                + "<li>"+tr("Use <b>|</b> or <b>OR</b> to combine with logical or")+"</li>"
    9799                + "<li>"+tr("Use <b>\"</b> to quote operators (e.g. if key contains :)")+"</li>"
    98100                + "<li>"+tr("Use <b>(</b> and <b>)</b> to group expressions")+"</li>"