public void ToODataString_EscapesThe_Uri()
        {
            //updatedat gt datetimeoffset'2014-04-04T07:00:00.0000000+00:00'
            var datetime1 = new ConstantNode(new DateTimeOffset(2014, 4, 4, 7, 0, 0, TimeSpan.FromHours(0)));
            var updatedAt = new MemberAccessNode(null, "updatedat");
            var gt1       = new BinaryOperatorNode(BinaryOperatorKind.GreaterThan, updatedAt, datetime1);

            // updatedat gt datetime'2014-04-04T07:0:0.000Z'
            var datetime2 = new ConstantNode(new DateTime(2014, 4, 4, 7, 0, 0, DateTimeKind.Utc));
            var someDate  = new MemberAccessNode(null, "someDate");
            var gt2       = new BinaryOperatorNode(BinaryOperatorKind.GreaterThan, someDate, datetime2);

            // startswith(text,'this&''%%=,?#')
            var text       = new MemberAccessNode(null, "text");
            var value      = new ConstantNode("this&'%%=,?#");
            var startswith = new FunctionCallNode("startswith", new QueryNode[] { text, value });

            //updatedat gt datetimeoffset'2014-04-04T07:00:00.0000000+00:00' and startswith(text,'this&''%%=,?#')
            var and2 = new BinaryOperatorNode(BinaryOperatorKind.And, gt2, startswith);

            var and1 = new BinaryOperatorNode(BinaryOperatorKind.And, gt1, and2);

            var desc = new MobileServiceTableQueryDescription("someTable")
            {
                Filter = and1
            };

            Assert.AreEqual(desc.ToODataString(), EscapedODataString);
        }
Exemple #2
0
        public Task <JToken> ReadAsync(MobileServiceTableQueryDescription query)
        {
            if (query.TableName == MobileServiceLocalSystemTables.OperationQueue || query.TableName == MobileServiceLocalSystemTables.SyncErrors)
            {
                MockTable table = GetTable(query.TableName);

                IEnumerable <JObject> items = table.Values;
                if (query.TableName == MobileServiceLocalSystemTables.OperationQueue)
                {
                    string odata = query.ToODataString();
                    if (odata.Contains("$orderby=sequence desc")) // the query to take total count and max sequence
                    {
                        items = items.OrderBy(o => o.Value <long>("sequence"));
                    }
                    else if (odata.StartsWith("$filter=((tableKind eq ") && odata.Contains("(sequence gt "))
                    {
                        var sequenceCompareNode = ((BinaryOperatorNode)query.Filter).RightOperand as BinaryOperatorNode;

                        items = items.Where(o => o.Value <long>("sequence") > (long)((ConstantNode)sequenceCompareNode.RightOperand).Value);
                        items = items.OrderBy(o => o.Value <long>("sequence"));
                    }
                    else if (odata.Contains("(sequence gt ")) // the query to get next operation
                    {
                        items = items.Where(o => o.Value <long>("sequence") > (long)((ConstantNode)((BinaryOperatorNode)query.Filter).RightOperand).Value);
                        items = items.OrderBy(o => o.Value <long>("sequence"));
                    }
                    else if (odata.Contains(") and (itemId eq '")) // the query to retrive operation by item id
                    {
                        string targetTable = ((ConstantNode)((BinaryOperatorNode)((BinaryOperatorNode)query.Filter).LeftOperand).RightOperand).Value.ToString();
                        string targetId    = ((ConstantNode)((BinaryOperatorNode)((BinaryOperatorNode)query.Filter).RightOperand).RightOperand).Value.ToString();
                        items = items.Where(o => o.Value <string>("itemId") == targetId && o.Value <string>("tableName") == targetTable);
                    }
                    else if (odata.Contains("$filter=(tableName eq '"))
                    {
                        items = items.Where(o => o.Value <string>("tableName") == ((ConstantNode)((BinaryOperatorNode)query.Filter).RightOperand).Value.ToString());
                    }
                }

                if (query.IncludeTotalCount)
                {
                    return(Task.FromResult <JToken>(new JObject()
                    {
                        { "count", items.Count() }, { "results", new JArray(items) }
                    }));
                }

                return(Task.FromResult <JToken>(new JArray(items)));
            }

            this.ReadQueries.Add(query);
            JToken response;

            if (ReadAsyncFunc != null)
            {
                response = ReadAsyncFunc(query);
            }
            else
            {
                response = JToken.Parse(ReadResponses.Dequeue());
            }

            return(Task.FromResult(response));
        }