/// <summary> /// Initializes a new instance of the <see cref="SmartSignalResultItemPresentationSummary"/> class /// </summary> /// <param name="value">The summary value</param> /// <param name="details">The summary details</param> /// <param name="chart">The summary chart</param> public SmartSignalResultItemPresentationSummary(string value, string details, SmartSignalResultItemPresentationProperty chart) { this.Value = value; this.Details = details; this.Chart = chart; }
/// <summary> /// Creates a presentation from a result item /// </summary> /// <param name="request">The smart signal request</param> /// <param name="signalName">The signal name</param> /// <param name="smartSignalResultItem">The result item</param> /// <param name="queryRunInfo">The query run information</param> /// <returns>The presentation</returns> public static SmartSignalResultItemPresentation CreateFromResultItem(SmartSignalRequest request, string signalName, SmartSignalResultItem smartSignalResultItem, SmartSignalResultItemQueryRunInfo queryRunInfo) { // A null result item has null presentation if (smartSignalResultItem == null) { return(null); } // Create presentation elements for each result item property Dictionary <string, string> predicates = new Dictionary <string, string>(); List <SmartSignalResultItemPresentationProperty> presentationProperties = new List <SmartSignalResultItemPresentationProperty>(); SmartSignalResultItemPresentationProperty summaryChart = null; string summaryValue = null; string summaryDetails = null; Dictionary <string, string> rawProperties = new Dictionary <string, string>(); foreach (PropertyInfo property in smartSignalResultItem.GetType().GetProperties()) { // Get the property value string propertyValue = PropertyValueToString(property.GetValue(smartSignalResultItem)); rawProperties[property.Name] = propertyValue; // Check if this property is a predicate if (property.GetCustomAttribute <ResultItemPredicateAttribute>() != null) { predicates[property.Name] = propertyValue; } // Get the presentation attribute ResultItemPresentationAttribute attribute = property.GetCustomAttribute <ResultItemPresentationAttribute>(); if (attribute != null) { // Verify that if the entity is a chart or query, then query run information was provided if (queryRunInfo == null && (attribute.Section == ResultItemPresentationSection.Chart || attribute.Section == ResultItemPresentationSection.AdditionalQuery)) { throw new InvalidSmartSignalResultItemPresentationException($"The presentation contains an item for the {attribute.Section} section, but no telemetry data client was provided"); } // Get the attribute title and information balloon - support interpolated strings string attributeTitle = Smart.Format(attribute.Title, smartSignalResultItem); string attributeInfoBalloon = Smart.Format(attribute.InfoBalloon, smartSignalResultItem); // Add presentation to the summary component if (attribute.Component.HasFlag(ResultItemPresentationComponent.Summary)) { if (attribute.Section == ResultItemPresentationSection.Chart) { // Verify there is at most one summary chart if (summaryChart != null) { throw new InvalidSmartSignalResultItemPresentationException("There can be at most one summary chart for each resultItem"); } // Create the summary chart presentation property summaryChart = new SmartSignalResultItemPresentationProperty(attributeTitle, propertyValue, attribute.Section, attributeInfoBalloon); } else if (attribute.Section == ResultItemPresentationSection.Property) { // Verify there is at most one summary presentation property if (summaryValue != null) { throw new InvalidSmartSignalResultItemPresentationException("There must be exactly one summary property for each resultItem"); } // Set summary presentation elements summaryValue = propertyValue; summaryDetails = attributeTitle; } else { throw new InvalidSmartSignalResultItemPresentationException($"Invalid section for summary property {property.Name}: {attribute.Section}"); } } // Add presentation to the details component if (attribute.Component.HasFlag(ResultItemPresentationComponent.Details)) { presentationProperties.Add(new SmartSignalResultItemPresentationProperty(attributeTitle, propertyValue, attribute.Section, attributeInfoBalloon)); } } } // Verify that a summary was provided if (summaryValue == null) { throw new InvalidSmartSignalResultItemPresentationException("There must be exactly one summary property for each result item"); } string id = string.Join("##", smartSignalResultItem.GetType().FullName, JsonConvert.SerializeObject(request), JsonConvert.SerializeObject(smartSignalResultItem)).Hash(); string resourceId = smartSignalResultItem.ResourceIdentifier.ToResourceId(); string correlationHash = string.Join("##", predicates.OrderBy(x => x.Key).Select(x => x.Key + "|" + x.Value)).Hash(); // Return the presentation object return(new SmartSignalResultItemPresentation( id, smartSignalResultItem.Title, new SmartSignalResultItemPresentationSummary(summaryValue, summaryDetails, summaryChart), resourceId, correlationHash, request.SignalId, signalName, DateTime.UtcNow, (int)request.Cadence.TotalMinutes, presentationProperties, rawProperties, queryRunInfo)); }