// Identify a sequence of data windows and replace with an intersection or union private static IList<ViewFactoryForge> BuildIntersectionsUnions( IList<ViewFactoryForge> forges, ViewFactoryForgeArgs args, ViewForgeEnv viewForgeEnv, EventType parentEventType) { IList<ViewFactoryForge> result = new List<ViewFactoryForge>(forges.Count); IList<ViewFactoryForge> dataWindows = new List<ViewFactoryForge>(2); foreach (var forge in forges) { if (forge is DataWindowViewForge) { dataWindows.Add(forge); } else { if (!dataWindows.IsEmpty()) { if (dataWindows.Count == 1) { result.AddAll(dataWindows); } else { var intersectUnion = MakeIntersectOrUnion(dataWindows, args, viewForgeEnv, parentEventType); result.Add(intersectUnion); } dataWindows.Clear(); } result.Add(forge); } } if (!dataWindows.IsEmpty()) { if (dataWindows.Count == 1) { result.AddAll(dataWindows); } else { var intersectUnion = MakeIntersectOrUnion(dataWindows, args, viewForgeEnv, parentEventType); result.Add(intersectUnion); } } return result; }
private static ViewFactoryForge MakeIntersectOrUnion( IList<ViewFactoryForge> dataWindows, ViewFactoryForgeArgs args, ViewForgeEnv viewForgeEnv, EventType parentEventType) { foreach (var forge in dataWindows) { try { forge.Attach(parentEventType, args.StreamNum, viewForgeEnv); } catch (ViewParameterException ex) { throw new ViewProcessingException(ex.Message, ex); } } if (args.Options.IsRetainUnion) { return new UnionViewFactoryForge(new List<ViewFactoryForge>(dataWindows)); } return new IntersectViewFactoryForge(new List<ViewFactoryForge>(dataWindows)); }
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); } }