void AddRecordToGroup(ExpandoObject currentRecord, FieldInfo field, List <Boolean> groupKeys) { if (groupKeys == null) { throw new DataLoaderException($"There is no groups property for '{field.TypeName}"); } ElementMetadata elemMeta = GetOrCreateMetadata(field.TypeName); if (String.IsNullOrEmpty(elemMeta.Items)) { throw new DataLoaderException($"There is no 'Items' property for '{field.TypeName}"); } GroupMetadata groupMeta = GetOrCreateGroupMetadata(field.TypeName); if (groupMeta.IsRoot(groupKeys)) { _root.Add(field.PropertyName, currentRecord); groupMeta.CacheElement(groupMeta.RootKey, currentRecord); // current } else { // item1 - elemKey, item2 -> parentKey var keys = groupMeta.GetKeys(groupKeys, currentRecord); var parentRec = groupMeta.GetCachedElement(keys.Item2); // parent parentRec.AddToArray(elemMeta.Items, currentRecord); if (!groupMeta.IsLeaf(groupKeys)) { groupMeta.CacheElement(keys.Item1, currentRecord); // current } } }
void ProcessMapObjectMetadata(FieldInfo fieldInfo, ElementMetadata elem) { var mapType = fieldInfo.TypeName + "Map"; var innerElem = GetOrCreateMetadata(mapType); foreach (var f in fieldInfo.MapFields) { innerElem.AddField(new FieldInfo($"{f}!{fieldInfo.TypeName}"), DataType.Undefined); } elem.AddField(new FieldInfo($"{fieldInfo.PropertyName}!{mapType}"), DataType.Undefined); }
void ProcessComplexMetadata(FieldInfo fieldInfo, ElementMetadata elem, DataType dt, Int32 fieldLen) { // create metadata for nested type var innerElem = GetOrCreateMetadata(fieldInfo.TypeName); var fna = fieldInfo.PropertyName.Split('.'); if (fna.Length != 2) { throw new DataLoaderException($"Invalid complex name {fieldInfo.PropertyName}"); } elem.AddField(new FieldInfo($"{fna[0]}!{fieldInfo.TypeName}"), DataType.Undefined); innerElem.AddField(new FieldInfo(fieldInfo, fna[1]), dt, fieldLen); }
ElementMetadata GetOrCreateMetadata(String typeName) { if (_metadata == null) { _metadata = new Dictionary <String, IDataMetadata>(); } if (_metadata.TryGetValue(typeName, out IDataMetadata elemMeta)) { return(elemMeta as ElementMetadata); } var newMeta = new ElementMetadata(); _metadata.Add(typeName, newMeta); return(newMeta); }