Пример #1
0
 public CalendarForgeRound(
     DateTimeFieldEnum field,
     DateTimeMethodEnum method)
 {
     this.field = field;
     this.method = method;
 }
Пример #2
0
 public FilterExprAnalyzerAffector GetFilterDesc(
     EventType[] typesPerStream,
     DateTimeMethodEnum currentMethod,
     IList<ExprNode> currentParameters,
     ExprDotNodeFilterAnalyzerInput inputDesc)
 {
     return null;
 }
Пример #3
0
 public DatetimeMethodDesc(
     DateTimeMethodEnum datetimeMethod,
     DatetimeMethodProviderForgeFactory forgeFactory,
     DotMethodFP[] parameters)
 {
     _datetimeMethod = datetimeMethod;
     _forgeFactory   = forgeFactory;
     _parameters     = parameters;
 }
Пример #4
0
        /// <summary>
        ///     Obtain information used by filter analyzer to handle this dot-method invocation as part of query planning/indexing.
        /// </summary>
        /// <param name="typesPerStream">event types</param>
        /// <param name="currentMethod">current method</param>
        /// <param name="currentParameters">current params</param>
        /// <param name="inputDesc">descriptor of what the input to this interval method is</param>
        public FilterExprAnalyzerDTIntervalAffector GetFilterDesc(
            EventType[] typesPerStream,
            DateTimeMethodEnum currentMethod,
            IList<ExprNode> currentParameters,
            ExprDotNodeFilterAnalyzerInput inputDesc)
        {
            // with intervals is not currently query planned
            if (currentParameters.Count > 1) {
                return null;
            }

            // Get input (target)
            int targetStreamNum;
            string targetPropertyStart;
            string targetPropertyEnd;
            if (inputDesc is ExprDotNodeFilterAnalyzerInputStream) {
                var targetStream = (ExprDotNodeFilterAnalyzerInputStream) inputDesc;
                targetStreamNum = targetStream.StreamNum;
                var targetType = typesPerStream[targetStreamNum];
                targetPropertyStart = targetType.StartTimestampPropertyName;
                targetPropertyEnd = targetType.EndTimestampPropertyName != null
                    ? targetType.EndTimestampPropertyName
                    : targetPropertyStart;
            }
            else if (inputDesc is ExprDotNodeFilterAnalyzerInputProp) {
                var targetStream = (ExprDotNodeFilterAnalyzerInputProp) inputDesc;
                targetStreamNum = targetStream.StreamNum;
                targetPropertyStart = targetStream.PropertyName;
                targetPropertyEnd = targetStream.PropertyName;
            }
            else {
                return null;
            }

            // check parameter info
            if (parameterPropertyStart == null) {
                return null;
            }

            return new FilterExprAnalyzerDTIntervalAffector(
                currentMethod,
                typesPerStream,
                targetStreamNum,
                targetPropertyStart,
                targetPropertyEnd,
                parameterStreamNum,
                parameterPropertyStart,
                parameterPropertyEnd);
        }
Пример #5
0
 public IntervalForge GetForge(
     StreamTypeService streamTypeService,
     DateTimeMethodEnum method,
     string methodNameUsed,
     IList<ExprNode> parameters,
     TimeAbacus timeAbacus,
     TableCompileTimeResolver tableCompileTimeResolver)
 {
     return new IntervalForgeImpl(
         method,
         methodNameUsed,
         streamTypeService,
         parameters,
         timeAbacus,
         tableCompileTimeResolver);
 }
Пример #6
0
        public CalendarForge GetOp(
            DateTimeMethodEnum method,
            string methodNameUsed,
            IList<ExprNode> parameters,
            ExprForge[] forges)
        {
            if (method == DateTimeMethodEnum.WITHTIME) {
                return new CalendarWithTimeForge(forges[0], forges[1], forges[2], forges[3]);
            }

            if (method == DateTimeMethodEnum.WITHDATE) {
                return new CalendarWithDateForge(forges[0], forges[1], forges[2]);
            }

            if (method == DateTimeMethodEnum.PLUS || method == DateTimeMethodEnum.MINUS) {
                return new CalendarPlusMinusForge(forges[0], method == DateTimeMethodEnum.MINUS ? -1 : 1);
            }

            if (method == DateTimeMethodEnum.WITHMAX ||
                method == DateTimeMethodEnum.WITHMIN ||
                method == DateTimeMethodEnum.ROUNDCEILING ||
                method == DateTimeMethodEnum.ROUNDFLOOR ||
                method == DateTimeMethodEnum.ROUNDHALF ||
                method == DateTimeMethodEnum.SET) {
                DateTimeFieldEnum fieldNum = CalendarOpUtil.GetEnum(methodNameUsed, parameters[0]);
                if (method == DateTimeMethodEnum.WITHMIN) {
                    return new CalendarWithMinForge(fieldNum);
                }

                if (method == DateTimeMethodEnum.ROUNDCEILING ||
                    method == DateTimeMethodEnum.ROUNDFLOOR ||
                    method == DateTimeMethodEnum.ROUNDHALF) {
                    return new CalendarForgeRound(fieldNum, method);
                }

                if (method == DateTimeMethodEnum.SET) {
                    return new CalendarSetForge(fieldNum, forges[1]);
                }

                return new CalendarWithMaxForge(fieldNum);
            }

            throw new IllegalStateException("Unrecognized calendar-op code '" + method + "'");
        }
