You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2016/12/23 13:54:44 UTC

ignite git commit: IGNITE-4415 .NET: Fix duplicate entity set handling in EntityFramework caching

Repository: ignite
Updated Branches:
  refs/heads/master 6ca86704c -> 781e5b7c9


IGNITE-4415 .NET: Fix duplicate entity set handling in EntityFramework caching


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/781e5b7c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/781e5b7c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/781e5b7c

Branch: refs/heads/master
Commit: 781e5b7c93a1ee47299fc94519efbd0bea020940
Parents: 6ca8670
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Fri Dec 23 16:53:59 2016 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Dec 23 16:54:35 2016 +0300

----------------------------------------------------------------------
 .../EntityFrameworkCacheTest.cs                 | 54 +++++++++++++++++++-
 .../Impl/DbCommandInfo.cs                       | 21 +++++++-
 2 files changed, 72 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/781e5b7c/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/EntityFrameworkCacheTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/EntityFrameworkCacheTest.cs b/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/EntityFrameworkCacheTest.cs
index 0e095f4..158df12 100644
--- a/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/EntityFrameworkCacheTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.EntityFramework.Tests/EntityFrameworkCacheTest.cs
@@ -321,6 +321,55 @@ namespace Apache.Ignite.EntityFramework.Tests
         }
 
         /// <summary>
+        /// Queries with entity sets used multiple times are handled correctly.
+        /// </summary>
+        [Test]
+        public void TestDuplicateEntitySets()
+        {
+            using (var ctx = GetDbContext())
+            {
+                var blog = new Blog
+                {
+                    Name = "Foo",
+                    Posts = new List<Post>
+                    {
+                        new Post {Title = "Foo"},
+                        new Post {Title = "Foo"},
+                        new Post {Title = "Foo"},
+                        new Post {Title = "Bar"}
+                    }
+                };
+                ctx.Blogs.Add(blog);
+
+                Assert.AreEqual(5, ctx.SaveChanges());
+
+                var res = ctx.Blogs.Select(b => new
+                {
+                    X = b.Posts.FirstOrDefault(p => p.Title == b.Name),
+                    Y = b.Posts.Count(p => p.Title == b.Name)
+                }).ToArray();
+
+                Assert.AreEqual(1, res.Length);
+                Assert.AreEqual("Foo", res[0].X.Title);
+                Assert.AreEqual(3, res[0].Y);
+
+                // Modify and check updated result.
+                ctx.Posts.Remove(ctx.Posts.First(x => x.Title == "Foo"));
+                Assert.AreEqual(1, ctx.SaveChanges());
+
+                res = ctx.Blogs.Select(b => new
+                {
+                    X = b.Posts.FirstOrDefault(p => p.Title == b.Name),
+                    Y = b.Posts.Count(p => p.Title == b.Name)
+                }).ToArray();
+
+                Assert.AreEqual(1, res.Length);
+                Assert.AreEqual("Foo", res[0].X.Title);
+                Assert.AreEqual(2, res[0].Y);
+            }
+        }
+
+        /// <summary>
         /// Tests transactions created with BeginTransaction.
         /// </summary>
         [Test]
@@ -664,8 +713,11 @@ namespace Apache.Ignite.EntityFramework.Tests
         {
             TestUtils.RunMultiThreaded(CreateRemoveBlog, 4, 5);
 
+            // Run once again to force cleanup.
+            CreateRemoveBlog();
+
             // Wait for the cleanup to complete.
-            Thread.Sleep(2000);
+            Thread.Sleep(1000);
 
             // Only one version of data is in the cache.
             Assert.AreEqual(1, _cache.GetSize());

http://git-wip-us.apache.org/repos/asf/ignite/blob/781e5b7c/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Impl/DbCommandInfo.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Impl/DbCommandInfo.cs b/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Impl/DbCommandInfo.cs
index 7f18170..6b5db05 100644
--- a/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Impl/DbCommandInfo.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.EntityFramework/Impl/DbCommandInfo.cs
@@ -127,6 +127,7 @@ namespace Apache.Ignite.EntityFramework.Impl
 
             expression.Accept(visitor);
 
+            // Should be sorted and unique.
             return visitor.EntitySets.ToArray();
         }
 
@@ -135,8 +136,9 @@ namespace Apache.Ignite.EntityFramework.Impl
         /// </summary>
         private class ScanExpressionVisitor : BasicCommandTreeVisitor
         {
-            /** */
-            private readonly List<EntitySetBase> _entitySets = new List<EntitySetBase>();
+            /** Unique and sorted entity sets. */
+            private readonly SortedSet<EntitySetBase> _entitySets = 
+                new SortedSet<EntitySetBase>(EntitySetComparer.Instance);
 
             /// <summary>
             /// Gets the entity sets.
@@ -154,5 +156,20 @@ namespace Apache.Ignite.EntityFramework.Impl
                 base.Visit(expression);
             }
         }
+
+        /// <summary>
+        /// Compares entity sets by name.
+        /// </summary>
+        private class EntitySetComparer : IComparer<EntitySetBase>
+        {
+            /** Default instance. */
+            public static readonly EntitySetComparer Instance = new EntitySetComparer();
+
+            /** <inheritdoc /> */
+            public int Compare(EntitySetBase x, EntitySetBase y)
+            {
+                return string.CompareOrdinal(x.Name, y.Name);
+            }
+        }
     }
 }