Ignore:
Timestamp:
2023-05-10T19:37:19+02:00 (19 months ago)
Author:
taylor.smock
Message:

Fix #22808: Add bulk removal method to DataSet

This fixes an issue where selecting a large number of objects that will be
removed after pasting them will cause a massive number of events to be fired.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java

    r17240 r18724  
    1818import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1919import org.openstreetmap.josm.data.osm.PrimitiveData;
     20import org.openstreetmap.josm.data.osm.PrimitiveId;
    2021import org.openstreetmap.josm.tools.CheckParameterUtil;
    2122
     
    128129        }
    129130        // reversed order, see #14620
    130         for (int i = createdPrimitives.size() - 1; i >= 0; i--) {
    131             OsmPrimitive osm = createdPrimitives.get(i);
    132             Optional<PrimitiveData> previous = preExistingData.stream()
    133                     .filter(pd -> pd.getPrimitiveId().equals(osm.getPrimitiveId())).findAny();
    134             if (previous.isPresent()) {
    135                 osm.load(previous.get());
    136             } else {
    137                 ds.removePrimitive(osm);
    138             }
    139         }
     131        final List<PrimitiveId> toRemove = new ArrayList<>(this.createdPrimitives.size());
     132        ds.update(() -> {
     133                    for (int i = createdPrimitives.size() - 1; i >= 0; i--) {
     134                        OsmPrimitive osm = createdPrimitives.get(i);
     135                        Optional<PrimitiveData> previous = preExistingData.stream()
     136                                .filter(pd -> pd.getPrimitiveId().equals(osm.getPrimitiveId())).findAny();
     137                        if (previous.isPresent()) {
     138                            osm.load(previous.get());
     139                        } else {
     140                            toRemove.add(osm);
     141                        }
     142                    }
     143                });
     144        ds.removePrimitives(toRemove);
    140145    }
    141146
Note: See TracChangeset for help on using the changeset viewer.