Пример #7
0
 public FilterExprAnalyzerDTIntervalAffector(
     DateTimeMethodEnum currentMethod,
     EventType[] typesPerStream,
     int targetStreamNum,
     string targetStartProp,
     string targetEndProp,
     int parameterStreamNum,
     string parameterStartProp,
     string parameterEndProp)
 {
     this.currentMethod = currentMethod;
     this.typesPerStream = typesPerStream;
     this.targetStreamNum = targetStreamNum;
     this.targetStartProp = targetStartProp;
     this.targetEndProp = targetEndProp;
     this.parameterStreamNum = parameterStreamNum;
     this.parameterStartProp = parameterStartProp;
     this.parameterEndProp = parameterEndProp;
 }
Пример #8
0
        public CalendarForge GetOp(
            DatetimeMethodDesc desc,
            string methodNameUsed,
            IList<ExprNode> parameters,
            ExprForge[] forges)
        {
            DateTimeMethodEnum method = desc.DatetimeMethod;
            switch (method) {
                case DateTimeMethodEnum.WITHTIME:
                    return new CalendarWithTimeForge(forges[0], forges[1], forges[2], forges[3]);

                case DateTimeMethodEnum.WITHDATE:
                    return new CalendarWithDateForge(forges[0], forges[1], forges[2]);

                case DateTimeMethodEnum.PLUS:
                case DateTimeMethodEnum.MINUS:
                    return new CalendarPlusMinusForge(forges[0], method == DateTimeMethodEnum.MINUS ? -1 : 1);

                case DateTimeMethodEnum.WITHMAX:
                case DateTimeMethodEnum.WITHMIN:
                case DateTimeMethodEnum.ROUNDCEILING:
                case DateTimeMethodEnum.ROUNDFLOOR:
                case DateTimeMethodEnum.ROUNDHALF:
                case DateTimeMethodEnum.SET: {
                    var fieldNum = CalendarOpUtil.GetEnum(methodNameUsed, parameters[0]);
                    return method switch {
                        DateTimeMethodEnum.WITHMIN => new CalendarWithMinForge(fieldNum),
                        DateTimeMethodEnum.ROUNDCEILING => new CalendarForgeRound(fieldNum, method),
                        DateTimeMethodEnum.ROUNDFLOOR => new CalendarForgeRound(fieldNum, method),
                        DateTimeMethodEnum.ROUNDHALF => new CalendarForgeRound(fieldNum, method),
                        DateTimeMethodEnum.SET => new CalendarSetForge(fieldNum, forges[1]),
                        _ => new CalendarWithMaxForge(fieldNum)
                    };
                }

                default:
                    throw new IllegalStateException("Unrecognized calendar-op code '" + method + "'");
            }
        }
Пример #9
0
        public FilterExprAnalyzerAffector GetFilterDesc(
            EventType[] typesPerStream,
            DateTimeMethodEnum currentMethod,
            IList<ExprNode> currentParameters,
            ExprDotNodeFilterAnalyzerInput inputDesc)
        {
            if (_includeLow == null || _includeHigh == null) {
                return null;
            }

            int targetStreamNum;
            string targetProperty;
            if (inputDesc is ExprDotNodeFilterAnalyzerInputStream) {
                var targetStream = (ExprDotNodeFilterAnalyzerInputStream) inputDesc;
                targetStreamNum = targetStream.StreamNum;
                var targetType = typesPerStream[targetStreamNum];
                targetProperty = targetType.StartTimestampPropertyName;
            }
            else if (inputDesc is ExprDotNodeFilterAnalyzerInputProp) {
                var targetStream = (ExprDotNodeFilterAnalyzerInputProp) inputDesc;
                targetStreamNum = targetStream.StreamNum;
                targetProperty = targetStream.PropertyName;
            }
            else {
                return null;
            }

            return new FilterExprAnalyzerDTBetweenAffector(
                typesPerStream,
                targetStreamNum,
                targetProperty,
                _start,
                _end,
                _includeLow.Value,
                _includeHigh.Value);
        }
