コード例 #1
0
        /// <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
            });
        }
コード例 #2
0
ファイル: ComparisonTests.cs プロジェクト: OsmSharp/core
      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));
      }
コード例 #3
0
ファイル: ComparisonTests.cs プロジェクト: OsmSharp/core
      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));
      }
コード例 #4
0
ファイル: OsmChangeExtensions.cs プロジェクト: OsmSharp/core
        /// <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);
        }
コード例 #5
0
ファイル: OsmChangeExtensions.cs プロジェクト: OsmSharp/core
        /// <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));
        }