internal static JToken ExtractEntityValue()

in libraries/Microsoft.Bot.Builder.AI.LUIS/LuisUtil.cs [88:164]


        internal static JToken ExtractEntityValue(EntityModel entity)
        {
            if (entity.Type.StartsWith("builtin.geographyV2.", StringComparison.Ordinal))
            {
                var subtype = entity.Type.Substring(20);
                return new JObject(
                    new JProperty("type", subtype),
                    new JProperty("location", entity.Entity));
            }

            if (entity.AdditionalProperties == null || !entity.AdditionalProperties.TryGetValue("resolution", out dynamic resolution))
            {
                return entity.Entity;
            }

            if (entity.Type.StartsWith("builtin.datetime.", StringComparison.Ordinal))
            {
                return JObject.FromObject(resolution);
            }

            if (entity.Type.StartsWith("builtin.datetimeV2.", StringComparison.Ordinal))
            {
                if (resolution.values == null || resolution.values.Count == 0)
                {
                    return JArray.FromObject(resolution);
                }

                var resolutionValues = (IEnumerable<dynamic>)resolution.values;
                var type = resolution.values[0].type;
                var timexes = resolutionValues.Select(val => val.timex);
                var distinctTimexes = timexes.Distinct();
                return new JObject(new JProperty("type", type), new JProperty("timex", JArray.FromObject(distinctTimexes)));
            }

            if (entity.Type.StartsWith("builtin.ordinalV2", StringComparison.Ordinal))
            {
                return new JObject(
                    new JProperty("relativeTo", resolution.relativeTo),
                    new JProperty("offset", Number(resolution.offset)));
            }

            switch (entity.Type)
            {
                case "builtin.number":
                case "builtin.ordinal": return Number(resolution.value);
                case "builtin.percentage":
                {
                    var svalue = (string)resolution.value;
                    if (svalue.EndsWith("%", StringComparison.Ordinal))
                    {
                        svalue = svalue.Substring(0, svalue.Length - 1);
                    }

                    return Number(svalue);
                }

                case "builtin.age":
                case "builtin.dimension":
                case "builtin.currency":
                case "builtin.temperature":
                {
                    var units = (string)resolution.unit;
                    var val = Number(resolution.value);
                    var obj = new JObject();
                    if (val != null)
                    {
                        obj.Add("number", val);
                    }

                    obj.Add("units", units);
                    return obj;
                }

                default:
                    return resolution.value ?? (resolution.values != null ? JArray.FromObject(resolution.values) : resolution);
            }
        }