Пример #10
0
 public static ForgeFactory GetForgeFactory(this DateTimeMethodEnum value)
 {
     switch (value)
     {
         case DateTimeMethodEnum.WITHTIME:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.WITHDATE:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.PLUS:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.MINUS:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.WITHMAX:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.WITHMIN:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.SET:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.ROUNDCEILING:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.ROUNDFLOOR:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.ROUNDHALF:
             return DatetimeMethodEnumStatics.CALENDAR_FORGE_FACTORY;
         case DateTimeMethodEnum.GET:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.FORMAT:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.TODATETIMEEX:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.TODATETIMEOFFSET:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.TODATETIME:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.TOMILLISEC:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETMINUTEOFHOUR:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETMONTHOFYEAR:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETDAYOFMONTH:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETDAYOFWEEK:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETDAYOFYEAR:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETHOUROFDAY:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETMILLISOFSECOND:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETSECONDOFMINUTE:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETWEEKYEAR:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.GETYEAR:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.BETWEEN:
             return DatetimeMethodEnumStatics.REFORMAT_FORGE_FACTORY;
         case DateTimeMethodEnum.BEFORE:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.AFTER:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.COINCIDES:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.DURING:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.INCLUDES:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.FINISHES:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.FINISHEDBY:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.MEETS:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.METBY:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.OVERLAPS:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.OVERLAPPEDBY:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.STARTS:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         case DateTimeMethodEnum.STARTEDBY:
             return DatetimeMethodEnumStatics.INTERVAL_FORGE_FACTORY;
         default:
             throw new ArgumentOutOfRangeException(nameof(value), value, null);
     }
 }
Пример #11
0
 public static DotMethodFP[] GetFootprints(this DateTimeMethodEnum value)
 {
     switch (value)
     {
         case DateTimeMethodEnum.WITHTIME:
             return DatetimeMethodEnumParams.WITHTIME;
         case DateTimeMethodEnum.WITHDATE:
             return DatetimeMethodEnumParams.WITHDATE;
         case DateTimeMethodEnum.PLUS:
             return DatetimeMethodEnumParams.PLUSMINUS;
         case DateTimeMethodEnum.MINUS:
             return DatetimeMethodEnumParams.PLUSMINUS;
         case DateTimeMethodEnum.WITHMAX:
             return DatetimeMethodEnumParams.CALFIELD;
         case DateTimeMethodEnum.WITHMIN:
             return DatetimeMethodEnumParams.CALFIELD;
         case DateTimeMethodEnum.SET:
             return DatetimeMethodEnumParams.CALFIELD_PLUS_INT;
         case DateTimeMethodEnum.ROUNDCEILING:
             return DatetimeMethodEnumParams.CALFIELD;
         case DateTimeMethodEnum.ROUNDFLOOR:
             return DatetimeMethodEnumParams.CALFIELD;
         case DateTimeMethodEnum.ROUNDHALF:
             return DatetimeMethodEnumParams.CALFIELD;
         case DateTimeMethodEnum.GET:
             return DatetimeMethodEnumParams.CALFIELD;
         case DateTimeMethodEnum.FORMAT:
             return DatetimeMethodEnumParams.FORMAT;
         case DateTimeMethodEnum.TODATETIMEEX:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.TODATETIMEOFFSET:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.TODATETIME:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.TOMILLISEC:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETMINUTEOFHOUR:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETMONTHOFYEAR:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETDAYOFMONTH:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETDAYOFWEEK:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETDAYOFYEAR:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETHOUROFDAY:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETMILLISOFSECOND:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETSECONDOFMINUTE:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETWEEKYEAR:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.GETYEAR:
             return DatetimeMethodEnumParams.NOPARAM;
         case DateTimeMethodEnum.BETWEEN:
             return DatetimeMethodEnumParams.BETWEEN;
         case DateTimeMethodEnum.BEFORE:
             return DatetimeMethodEnumParams.INTERVAL_BEFORE_AFTER;
         case DateTimeMethodEnum.AFTER:
             return DatetimeMethodEnumParams.INTERVAL_BEFORE_AFTER;
         case DateTimeMethodEnum.COINCIDES:
             return DatetimeMethodEnumParams.INTERVAL_COINCIDES;
         case DateTimeMethodEnum.DURING:
             return DatetimeMethodEnumParams.INTERVAL_DURING_INCLUDES;
         case DateTimeMethodEnum.INCLUDES:
             return DatetimeMethodEnumParams.INTERVAL_DURING_INCLUDES;
         case DateTimeMethodEnum.FINISHES:
             return DatetimeMethodEnumParams.INTERVAL_FINISHES_FINISHEDBY;
         case DateTimeMethodEnum.FINISHEDBY:
             return DatetimeMethodEnumParams.INTERVAL_FINISHES_FINISHEDBY;
         case DateTimeMethodEnum.MEETS:
             return DatetimeMethodEnumParams.INTERVAL_MEETS_METBY;
         case DateTimeMethodEnum.METBY:
             return DatetimeMethodEnumParams.INTERVAL_MEETS_METBY;
         case DateTimeMethodEnum.OVERLAPS:
             return DatetimeMethodEnumParams.INTERVAL_DURING_OVERLAPS_OVERLAPBY;
         case DateTimeMethodEnum.OVERLAPPEDBY:
             return DatetimeMethodEnumParams.INTERVAL_DURING_OVERLAPS_OVERLAPBY;
         case DateTimeMethodEnum.STARTS:
             return DatetimeMethodEnumParams.INTERVAL_STARTS_STARTEDBY;
         case DateTimeMethodEnum.STARTEDBY:
             return DatetimeMethodEnumParams.INTERVAL_STARTS_STARTEDBY;
         default:
             throw new ArgumentOutOfRangeException(nameof(value), value, null);
     }
 }
