/// <summary> /// Squashes the given changesets into one that has the same effect. /// </summary> public static OsmChange Squash(this IEnumerable <OsmChange> changes) { var deletions = new Dictionary <OsmGeoVersionKey, OsmGeo>(); var modifications = new Dictionary <OsmGeoVersionKey, OsmGeo>(); var creations = new Dictionary <OsmGeoVersionKey, OsmGeo>(); foreach (var change in changes) { if (change.Create != null) { foreach (var create in change.Create) { // just add all creates as normal. creations[new OsmGeoVersionKey(create)] = create; } } if (change.Modify != null) { foreach (var mod in change.Modify) { OsmGeo creationOfMod; var key = new OsmGeoVersionKey(mod); if (creations.TryGetPreviousVersion(key, out creationOfMod)) { // don't modify a new creation, create it properly once. creations.Remove(new OsmGeoVersionKey(creationOfMod)); creations[key] = mod; } else { // add to modifications as normal. modifications[key] = mod; } } } if (change.Delete != null) { foreach (var del in change.Delete) { var key = new OsmGeoVersionKey(del); if (creations.ContainsKey(key)) { // don't delete after create, just don't create. creations.Remove(key); } else { // add delete as normal. deletions[new OsmGeoVersionKey(del)] = del; } } } } return(new OsmChange() { Create = creations.Values.ToArray(), Delete = deletions.Values.ToArray(), Modify = modifications.Values.ToArray(), Generator = "OsmSharp", Version = 6 }); }
public void OsmGeoVersionKey_Nodes_CompareVersion() { var n1 = new OsmGeoVersionKey(OsmGeoType.Node, 42, 0); var n2 = new OsmGeoVersionKey(OsmGeoType.Node, 42, 1); Assert.AreEqual(-1, n1.CompareTo(n2)); Assert.AreEqual(1, n2.CompareTo(n1)); }
public void OsmGeoVersionKey_NodeAndWay_CompareId() { var n1 = new OsmGeoVersionKey(OsmGeoType.Node, 42, 0); var n2 = new OsmGeoVersionKey(OsmGeoType.Way, 0, 0); Assert.AreEqual(-1, n1.CompareTo(n2)); Assert.AreEqual(1, n2.CompareTo(n1)); }
/// <summary> /// Tries to get a previous version in the given dictionary. /// </summary> private static bool TryGetPreviousVersion(this Dictionary <OsmGeoVersionKey, OsmGeo> data, OsmGeoVersionKey key, out OsmGeo result) { var previous = key; result = null; while (!data.TryGetValue(previous, out result)) { previous = previous.Previous; if (previous == null) { return(false); } } return(true); }
/// <summary> /// Returns true if the given key is in the dictionary. /// </summary> private static bool ContainsPreviousVersion(this Dictionary <OsmGeoVersionKey, OsmGeo> data, OsmGeoVersionKey key) { OsmGeo result; return(data.TryGetPreviousVersion(key, out result)); }