Esempio n. 1
0
        public ExprDotNodeForgeStream(
            ExprDotNodeImpl parent,
            FilterExprAnalyzerAffector filterExprAnalyzerAffector,
            int streamNumber,
            EventType eventType,
            ExprDotForge[] evaluators,
            bool method)
        {
            this.parent = parent;
            FilterExprAnalyzerAffector = filterExprAnalyzerAffector;
            StreamNumber = streamNumber;
            EventType = eventType;
            Evaluators = evaluators;
            this.method = method;

            var last = evaluators[evaluators.Length - 1];
            if (!method) {
                if (last.TypeInfo is ClassMultiValuedEPType) {
                    EvaluationType = EPTypeHelper.GetClassMultiValuedContainer(last.TypeInfo).GetBoxedType();
                }
                else {
                    EvaluationType = EPTypeHelper.GetClassSingleValued(last.TypeInfo).GetBoxedType();
                }
            }
            else {
                EvaluationType = EPTypeHelper.GetNormalizedClass(last.TypeInfo).GetBoxedType();
            }
        }
Esempio n. 2
0
        public AggregationTableReadDesc ValidateAggregationTableRead(
            ExprValidationContext validationContext,
            TableMetadataColumnAggregation tableAccessColumn,
            TableMetaData table)
        {
            // child node validation
            ExprNodeUtilityValidate.GetValidatedSubtree(ExprNodeOrigin.AGGPARAM, ChildNodes, validationContext);

            // portable validation
            var validation = tableAccessColumn.AggregationPortableValidation;
            if (!(validation is AggregationPortableValidationPluginMultiFunc)) {
                throw new ExprValidationException("Invalid aggregation column type");
            }

            // obtain handler
            var ctx = new AggregationMultiFunctionValidationContext(
                functionName,
                validationContext.StreamTypeService.EventTypes,
                positionalParams,
                validationContext.StatementName,
                validationContext,
                config,
                null,
                ChildNodes,
                optionalFilter);
            var handler = aggregationMultiFunctionForge.ValidateGetHandler(ctx);

            // set of reader
            var epType = handler.ReturnType;
            Type returnType = EPTypeHelper.GetNormalizedClass(epType);
            var forge = new AggregationTableAccessAggReaderForgePlugIn(
                returnType,
                (AggregationMultiFunctionTableReaderModeManaged) handler.TableReaderMode);
            EventType eventTypeCollection = EPTypeHelper.OptionalIsEventTypeColl(epType);
            EventType eventTypeSingle = EPTypeHelper.OptionalIsEventTypeSingle(epType);
            Type componentTypeCollection = EPTypeHelper.OptionalIsComponentTypeColl(epType);
            return new AggregationTableReadDesc(forge, eventTypeCollection, componentTypeCollection, eventTypeSingle);
        }
