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 flattening 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 Flatten <TSource, TResult>(Expression <Func <TSource, IEnumerable <TResult> > > selector) { var aggregateFactory = new FlatteningAggregatorFactory <TSource, TResult>(selector.Compile()); _expressions["Selector"] = selector; AggregatorFactory(FlattenName, aggregateFactory); }