private SubClassMap CreateSubClassMap(Type classType, Func <Type, IClassMap> classMapFinder) { //TODO: should probably do something different to find the base type //mabe a convention? var superClassMap = classMapFinder(classType.BaseType); if (superClassMap == null) { throw new InvalidOperationException(string.Format("Unable to find super class map for subclass {0}", classType)); } var subClassMap = new SubClassMap(classType); ((ClassMapBase)superClassMap).AddSubClassMap(subClassMap); var discriminator = _profile.GetDiscriminator(classType); var parentDiscriminator = superClassMap.Discriminator; if (parentDiscriminator == null) { subClassMap.Discriminator = discriminator; } else { Array array; if (parentDiscriminator.GetType().IsArray) { array = Array.CreateInstance(typeof(object), ((Array)parentDiscriminator).Length + 1); } else { array = Array.CreateInstance(typeof(object), 2); array.SetValue(parentDiscriminator, 0); } array.SetValue(discriminator, array.Length - 1); subClassMap.Discriminator = array; } foreach (var member in _profile.FindMembers(classType)) { if (subClassMap.HasId && subClassMap.IdMap.MemberName == member.Name) { continue; } if (subClassMap.HasExtendedProperties && subClassMap.ExtendedPropertiesMap.MemberName == member.Name) { continue; } if (superClassMap.GetMemberMapFromMemberName(member.Name) != null) { continue; //don't want to remap a member } subClassMap.AddMemberMap(CreateMemberMap(classType, member)); } return(subClassMap); }
private void ProcessSubClassMap(SubClassMap map, ObjectAccessor accessor, Dictionary <byte[], TCell> input, ConcurrentDictionary <string, long> ts) { var target = Activator.CreateInstance(map.Type); var targetAccessor = ObjectAccessor.Create(target); Parallel.ForEach(map.Mappers.Select(x => x.ExposeMap()), subMap => { ProcessMap(subMap, targetAccessor, input, ts); }); accessor[map.Name] = target; }
private IEnumerable <HBaseCell> ProcessSubclassMap(SubClassMap map, ObjectAccessor accessor, string key, IList <string> descriptors) { var maps = map.Mappers.Select(x => x.ExposeMap()); var target = accessor[map.Name]; var acc = ObjectAccessor.Create(target); var cells = new ConcurrentBag <IEnumerable <HBaseCell> >(); Parallel.ForEach(maps, subMap => { cells.Add(ProcessMap(subMap, acc, key, descriptors)); }); return(cells.SelectMany(x => x)); }