public void Handle(IList <IObjectFuture> objectFutures) { List <IEnumerable> allToPrefetch = new List <IEnumerable>(objectFutures.Count); for (int i = 0, size = objectFutures.Count; i < size; i++) { IObjectFuture objectFuture = objectFutures[i]; if (!(objectFuture is PrefetchFuture)) { throw new ArgumentException("'" + GetType().Name + "' cannot handle " + typeof(IObjectFuture).Name + " implementations of type '" + objectFuture.GetType().Name + "'"); } PrefetchFuture prefetchFuture = (PrefetchFuture)objectFuture; IEnumerable toPrefetch = prefetchFuture.ToPrefetch; allToPrefetch.Add(toPrefetch); } PrefetchHelper.Prefetch(allToPrefetch); }
protected void ApplyRelationUpdateItems(IObjRefContainer entity, IRelationUpdateItem[] ruis, bool isUpdate, IEntityMetaData metadata, IReader reader) { List <Object> toPrefetch = new List <Object>(); RelationMember[] relationMembers = metadata.RelationMembers; foreach (IRelationUpdateItem rui in ruis) { String memberName = rui.MemberName; int relationIndex = metadata.GetIndexByRelationName(memberName); if (ValueHolderState.INIT == entity.Get__State(relationIndex)) { throw new Exception("ValueHolder already initialized for property '" + memberName + "'"); } IObjRef[] existingORIs = entity.Get__ObjRefs(relationIndex); IObjRef[] addedORIs = rui.AddedORIs; IObjRef[] removedORIs = rui.RemovedORIs; IObjRef[] newORIs; if (existingORIs.Length == 0) { if (removedORIs != null && addedORIs.Length > 0) { throw new ArgumentException("Removing from empty member"); } newORIs = addedORIs != null && addedORIs.Length > 0 ? addedORIs : ObjRef.EMPTY_ARRAY; } else { // Set to efficiently remove entries LinkedHashSet <IObjRef> existingORIsSet = new LinkedHashSet <IObjRef>(existingORIs); if (removedORIs != null && removedORIs.Length > 0) { foreach (IObjRef removedORI in removedORIs) { if (!existingORIsSet.Remove(removedORI)) { throw OptimisticLockUtil.ThrowModified(OriHelper.EntityToObjRef(entity), null, entity); } } } if (addedORIs != null && addedORIs.Length > 0) { foreach (IObjRef addedORI in addedORIs) { if (!existingORIsSet.Add(addedORI)) { throw OptimisticLockUtil.ThrowModified(OriHelper.EntityToObjRef(entity), null, entity); } } } if (existingORIsSet.Count == 0) { newORIs = ObjRef.EMPTY_ARRAY; } else { newORIs = existingORIsSet.ToArray(); } } RelationMember member = relationMembers[relationIndex]; if (isUpdate) { entity.Set__ObjRefs(relationIndex, newORIs); if (!entity.Is__Initialized(relationIndex)) { DirectValueHolderRef dvhr = new DirectValueHolderRef(entity, member); toPrefetch.Add(dvhr); } } else { BuildSetterCommands(entity, newORIs, member, reader); } } if (toPrefetch.Count > 0) { IObjectFuture objectFuture = new PrefetchFuture(toPrefetch); IObjectCommand command = CommandBuilder.Build(reader.CommandTypeRegistry, objectFuture, null); reader.AddObjectCommand(command); } }