private IAggregatorFactory BuildAggregatorFactory(ReteBuilderContext context, AggregateElement element) { IAggregatorFactory factory; switch (element.Name) { case AggregateElement.CollectName: factory = new CollectionAggregatorFactory(); break; case AggregateElement.GroupByName: factory = new GroupByAggregatorFactory(); break; case AggregateElement.ProjectName: factory = new ProjectionAggregatorFactory(); break; case AggregateElement.FlattenName: factory = new FlatteningAggregatorFactory(); break; default: throw new ArgumentException( $"Unrecognized aggregate element. Name={element.Name}"); } var compiledExpressions = CompileExpressions(context, element); factory.Compile(element, compiledExpressions); return(factory); }
private IAggregatorFactory BuildAggregatorFactory(ReteBuilderContext context, AggregateElement element) { IAggregatorFactory factory; switch (element.Name) { case AggregateElement.CollectName: factory = new CollectionAggregatorFactory(); break; case AggregateElement.GroupByName: factory = new GroupByAggregatorFactory(); break; case AggregateElement.ProjectName: factory = new ProjectionAggregatorFactory(); break; case AggregateElement.FlattenName: factory = new FlatteningAggregatorFactory(); break; default: factory = GetCustomFactory(element); break; } var compiledExpressions = CompileExpressions(context, element); factory.Compile(element, compiledExpressions); return(factory); }
/// <summary> /// Configure projection aggregator. /// </summary> /// <param name="selector">Projection expression.</param> /// <typeparam name="TSource">Type of source elements to aggregate.</typeparam> /// <typeparam name="TResult">Type of result elements to aggregate.</typeparam> public void Project <TSource, TResult>(Expression <Func <TSource, TResult> > selector) { var aggregateFactory = new ProjectionAggregatorFactory <TSource, TResult>(selector.Compile()); _expressions["Selector"] = selector; AggregatorFactory(ProjectName, aggregateFactory); }