public static async Task <CdmLocalEntityDeclarationDefinition> FromData(CdmCorpusContext ctx, CdmFolderDefinition documentFolder, LocalEntity obj, CdmCollection <CdmTraitDefinition> extensionTraitDefList) { var localEntity = ctx.Corpus.MakeObject <CdmLocalEntityDeclarationDefinition>(CdmObjectType.LocalEntityDeclarationDef, obj.Name); var entityDoc = await DocumentPersistence.FromData(ctx, obj, extensionTraitDefList); if (entityDoc == null) { Logger.Error(nameof(LocalEntityDeclarationPersistence), ctx, "There was an error while trying to fetch the entity doc from local entity declaration persistence."); return(null); } documentFolder.Documents.Add(entityDoc); // Entity schema path is the path to the doc containing the entity definition. localEntity.EntityPath = ctx.Corpus.Storage.CreateRelativeCorpusPath($"{entityDoc.AtCorpusPath}/{obj.Name}", entityDoc); localEntity.Explanation = obj.Description; localEntity.LastChildFileModifiedTime = obj.LastChildFileModifiedTime; localEntity.LastFileModifiedTime = obj.LastFileModifiedTime; localEntity.LastFileStatusCheckTime = obj.LastFileStatusCheckTime; if (obj.IsHidden == true) { var isHiddenTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden", true); isHiddenTrait.IsFromProperty = true; localEntity.ExhibitsTraits.Add(isHiddenTrait); } // Add traits for schema entity info. if (obj.Schemas != null) { var t2pm = new TraitToPropertyMap(localEntity); t2pm.UpdatePropertyValue("cdmSchemas", obj.Schemas); } // Data partitions are part of the local entity, add them here. if (obj.Partitions != null) { foreach (var element in obj.Partitions) { var cdmPartition = await DataPartitionPersistence.FromData(ctx, element, extensionTraitDefList); if (cdmPartition != null) { localEntity.DataPartitions.Add(cdmPartition); } else { Logger.Error(nameof(LocalEntityDeclarationPersistence), ctx, "There was an error while trying to fetch the entity doc from local entity declaration persistence."); return(null); } } } return(localEntity); }
private static IDictionary <string, JToken> CreateTablePropertyBags(CdmLocalEntityDeclarationDefinition instance, ResolveOptions resOpt, CopyOptions options, IDictionary <string, JToken> properties) { if (properties == null) { properties = new Dictionary <string, JToken>(); } if (instance.EntityPath != null) { Tuple <string, string> pathTuple = StorageUtils.SplitNamespacePath(instance.EntityPath); if (pathTuple == null) { Logger.Error((ResolveContext)instance.Ctx, Tag, nameof(ToDataAsync), instance.AtCorpusPath, CdmLogCode.ErrPersistSymsEntityPathNull, instance.EntityName); return(null); } properties["cdm:entityPath"] = JToken.FromObject(pathTuple.Item2); } var t2pm = new TraitToPropertyMap(instance); var isHiddenTrait = t2pm.FetchTraitReference("is.hidden"); if (!properties.ContainsKey("cdm:description")) { properties["cdm:description"] = instance.Explanation; } if (instance.LastChildFileModifiedTime != null) { properties["cdm:lastChildFileModifiedTime"] = instance.LastChildFileModifiedTime; } if (instance.LastFileModifiedTime != null) { properties["cdm:lastFileModifiedTime"] = instance.LastFileModifiedTime; } if (instance.LastFileStatusCheckTime != null) { properties["cdm:lastFileStatusCheckTime"] = instance.LastFileStatusCheckTime; } if (isHiddenTrait != null) { properties["cdm:isHidden"] = true; } if (instance.ExhibitsTraits != null && instance.ExhibitsTraits.Count > 0) { properties["cdm:entityDecTraits"] = JToken.FromObject(Utils.ListCopyData <TraitReferenceDefinition>(resOpt, instance.ExhibitsTraits, options), new JsonSerializer { NullValueHandling = NullValueHandling.Ignore, ContractResolver = new CamelCasePropertyNamesContractResolver() }); } return(properties); }
public static async Task <CdmLocalEntityDeclarationDefinition> FromData(CdmCorpusContext ctx, CdmFolderDefinition documentFolder, LocalEntity obj, List <CdmTraitDefinition> extensionTraitDefList, CdmManifestDefinition manifest) { var localEntity = ctx.Corpus.MakeObject <CdmLocalEntityDeclarationDefinition>(CdmObjectType.LocalEntityDeclarationDef, obj.Name); var localExtensionTraitDefList = new List <CdmTraitDefinition>(); var entityDoc = await DocumentPersistence.FromData(ctx, obj, extensionTraitDefList, localExtensionTraitDefList); documentFolder.Documents.Add(entityDoc); // Entity schema path is the path to the doc containing the entity definition. localEntity.EntityPath = ctx.Corpus.Storage.CreateRelativeCorpusPath($"{entityDoc.AtCorpusPath}/{obj.Name}", manifest); localEntity.Explanation = obj.Description; localEntity.LastChildFileModifiedTime = obj.LastChildFileModifiedTime; localEntity.LastFileModifiedTime = obj.LastFileModifiedTime; localEntity.LastFileStatusCheckTime = obj.LastFileStatusCheckTime; if (obj.IsHidden == true) { var isHiddenTrait = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.hidden", true); isHiddenTrait.IsFromProperty = true; localEntity.ExhibitsTraits.Add(isHiddenTrait); } // Add traits for schema entity info. if (obj.Schemas != null) { var t2pm = new TraitToPropertyMap(localEntity); t2pm.UpdatePropertyValue("cdmSchemas", obj.Schemas); } // Data partitions are part of the local entity, add them here. if (obj.Partitions != null) { foreach (var element in obj.Partitions) { var cdmPartition = await DataPartitionPersistence.FromData(ctx, element, extensionTraitDefList, localExtensionTraitDefList, documentFolder); if (cdmPartition != null) { localEntity.DataPartitions.Add(cdmPartition); } else { Logger.Error((ResolveContext)ctx, Tag, nameof(FromData), null, CdmLogCode.ErrPersistModelJsonDocConversionError); return(null); } } } List <CdmImport> importDocs = await ExtensionHelper.StandardImportDetection(ctx, extensionTraitDefList, localExtensionTraitDefList); ExtensionHelper.AddImportDocsToManifest(ctx, importDocs, entityDoc); return(localEntity); }
public static CdmTypeAttributeDefinition FromData(CdmCorpusContext ctx, JToken obj, string entityName = null) { if (obj == null) { return(null); } var typeAttribute = ctx.Corpus.MakeObject <CdmTypeAttributeDefinition>(CdmObjectType.TypeAttributeDef, (string)obj["name"]); typeAttribute.Purpose = PurposeReferencePersistence.FromData(ctx, obj["purpose"]); typeAttribute.DataType = DataTypeReferencePersistence.FromData(ctx, obj["dataType"]); typeAttribute.Cardinality = Utils.CardinalitySettingsFromData(obj["cardinality"], typeAttribute); typeAttribute.AttributeContext = AttributeContextReferencePersistence.FromData(ctx, obj["attributeContext"]); Utils.AddListToCdmCollection(typeAttribute.AppliedTraits, Utils.CreateTraitReferenceList(ctx, obj["appliedTraits"])); typeAttribute.ResolutionGuidance = AttributeResolutionGuidancePersistence.FromData(ctx, obj["resolutionGuidance"]); if (obj["isPrimaryKey"] != null && (bool)obj["isPrimaryKey"] && entityName != null) { TraitToPropertyMap t2pMap = new TraitToPropertyMap(typeAttribute); t2pMap.UpdatePropertyValue("isPrimaryKey", entityName + "/(resolvedAttributes)/" + typeAttribute.Name); } typeAttribute.Explanation = Utils.PropertyFromDataToString(obj["explanation"]); typeAttribute.Description = Utils.PropertyFromDataToString(obj["description"]); typeAttribute.IsReadOnly = Utils.PropertyFromDataToBool(obj["isReadOnly"]); typeAttribute.IsNullable = Utils.PropertyFromDataToBool(obj["isNullable"]); typeAttribute.SourceName = Utils.PropertyFromDataToString(obj["sourceName"]); typeAttribute.SourceOrdering = Utils.PropertyFromDataToInt(obj["sourceOrdering"]); typeAttribute.DisplayName = Utils.PropertyFromDataToString(obj["displayName"]); typeAttribute.ValueConstrainedToList = Utils.PropertyFromDataToBool(obj["valueConstrainedToList"]); typeAttribute.MaximumLength = Utils.PropertyFromDataToInt(obj["maximumLength"]); typeAttribute.MaximumValue = Utils.PropertyFromDataToString(obj["maximumValue"]); typeAttribute.MinimumValue = Utils.PropertyFromDataToString(obj["minimumValue"]); typeAttribute.DefaultValue = obj["defaultValue"]; typeAttribute.Projection = ProjectionPersistence.FromData(ctx, obj["projection"]); var dataFormat = Utils.PropertyFromDataToString(obj["dataFormat"]); if (dataFormat != null) { bool success = Enum.TryParse(dataFormat, true, out CdmDataFormat cdmDataFormat); if (success) { typeAttribute.DataFormat = cdmDataFormat; } else { Logger.Warning(ctx, Tag, nameof(FromData), null, CdmLogCode.WarnPersistEnumNotFound, dataFormat); } } return(typeAttribute); }
public static async Task <LocalEntity> ToData(CdmLocalEntityDeclarationDefinition instance, CdmManifestDefinition manifest, ResolveOptions resOpt, CopyOptions options) { var localEntity = await DocumentPersistence.ToData(instance.EntityPath, manifest, resOpt, options, instance.Ctx); if (localEntity != null) { var t2pm = new TraitToPropertyMap(instance); var isHiddenTrait = t2pm.FetchTraitReference("is.hidden"); if (localEntity.Description == null) { localEntity.Description = instance.Explanation; } localEntity.LastChildFileModifiedTime = instance.LastChildFileModifiedTime; localEntity.LastFileModifiedTime = instance.LastFileModifiedTime; localEntity.LastFileStatusCheckTime = instance.LastFileStatusCheckTime; if (isHiddenTrait != null) { localEntity.IsHidden = true; } if (t2pm.FetchPropertyValue("cdmSchemas") is List <string> schemas) { localEntity.Schemas = schemas; } if (instance.DataPartitions != null && instance.DataPartitions.Count > 0) { localEntity.Partitions = new List <Partition>(); foreach (var element in instance.DataPartitions) { var partition = await DataPartitionPersistence.ToData(element, resOpt, options); if (partition != null) { localEntity.Partitions.Add(partition); } else { Logger.Error((ResolveContext)instance.Ctx, Tag, nameof(ToData), instance.AtCorpusPath, CdmLogCode.ErrPersistModelJsonEntityPartitionConversionError); return(null); } } } } return(localEntity); }
public static async Task <LocalEntity> ToData(CdmLocalEntityDeclarationDefinition instance, ResolveOptions resOpt, CopyOptions options) { var localEntity = await DocumentPersistence.ToData(instance.EntityPath, resOpt, options, instance.Ctx); if (localEntity != null) { var t2pm = new TraitToPropertyMap(instance); var isHiddenTrait = t2pm.FetchTraitReference("is.hidden"); localEntity.Description = instance.Explanation; localEntity.LastChildFileModifiedTime = instance.LastChildFileModifiedTime; localEntity.LastFileModifiedTime = instance.LastFileModifiedTime; localEntity.LastFileStatusCheckTime = instance.LastFileStatusCheckTime; if (isHiddenTrait != null) { localEntity.IsHidden = true; } if (t2pm.FetchPropertyValue("cdmSchemas") is List <string> schemas) { localEntity.Schemas = schemas; } if (instance.DataPartitions != null && instance.DataPartitions.Count > 0) { localEntity.Partitions = new List <Partition>(); foreach (var element in instance.DataPartitions) { var partition = await DataPartitionPersistence.ToData(element, resOpt, options); if (partition != null) { localEntity.Partitions.Add(partition); } else { Logger.Error(nameof(LocalEntityDeclarationPersistence), instance.Ctx, "There was an error while trying to convert cdm data partition to model.json partition."); return(null); } } } } return(localEntity); }
public static DataColumn ToData(CdmTypeAttributeDefinition instance, CdmCorpusContext ctx, ResolveOptions resOpt, CopyOptions options) { var properties = CreateProperties(instance, resOpt, options); var originDataTypeName = new TypeInfo { Properties = properties, IsComplexType = false, IsNullable = instance.GetProperty("isNullable"), TypeFamily = "cdm" }; var t2pm = new TraitToPropertyMap(instance);; var numericTraits = t2pm.FetchTraitReference("is.dataFormat.numeric.shaped"); if (numericTraits != null) { foreach (var numericTraitsArg in numericTraits.Arguments) { if (numericTraitsArg.Name == "precision") { originDataTypeName.Precision = (int)numericTraitsArg.Value; } if (numericTraitsArg.Name == "scale") { originDataTypeName.Scale = (int)numericTraitsArg.Value; } } } var dataFormat = instance.GetProperty("dataFormat"); originDataTypeName = Utils.CdmDataFormatToSymsDataType(dataFormat, originDataTypeName); if (originDataTypeName.TypeName == null) { Logger.Error(ctx, Tag, nameof(ToData), instance.AtCorpusPath, CdmLogCode.ErrPersistSymsUnknownDataFormat, instance.DisplayName); return(null); } return(new DataColumn { OriginDataTypeName = originDataTypeName, Name = instance.Name }); }
private static IDictionary <string, JToken> FillPropertyBagFromCsvTrait(CdmDataPartitionDefinition instance, IDictionary <string, JToken> properties = null) { TraitToPropertyMap tpm = new TraitToPropertyMap(instance); var csvTrait = tpm.FetchTraitReference("is.partition.format.CSV"); if (csvTrait != null) { if (properties == null) { properties = new Dictionary <string, JToken>(); } foreach (var csvTraitArg in csvTrait.Arguments) { string key; // map to syms define properties switch (csvTraitArg.Name) { case "columnHeaders": key = "header"; break; case "delimiter": key = "field.delim"; break; default: key = csvTraitArg.Value; break; } properties[key] = csvTraitArg.Value; } } return(properties); }
public static StorageDescriptor ToData(CdmDataPartitionDefinition instance, StorageDescriptor obj, ResolveOptions resOpt, CopyOptions options) { obj.Properties = new Dictionary <string, JToken>(); if (instance.Name != null) { obj.Properties["cdm:name"] = instance.Name; } if (instance.LastFileStatusCheckTime != null) { obj.Properties["cdm:lastFileStatusCheckTime"] = instance.LastFileStatusCheckTime; } if (instance.LastFileModifiedTime != null) { obj.Properties["cdm:lastFileModifiedTime"] = instance.LastFileModifiedTime; } if (instance.ExhibitsTraits != null) { TraitToPropertyMap tpm = new TraitToPropertyMap(instance); var csvTrait = tpm.FetchTraitReference("is.partition.format.CSV"); if (csvTrait != null) { instance.ExhibitsTraits.Remove("is.partition.format.CSV"); } if (instance.ExhibitsTraits.Count > 0) { obj.Properties["cdm:traits"] = JToken.FromObject(Utils.ListCopyData <TraitReferenceDefinition>(resOpt, instance.ExhibitsTraits, options), new JsonSerializer { NullValueHandling = NullValueHandling.Ignore, ContractResolver = new CamelCasePropertyNamesContractResolver() }); } if (csvTrait != null) { instance.ExhibitsTraits.Add(csvTrait); } } var properties = FillPropertyBagFromCsvTrait(instance); if (properties != null) { obj.Format = new FormatInfo { InputFormat = InputFormat.OrgapachehadoopmapredSequenceFileInputFormat, OutputFormat = OutputFormat.OrgapachehadoophiveqlioHiveSequenceFileOutputFormat, SerializeLib = SerializeLib.Orgapachehadoophiveserde2lazyLazySimpleSerDe, FormatType = FormatType.Csv, Properties = properties }; } else { // error return(null); } return(obj); }
public static CdmTypeAttributeDefinition FromData(CdmCorpusContext ctx, DataColumn obj, string entityName = null) { var typeAttribute = ctx.Corpus.MakeObject <CdmTypeAttributeDefinition>(CdmObjectType.TypeAttributeDef, obj.Name); var properties = obj.OriginDataTypeName.Properties; typeAttribute.DataFormat = Utils.SymsDataTypeToCdmDataFormat(obj.OriginDataTypeName); if (obj.OriginDataTypeName.Scale != 0 || obj.OriginDataTypeName.Precision != 0) { var numericTraits = ctx.Corpus.MakeRef <CdmTraitReference>(CdmObjectType.TraitRef, "is.dataFormat.numeric.shaped", true); var scaleTraitsArg = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "scale"); scaleTraitsArg.Value = obj.OriginDataTypeName.Scale; numericTraits.Arguments.Add(scaleTraitsArg); var precisionTraitsArg = ctx.Corpus.MakeObject <CdmArgumentDefinition>(CdmObjectType.ArgumentDef, "scale"); precisionTraitsArg.Value = obj.OriginDataTypeName.Scale; numericTraits.Arguments.Add(precisionTraitsArg); } if (properties != null) { if (properties.ContainsKey("cdm:purpose")) { typeAttribute.Purpose = properties["cdm:purpose"].ToObject <CdmPurposeReference>(); } if (properties.ContainsKey("cdm:dataType")) { typeAttribute.DataType = properties["cdm:dataType"].ToObject <CdmDataTypeReference> (); } if (properties.ContainsKey("cdm:cardinality")) { string minCardinality = null; if (properties["cdm:minimum"] != null) { minCardinality = properties["cdm:minimum"].ToObject <string>(); } string maxCardinality = null; if (properties["cdm:maximum"] != null) { maxCardinality = properties["cdm:maximum"].ToObject <string>(); } if (string.IsNullOrWhiteSpace(minCardinality) || string.IsNullOrWhiteSpace(maxCardinality)) { Logger.Error((ResolveContext)ctx, Tag, nameof(FromData), null, CdmLogCode.ErrPersistCardinalityPropMissing); } if (!CardinalitySettings.IsMinimumValid(minCardinality)) { Logger.Error((ResolveContext)ctx, Tag, nameof(FromData), null, CdmLogCode.ErrValdnInvalidMinCardinality, minCardinality); } if (!CardinalitySettings.IsMaximumValid(maxCardinality)) { Logger.Error((ResolveContext)ctx, Tag, nameof(FromData), null, CdmLogCode.ErrValdnInvalidMaxCardinality, maxCardinality); } if (!string.IsNullOrWhiteSpace(minCardinality) && !string.IsNullOrWhiteSpace(maxCardinality) && CardinalitySettings.IsMinimumValid(minCardinality) && CardinalitySettings.IsMinimumValid(maxCardinality)) { typeAttribute.Cardinality = new CardinalitySettings(typeAttribute) { Minimum = minCardinality, Maximum = maxCardinality }; } } if (properties.ContainsKey("cdm:traits")) { Utils.AddListToCdmCollection(typeAttribute.AppliedTraits, Utils.CreateTraitReferenceList(ctx, properties["cdm:traits"])); } if (properties.ContainsKey("cdm:isPrimaryKey") && properties["cdm:isPrimaryKey"].ToObject <bool>()) { TraitToPropertyMap t2pMap = new TraitToPropertyMap(typeAttribute); t2pMap.UpdatePropertyValue("isPrimaryKey", entityName + "/(resolvedAttributes)/" + typeAttribute.Name); } if (properties.ContainsKey("cdm:isReadOnly")) { typeAttribute.IsReadOnly = properties["cdm:isReadOnly"].ToObject <bool>(); } if (properties.ContainsKey("cdm:sourceName")) { typeAttribute.SourceName = properties["cdm:sourceName"].ToObject <string>(); } if (properties.ContainsKey("cdm:sourceOrdering")) { typeAttribute.SourceOrdering = properties["cdm:sourceOrdering"].ToObject <int>(); } if (properties.ContainsKey("cdm:valueConstrainedToList")) { typeAttribute.ValueConstrainedToList = properties["cdm:valueConstrainedToList"].ToObject <bool>(); } if (properties.ContainsKey("cdm:maximumLength")) { typeAttribute.MaximumLength = properties["cdm:maximumLength"].ToObject <int>(); } if (properties.ContainsKey("cdm:maximumValue")) { typeAttribute.MaximumValue = properties["cdm:maximumValue"].ToObject <string>(); } if (properties.ContainsKey("cdm:minimumValue")) { typeAttribute.MinimumValue = properties["cdm:minimumValue"].ToObject <string>(); } if (properties.ContainsKey("cdm:defaultValue")) { typeAttribute.DefaultValue = properties["cdm:defaultValue"]; } } return(typeAttribute); }
/// <summary> /// Initializes a new instance of the <see cref="CdmDataPartitionPatternDefinition"/> class. /// </summary> /// <param name="ctx">The context.</param> /// <param name="name">The name.</param> public CdmDataPartitionPatternDefinition(CdmCorpusContext ctx, string name) : base(ctx) { this.ObjectType = CdmObjectType.DataPartitionPatternDef; this.Name = name; this.TraitToPropertyMap = new TraitToPropertyMap(this); }
public async static Task <Model> ToData(CdmManifestDefinition instance, ResolveOptions resOpt, CopyOptions options) { var result = new Model() { Name = instance.ManifestName, Description = instance.Explanation, ModifiedTime = instance.LastFileModifiedTime, LastChildFileModifiedTime = instance.LastChildFileModifiedTime, LastFileStatusCheckTime = instance.LastFileStatusCheckTime, DocumentVersion = instance.DocumentVersion }; TraitToPropertyMap t2pm = new TraitToPropertyMap(instance); CdmTraitReference isHiddenTrait = t2pm.FetchTraitReference("is.hidden"); if (isHiddenTrait != null) { result.IsHidden = true; } CdmTraitReference applicationTrait = t2pm.FetchTraitReference("is.managedBy"); if (applicationTrait != null) { result.Application = applicationTrait.Arguments.AllItems[0].Value as string; } CdmTraitReference versionTrait = t2pm.FetchTraitReference("is.modelConversion.modelVersion"); if (versionTrait != null) { result.Version = versionTrait.Arguments.AllItems[0].Value; } else { // version property is required. If it doesn't exist set default. result.Version = "1.0"; } CdmTraitReference cultureTrait = t2pm.FetchTraitReference("is.partition.culture"); if (cultureTrait != null) { result.Culture = cultureTrait.Arguments.AllItems[0].Value as string; } Dictionary <string, string> referenceEntityLocations = new Dictionary <string, string>(); Dictionary <string, string> referenceModels = new Dictionary <string, string>(); CdmTraitReference referenceModelsTrait = t2pm.FetchTraitReference("is.modelConversion.referenceModelMap"); if (referenceModelsTrait != null) { JArray refModels = referenceModelsTrait.Arguments[0].Value as JArray; foreach (JObject referenceModel in refModels) { var referenceModelId = referenceModel["id"]; var referenceModelIdAsString = referenceModelId.ToString(); var referenceModelLocation = referenceModel["location"]; var referenceModelLocationAsString = referenceModelLocation.ToString(); referenceModels.Add(referenceModelIdAsString, referenceModelLocationAsString); referenceEntityLocations.Add(referenceModelLocationAsString, referenceModelIdAsString); } } await Utils.ProcessTraitsAndAnnotationsToData(instance.Ctx, result, instance.ExhibitsTraits); if (instance.Entities != null && instance.Entities.Count > 0) { List <Task> promises = new List <Task>(); var obtainedEntities = new ConcurrentBag <JToken>(); foreach (var entity in instance.Entities) { Task createdPromise = Task.Run(async() => { dynamic element = null; if (entity.ObjectType == CdmObjectType.LocalEntityDeclarationDef) { element = await LocalEntityDeclarationPersistence.ToData( entity as CdmLocalEntityDeclarationDefinition, instance, resOpt, options ); } else if (entity.ObjectType == CdmObjectType.ReferencedEntityDeclarationDef) { element = await ReferencedEntityDeclarationPersistence.ToData( entity as CdmReferencedEntityDeclarationDefinition, resOpt, options ); var location = instance.Ctx.Corpus.Storage.CorpusPathToAdapterPath(entity.EntityPath); if (StringUtils.IsBlankByCdmStandard(location)) { Logger.Error((ResolveContext)instance.Ctx, Tag, nameof(ToData), instance.AtCorpusPath, CdmLogCode.ErrPersistModelJsonInvalidEntityPath); element = null; } if (element is ReferenceEntity referenceEntity) { // path separator can differ depending on the adapter, cover the case where path uses '/' or '\' int lastSlashLocation = location.LastIndexOf("/") > location.LastIndexOf("\\") ? location.LastIndexOf("/") : location.LastIndexOf("\\"); if (lastSlashLocation > 0) { location = location.Slice(0, lastSlashLocation); } if (referenceEntity.ModelId != null) { if (referenceModels.TryGetValue(referenceEntity.ModelId, out var savedLocation) && savedLocation != location) { Logger.Error((ResolveContext)instance.Ctx, Tag, nameof(ToData), instance.AtCorpusPath, CdmLogCode.ErrPersistModelJsonModelIdDuplication); element = null; } else if (savedLocation == null) { referenceModels[referenceEntity.ModelId] = location; referenceEntityLocations[location] = referenceEntity.ModelId; } } else if (referenceEntity.ModelId == null && referenceEntityLocations.ContainsKey(location)) { referenceEntity.ModelId = referenceEntityLocations[location]; } else { referenceEntity.ModelId = Guid.NewGuid().ToString(); referenceModels[referenceEntity.ModelId] = location; referenceEntityLocations[location] = referenceEntity.ModelId; } } } if (element != null) { obtainedEntities.Add(JToken.FromObject(element)); } else { Logger.Error((ResolveContext)instance.Ctx, Tag, nameof(ToData), instance.AtCorpusPath, CdmLogCode.ErrPersistModelJsonEntityDeclarationConversionError, entity.EntityName); } }); try { // TODO: Currently function is synchronous. Remove next line to turn it asynchronous. // Currently some functions called are not thread safe. await createdPromise; promises.Add(createdPromise); } catch (Exception ex) { Logger.Error((ResolveContext)instance.Ctx, Tag, nameof(ToData), instance.AtCorpusPath, CdmLogCode.ErrPersistModelJsonEntityDeclarationConversionFailure, entity.EntityName, ex.Message); } } await Task.WhenAll(promises); result.Entities = obtainedEntities.ToList(); } if (referenceModels.Count > 0) { result.ReferenceModels = new List <ReferenceModel>(); foreach (var referenceModel in referenceModels) { result.ReferenceModels.Add(new ReferenceModel() { Id = referenceModel.Key, Location = referenceModel.Value }); } } if (instance.Relationships != null && instance.Relationships.Count > 0) { result.Relationships = new List <SingleKeyRelationship>(); foreach (var cdmRelationship in instance.Relationships) { var relationship = await RelationshipPersistence.ToData(cdmRelationship, resOpt, options); if (relationship != null) { result.Relationships.Add(relationship); } } } result.Imports = new List <Import>(); if (instance.Imports != null && instance.Imports.Count > 0) { foreach (var element in instance.Imports) { result.Imports.Add(CdmFolder.ImportPersistence.ToData(element, resOpt, options)); } } // Importing foundations.cdm.json to resolve trait properly on manifest if (instance.Imports == null || instance.Imports.Item(Constants.FoundationsCorpusPath, checkMoniker: false) == null) { result.Imports.Add(new Import { CorpusPath = Constants.FoundationsCorpusPath }); } return(result); }