コード例 #1
0
        public async Task Top0Query_Indexed_Returns0UserProfiles()
        {
            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(obj => obj.TraceIdentifier).Returns("Test trace");
            List <KeyValuePair <string, string> > query = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>("$top", "0")
            };

            IEnumerable <JToken> result = await ReliableStateExtensions.QueryPartitionAsync(userDictionaryManager, httpContext.Object, "indexed_users", query, Guid.NewGuid(), new CancellationToken());

            var profiles = GetProfilesFromJTokens(result);

            Assert.AreEqual(0, profiles.Count);
        }
コード例 #2
0
        public async Task EmptyQuery_Indexed_ReturnsUserProfileAll()
        {
            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(obj => obj.TraceIdentifier).Returns("Test trace");
            IEnumerable <KeyValuePair <string, string> > query = new List <KeyValuePair <string, string> >();
            IEnumerable <JToken> result = await ReliableStateExtensions.QueryPartitionAsync(userDictionaryManager, httpContext.Object, "indexed_users", query, Guid.NewGuid(), new CancellationToken());


            var profiles = GetProfilesFromJTokens(result);

            Assert.IsTrue(profiles.Contains(user0));
            Assert.IsTrue(profiles.Contains(user1));
            Assert.IsTrue(profiles.Contains(user2));
            Assert.IsTrue(profiles.Contains(user3));
            Assert.IsTrue(profiles.Contains(user4));
        }
コード例 #3
0
        public async Task CollectionNotADictionary_ThrowsArgumentError()
        {
            var queue = new Mock <IReliableQueue <string> >();


            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(obj => obj.TraceIdentifier).Returns("Test trace");
            string collection = "collection";
            IEnumerable <KeyValuePair <string, string> > query = new List <KeyValuePair <string, string> >();

            var stateManager = new Mock <IReliableStateManager>();

            stateManager.Setup(obj => obj.TryGetAsync <IReliableState>(collection)).Returns(Task.FromResult(new ConditionalValue <IReliableState>(true, queue.Object)));


            var result = await ReliableStateExtensions.QueryPartitionAsync(stateManager.Object, httpContext.Object, collection, query, Guid.NewGuid(), new CancellationToken());
        }
コード例 #4
0
        public async Task FilternBadRange_LowGreaterThanHigh_Query_Indexed_ReturnsEmpty()
        {
            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(obj => obj.TraceIdentifier).Returns("Test trace");
            List <KeyValuePair <string, string> > query = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>("$filter", "Value/Email gt '*****@*****.**' and Value/Email lt '*****@*****.**'")
            };

            IEnumerable <JToken> result = await ReliableStateExtensions.QueryPartitionAsync(userDictionaryManager, httpContext.Object, "indexed_users", query, Guid.NewGuid(), new CancellationToken());

            var profiles = GetProfilesFromJTokens(result);

            Assert.IsFalse(profiles.Contains(user0));
            Assert.IsFalse(profiles.Contains(user1));
            Assert.IsFalse(profiles.Contains(user2));
            Assert.IsFalse(profiles.Contains(user3));
            Assert.IsFalse(profiles.Contains(user4));
        }
コード例 #5
0
        public async Task FilterLessThanEqualAndGreaterThanEqualQuery_NotIndexed_ReturnsUserProfile1_2_3_4_5()
        {
            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(obj => obj.TraceIdentifier).Returns("Test trace");
            List <KeyValuePair <string, string> > query = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>("$filter", "Value/Email ge '*****@*****.**' and Value/Email le '*****@*****.**'")
            };

            IEnumerable <JToken> result = await ReliableStateExtensions.QueryPartitionAsync(userDictionaryManager, httpContext.Object, "users", query, Guid.NewGuid(), new CancellationToken());

            var profiles = GetProfilesFromJTokens(result);

            Assert.IsTrue(profiles.Contains(user0));
            Assert.IsTrue(profiles.Contains(user1));
            Assert.IsTrue(profiles.Contains(user2));
            Assert.IsTrue(profiles.Contains(user3));
            Assert.IsTrue(profiles.Contains(user4));
        }
