示例#1
0
        // 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;
        }
示例#2
0
        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));
        }
示例#3
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);
            }
        }