Esempio n. 3
0
        public DTLocalForge GetForge(
            IList<CalendarForge> calendarForges,
            TimeAbacus timeAbacus,
            Type inputType,
            EventType inputEventType,
            ReformatForge reformatForge,
            IntervalForge intervalForge)
        {
            if (inputEventType == null) {
                var inputTypeBoxed = inputType.GetBoxedType();
                if (reformatForge != null) {
                    if (TypeHelper.IsSubclassOrImplementsInterface(inputType, typeof(DateTimeEx))) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalDtxReformatForge(reformatForge);
                        }

                        return new DTLocalDtxOpsReformatForge(calendarForges, reformatForge);
                    }

                    if (inputTypeBoxed == typeof(long?)) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalLongReformatForge(reformatForge);
                        }

                        return new DTLocalLongOpsReformatForge(calendarForges, reformatForge, timeAbacus);
                    }

                    if (inputTypeBoxed == typeof(DateTimeOffset?)) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalDtoReformatForge(reformatForge);
                        }

                        return new DTLocalDtoOpsReformatForge(calendarForges, reformatForge);
                    }

                    if (inputTypeBoxed == typeof(DateTime?)) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalDateTimeReformatForge(reformatForge);
                        }

                        return new DTLocalDateTimeOpsReformatForge(calendarForges, reformatForge);
                    }
                }
                else if (intervalForge != null) {
                    if (TypeHelper.IsSubclassOrImplementsInterface(inputType, typeof(DateTimeEx))) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalDtxIntervalForge(intervalForge);
                        }

                        return new DTLocalDtxOpsIntervalForge(calendarForges, intervalForge);
                    }

                    if (inputTypeBoxed == typeof(long?)) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalLongIntervalForge(intervalForge);
                        }

                        return new DTLocalLongOpsIntervalForge(calendarForges, intervalForge, timeAbacus);
                    }

                    if (inputTypeBoxed == typeof(DateTimeOffset?)) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalDtoIntervalForge(intervalForge);
                        }

                        return new DTLocalDtoOpsIntervalForge(calendarForges, intervalForge);
                    }

                    if (inputTypeBoxed == typeof(DateTime?)) {
                        if (calendarForges.IsEmpty()) {
                            return new DTLocalDateTimeIntervalForge(intervalForge);
                        }

                        return new DTLocalDateTimeOpsIntervalForge(calendarForges, intervalForge);
                    }
                }
                else { // only calendar op, nothing else
                    if (TypeHelper.IsSubclassOrImplementsInterface(inputType, typeof(DateTimeEx))) {
                        return new DTLocalDtxOpsDtxForge(calendarForges);
                    }

                    if (inputTypeBoxed == typeof(long?)) {
                        return new DTLocalDtxOpsLongForge(calendarForges, timeAbacus);
                    }

                    if (inputTypeBoxed == typeof(DateTimeOffset?)) {
                        return new DTLocalDtxOpsDtoForge(calendarForges);
                    }

                    if (inputTypeBoxed == typeof(DateTime?)) {
                        return new DTLocalDtxOpsDtzForge(calendarForges);
                    }
                }

                throw new ArgumentException("Invalid input type '" + inputTypeBoxed + "'");
            }

            var getter = ((EventTypeSPI) inputEventType).GetGetterSPI(inputEventType.StartTimestampPropertyName);
            var getterResultType = inputEventType.GetPropertyType(inputEventType.StartTimestampPropertyName);

            if (reformatForge != null) {
                var inner = GetForge(calendarForges, timeAbacus, getterResultType, null, reformatForge, null);
                return new DTLocalBeanReformatForge(getter, getterResultType, inner, reformatForge.ReturnType);
            }

            if (intervalForge == null) { // only calendar op
                var inner = GetForge(calendarForges, timeAbacus, getterResultType, null, null, null);
                return new DTLocalBeanCalOpsForge(
                    getter,
                    getterResultType,
                    inner,
                    EPTypeHelper.GetNormalizedClass(TypeInfo));
            }

            // have interval op but no end timestamp
            if (inputEventType.EndTimestampPropertyName == null) {
                var inner = GetForge(calendarForges, timeAbacus, getterResultType, null, null, intervalForge);
                return new DTLocalBeanIntervalNoEndTSForge(
                    getter,
                    getterResultType,
                    inner,
                    EPTypeHelper.GetNormalizedClass(TypeInfo));
            }

            // interval op and have end timestamp
            var getterEndTimestamp =
                ((EventTypeSPI) inputEventType).GetGetterSPI(inputEventType.EndTimestampPropertyName);
            var getterEndType = inputEventType.GetPropertyType(inputEventType.EndTimestampPropertyName);
            var innerX = (DTLocalForgeIntervalComp) GetForge(
                calendarForges,
                timeAbacus,
                getterResultType,
                null,
                null,
                intervalForge);
            return new DTLocalBeanIntervalWithEndForge(
                getter,
                getterResultType,
                getterEndTimestamp,
                getterEndType,
                innerX);
        }