Exemplo n.º 1
0
        public IQuery <T> ExecuteQuery <T>(ICompiledQuery <T> compiledQuery, string collection = null) where T : class
        {
            if (compiledQuery == null)
            {
                throw new ArgumentNullException(nameof(compiledQuery));
            }

            var compiledQueryType = compiledQuery.GetType();

            var discriminator = NullableThumbprintFactory.GetNullableThumbprint(compiledQuery);

            if (!_store.CompiledQueries.TryGetValue(discriminator, out var queryState))
            {
                lock (_store.CompiledQueries)
                {
                    if (!_store.CompiledQueries.TryGetValue(discriminator, out queryState))
                    {
                        var localQuery   = ((IQuery) new DefaultQuery(this, _tablePrefix, collection)).For <T>(false);
                        var defaultQuery = (DefaultQuery.Query <T>)compiledQuery.Query().Compile().Invoke(localQuery);
                        queryState = defaultQuery._query._queryState;

                        _store.CompiledQueries[discriminator] = queryState;
                    }
                }
            }

            queryState = queryState.Clone();

            IQuery newQuery = new DefaultQuery(this, queryState, compiledQuery);

            return(newQuery.For <T>(false));
        }
Exemplo n.º 2
0
        public IQuery <T> ExecuteQuery <T>(ICompiledQuery <T> compiledQuery, string collection = null) where T : class
        {
            if (compiledQuery == null)
            {
                throw new ArgumentNullException(nameof(compiledQuery));
            }

            var compiledQueryType = compiledQuery.GetType();

            var discriminator = NullableThumbprintFactory.GetNullableThumbprint(compiledQuery);

            if (!_store.CompiledQueries.TryGetValue(discriminator, out var queryState))
            {
                var localQuery   = ((IQuery) new DefaultQuery(_connection, _transaction, this, _tablePrefix, collection)).For <T>(false);
                var defaultQuery = (DefaultQuery.Query <T>)compiledQuery.Query().Compile().Invoke(localQuery);
                queryState = defaultQuery._query._queryState;

                // Don't use Add as two thread could concurrently reach this point.
                // We don't mind losing some values as the next call will restore it if it's not cached.
                _store.CompiledQueries = _store.CompiledQueries.SetItem(discriminator, queryState);
            }

            queryState = queryState.Clone();

            IQuery newQuery = new DefaultQuery(_connection, _transaction, this, _tablePrefix, queryState, compiledQuery);

            return(newQuery.For <T>(false));
        }
        public void ShouldNotHaveLsbSetForNonNullable()
        {
            var d = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithNoNullable));

            var a1  = d.GetNullableThumbprint(new DiscriminatorWithNoNullable());
            var lsb = a1 & uint.MaxValue;

            Assert.Equal(0, lsb);
        }
        public void ShouldHandleMaxProperties()
        {
            var a1 = NullableThumbprintFactory.GetNullableThumbprint(new DiscriminatorWithMaxNullable());

            for (var i = 0; i <= 47; i++)
            {
                Assert.Equal(1, (a1 >> i) & 1);
            }
        }
        public void ShouldReturnDifferentInstances()
        {
            var d1 = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithNoNullable));
            var d2 = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithNoNullable2));

            Assert.NotNull(d1);
            Assert.NotNull(d2);
            Assert.NotEqual(d1, d2);
        }
        public void ShouldReturnSameInstancePerType()
        {
            var d1 = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithStrings));
            var d2 = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithStrings));

            Assert.NotNull(d1);
            Assert.NotNull(d2);
            Assert.Same(d1, d2);
        }
        public void ShouldReturnDifferentValues()
        {
            DiscriminatorWithNoNullable i1 = new DiscriminatorWithNoNullable();
            DiscriminatorWithNoNullable i2 = new DiscriminatorWithNoNullable2();

            var a1 = NullableThumbprintFactory.GetNullableThumbprint(i1);
            var a2 = NullableThumbprintFactory.GetNullableThumbprint(i2);

            Assert.NotEqual(a1, a2);
        }
        public void ShouldReturnSameMaskForDifferentInstances()
        {
            var d = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithNoNullable));

            var a1 = d.GetNullableThumbprint(new DiscriminatorWithNoNullable {
                A = 0, B = true, C = DateTime.UtcNow
            });
            var a2 = d.GetNullableThumbprint(new DiscriminatorWithNoNullable {
                A = 1, B = false
            });

            Assert.Equal(a1, a2);
        }
        public void ShouldBuildDiscriminatorForString()
        {
            var d1 = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithStrings));

            var a1 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = "a", B = "", C = "", D = ""
            });
            var a2 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = "b", B = "", C = "", D = ""
            });
            var a3 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = null, B = "", C = "", D = ""
            });
            var a4 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = null, B = "b", C = "", D = ""
            });
            var a5 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = null, B = "", C = null, D = ""
            });
            var a6 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = null, B = "b", C = null, D = "b"
            });
            var a7 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = null, B = null, C = "", D = ""
            });
            var a8 = d1.GetNullableThumbprint(new DiscriminatorWithStrings {
                A = "", B = "", C = null, D = null
            });

            Assert.Equal(a1, a2);
            Assert.Equal(a3, a4);
            Assert.NotEqual(a1, a3);
            Assert.Equal(a5, a6);
            var distinctValues = new[] { a1, a2, a3, a4, a5, a6, a7, a8 }.Distinct();

            Assert.Equal(5, distinctValues.Count());
        }
Exemplo n.º 10
0
        public void ShouldBuildDiscriminatorForNullableTypes()
        {
            var d1 = NullableThumbprintFactory.GetNullableThumbprintBuilder(typeof(DiscriminatorWithNullable));

            var a1 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = 0, B = true, C = DateTime.UtcNow
            });
            var a2 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = 1, B = false, C = DateTime.UtcNow
            });
            var a3 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = null, B = true, C = DateTime.UtcNow
            });
            var a4 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = null, B = false, C = DateTime.UtcNow
            });
            var a5 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = null, B = true, C = null
            });
            var a6 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = null, B = false, C = null
            });
            var a7 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = null, B = null, C = DateTime.UtcNow
            });
            var a8 = d1.GetNullableThumbprint(new DiscriminatorWithNullable {
                A = 0, B = null, C = null
            });

            Assert.Equal(a1, a2);
            Assert.Equal(a3, a4);
            Assert.NotEqual(a1, a3);
            Assert.Equal(a5, a6);
            var distinctValues = new[] { a1, a2, a3, a4, a5, a6, a7, a8 }.Distinct();

            Assert.Equal(5, distinctValues.Count());
        }
Exemplo n.º 11
0
 public void ShouldHandleOverflowProperties()
 {
     Assert.Throws <InvalidOperationException>(() => NullableThumbprintFactory.GetNullableThumbprint(new DiscriminatorWithMaxNullable2()));
 }