예제 #1
0
        public object Execute(VariableContext context = null)
        {
            var leftVal  = this.Left.Execute(context);
            var rightVal = this.Right.Execute(context);

            if (leftVal is Variable l && rightVal is Variable r)
            {
                if (l.ValueType != r.ValueType)
                {
                    throw new FEELException("The variable type does not match for the arithmetic action");
                }
                switch (l.ValueType)
                {
                case DataTypeEnum.Decimal:
                    return(new Variable(l.NumericVal + r.NumericVal));

                case DataTypeEnum.String:
                    return(new Variable($"{l.StringVal}{r.StringVal}"));

                case DataTypeEnum.Date:
                case DataTypeEnum.DateTime:
                case DataTypeEnum.Time:
                case DataTypeEnum.YearMonthDuration:
                case DataTypeEnum.DayTimeDuration:
                    return(DateAndTimeHelper.Addition(l, r));

                default:
                    throw new FEELException("Failed to perform addition to incorrect FEEL type");
                }
            }

            throw new FEELException("Failed to perform addition due to values not being a variable");
        }
예제 #2
0
        public object Execute(VariableContext context = null)
        {
            var dateExprVar = DateExpression.Execute();

            if (dateExprVar is Variable dateExprOut)
            {
                switch (DateFunction)
                {
                case "date":
                    return(DateAndTimeHelper.DateVal(dateExprOut.StringVal));

                case "date and time":
                    return(DateAndTimeHelper.DateTimeVal(dateExprOut.StringVal));

                case "time":
                    return(DateAndTimeHelper.TimeVal(dateExprOut.StringVal));

                case "duration":
                    return(DateAndTimeHelper.DurationVal(dateExprOut.StringVal));

                default:
                    throw new FEELException($"The following date function {DateFunction} is not supported");
                }
            }

            throw new FEELException($"Failed executing date function {DateFunction}");
        }
예제 #3
0
        public void Evaluate_YearAndMonthDurationFunc(string exprText, string expected)
        {
            Variable variable = ParseAndEval(exprText);

            var expectedVal = DateAndTimeHelper.DurationVal(expected);

            Assert.Equal(expectedVal, variable);
        }
예제 #4
0
        public static Variable MakeVariable(object value, string typeName)
        {
            if (value == null)
            {
                return(new Variable());
            }
            switch (typeName.ToLower())
            {
            case "string":
                return(value.ToString());

            case "number":
            case "decimal":
            case "double":
                return(Decimal.Parse(value.ToString()));

            case "boolean":
                return(bool.Parse(value.ToString()));

            case "date":
                return(DateAndTimeHelper.DateVal(value.ToString()));

            case "dateTime":
            case "datetime":
                return(DateAndTimeHelper.DateTimeVal(value.ToString()));

            case "time":
                return(DateAndTimeHelper.TimeVal(value.ToString()));

            case "yearmonthduration":
            case "daytimeduration":
            case "duration":
                return(DateAndTimeHelper.DurationVal(value.ToString()));

            default:
                throw new NotImplementedException($"The following type: {typeName} is not supported for a variable");
            }
        }
예제 #5
0
        public static Variable MakeVariable(object value, DataTypeEnum typeEnum)
        {
            if (value == null)
            {
                return(new Variable());
            }
            switch (typeEnum)
            {
            case DataTypeEnum.String:
                return(value.ToString());

            case DataTypeEnum.Decimal:
                return(Decimal.Parse(value.ToString()));

            case DataTypeEnum.Boolean:
                return(bool.Parse(value.ToString()));

            case DataTypeEnum.Date:
                return(DateAndTimeHelper.DateVal(value.ToString()));

            case DataTypeEnum.DateTime:
                return(DateAndTimeHelper.DateTimeVal(value.ToString()));

            case DataTypeEnum.Time:
                return(DateAndTimeHelper.TimeVal(value.ToString()));

            case DataTypeEnum.YearMonthDuration:
            case DataTypeEnum.DayTimeDuration:
                return(DateAndTimeHelper.DurationVal(value.ToString()));

            case DataTypeEnum.Null:
                return(new Variable());

            default:
                throw new NotImplementedException($"The following type: {typeEnum} is not supported for a variable");
            }
        }
