This example demonstrates how to get model structure create custom furmula and list and use it to create discover.
using System;
using PyramidAnalytics.Sdk.Api;
using PyramidAnalytics.Sdk.Client;
using PyramidAnalytics.Sdk.Model;
Main();
static void Main()
{
Configuration conf = new Configuration();
conf.BasePath = "http://mysite.com";
AuthenticationServiceApi api = new AuthenticationServiceApi(conf);
string token = api.AuthenticateUser(new UserCredentials(
username: "adminUser",
password: "abc123!"
));
Console.WriteLine("Api token : " + token);
conf.AddApiKey("paToken", token);
GlobalConfiguration.Instance = conf;
ContentServiceApi contentApi = new ContentServiceApi();
Guid folderId = getFolder(contentApi, "FolderName");
DataSourcesServiceApi dataSourcesApi = new DataSourcesServiceApi();
ConnectionSearchCriteria cssc = new ConnectionSearchCriteria(
serverSearchCriteria: new SearchCriteria(
searchValue: "In-Memory DB",
searchMatchType: SearchMatchType.Equals
),
databaseSearchCriteria: new SearchCriteria(
searchValue: "SampleDemo",
searchMatchType: SearchMatchType.Equals
),
modelSearchCriteria: new SearchCriteria(
searchValue: "SampleDemo",
searchMatchType: SearchMatchType.Contains
)
);
Guid connectionStringId = Guid.Parse(dataSourcesApi.FindModelConnection(cssc)[0].Id);
Console.WriteLine("Connection String Id : " + connectionStringId);
ThemesServiceApi themesApi = new ThemesServiceApi();
string themeId = themesApi.FindThemeByName(new SearchCriteria(searchValue: "Pyramid", searchMatchType: SearchMatchType.Contains))[0].ThemeId;
Console.WriteLine("Theme Id : " + themeId);
ModelingModel mom = dataSourcesApi.GetModelStructure(connectionStringId.ToString());
AnalyticsServiceApi analystApi = new AnalyticsServiceApi();
Guid listId = addList(analystApi, connectionStringId, folderId, mom);
Guid formulaId = addFormula(analystApi, connectionStringId, folderId, mom);
addDiscovery(analystApi, connectionStringId, folderId, formulaId, listId, themeId, mom);
}
static Guid getFolder(ContentServiceApi contentApi, string folderName)
{
ContentSearchParamsObject searchParams = new ContentSearchParamsObject(
searchString: folderName,
filterTypes: new List<ContentTypeObject> { ContentTypeObject.Folder },
searchMatchType: SearchMatchType.Equals,
searchRootFolderType: SearchRootFolderType.Private
);
List<PyramidContentItem> folders = contentApi.FindContentItem(searchParams);
Guid folderId = Guid.Parse(folders[0].Id);
Console.WriteLine("Folder id : " + folderId);
return folderId;
}
static Guid addList(AnalyticsServiceApi analystApi, Guid connectionStringId, Guid folderId, ModelingModel mom)
{
String uniqueName = getColumnUniqueNameFromModel(mom, "products", "Color");
String formulaSyntax = String.Format("{{Except({{AllMembers({0})}},{{{0}.[Multi],{0}.[NA]}})}}", uniqueName);
ListData customList = new ListData(connectionId: connectionStringId,
formulaSyntax: formulaSyntax,
itemName: "All Colors without NA and Multi",
description: "custom list item descriptions",
folderId: folderId,
parentDimension: "[products]",
parentHierarchy: uniqueName
);
Guid listId = analystApi.SetList(customList);
Console.WriteLine("List id : " + listId);
return listId;
}
static Guid addFormula(AnalyticsServiceApi analystApi, Guid connectionStringId, Guid folderId, ModelingModel mom)
{
var price = getMeasureUniqueNameFromModel(mom, "data", "price");
var quantity = getMeasureUniqueNameFromModel(mom, "data", "quantity");
FormulaData customFormula = new FormulaData(connectionId: connectionStringId,
formulaSyntax: price + "/" + quantity,
itemName: "Price By Quantity",
folderId: folderId,
parentDimension: "[measures]"
);
Guid formulaId = analystApi.SetFormula(customFormula);
Console.WriteLine("Formula id : " + formulaId);
return formulaId;
}
static void addDiscovery(AnalyticsServiceApi analystApi, Guid connectionStringId, Guid folderId, Guid formulaId, Guid listId, string themeId, ModelingModel mom)
{
DiscoverData simpleDiscovery = new DiscoverData(connectionId: connectionStringId,
itemName: "Prices by categories",
description: "Discovery item descriptions",
folderId: folderId,
themeId: themeId,
visuals: new Visuals(cartesian:// create cartesian visual
new CartesianVisual(
visualType: CartesianVisualType.StackedColumnChart,
categories: new CartesianCategoriesDropZone(new List<CartesianCategoriesHierarchyChip>
{
new CartesianCategoriesHierarchyChip(uniqueName:getColumnUniqueNameFromModel(mom,"products","product category")),
new CartesianCategoriesHierarchyChip(uniqueName:getColumnUniqueNameFromModel(mom,"products","product sub category"))
}),
values: new CartesianValuesDropZone(new List<CartesianValuesMeasureChip>
{
new CartesianValuesMeasureChip(uniqueName:formulaId.ToString())
}),
filter: new CartesianFilterDropZone(new List<CartesianFilterChip>
{
new CartesianFilterChip(hierarchy: new CartesianFilterHierarchyChip(
uniqueName:getColumnUniqueNameFromModel(mom, "customers", "country"),
filterType:FilterHierarchyType.DropDownMultiSelect
))
}),
color: new CartesianColorDropZone(new List<CartesianColorChip>
{
new CartesianColorChip(hierarchy:new CartesianColorHierarchyChip(uniqueName:getColumnUniqueNameFromModel(mom, "products", "color")))
})
)
),
elementSelections: new List<HierarchyElementSelection>
{
new HierarchyElementSelection(uniqueName:getColumnUniqueNameFromModel(mom, "products", "Color"),
all: false,
selectionsList:new List<ElementSelectionData>
{
new ElementSelectionData(selectionType: ElementSelectionDataType.List,
uniqueNames:new List<string>{ listId.ToString() }
)
}
)
}
);
Guid ret = analystApi.CreateDiscover(simpleDiscovery);
Console.WriteLine("Discovery id : " + ret);
}
static string getMeasureUniqueNameFromModel(ModelingModel mom, string tableName, string displayName)
{
return mom.Tables
.Where(t => t.DisplayName.Equals(tableName, StringComparison.OrdinalIgnoreCase))
.First().ModelingMeasures
.Where(mm => mm.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
.First().UniqueName;
}
static string getColumnUniqueNameFromModel(ModelingModel mom, string tableName, string displayName)
{
ModelingColumn? modelingColumn = mom.Tables
.Where(t => t.DisplayName.Equals(tableName, StringComparison.OrdinalIgnoreCase))
.First().ModelingColumns
.Where(mc => mc.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
.FirstOrDefault();
if (modelingColumn != null)
return modelingColumn.UniqueName;
return mom.Tables
.Where(t => t.DisplayName.Equals(tableName, StringComparison.OrdinalIgnoreCase))
.First().ModelingHierarchies
.Where(mh => mh.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase))
.First().UniqueName;
}