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); }
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)); }
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()); }
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)); }
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)); }
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. }