コード例 #6
0
        public async Task FilterEqualsOnInlusivePropertyQuery_NotIndexed_ReturnsUserProfile3_4()
        {
            var httpContext = new Mock <HttpContext>();

            httpContext.Setup(obj => obj.TraceIdentifier).Returns("Test trace");
            List <KeyValuePair <string, string> > query = new List <KeyValuePair <string, string> >
            {
                new KeyValuePair <string, string>("$filter", "Value/Age eq 21")
            };

            IEnumerable <JToken> result = await ReliableStateExtensions.QueryPartitionAsync(userDictionaryManager, httpContext.Object, "users", query, Guid.NewGuid(), new CancellationToken());

            var profiles = GetProfilesFromJTokens(result);

            Assert.IsFalse(profiles.Contains(user0));
            Assert.IsFalse(profiles.Contains(user1));
            Assert.IsFalse(profiles.Contains(user2));
            Assert.IsTrue(profiles.Contains(user3));
            Assert.IsTrue(profiles.Contains(user4));
        }
        // Executes the expression tree that is passed to it.
        // Should return
        internal static async Task <object> Execute <TKey, TValue>(Expression expression, IReliableStateManager stateManager, IReliableIndexedDictionary <TKey, TValue> dictionary, bool IsEnumerable)
            where TKey : IComparable <TKey>, IEquatable <TKey>
        {
            //The expression must represent a query over the data source.
            if (!IsQueryOverDataSource(expression))
            {
                throw new InvalidProgramException("No query over the data source was specified.");
            }

            // Find the call to Where() and get the lambda expression predicate.
            InnermostWhereFinder whereFinder     = new InnermostWhereFinder();
            MethodCallExpression whereExpression = whereFinder.GetInnermostWhere(expression);
            IQueryable <TValue>  queryableValues;

            if (whereExpression != null)
            {
                LambdaExpression lambdaExpression = (LambdaExpression)((UnaryExpression)(whereExpression.Arguments[1])).Operand;

                // Send the lambda expression through the partial evaluator.
                lambdaExpression = (LambdaExpression)Evaluator.PartialEval(lambdaExpression);

                // Translate expression to Odata Expression
                SingleValueNode    root = TranslateToOData(lambdaExpression.Body);
                IEnumerable <TKey> keys = ReliableStateExtensions.TryFilterNode <TKey, TValue>(root, false, stateManager, dictionary.Name.AbsolutePath, new CancellationToken()).Result;

                IEnumerable <TValue> values;
                using (var tx = stateManager.CreateTransaction())
                {
                    IEnumerable <KeyValuePair <TKey, TValue> > pairs = await dictionary.GetAllAsync(tx, keys, TimeSpan.FromSeconds(4), new CancellationToken()).AsEnumerable();

                    values          = new KeyValueToValueEnumerable <TKey, TValue>(pairs);
                    queryableValues = values.AsQueryable <TValue>();
                    await tx.CommitAsync();
                }
            }
            else
            {
                IAsyncEnumerable <TValue> values;
                using (var tx = stateManager.CreateTransaction())
                {
                    IAsyncEnumerable <KeyValuePair <TKey, TValue> > pairs = dictionary.CreateEnumerableAsync(tx, EnumerationMode.Ordered).Result;
                    values          = new KeyValueToValueAsyncEnumerable <TKey, TValue>(pairs);
                    queryableValues = (values.AsEnumerable().Result).AsQueryable <TValue>();
                    await tx.CommitAsync();
                }
            }

            // Copy the expression tree that was passed in, changing only the first
            // argument of the innermost MethodCallExpression.
            ExpressionTreeModifier <TKey, TValue> treeCopier = new ExpressionTreeModifier <TKey, TValue>(queryableValues);
            Expression newExpressionTree = treeCopier.Visit(expression);

            // This step creates an IQueryable that executes by replacing Queryable methods with Enumerable methods.
            if (IsEnumerable)
            {
                return(queryableValues.Provider.CreateQuery(newExpressionTree));
            }
            else
            {
                return(queryableValues.Provider.Execute(newExpressionTree));
            }

            // This step creates an IQueryable that executes by replacing Queryable methods with Enumerable methods.
        }