示例#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;
        }
示例#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;
        }
示例#3
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;
        }
示例#4
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));
        }
示例#5
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);
            }
        }
示例#6
0
 public ViewForgeEnv(ViewFactoryForgeArgs args)
 {
     this.args = args;
 }