Пример #12
0
 public static string GetNameCamel(this DateTimeMethodEnum value)
 {
     switch (value)
     {
         case DateTimeMethodEnum.WITHTIME:
             return "withTime";
         case DateTimeMethodEnum.WITHDATE:
             return "withDate";
         case DateTimeMethodEnum.PLUS:
             return "plus";
         case DateTimeMethodEnum.MINUS:
             return "minus";
         case DateTimeMethodEnum.WITHMAX:
             return "withMax";
         case DateTimeMethodEnum.WITHMIN:
             return "withMin";
         case DateTimeMethodEnum.SET:
             return "set";
         case DateTimeMethodEnum.ROUNDCEILING:
             return "roundCeiling";
         case DateTimeMethodEnum.ROUNDFLOOR:
             return "roundFloor";
         case DateTimeMethodEnum.ROUNDHALF:
             return "roundHalf";
         case DateTimeMethodEnum.GET:
             return "Get";
         case DateTimeMethodEnum.FORMAT:
             return "format";
         case DateTimeMethodEnum.TODATETIMEEX:
             return "toDateTimeEx";
         case DateTimeMethodEnum.TODATETIMEOFFSET:
             return "toDateTimeOffset";
         case DateTimeMethodEnum.TODATETIME:
             return "toDateTime";
         case DateTimeMethodEnum.TOMILLISEC:
             return "toMillisec";
         case DateTimeMethodEnum.GETMINUTEOFHOUR:
             return "getMinuteOfHour";
         case DateTimeMethodEnum.GETMONTHOFYEAR:
             return "getMonthOfYear";
         case DateTimeMethodEnum.GETDAYOFMONTH:
             return "getDayOfMonth";
         case DateTimeMethodEnum.GETDAYOFWEEK:
             return "getDayOfWeek";
         case DateTimeMethodEnum.GETDAYOFYEAR:
             return "getDayOfYear";
         case DateTimeMethodEnum.GETHOUROFDAY:
             return "getHourOfDay";
         case DateTimeMethodEnum.GETMILLISOFSECOND:
             return "getMillisOfSecond";
         case DateTimeMethodEnum.GETSECONDOFMINUTE:
             return "getSecondOfMinute";
         case DateTimeMethodEnum.GETWEEKYEAR:
             return "getWeekyear";
         case DateTimeMethodEnum.GETYEAR:
             return "getYear";
         case DateTimeMethodEnum.BETWEEN:
             return "between";
         case DateTimeMethodEnum.BEFORE:
             return "before";
         case DateTimeMethodEnum.AFTER:
             return "after";
         case DateTimeMethodEnum.COINCIDES:
             return "coincides";
         case DateTimeMethodEnum.DURING:
             return "during";
         case DateTimeMethodEnum.INCLUDES:
             return "includes";
         case DateTimeMethodEnum.FINISHES:
             return "finishes";
         case DateTimeMethodEnum.FINISHEDBY:
             return "finishedBy";
         case DateTimeMethodEnum.MEETS:
             return "meets";
         case DateTimeMethodEnum.METBY:
             return "metBy";
         case DateTimeMethodEnum.OVERLAPS:
             return "overlaps";
         case DateTimeMethodEnum.OVERLAPPEDBY:
             return "overlappedBy";
         case DateTimeMethodEnum.STARTS:
             return "starts";
         case DateTimeMethodEnum.STARTEDBY:
             return "startedBy";
         default:
             throw new ArgumentOutOfRangeException(nameof(value), value, null);
     }
 }
