public object AssemblePrimaryKeys( ResourceProfileData profileData, ResourceClassBase resourceClass, TemplateContext templateContext) { if (profileData == null) { throw new ArgumentNullException(nameof(profileData)); } if (resourceClass == null) { throw new ArgumentNullException(nameof(resourceClass)); } if (templateContext == null) { throw new ArgumentNullException(nameof(templateContext)); } var pks = new List <object>(); var activeResource = profileData.GetProfileActiveResource(resourceClass); var filteredResource = profileData.GetContainedResource(resourceClass) ?? resourceClass; if (resourceClass is ResourceChildItem) { pks.Add( new { HasParent = ResourceRenderer.DoRenderProperty, Property = new { PropertyName = resourceClass.GetResourceInterfaceName( templateContext.GetSchemaProperCaseNameForResource(resourceClass), templateContext.IsProfiles, templateContext.IsExtension), ReferencesWithUnifiedKey = resourceClass.References .Where(@ref => @ref.Properties.Any(rp => rp.IsUnified())) .Select(@ref => new { ReferencePropertyName = @ref.PropertyName, ReferenceFieldName = @ref.PropertyName.ToCamelCase(), UnifiedKeyProperties = @ref.Properties .Where(rp => rp.IsUnified()) .Select(rp => new { UnifiedKeyPropertyName = rp.PropertyName }) }) } }); } var props = new List <PropertyData>(); foreach (var property in activeResource.AllProperties .Where(x => x.IsIdentifying) .OrderBy(x => x.PropertyName)) { if (activeResource.IsDescriptorEntity()) { props.Add(PropertyData.CreateDerivedProperty(property)); continue; } if (activeResource.IsAggregateRoot()) { if (resourceClass.IsDerived) { props.Add(AssembleDerivedProperty(property)); } else { props.Add( property.IsPersonOrUsi() && !templateContext.IsExtension ? PropertyData.CreateUsiPrimaryKey(property) : property.HasAssociations() && !property.IsDirectLookup ? PropertyData.CreateReferencedProperty(property, resource: filteredResource) : PropertyData.CreateStandardProperty(property)); } } else { // non aggregate root if (activeResource.References.Any()) { if (property.IsPersonOrUsi()) { props.Add(PropertyData.CreateUsiPrimaryKey(property)); continue; } if (resourceClass.HasBackReferences() && resourceClass.BackReferencedProperties() .Contains(property, ModelComparers.ResourcePropertyNameOnly)) { continue; } props.Add( property.HasAssociations() && !property.IsDirectLookup ? PropertyData.CreateReferencedProperty(property) : PropertyData.CreateStandardProperty(property)); } else { props.Add(PropertyData.CreateStandardProperty(property)); } } } pks.AddRange(CreatePropertyDtos(props)); return(pks.Any() ? new { Properties = pks } : ResourceRenderer.DoNotRenderProperty); }
private IEnumerable <PropertyData> CreateProperties(ResourceClassBase resourceClass) { var allPossibleProperties = resourceClass.FilterContext.UnfilteredResourceClass?.NonIdentifyingProperties ?? resourceClass.NonIdentifyingProperties; var currentProperties = resourceClass.AllProperties; var propertyPairs = (from p in allPossibleProperties join c in currentProperties on p.PropertyName equals c.PropertyName into leftJoin from _c in leftJoin.DefaultIfEmpty() where // Non-identifying properties only !p.IsIdentifying // Exclude boilerplate "id" property && !p.PropertyName.Equals("Id") // Exclude inherited properties && !p.IsInheritedProperty() orderby p.PropertyName select new { UnderlyingProperty = p, CurrentProperty = _c }) .ToList(); foreach (var propertyPair in propertyPairs) { // If the property was filtered out, then generate an explicit interface "Null" implementation only. if (propertyPair.CurrentProperty == null) { yield return(PropertyData.CreateNullProperty(propertyPair.UnderlyingProperty)); continue; } var property = propertyPair.CurrentProperty; if (property.IsSynchronizable()) { if (resourceClass.IsDescriptorEntity()) { if (!property.IsInheritedProperty()) { yield return(AssembleDerivedProperty(property)); } } else if (property.IsDirectLookup) { yield return(PropertyData.CreateStandardProperty(property)); } else { yield return (property.HasAssociations() ? PropertyData.CreateReferencedProperty(property) : PropertyData.CreateStandardProperty(property)); } } else { if (property.HasAssociations()) { yield return(property.IsLookup ? PropertyData.CreateStandardProperty(property) : PropertyData.CreateReferencedProperty(property)); } else { yield return(PropertyData.CreateStandardProperty(property)); } } } }
public object AssembleInheritedProperties( ResourceProfileData profileData, ResourceClassBase resource) { if (profileData == null) { throw new ArgumentNullException(nameof(profileData)); } if (resource == null) { throw new ArgumentNullException(nameof(resource)); } IList <ResourcePropertyData> includedProperties = null; if (profileData.HasProfile) { includedProperties = (resource.Name == profileData.SuppliedResource.Name ? profileData.UnfilteredResource : resource).InheritedProperties() .Where(x => !x.IsIdentifying && !x.PropertyName.Equals("Id")) .OrderBy(x => x.PropertyName) .Select( x => new ResourcePropertyData { Property = x, IsStandardProperty = !profileData.IsIncluded(resource, x) }) .ToList(); } else { includedProperties = resource.InheritedProperties() .OrderBy(x => x.PropertyName) .Where(x => !x.IsIdentifying && !x.PropertyName.Equals("Id")) .Select( x => new ResourcePropertyData { Property = x, IsStandardProperty = false }) .ToList(); } var propertiesToRender = new List <PropertyData>(); if (resource.IsDescriptorEntity() && resource.InheritedProperties() .Any(x => !x.IsIdentifying && !x.PropertyName.Equals("Id"))) { propertiesToRender.AddRange( includedProperties.Select( x => { var propertyData = x.IsStandardProperty ? PropertyData.CreateNullProperty(x.Property) : PropertyData.CreateStandardProperty(x.Property); propertyData[ResourceRenderer.MiscellaneousComment] = "// NOT in a reference, NOT a lookup column "; return(propertyData); })); } else if (resource.IsDerived) { propertiesToRender.AddRange( includedProperties.Select( x => x.IsStandardProperty ? PropertyData.CreateNullProperty(x.Property) : PropertyData.CreateStandardProperty(x.Property))); } return(propertiesToRender.Any() ? new { Properties = CreatePropertyDtos(propertiesToRender) } : ResourceRenderer.DoNotRenderProperty); }