in libraries/Microsoft.Bot.Builder.AI.LUIS/V3/LuisUtil.cs [43:169]
internal static JToken MapProperties(JToken source, bool inInstance)
{
var result = source;
if (source is JObject obj)
{
var nobj = new JObject();
// Fix datetime by reverting to simple timex
if (!inInstance && obj.TryGetValue("type", out var type) && type.Type == JTokenType.String && _dateSubtypes.Contains(type.Value<string>()))
{
var timexs = obj["values"];
var arr = new JArray();
if (timexs != null)
{
var unique = new HashSet<string>();
foreach (var elt in timexs)
{
unique.Add(elt["timex"]?.Value<string>());
}
foreach (var timex in unique)
{
arr.Add(timex);
}
nobj["timex"] = arr;
}
nobj["type"] = type;
}
else
{
// Map or remove properties
foreach (var property in obj.Properties())
{
var name = NormalizeEntity(property.Name);
var isObj = property.Value.Type == JTokenType.Object;
var isArray = property.Value.Type == JTokenType.Array;
var isString = property.Value.Type == JTokenType.String;
var isInt = property.Value.Type == JTokenType.Integer;
var val = MapProperties(property.Value, inInstance || property.Name == MetadataKey);
if (name == "datetime" && isArray)
{
nobj.Add("datetimeV1", val);
}
else if (name == "datetimeV2" && isArray)
{
nobj.Add("datetime", val);
}
else if (inInstance)
{
// Correct $instance issues
if (name == "length" && isInt)
{
nobj.Add("endIndex", property.Value.Value<int>() + property.Parent["startIndex"].Value<int>());
}
else if (!((isInt && name == "modelTypeId") ||
(isString && name == "role")))
{
nobj.Add(name, val);
}
}
else
{
// Correct non-$instance values
if (name == "unit" && isString)
{
nobj.Add("units", val);
}
else
{
nobj.Add(name, val);
}
}
}
}
result = nobj;
}
else if (source is JArray arr)
{
var narr = new JArray();
foreach (var elt in arr)
{
// Check if element is geographyV2
var isGeographyV2 = string.Empty;
foreach (var props in elt.Children())
{
var tokenProp = props as JProperty;
if (tokenProp == null)
{
break;
}
if (tokenProp.Name.Contains("type") && _geographySubtypes.Contains(tokenProp.Value.ToString()))
{
isGeographyV2 = tokenProp.Value.ToString();
break;
}
}
if (!inInstance && !string.IsNullOrEmpty(isGeographyV2))
{
var geoEntity = new JObject();
foreach (var props in elt.Children())
{
var tokenProp = props as JProperty;
if (tokenProp.Name.Contains("value"))
{
geoEntity.Add("location", tokenProp.Value);
}
}
geoEntity.Add("type", isGeographyV2);
narr.Add(geoEntity);
}
else
{
narr.Add(MapProperties(elt, inInstance));
}
}
result = narr;
}
return result;
}