Пример #13
0
        public static IntervalComputerForge Make(
            DateTimeMethodEnum method,
            IList<ExprNode> expressions,
            TimeAbacus timeAbacus)
        {
            var parameters = GetParameters(expressions, timeAbacus);

            if (method == DateTimeMethodEnum.BEFORE) {
                if (parameters.Length == 0) {
                    return new IntervalComputerBeforeNoParamForge();
                }

                var pair =
                    IntervalStartEndParameterPairForge.FromParamsWithLongMaxEnd(parameters);
                if (pair.IsConstant) {
                    return new IntervalComputerConstantBefore(pair);
                }

                return new IntervalComputerBeforeWithDeltaExprForge(pair);
            }

            if (method == DateTimeMethodEnum.AFTER) {
                if (parameters.Length == 0) {
                    return new IntervalComputerAfterNoParam();
                }

                var pair =
                    IntervalStartEndParameterPairForge.FromParamsWithLongMaxEnd(parameters);
                if (pair.IsConstant) {
                    return new IntervalComputerConstantAfter(pair);
                }

                return new IntervalComputerAfterWithDeltaExprForge(pair);
            }

            if (method == DateTimeMethodEnum.COINCIDES) {
                if (parameters.Length == 0) {
                    return new IntervalComputerCoincidesNoParam();
                }

                var pair =
                    IntervalStartEndParameterPairForge.FromParamsWithSameEnd(parameters);
                if (pair.IsConstant) {
                    return new IntervalComputerConstantCoincides(pair);
                }

                return new IntervalComputerCoincidesWithDeltaExprForge(pair);
            }

            if (method == DateTimeMethodEnum.DURING || method == DateTimeMethodEnum.INCLUDES) {
                if (parameters.Length == 0) {
                    if (method == DateTimeMethodEnum.DURING) {
                        return new IntervalComputerDuringNoParam();
                    }

                    return new IntervalComputerIncludesNoParam();
                }

                var pair =
                    IntervalStartEndParameterPairForge.FromParamsWithSameEnd(parameters);
                if (parameters.Length == 1) {
                    return new IntervalComputerDuringAndIncludesThresholdForge(
                        method == DateTimeMethodEnum.DURING,
                        pair.Start.Forge);
                }

                if (parameters.Length == 2) {
                    return new IntervalComputerDuringAndIncludesMinMax(
                        method == DateTimeMethodEnum.DURING,
                        pair.Start.Forge,
                        pair.End.Forge);
                }

                return new IntervalComputerDuringMinMaxStartEndForge(
                    method == DateTimeMethodEnum.DURING,
                    GetEvaluators(expressions, timeAbacus));
            }

            if (method == DateTimeMethodEnum.FINISHES) {
                if (parameters.Length == 0) {
                    return new IntervalComputerFinishesNoParam();
                }

                ValidateConstantThreshold("finishes", parameters[0]);
                return new IntervalComputerFinishesThresholdForge(parameters[0].Forge);
            }

            if (method == DateTimeMethodEnum.FINISHEDBY) {
                if (parameters.Length == 0) {
                    return new IntervalComputerFinishedByNoParam();
                }

                ValidateConstantThreshold("finishedby", parameters[0]);
                return new IntervalComputerFinishedByThresholdForge(parameters[0].Forge);
            }

            if (method == DateTimeMethodEnum.MEETS) {
                if (parameters.Length == 0) {
                    return new IntervalComputerMeetsNoParam();
                }

                ValidateConstantThreshold("meets", parameters[0]);
                return new IntervalComputerMeetsThresholdForge(parameters[0].Forge);
            }

            if (method == DateTimeMethodEnum.METBY) {
                if (parameters.Length == 0) {
                    return new IntervalComputerMetByNoParam();
                }

                ValidateConstantThreshold("metBy", parameters[0]);
                return new IntervalComputerMetByThresholdForge(parameters[0].Forge);
            }

            if (method == DateTimeMethodEnum.OVERLAPS || method == DateTimeMethodEnum.OVERLAPPEDBY) {
                if (parameters.Length == 0) {
                    if (method == DateTimeMethodEnum.OVERLAPS) {
                        return new IntervalComputerOverlapsNoParam();
                    }

                    return new IntervalComputerOverlappedByNoParam();
                }

                if (parameters.Length == 1) {
                    return new IntervalComputerOverlapsAndByThreshold(
                        method == DateTimeMethodEnum.OVERLAPS,
                        parameters[0].Forge);
                }

                return new IntervalComputerOverlapsAndByMinMaxForge(
                    method == DateTimeMethodEnum.OVERLAPS,
                    parameters[0].Forge,
                    parameters[1].Forge);
            }

            if (method == DateTimeMethodEnum.STARTS) {
                if (parameters.Length == 0) {
                    return new IntervalComputerStartsNoParam();
                }

                ValidateConstantThreshold("starts", parameters[0]);
                return new IntervalComputerStartsThresholdForge(parameters[0].Forge);
            }

            if (method == DateTimeMethodEnum.STARTEDBY) {
                if (parameters.Length == 0) {
                    return new IntervalComputerStartedByNoParam();
                }

                ValidateConstantThreshold("startedBy", parameters[0]);
                return new IntervalComputerStartedByThresholdForge(parameters[0].Forge);
            }

            throw new ArgumentException("Unknown datetime method '" + method + "'");
        }
