private void UpdateRow(Net.Vpc.Upa.Impl.Persistence.Result.ResultColumn[] columns, Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo fi, string label, object @value) { if (fi.update) { foreach (int?index in fi.indexesToUpdate) { Net.Vpc.Upa.Impl.Persistence.Result.ResultColumn c = columns[index]; c.SetLabel(label); c.SetValue(@value); } } }
public override T Parse(Net.Vpc.Upa.Persistence.QueryResult result) /* throws Net.Vpc.Upa.Exceptions.UPAException */ { System.Collections.Generic.IDictionary <string, object> groupValues = new System.Collections.Generic.Dictionary <string, object>(); Net.Vpc.Upa.Impl.Persistence.Result.ResultColumn[] values = new Net.Vpc.Upa.Impl.Persistence.Result.ResultColumn[(metaData.GetFields()).Count]; for (int i = 0; i < values.Length; i++) { values[i] = new Net.Vpc.Upa.Impl.Persistence.Result.ResultColumn(); } foreach (Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo typeInfo in typeInfos) { typeInfo.entityObject = null; typeInfo.entityRecord = null; typeInfo.entityResult = null; } foreach (Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo typeInfo in typeInfos) { if (typeInfo.entity == null) { foreach (Net.Vpc.Upa.Impl.Persistence.Result.FieldInfo f in typeInfo.allFields) { object fieldValue = result.Read <T>(f.dbIndex); groupValues[f.nativeField.GetFullBinding()] = fieldValue; groupValues[f.nativeField.GetExprString()] = fieldValue; UpdateRow(values, f, f.nativeField.GetExprString(), fieldValue); } } else if (typeInfo.leadPrimaryField == null) { if (typeInfo.record) { object entityObject = null; Net.Vpc.Upa.Record entityRecord = typeInfo.entityFactory == null ? ((Net.Vpc.Upa.Record)(ofactory.CreateObject <Net.Vpc.Upa.Record>(typeof(Net.Vpc.Upa.Record)))) : typeInfo.entityFactory.CreateRecord(); typeInfo.entityObject = entityObject; typeInfo.entityRecord = entityRecord; typeInfo.entityResult = entityRecord; } else { object entityObject = typeInfo.entityFactory.CreateObject <R>(); Net.Vpc.Upa.Record entityRecord = typeInfo.entityConverter.ObjectToRecord(entityObject, true); typeInfo.entityObject = entityObject; typeInfo.entityRecord = entityRecord; typeInfo.entityResult = entityObject; } groupValues[typeInfo.binding] = typeInfo.entityResult; UpdateRow(values, typeInfo, typeInfo.binding, typeInfo.entityResult); foreach (Net.Vpc.Upa.Impl.Persistence.Result.FieldInfo f in typeInfo.allFields) { object fieldValue = result.Read <T>(f.dbIndex); groupValues[f.nativeField.GetFullBinding()] = fieldValue; typeInfo.entityRecord.SetObject(f.name, fieldValue); UpdateRow(values, f, f.nativeField.GetExprString(), fieldValue); } } else { object leadPK = result.Read <T>(typeInfo.leadPrimaryField.dbIndex); if (leadPK != null) { //create new instances if (typeInfo.record) { typeInfo.entityRecord = typeInfo.entityFactory == null ? ((Net.Vpc.Upa.Record)(ofactory.CreateObject <Net.Vpc.Upa.Record>(typeof(Net.Vpc.Upa.Record)))) : typeInfo.entityFactory.CreateRecord(); typeInfo.entityResult = typeInfo.entityRecord; } else { object entityObject = typeInfo.entityFactory.CreateObject <R>(); Net.Vpc.Upa.Record entityRecord = typeInfo.entityConverter.ObjectToRecord(entityObject, true); typeInfo.entityObject = entityObject; typeInfo.entityRecord = entityRecord; typeInfo.entityResult = entityObject; } groupValues[typeInfo.binding] = typeInfo.entityResult; UpdateRow(values, typeInfo, typeInfo.binding, typeInfo.entityResult); foreach (Net.Vpc.Upa.Impl.Persistence.Result.FieldInfo f in typeInfo.allFields) { object fieldValue = result.Read <T>(f.dbIndex); groupValues[f.nativeField.GetFullBinding()] = fieldValue; UpdateRow(values, f, f.nativeField.GetExprString(), fieldValue); typeInfo.entityRecord.SetObject(f.name, fieldValue); } if (loadManyToOneRelations) { foreach (Net.Vpc.Upa.Relationship relationship in typeInfo.manyToOneRelations) { object extractedId = relationship.ExtractIdByForeignFields(typeInfo.entityRecord); if (extractedId != null) { object @value = loader.LoadObject(relationship.GetTargetEntity(), extractedId, relationAsRecord, loaderContext); typeInfo.entityRecord.SetObject(relationship.GetSourceRole().GetEntityField().GetName(), @value); groupValues[typeInfo.binding + "." + relationship.GetSourceRole().GetEntityField().GetName()] = @value; } } } } else { typeInfo.entityObject = null; typeInfo.entityRecord = null; } } } foreach (Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo typeInfo in typeInfos) { if (typeInfo.parentBinding != null) { Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo pp = Net.Vpc.Upa.Impl.FwkConvertUtils.GetMapValue <string, Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo>(bindingToTypeInfos, typeInfo.parentBinding); if (pp == null) { } else if (pp.entityRecord != null) { pp.entityRecord.SetObject(typeInfo.bindingName, typeInfo.entityResult); } } } if (updatable) { foreach (Net.Vpc.Upa.Impl.Persistence.Result.TypeInfo typeInfo in typeInfos) { if (typeInfo.record) { Net.Vpc.Upa.Impl.Persistence.Result.QueryResultUpdaterPropertyChangeListener li = new Net.Vpc.Upa.Impl.Persistence.Result.QueryResultUpdaterPropertyChangeListener(typeInfo, result); typeInfo.entityRecord.AddPropertyChangeListener(li); } else { typeInfo.entityUpdatable = Net.Vpc.Upa.Impl.Util.PlatformUtils.CreateObjectInterceptor <object>(typeInfo.entityType, new Net.Vpc.Upa.Impl.Persistence.Result.UpdatableObjectInterceptor(typeInfo, typeInfo.entityObject, result)); groupValues[typeInfo.binding] = typeInfo.entityUpdatable; int index = typeInfo.allFields[0].nativeField.GetIndex(); if (values[index].GetValue() == typeInfo.entityType) { values[index].SetValue(typeInfo.entityUpdatable); } } } } return((T)this.resultBuilder.CreateResult(values, metaData)); }