예제 #6
0
        public async Task Load48HoursWeatherInfo()
        {
            if (IsBusy)
            {
                return;
            }

            IsBusy = true;

            try
            {
                await GeolocationHelper.GetGeolocationInfo(geoModel);

                var result = await HttpConnection.Get48HoursWeatherInfoAsync(geoModel.Lat, geoModel.Lon, "apiKey");

                if (result.Hourly != null)
                {
                    foreach (var item in result.Hourly)
                    {
                        Hourly48ForecastList.Add(new Forecast48HoursModel
                        {
                            Dt                      = DateAndTimeHelper.ConvertToDateAndTime(item.Dt, DateAndTimeHelper.TypeForDateAndTimeFormat.TIME),
                            DateAndTime             = DateAndTimeHelper.ConvertToDateAndTime(item.Dt, DateAndTimeHelper.TypeForDateAndTimeFormat.DATE_AND_TIME_FOR_48FORECAST),
                            Temp                    = Math.Round(item.Temp.Value, 1).ToString(),
                            Icon                    = HttpConnection.GetIconForWeather(item.Weather.First().Icon),
                            WindDeg                 = WindHelper.DegreesToGeogrpahicalDirections(item.WindDeg.Value),
                            GroupName               = DateAndTimeHelper.ConvertToDateAndTime(item.Dt, DateAndTimeHelper.TypeForDateAndTimeFormat.COMMON_DATETIME),
                            ColorOfTemperatureLabel = item.Weather.First().Icon.Contains("n")?"#000000": "#008000",
                            Humidity                = item.Humidity,
                            WindSpeed               = WindHelper.MpsToKmph(item.WindSpeed.Value),
                            Rain                    = string.IsNullOrEmpty(item.Rain) ? "0" : item.Rain,
                            Clouds                  = item.Clouds,
                            Pressure                = item.Pressure,
                            Description             = item.Weather.First().Description,
                            FeelsTemp               = Math.Round(item.FeelsLike.Value, 1).ToString()
                        });
                    }

                    List <string> groupNamesList = new List <string>();

                    foreach (var item in Hourly48ForecastList)
                    {
                        groupNamesList.Add(item.GroupName);
                    }

                    var distinctGroupNamesList = groupNamesList.Distinct().ToList();

                    foreach (var item in distinctGroupNamesList)
                    {
                        GroupedHourly48ForecastList.Add(new GroupingForListClass <string, Forecast48HoursModel>(item, Hourly48ForecastList.Where(x => x.GroupName == item)));
                    }
                }
                else
                {
                    await App.Current.MainPage.DisplayAlert("Błąd", "Coś poszło nie tak.", "OK");
                }
            }

            catch (Exception ex)
            {
                await App.Current.MainPage.DisplayAlert("Błąd", "Coś poszło nie tak.", "OK");
            }
            finally
            {
                IsBusy = false;
            }
        }
