/// <summary> /// Called by QueryProvider to execute queries /// </summary> /// <param name="expression">ExpressionTree to parse</param> /// <returns>list of objects with query results</returns> internal object Execute(Expression expression, bool isEnumerable) { Dictionary <string, string> parameters = null; // request processor is specific to request type (i.e. Status, User, etc.) var reqProc = CreateRequestProcessor(expression, isEnumerable); // we need the where expression because it contains the criteria for the request var whereFinder = new FirstWhereClauseFinder(); var whereExpression = whereFinder.GetFirstWhere(expression); if (whereExpression != null) { var lambdaExpression = (LambdaExpression) ((UnaryExpression)(whereExpression.Arguments[1])).Operand; // translate variable references in expression into constants lambdaExpression = (LambdaExpression)Evaluator.PartialEval(lambdaExpression); parameters = reqProc.GetParameters(lambdaExpression); } // construct REST endpoint, based on input parameters var url = reqProc.BuildURL(parameters); // execute the query and return results var queryableList = TwitterExecute.QueryTwitter(url, reqProc); if (isEnumerable) { return(queryableList); } else { return(queryableList[0]); } }
public void GetParametersTest() { var dmProc = new DirectMessageRequestProcessor<DirectMessage>(); var ctx = new TwitterContext(); var directMessages = from tweet in ctx.DirectMessage where tweet.Type == DirectMessageType.SentTo select tweet; var whereFinder = new FirstWhereClauseFinder(); var whereExpression = whereFinder.GetFirstWhere(directMessages.Expression); var lambdaExpression = (LambdaExpression)((UnaryExpression)(whereExpression.Arguments[1])).Operand; lambdaExpression = (LambdaExpression)Evaluator.PartialEval(lambdaExpression); var queryParams = dmProc.GetParameters(lambdaExpression); Assert.IsTrue( queryParams.Contains( new KeyValuePair<string, string>("Type", ((int)DirectMessageType.SentTo).ToString()))); }
public void GetParametersTest() { var reqProc = new StatusRequestProcessor<Status>(); var ctx = new TwitterContext(); var publicQuery = from tweet in ctx.Status where tweet.Type == StatusType.Public select tweet; var whereFinder = new FirstWhereClauseFinder(); var whereExpression = whereFinder.GetFirstWhere(publicQuery.Expression); var lambdaExpression = (LambdaExpression)((UnaryExpression)(whereExpression.Arguments[1])).Operand; lambdaExpression = (LambdaExpression)Evaluator.PartialEval(lambdaExpression); var queryParams = reqProc.GetParameters(lambdaExpression); Assert.IsTrue( queryParams.Contains( new KeyValuePair<string, string>("Type", ((int)StatusType.Public).ToString()))); }