private static IList<ViewFactoryForge> BuildGrouped( IList<ViewFactoryForge> forgesChain, ViewFactoryForgeArgs args, ViewForgeEnv viewForgeEnv, EventType parentEventType) { if (forgesChain.IsEmpty()) { return forgesChain; } if (!(forgesChain[0] is GroupByViewFactoryForge)) { // group is always first return forgesChain; } var group = (GroupByViewFactoryForge) forgesChain[0]; // find merge var indexMerge = -1; for (var i = 0; i < forgesChain.Count; i++) { if (forgesChain[i] is MergeViewFactoryForge) { indexMerge = i; break; } } if (indexMerge == -1 || indexMerge == 1) { throw new ArgumentException(); } // obtain list of grouped forges IList<ViewFactoryForge> groupeds = new List<ViewFactoryForge>(indexMerge - 1); var eventType = parentEventType; for (var i = 1; i < indexMerge; i++) { ViewFactoryForge forge = forgesChain[i]; groupeds.Add(forge); try { forge.Attach(eventType, args.StreamNum, viewForgeEnv); } catch (ViewParameterException ex) { throw new ViewProcessingException(ex.Message, ex); } } group.Groupeds = groupeds; // obtain list of remaining IList<ViewFactoryForge> remainder = new List<ViewFactoryForge>(1); remainder.Add(group); for (var i = indexMerge + 1; i < forgesChain.Count; i++) { remainder.Add(forgesChain[i]); } // the result is the remainder return remainder; }
public static ViewFactoryForgeDesc CreateForges( ViewSpec[] viewSpecDefinitions, ViewFactoryForgeArgs args, EventType parentEventType) { try { // Clone the view spec list to prevent parameter modification var viewSpecList = new List<ViewSpec>(viewSpecDefinitions); var viewForgeEnv = new ViewForgeEnv(args); var additionalForgeables = new List<StmtClassForgeableFactory>(); // Inspect views and add merge views if required // As users can specify merge views, if they are not provided they get added AddMergeViews(viewSpecList); // Instantiate factories, not making them aware of each other yet, we now have a chain var forgesChain = InstantiateFactories(viewSpecList, args, viewForgeEnv); // Determine event type serdes that may be required foreach (ViewFactoryForge forge in forgesChain) { if (forge is DataWindowViewForge) { IList<StmtClassForgeableFactory> serdeForgeables = SerdeEventTypeUtility.Plan( parentEventType, viewForgeEnv.StatementRawInfo, viewForgeEnv.SerdeEventTypeRegistry, viewForgeEnv.SerdeResolver); additionalForgeables.AddAll(serdeForgeables); } } // Build data window views that occur next to each other ("d d", "d d d") into a single intersection or union // Calls attach on the contained-views. var forgesChainWIntersections = BuildIntersectionsUnions( forgesChain, args, viewForgeEnv, parentEventType); // Verify group window use VerifyGroups(forgesChainWIntersections); // Build group window views that may contain data windows and also intersection and union // Calls attach on the contained-views. var forgesGrouped = BuildGrouped(forgesChainWIntersections, args, viewForgeEnv, parentEventType); var eventType = parentEventType; for (var i = 0; i < forgesGrouped.Count; i++) { ViewFactoryForge factoryToAttach = forgesGrouped[i]; try { factoryToAttach.Attach(eventType, args.StreamNum, viewForgeEnv); eventType = factoryToAttach.EventType; } catch (ViewParameterException ex) { throw new ViewProcessingException(ex.Message, ex); } } // get multikey forges var multikeyForges = GetMultikeyForges(forgesGrouped, viewForgeEnv); additionalForgeables.AddAll(multikeyForges); return new ViewFactoryForgeDesc(forgesGrouped, additionalForgeables); } catch (ViewProcessingException ex) { throw new ExprValidationException("Failed to validate data window declaration: " + ex.Message, ex); } }