예제 #7
0
        public object Execute(VariableContext context = null)
        {
            if (Names.Count == 1)
            {
                var funcVar = VariableContextHelper.RetrieveFunctionInput(context, Names[0], false);
                if (funcVar != null)
                {
                    return(funcVar);
                }

                var outVar = VariableContextHelper.RetrieveInputVariable(context, Names[0], false);
                if (outVar != null)
                {
                    return(outVar);
                }
                outVar = VariableContextHelper.RetrieveGlobalVariable(context, Names[0], false);
                if (outVar != null)
                {
                    return(outVar);
                }

                var decisionVar = DMNDoerHelper.EvaluateDecisionByName(context, Names[0]);
                if (decisionVar != null)
                {
                    //all the values that override is always string variable
                    var overrideVar = VariableContextHelper.RetrieveInputVariable(context, Names[0], false);
                    if (overrideVar != null)
                    {
                        return(VariableHelper.MakeVariable(overrideVar.StringVal, decisionVar.ValueType));
                    }
                    return(decisionVar);
                }

                return(new Variable(Names[0]));
            }

            //Context parent child layers
            var ctxVar = VariableContextHelper.RetrieveInputVariable(context, Names[0], false);

            if (ctxVar == null)
            {
                ctxVar = VariableContextHelper.RetrieveGlobalVariable(context, Names[0], false);
            }

            if (ctxVar == null)
            {
                ctxVar = DMNDoerHelper.EvaluateDecisionByName(context, Names[0]);
                //all the values that override is always string variable
                var overrideVar = VariableContextHelper.RetrieveInputVariable(context, Names[0], false);
                if (overrideVar != null)
                {
                    var overrideTyped = VariableHelper.MakeVariable(overrideVar.StringVal, ctxVar.ValueType);
                    ctxVar = overrideTyped;
                }
            }

            if (ctxVar == null && ctxVar.ValueType != DataTypeEnum.Context)
            {
                throw new FEELException("Failed finding a context variable");
            }

            for (int i = 1; i < Names.Count; i++)
            {
                switch (ctxVar.ValueType)
                {
                case DataTypeEnum.Context:
                    ctxVar = FindContextVariable(Names[i], ctxVar);
                    break;

                case DataTypeEnum.Date:
                    return(DateAndTimeHelper.DatePropEvals(ctxVar, Names[i]));

                case DataTypeEnum.DateTime:
                    return(DateAndTimeHelper.DateTimePropEvals(ctxVar, Names[i]));

                case DataTypeEnum.Time:
                    return(DateAndTimeHelper.TimePropEvals(ctxVar, Names[i]));

                case DataTypeEnum.YearMonthDuration:
                case DataTypeEnum.DayTimeDuration:
                    return(DateAndTimeHelper.DurationPropEvals(ctxVar, Names[i]));

                default:
                    throw new FEELException($"Path expression for {ctxVar.ValueType} is not supported");
                }
            }

            return(ctxVar);
        }
예제 #8
0
        public object Execute(VariableContext context = null)
        {
            var parentVal = Parent.Execute(context);

            if (parentVal is Variable parentVar)
            {
                switch (parentVar.ValueType)
                {
                case DataTypeEnum.Context:
                    parentVar.ContextInputs.ContextDict.TryGetValue(Child, out Variable contextOut);
                    return(contextOut);

                case DataTypeEnum.List:
                    if (parentVar.ListVal.Count == 1)
                    {
                        if (parentVar.ListVal[0].ValueType != DataTypeEnum.Context)
                        {
                            throw new FEELException("List of context types is supported for path expressions");
                        }
                        var ctx = parentVar.ListVal[0].ContextInputs;
                        ctx.ContextDict.TryGetValue(Child, out Variable lCtx);
                        return(lCtx);
                    }
                    if (parentVar.ListVal.Count > 1)
                    {
                        var outList = new List <Variable> ();

                        foreach (var item in parentVar.ListVal)
                        {
                            if (item.ValueType != DataTypeEnum.Context)
                            {
                                throw new FEELException("List of context types is supported for path expressions");
                            }
                            var ctx = item.ContextInputs;
                            ctx.ContextDict.TryGetValue(Child, out Variable lCtx);
                            outList.Add(lCtx);
                        }
                        return(new Variable(outList));
                    }
                    throw new FEELException("Empty list for path expression");

                case DataTypeEnum.Date:
                    return(DateAndTimeHelper.DatePropEvals(parentVar, Child));

                case DataTypeEnum.DateTime:
                    return(DateAndTimeHelper.DateTimePropEvals(parentVar, Child));

                case DataTypeEnum.Time:
                    return(DateAndTimeHelper.TimePropEvals(parentVar, Child));

                case DataTypeEnum.YearMonthDuration:
                case DataTypeEnum.DayTimeDuration:
                    return(DateAndTimeHelper.DurationPropEvals(parentVar, Child));

                default:
                    throw new FEELException($"Path expression for {parentVar.ValueType} is not supported");
                }
            }

            throw new FEELException("Parent source is not a variable type");
        }
예제 #9
0
 public Variable Execute(List <Variable> parameters)
 {
     return(DateAndTimeHelper.YearMonthDurationFunction(parameters));
 }
예제 #10
0
        public Variable Execute(List <Variable> parameters)
        {
            parameters.ExpectedParamCount(1);

            return(DateAndTimeHelper.DurationVal(parameters[0].StringVal));
        }
