private static IList<ViewFactoryForge> InstantiateFactories( IList<ViewSpec> viewSpecList, ViewFactoryForgeArgs args, ViewForgeEnv viewForgeEnv) { IList<ViewFactoryForge> forges = new List<ViewFactoryForge>(); foreach (var spec in viewSpecList) { // Create the new view factory ViewFactoryForge viewFactoryForge = args.ViewResolutionService.Create( spec.ObjectNamespace, spec.ObjectName, args.OptionalCreateNamedWindowName); forges.Add(viewFactoryForge); // Set view factory parameters try { viewFactoryForge.SetViewParameters( spec.ObjectParameters, viewForgeEnv, args.StreamNum); } catch (ViewParameterException e) { throw new ViewProcessingException( "Error in view '" + spec.ObjectName + "', " + e.Message, e); } } return forges; }
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; }
// 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); } }
public ViewForgeEnv(ViewFactoryForgeArgs args) { this.args = args; }