private void MapCompositeKey(OperationExecutionContext context) { // TODO: AY: Review this later var domain = context.Session.Domain; var nodeId = context.Session.StorageNodeId; var keyInfo = Key.TypeReference.Type.Key; var hierarchy = keyInfo.Hierarchy; if (hierarchy.Key.Fields.Count == 1 && !hierarchy.Key.Fields[0].IsEntity) { return; } var columnIndex = 0; var sourceTuple = Key.Value; var resultTuple = Tuple.Create(sourceTuple.Descriptor); var hasTemporaryComponentBeenFound = false; foreach (var keyField in hierarchy.Key.Fields) { if (keyField.Parent != null) { continue; } if (keyField.IsPrimitive) { resultTuple.SetValue(columnIndex, sourceTuple.GetValue(columnIndex)); columnIndex++; } else { var association = keyField.Associations.Last(); var componentKeyValue = Tuple.Create(association.TargetType.Key.TupleDescriptor); sourceTuple.CopyTo(componentKeyValue, columnIndex, keyField.MappingInfo.Length); var componentKey = Key.Create(domain, nodeId, association.TargetType.UnderlyingType, TypeReferenceAccuracy.BaseType, componentKeyValue); var componentKeyLength = componentKey.Value.Count; Key mappedKey; if (context.KeyMapping.TryGetValue(componentKey, out mappedKey)) { mappedKey.Value.CopyTo(resultTuple, 0, columnIndex, componentKeyLength); hasTemporaryComponentBeenFound = true; } else { componentKeyValue.CopyTo(resultTuple, 0, columnIndex, componentKeyLength); } columnIndex += componentKeyLength; } } if (hasTemporaryComponentBeenFound) { var result = Key.Create(domain, nodeId, Key.TypeReference.Type.UnderlyingType, TypeReferenceAccuracy.BaseType, resultTuple); context.AddKeyMapping(Key, result); } }
private void MapNewKey(OperationExecutionContext context) { var domain = context.Session.Domain; if (Key.IsTemporary(domain)) { var mappedKey = Key.Generate(context.Session, Key.TypeInfo); context.AddKeyMapping(Key, mappedKey); } }