Пример #14
0
        public IntervalForgeImpl(
            DateTimeMethodEnum method,
            string methodNameUse,
            StreamTypeService streamTypeService,
            IList<ExprNode> expressions,
            TimeAbacus timeAbacus,
            TableCompileTimeResolver tableCompileTimeResolver)
        {
            ExprForge forgeEndTimestamp = null;
            Type timestampType;

            if (expressions[0] is ExprStreamUnderlyingNode) {
                var und = (ExprStreamUnderlyingNode) expressions[0];
                parameterStreamNum = und.StreamId;
                var type = streamTypeService.EventTypes[parameterStreamNum];
                parameterPropertyStart = type.StartTimestampPropertyName;
                if (parameterPropertyStart == null) {
                    throw new ExprValidationException(
                        "For date-time method '" +
                        methodNameUse +
                        "' the first parameter is event type '" +
                        type.Name +
                        "', however no timestamp property has been defined for this event type");
                }

                timestampType = type.GetPropertyType(parameterPropertyStart);
                var getter = ((EventTypeSPI) type).GetGetterSPI(parameterPropertyStart);
                var getterReturnTypeBoxed = type.GetPropertyType(parameterPropertyStart).GetBoxedType();
                ForgeTimestamp = new ExprEvaluatorStreamDTProp(parameterStreamNum, getter, getterReturnTypeBoxed);

                if (type.EndTimestampPropertyName != null) {
                    parameterPropertyEnd = type.EndTimestampPropertyName;
                    var getterEndTimestamp =
                        ((EventTypeSPI) type).GetGetterSPI(type.EndTimestampPropertyName);
                    forgeEndTimestamp = new ExprEvaluatorStreamDTProp(
                        parameterStreamNum,
                        getterEndTimestamp,
                        getterReturnTypeBoxed);
                }
                else {
                    parameterPropertyEnd = parameterPropertyStart;
                }
            }
            else {
                ForgeTimestamp = expressions[0].Forge;
                timestampType = ForgeTimestamp.EvaluationType;

                string unresolvedPropertyName = null;
                if (expressions[0] is ExprIdentNode) {
                    var identNode = (ExprIdentNode) expressions[0];
                    parameterStreamNum = identNode.StreamId;
                    parameterPropertyStart = identNode.ResolvedPropertyName;
                    parameterPropertyEnd = parameterPropertyStart;
                    unresolvedPropertyName = identNode.UnresolvedPropertyName;
                }

                if (!TypeHelper.IsDateTime(ForgeTimestamp.EvaluationType)) {
                    // ident node may represent a fragment
                    if (unresolvedPropertyName != null) {
                        var propertyDesc = ExprIdentNodeUtil.GetTypeFromStream(
                            streamTypeService,
                            unresolvedPropertyName,
                            false,
                            true,
                            tableCompileTimeResolver);
                        if (propertyDesc.First.FragmentEventType != null) {
                            var type = propertyDesc.First.FragmentEventType.FragmentType;
                            parameterPropertyStart = type.StartTimestampPropertyName;
                            if (parameterPropertyStart == null) {
                                throw new ExprValidationException(
                                    "For date-time method '" +
                                    methodNameUse +
                                    "' the first parameter is event type '" +
                                    type.Name +
                                    "', however no timestamp property has been defined for this event type");
                            }

                            timestampType = type.GetPropertyType(parameterPropertyStart);
                            var getterFragment =
                                ((EventTypeSPI) streamTypeService.EventTypes[parameterStreamNum]).GetGetterSPI(
                                    unresolvedPropertyName);
                            var getterStartTimestamp =
                                ((EventTypeSPI) type).GetGetterSPI(parameterPropertyStart);
                            ForgeTimestamp = new ExprEvaluatorStreamDTPropFragment(
                                parameterStreamNum,
                                getterFragment,
                                getterStartTimestamp);

                            if (type.EndTimestampPropertyName != null) {
                                parameterPropertyEnd = type.EndTimestampPropertyName;
                                var getterEndTimestamp =
                                    ((EventTypeSPI) type).GetGetterSPI(type.EndTimestampPropertyName);
                                forgeEndTimestamp = new ExprEvaluatorStreamDTPropFragment(
                                    parameterStreamNum,
                                    getterFragment,
                                    getterEndTimestamp);
                            }
                            else {
                                parameterPropertyEnd = parameterPropertyStart;
                            }
                        }
                    }
                    else {
                        throw new ExprValidationException(
                            "For date-time method '" +
                            methodNameUse +
                            "' the first parameter expression returns '" +
                            ForgeTimestamp.EvaluationType +
                            "', however requires a Date, DateTimeEx, Long-type return value or event (with timestamp)");
                    }
                }
            }

            var intervalComputerForge =
                IntervalComputerForgeFactory.Make(method, expressions, timeAbacus);

            // evaluation without end timestamp
            var timestampTypeBoxed = timestampType.GetBoxedType();
            if (forgeEndTimestamp == null) {
                if (TypeHelper.IsSubclassOrImplementsInterface(timestampType, typeof(DateTimeEx))) {
                    IntervalOpForge = new IntervalOpDateTimeExForge(intervalComputerForge);
                }
                else if (timestampTypeBoxed == typeof(long?)) {
                    IntervalOpForge = new IntervalOpForgeLong(intervalComputerForge);
                }
                else if (timestampTypeBoxed == typeof(DateTimeOffset?)) {
                    IntervalOpForge = new IntervalOpDateTimeOffsetForge(intervalComputerForge);
                }
                else if (timestampTypeBoxed == typeof(DateTime?)) {
                    IntervalOpForge = new IntervalOpDateTimeForge(intervalComputerForge);
                }
                else {
                    throw new ArgumentException("Invalid interval first parameter type '" + timestampType + "'");
                }
            }
            else {
                if (TypeHelper.IsSubclassOrImplementsInterface(timestampType, typeof(DateTimeEx))) {
                    IntervalOpForge = new IntervalOpDateTimeExWithEndForge(intervalComputerForge, forgeEndTimestamp);
                }
                else if (timestampTypeBoxed == typeof(long?)) {
                    IntervalOpForge = new IntervalOpLongWithEndForge(intervalComputerForge, forgeEndTimestamp);
                }
                else if (timestampTypeBoxed == typeof(DateTimeOffset?)) {
                    IntervalOpForge = new IntervalOpDateTimeOffsetWithEndForge(
                        intervalComputerForge,
                        forgeEndTimestamp);
                }
                else if (timestampTypeBoxed == typeof(DateTime?)) {
                    IntervalOpForge = new IntervalOpDateTimeWithEndForge(intervalComputerForge, forgeEndTimestamp);
                }
                else {
                    throw new ArgumentException("Invalid interval first parameter type '" + timestampType + "'");
                }
            }
        }
