Ticket #20405: 20405.patch

File 20405.patch, 1.4 KB (added by GerdP, 2 years ago)

simple patch that implements a cache for members in history relation in the parser, very effective when relations have many versions as most members are the same in each version

  • src/org/openstreetmap/josm/io/AbstractParser.java

     
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.time.Instant;
     7import java.util.HashMap;
     8import java.util.Map;
    79
    810import org.openstreetmap.josm.data.coor.LatLon;
    911import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     
    3032    protected Locator locator;
    3133    /** if true, replace user information in input by anonymous user */
    3234    protected boolean useAnonymousUser;
     35    private Map<RelationMemberData, RelationMemberData> memberCache = new HashMap<>();
    3336
    3437    @Override
    3538    public void setDocumentLocator(Locator locator) {
     
    181184        }
    182185        String role = getMandatoryAttributeString(atts, "role");
    183186        RelationMemberData member = new RelationMemberData(role, type, ref);
    184         ((HistoryRelation) currentPrimitive).addMember(member);
     187        // see #20405: cache equal instances of members
     188        RelationMemberData cachedMember = memberCache .putIfAbsent(member, member);
     189        if (cachedMember == null)
     190            cachedMember = member;
     191        ((HistoryRelation) currentPrimitive).addMember(cachedMember);
    185192    }
    186193
    187194    protected final boolean doStartElement(String qName, Attributes atts) throws SAXException {