예제 #11
0
        public async Task LoadActualAndDailyWeatherInfoForSevenDays()
        {
            if (IsBusy)
            {
                return;
            }

            DailyForecastList.Clear();
            IsBusy = true;
            try
            {
                var result = await HttpConnection.GetActualWeatherInfoForLocationAsync(geoModel.Location, "apiKey");

                if (result != null)
                {
                    Location             = result.Name;
                    DescriptionOfWeather = result.Weather.First().Description;
                    DateAndTime          = DateAndTimeHelper.ConvertToDateAndTime(result.Dt, DateAndTimeHelper.TypeForDateAndTimeFormat.COMMON_DATETIME);
                    SunriseTime          = DateAndTimeHelper.ConvertToDateAndTime(result.Sys.Sunrise, DateAndTimeHelper.TypeForDateAndTimeFormat.TIME);
                    SunsetTime           = DateAndTimeHelper.ConvertToDateAndTime(result.Sys.Sunset, DateAndTimeHelper.TypeForDateAndTimeFormat.TIME);
                    Temperature          = Math.Round(result.Main.Temp.Value, 1).ToString();
                    FeelsLikeTemperature = Math.Round(result.Main.FeelsLike.Value, 1).ToString();
                    Humidity             = result.Main.Humidity;
                    WindSpeed            = WindHelper.MpsToKmph(result.Wind.Speed.Value);
                    Pressure             = result.Main.Pressure;
                    Clouds        = result.Clouds.All;
                    WindDirection = WindHelper.DegreesToGeogrpahicalDirections(result.Wind.Deg.Value);
                    Icon          = HttpConnection.GetIconForWeather(result.Weather.First().Icon);
                }
                else
                {
                    await App.Current.MainPage.DisplayAlert("Błąd", "Coś poszło nie tak.", "OK");
                }

                var resultForDailyWeatherInfo = await HttpConnection.GetDailyWeatherInfoForSevenDaysAsync(geoModel.Lat, geoModel.Lon, "apiKey");

                if (resultForDailyWeatherInfo.Daily != null)
                {
                    foreach (var item in resultForDailyWeatherInfo.Daily)
                    {
                        DailyForecastList.Add(new DailyForecastForSevenDaysModel
                        {
                            Dt           = DateAndTimeHelper.ConvertToDateAndTime(item.Dt, DateAndTimeHelper.TypeForDateAndTimeFormat.COMMON_DATETIME),
                            DayTemp      = Math.Round(item.Temp.Day.Value, 1).ToString(),
                            NightTemp    = Math.Round(item.Temp.Night.Value, 1).ToString(),
                            MinTemp      = Math.Round(item.Temp.Min.Value, 1).ToString(),
                            MaxTemp      = Math.Round(item.Temp.Max.Value, 1).ToString(),
                            FeelsTempDay = Math.Round(item.FeelsLike.Day.Value, 1).ToString(),
                            Humidity     = item.Humidity,
                            Sunrise      = DateAndTimeHelper.ConvertToDateAndTime(item.Sunrise, DateAndTimeHelper.TypeForDateAndTimeFormat.TIME),
                            Sunset       = DateAndTimeHelper.ConvertToDateAndTime(item.Sunset, DateAndTimeHelper.TypeForDateAndTimeFormat.TIME),
                            WindDeg      = WindHelper.DegreesToGeogrpahicalDirections(item.WindDeg.Value),
                            WindSpeed    = WindHelper.MpsToKmph(item.WindSpeed.Value),
                            Rain         = string.IsNullOrEmpty(item.Rain) ? "0" : item.Rain,
                            Icon         = HttpConnection.GetIconForWeather(item.Weather.First().Icon),
                            Clouds       = item.Clouds,
                            Pressure     = item.Pressure,
                            Description  = item.Weather.First().Description
                        });
                    }
                }
                else
                {
                    await App.Current.MainPage.DisplayAlert("Błąd", "Coś poszło nie tak.", "OK");
                }
            }

            catch (Exception ex)
            {
                await App.Current.MainPage.DisplayAlert("Błąd", "Coś poszło nie tak. Być może nie włączono Internetu.", "OK");

                System.Diagnostics.Process.GetCurrentProcess().CloseMainWindow();
            }
            finally
            {
                IsBusy = false;
            }
        }
예제 #12
0
 public Variable Execute(List <Variable> parameters)
 {
     return(DateAndTimeHelper.DateTimeFunction(parameters));
 }