Пример #15
0
        public static ExprDotDTMethodDesc ValidateMake(
            StreamTypeService streamTypeService,
            Deque<ExprChainedSpec> chainSpecStack,
            DateTimeMethodEnum dtMethod,
            string dtMethodName,
            EPType inputType,
            IList<ExprNode> parameters,
            ExprDotNodeFilterAnalyzerInput inputDesc,
            TimeAbacus timeAbacus,
            ExprEvaluatorContext exprEvaluatorContext,
            TableCompileTimeResolver tableCompileTimeResolver)
        {
            // verify input
            var message = "Date-time enumeration method '" +
                          dtMethodName +
                          "' requires either a DateTimeEx, DateTimeOffset, DateTime, or long value as input or events of an event type that declares a timestamp property";
            if (inputType is EventEPType) {
                if (((EventEPType) inputType).EventType.StartTimestampPropertyName == null) {
                    throw new ExprValidationException(message);
                }
            }
            else {
                if (!(inputType is ClassEPType || inputType is NullEPType)) {
                    throw new ExprValidationException(
                        message + " but received " + inputType.ToTypeDescriptive());
                }

                if (inputType is ClassEPType) {
                    var classEPType = (ClassEPType) inputType;
                    if (!TypeHelper.IsDateTime(classEPType.Clazz)) {
                        throw new ExprValidationException(
                            message + " but received " + classEPType.Clazz.CleanName());
                    }
                }
            }

            IList<CalendarForge> calendarForges = new List<CalendarForge>();
            ReformatForge reformatForge = null;
            IntervalForge intervalForge = null;
            var currentMethod = dtMethod;
            var currentParameters = parameters;
            var currentMethodName = dtMethodName;

            // drain all calendar op
            FilterExprAnalyzerAffector filterAnalyzerDesc = null;
            while (true) {
                // handle the first one only if its a calendar op
                var forges = GetForges(currentParameters);
                var opFactory = currentMethod.GetForgeFactory();

                // compile parameter abstract for validation against available footprints
                DotMethodFPProvided footprintProvided = DotMethodUtil.GetProvidedFootprint(currentParameters);

                // validate parameters
                DotMethodUtil.ValidateParametersDetermineFootprint(
                    currentMethod.GetFootprints(),
                    DotMethodTypeEnum.DATETIME,
                    currentMethodName,
                    footprintProvided,
                    DotMethodInputTypeMatcherImpl.DEFAULT_ALL);

                if (opFactory is CalendarForgeFactory) {
                    var calendarForge = ((CalendarForgeFactory) currentMethod.GetForgeFactory()).GetOp(
                        currentMethod,
                        currentMethodName,
                        currentParameters,
                        forges);
                    calendarForges.Add(calendarForge);
                }
                else if (opFactory is ReformatForgeFactory) {
                    reformatForge = ((ReformatForgeFactory) opFactory).GetForge(
                        inputType,
                        timeAbacus,
                        currentMethod,
                        currentMethodName,
                        currentParameters,
                        exprEvaluatorContext);

                    // compile filter analyzer information if there are no calendar op in the chain
                    if (calendarForges.IsEmpty()) {
                        filterAnalyzerDesc = reformatForge.GetFilterDesc(
                            streamTypeService.EventTypes,
                            currentMethod,
                            currentParameters,
                            inputDesc);
                    }
                    else {
                        filterAnalyzerDesc = null;
                    }
                }
                else if (opFactory is IntervalForgeFactory) {
                    intervalForge = ((IntervalForgeFactory) opFactory).GetForge(
                        streamTypeService,
                        currentMethod,
                        currentMethodName,
                        currentParameters,
                        timeAbacus,
                        tableCompileTimeResolver);

                    // compile filter analyzer information if there are no calendar op in the chain
                    if (calendarForges.IsEmpty()) {
                        filterAnalyzerDesc = intervalForge.GetFilterDesc(
                            streamTypeService.EventTypes,
                            currentMethod,
                            currentParameters,
                            inputDesc);
                    }
                    else {
                        filterAnalyzerDesc = null;
                    }
                }
                else {
                    throw new IllegalStateException("Invalid op factory class " + opFactory);
                }

                // see if there is more
                if (chainSpecStack.IsEmpty() || !DatetimeMethodEnumHelper.IsDateTimeMethod(chainSpecStack.First.Name)) {
                    break;
                }

                // pull next
                var next = chainSpecStack.RemoveFirst();
                currentMethod = DatetimeMethodEnumHelper.FromName(next.Name);
                currentParameters = next.Parameters;
                currentMethodName = next.Name;

                if (reformatForge != null || intervalForge != null) {
                    throw new ExprValidationException("Invalid input for date-time method '" + next.Name + "'");
                }
            }

            ExprDotForge dotForge;
            EPType returnType;

            dotForge = new ExprDotDTForge(
                calendarForges,
                timeAbacus,
                reformatForge,
                intervalForge,
                inputType.GetClassSingleValued(),
                inputType.GetEventTypeSingleValued());
            returnType = dotForge.TypeInfo;
            return new ExprDotDTMethodDesc(dotForge, returnType, filterAnalyzerDesc);
        }
