public class QueryModelVisitor : QueryModelVisitorBase
{
private static readonly ResultOperatorMap ResultOperatorMap;
public IStreamedDataInfo CurrentEvaluationType { get; private set; }
public IStreamedDataInfo PreviousEvaluationType { get; private set; }
public QueryModel QueryModel { get; private set; }
public IntermediateTree IntermediateTree { get; private set; }
static QueryModelVisitor()
{
ResultOperatorMap = new ResultOperatorMap();
ResultOperatorMap.Add<FirstResultOperator, ProcessFirst>();
ResultOperatorMap.Add<SingleResultOperator, ProcessSingle>();
ResultOperatorMap.Add<GroupResultOperator, ProcessGroupBy>();
}
internal QueryModelVisitor(QueryModel queryModel)
{
QueryModel = queryModel;
IntermediateTree = new IntermediateTree();
}
private void Visit()
{
VisitQueryModel(QueryModel);
}
public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index)
{
PreviousEvaluationType = CurrentEvaluationType;
CurrentEvaluationType = resultOperator.GetOutputDataInfo(PreviousEvaluationType);
ResultOperatorMap.Process(resultOperator, this, IntermediateTree);
}
public override void VisitSelectClause(SelectClause selectClause, QueryModel queryModel)
{
CurrentEvaluationType = selectClause.GetOutputDataInfo();
base.VisitSelectClause(selectClause, queryModel);
}
public static Delegate GenerateDelegate(QueryModel queryModel)
{
var visitor = new QueryModelVisitor(queryModel);
visitor.Visit();
ReWrite(visitor);
return visitor.IntermediateTree.MergeLambdasAndCompile();
}
private static void ReWrite(QueryModelVisitor queryModelVisitor)
{
if (queryModelVisitor.QueryModel.ResultOperators.Count == 1 && queryModelVisitor.QueryModel.ResultOperators[0] is GroupResultOperator)
{
ResultOperatorMap.Process(queryModelVisitor.QueryModel.ResultOperators[0], queryModelVisitor, queryModelVisitor.IntermediateTree);
return;
}
var subQueryExpression = queryModelVisitor.QueryModel.MainFromClause.FromExpression as SubQueryExpression;
if ((subQueryExpression != null) &&
(subQueryExpression.QueryModel.ResultOperators.Count == 1) &&
(subQueryExpression.QueryModel.ResultOperators[0] is GroupResultOperator))
{
ResultOperatorMap.Process(subQueryExpression.QueryModel.ResultOperators[0], queryModelVisitor, queryModelVisitor.IntermediateTree);
}
}
}
QueryModelVisitor reference to NH
在 2013年1月24日星期四UTC+8下午6时20分36秒,yjinglee写道: