Example #1
0
        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;
        }
Example #2
0
        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");
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
 public void Visit(ViewFactoryForge forge) => ProcVisit.Invoke(forge);
Example #6
0
 public void Visit(ViewFactoryForge forge)
 {
     if (forge is ScheduleHandleCallbackProvider) {
         providers.Add((ScheduleHandleCallbackProvider) forge);
     }
 }