Пример #16
0
        public ReformatForge GetForge(
            EPType inputType,
            TimeAbacus timeAbacus,
            DateTimeMethodEnum method,
            string methodNameUsed,
            IList<ExprNode> parameters,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            if (method == DateTimeMethodEnum.GET) {
                var fieldNum = CalendarOpUtil.GetEnum(methodNameUsed, parameters[0]);
                return new ReformatGetFieldForge(fieldNum, timeAbacus);
            }

            if (method == DateTimeMethodEnum.FORMAT) {
                if (parameters.IsEmpty()) {
                    return FORMAT_STRING;
                }

                var formatterType = CalendarOpUtil.ValidateGetFormatterType(inputType, methodNameUsed, parameters[0]);
                return new ReformatFormatForge(formatterType, parameters[0].Forge, timeAbacus);
            }

            if (method == DateTimeMethodEnum.TODATETIMEEX) {
                return new ReformatToDateTimeExForge(timeAbacus);
            }

            if (method == DateTimeMethodEnum.TODATETIMEOFFSET) {
                return new ReformatToDateTimeOffsetForge(timeAbacus);
            }

            if (method == DateTimeMethodEnum.TODATETIME) {
                return new ReformatToDateTimeForge(timeAbacus);
            }

            if (method == DateTimeMethodEnum.TOMILLISEC) {
                return new ReformatToMillisecForge();
            }

            if (method == DateTimeMethodEnum.GETDAYOFMONTH) {
                return new ReformatEvalForge(DateTimeExEvalStatics.DAY_OF_MONTH, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETMINUTEOFHOUR) {
                return new ReformatEvalForge(DateTimeExEvalStatics.MINUTE_OF_HOUR, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETMONTHOFYEAR) {
                return new ReformatEvalForge(DateTimeExEvalStatics.MONTH_OF_YEAR, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETDAYOFWEEK) {
                return new ReformatEvalForge(DateTimeExEvalStatics.DAY_OF_WEEK, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETDAYOFYEAR) {
                return new ReformatEvalForge(DateTimeExEvalStatics.DAY_OF_YEAR, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETHOUROFDAY) {
                return new ReformatEvalForge(DateTimeExEvalStatics.HOUR_OF_DAY, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETMILLISOFSECOND) {
                return new ReformatEvalForge(DateTimeExEvalStatics.MILLIS_OF_SECOND, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETSECONDOFMINUTE) {
                return new ReformatEvalForge(DateTimeExEvalStatics.SECOND_OF_MINUTE, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETWEEKYEAR) {
                return new ReformatEvalForge(DateTimeExEvalStatics.WEEKYEAR, timeAbacus);
            }

            if (method == DateTimeMethodEnum.GETYEAR) {
                return new ReformatEvalForge(DateTimeExEvalStatics.YEAR, timeAbacus);
            }

            if (method == DateTimeMethodEnum.BETWEEN) {
                if (ExprNodeUtilityQuery.IsAllConstants(parameters)) {
                    return new ReformatBetweenConstantParamsForge(parameters);
                }

                return new ReformatBetweenNonConstantParamsForge(parameters);
            }

            throw new IllegalStateException("Unrecognized date-time method code '" + method + "'");
        }