/Atlassian.Jira/Linq/JiraQueryProvider.cs
https://bitbucket.org/yyo/atlassian.net-sdk-v2.0 · C# · 69 lines · 57 code · 12 blank · 0 comment · 4 complexity · 76283a00cb9ec80129751def345eca5c MD5 · raw file
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Linq.Expressions;
-
- namespace Atlassian.Jira.Linq
- {
- public class JiraQueryProvider: IQueryProvider
- {
- private readonly IJqlExpressionVisitor _translator;
- private readonly Jira _jiraServer;
-
- public JiraQueryProvider(IJqlExpressionVisitor translator, Jira jiraInstance)
- {
- _translator = translator;
- _jiraServer = jiraInstance;
- }
-
- public IQueryable<T> CreateQuery<T>(Expression expression)
- {
- return new JiraQueryable<T>(this, expression);
- }
-
- public IQueryable CreateQuery(Expression expression)
- {
- throw new NotImplementedException();
- }
-
- public T Execute<T>(Expression expression)
- {
- bool isEnumerable = (typeof(T).Name == "IEnumerable`1");
-
- return (T)this.Execute(expression, isEnumerable);
- }
-
- public object Execute(Expression expression)
- {
- return Execute(expression, true);
- }
-
- private object Execute(Expression expression, bool isEnumerable)
- {
- var jql = _translator.Process(expression);
-
- if (jql.ProcessCount && _jiraServer.UseRestApi)
- {
- return _jiraServer.WithToken<int>((token, client) =>
- {
- return _jiraServer.RemoteService.GetIssueCountFromJqlSearch(jql.Expression);
- });
- }
-
- IQueryable<Issue> issues = _jiraServer.GetIssuesFromJql(jql.Expression, jql.StartAt, jql.MaxResults ?? _jiraServer.MaxIssuesPerRequest).AsQueryable();
-
- if (isEnumerable)
- {
- return issues;
- }
- else
- {
- var treeCopier = new ExpressionTreeModifier(issues);
- Expression newExpressionTree = treeCopier.Visit(expression);
-
- return issues.Provider.Execute(newExpressionTree);
- }
- }
- }
- }