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; }
public IntersectViewFactoryForge(IList<ViewFactoryForge> intersected) { this.intersected = intersected; if (intersected.IsEmpty()) { throw new IllegalStateException("Empty intersected forges"); } int batchCount = 0; for (int i = 0; i < intersected.Count; i++) { ViewFactoryForge forge = intersected[i]; hasAsymetric |= forge is AsymetricDataWindowViewForge; if (forge is DataWindowBatchingViewForge) { batchCount++; batchViewIndex = i; } } if (batchCount > 1) { throw new ViewProcessingException("Cannot combined multiple batch data windows into an intersection"); } }
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 void Visit(ViewFactoryForge forge) => ProcVisit.Invoke(forge);
public void Visit(ViewFactoryForge forge) { if (forge is ScheduleHandleCallbackProvider) { providers.Add((ScheduleHandleCallbackProvider) forge); } }