diff --git a/SetUpAggs/AW Internet Sales/AdventureWorksAggs.smproj b/SetUpAggs/AW Internet Sales/AdventureWorksAggs.smproj
new file mode 100644
index 0000000..963435a
--- /dev/null
+++ b/SetUpAggs/AW Internet Sales/AdventureWorksAggs.smproj
@@ -0,0 +1,45 @@
+
+
+ Development
+ 2.0
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}
+ Exe
+ MyRootNamespace
+ MyAssemblyName
+ false
+ bin\
+ AdventureWorksAggs
+
+
+ bin\
+ asazure://southcentralus.asazure.windows.net/chwade003
+ Developer
+ Unknown
+ AdventureWorksAg
+ Model
+ Default
+ False
+ InMemory
+ Default
+ Default
+
+
+ asazure://aspaastest14.asazure-int.windows.net/sukanyasaltsrc1
+ Developer
+ Unknown
+ AdventureWorksAggs
+ Model
+ Default
+ False
+ InMemory
+ Default
+ Default
+
+
+
+
+ Code
+
+
+
+
\ No newline at end of file
diff --git a/SetUpAggs/AW Internet Sales/Model.bim b/SetUpAggs/AW Internet Sales/Model.bim
new file mode 100644
index 0000000..7eb3e65
--- /dev/null
+++ b/SetUpAggs/AW Internet Sales/Model.bim
@@ -0,0 +1,1626 @@
+{
+ "name": "SemanticModel",
+ "compatibilityLevel": 1400,
+ "model": {
+ "defaultMode": "directQuery",
+ "culture": "en-US",
+ "dataSources": [
+ {
+ "type": "structured",
+ "name": "SQL/localhost\\SP1;AdventureWorksDW",
+ "connectionDetails": {
+ "protocol": "tds",
+ "address": {
+ "server": "chwadeaggs.database.windows.net",
+ "database": "chwadeAW"
+ },
+ "authentication": null,
+ "query": null
+ },
+ "credential": {
+ "AuthenticationKind": "UsernamePassword",
+ "kind": "SQL",
+ "path": "chwadeaggs.database.windows.net;chwadeAW",
+ "Username": "Jim",
+ "EncryptConnection": true
+ }
+ }
+ ],
+ "tables": [
+ {
+ "name": "FactInternetSales",
+ "columns": [
+ {
+ "name": "ProductKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductKey"
+ },
+ {
+ "name": "OrderDateKey",
+ "dataType": "int64",
+ "sourceColumn": "OrderDateKey"
+ },
+ {
+ "name": "DueDateKey",
+ "dataType": "int64",
+ "sourceColumn": "DueDateKey"
+ },
+ {
+ "name": "ShipDateKey",
+ "dataType": "int64",
+ "sourceColumn": "ShipDateKey"
+ },
+ {
+ "name": "CustomerKey",
+ "dataType": "int64",
+ "sourceColumn": "CustomerKey"
+ },
+ {
+ "name": "PromotionKey",
+ "dataType": "int64",
+ "sourceColumn": "PromotionKey"
+ },
+ {
+ "name": "CurrencyKey",
+ "dataType": "int64",
+ "sourceColumn": "CurrencyKey"
+ },
+ {
+ "name": "SalesTerritoryKey",
+ "dataType": "int64",
+ "sourceColumn": "SalesTerritoryKey"
+ },
+ {
+ "name": "SalesOrderNumber",
+ "dataType": "string",
+ "sourceColumn": "SalesOrderNumber"
+ },
+ {
+ "name": "SalesOrderLineNumber",
+ "dataType": "int64",
+ "sourceColumn": "SalesOrderLineNumber"
+ },
+ {
+ "name": "RevisionNumber",
+ "dataType": "int64",
+ "sourceColumn": "RevisionNumber"
+ },
+ {
+ "name": "OrderQuantity",
+ "dataType": "int64",
+ "sourceColumn": "OrderQuantity"
+ },
+ {
+ "name": "UnitPrice",
+ "dataType": "decimal",
+ "sourceColumn": "UnitPrice"
+ },
+ {
+ "name": "ExtendedAmount",
+ "dataType": "decimal",
+ "sourceColumn": "ExtendedAmount"
+ },
+ {
+ "name": "UnitPriceDiscountPct",
+ "dataType": "double",
+ "sourceColumn": "UnitPriceDiscountPct"
+ },
+ {
+ "name": "DiscountAmount",
+ "dataType": "double",
+ "sourceColumn": "DiscountAmount"
+ },
+ {
+ "name": "ProductStandardCost",
+ "dataType": "decimal",
+ "sourceColumn": "ProductStandardCost"
+ },
+ {
+ "name": "TotalProductCost",
+ "dataType": "decimal",
+ "sourceColumn": "TotalProductCost"
+ },
+ {
+ "name": "SalesAmount",
+ "dataType": "decimal",
+ "sourceColumn": "SalesAmount"
+ },
+ {
+ "name": "TaxAmt",
+ "dataType": "decimal",
+ "sourceColumn": "TaxAmt"
+ },
+ {
+ "name": "Freight",
+ "dataType": "decimal",
+ "sourceColumn": "Freight"
+ },
+ {
+ "name": "CarrierTrackingNumber",
+ "dataType": "string",
+ "sourceColumn": "CarrierTrackingNumber"
+ },
+ {
+ "name": "CustomerPONumber",
+ "dataType": "string",
+ "sourceColumn": "CustomerPONumber"
+ },
+ {
+ "name": "OrderDate",
+ "dataType": "dateTime",
+ "sourceColumn": "OrderDate",
+ "variations": [
+ {
+ "name": "Calendar Reuse",
+ "description": "Show Calendar hierarchy as field in Internet Sales",
+ "relationship": "ae49b4e7-772e-4fde-a7e4-3f5f80915766",
+ "defaultHierarchy": {
+ "table": "DimDate",
+ "hierarchy": "Calendar"
+ },
+ "isDefault": true
+ }
+ ]
+ },
+ {
+ "name": "DueDate",
+ "dataType": "dateTime",
+ "sourceColumn": "DueDate"
+ },
+ {
+ "name": "ShipDate",
+ "dataType": "dateTime",
+ "sourceColumn": "ShipDate"
+ },
+ {
+ "type": "calculated",
+ "name": "Margin",
+ "dataType": "decimal",
+ "isDataTypeInferred": true,
+ "expression": "[SalesAmount]-[TotalProductCost]",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "LastUpdateDate",
+ "dataType": "dateTime",
+ "sourceColumn": "LastUpdateDate"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "FactInternetSales",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data]",
+ "in",
+ " dbo_FactInternetSales"
+ ]
+ },
+ "annotations": [
+ {
+ "name": "QueryEditorSerialization",
+ "value": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data]",
+ "in",
+ " dbo_FactInternetSalesText]]>"
+ ]
+ }
+ ]
+ }
+ ],
+ "measures": [
+ {
+ "name": "InternetDistinctCountSalesOrder",
+ "expression": "DISTINCTCOUNT([SalesOrderNumber])",
+ "formatString": "#,0"
+ },
+ {
+ "name": "InternetOrderLinesCount",
+ "expression": "COUNTA([SalesOrderLineNumber])",
+ "formatString": "#,0"
+ },
+ {
+ "name": "InternetTotalUnits",
+ "expression": "SUM([OrderQuantity])",
+ "formatString": "#,0"
+ },
+ {
+ "name": "InternetTotalDiscountAmount",
+ "expression": "SUM([DiscountAmount])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetTotalProductCost",
+ "expression": "SUM([TotalProductCost])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetTotalSales",
+ "expression": "SUM([SalesAmount])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetTotalTaxAmt",
+ "expression": "SUM([TaxAmt])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetTotalFreight",
+ "expression": "SUM([Freight])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetTotalMargin",
+ "expression": "SUM([Margin])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetCurrentQuarterSalesPerformance",
+ "expression": "IFERROR([InternetCurrentQuarterSales]/[InternetPreviousQuarterSalesProportionToQTD],BLANK())",
+ "kpi": {
+ "targetExpression": "1.1",
+ "statusGraphic": "Shapes",
+ "statusExpression": [
+ "var x='FactInternetSales'[InternetCurrentQuarterSalesPerformance] return",
+ " if(ISBLANK(x),BLANK(),",
+ " If(x<1,-1,",
+ "\t If(x<1.07,0,1)",
+ " )",
+ " )",
+ " "
+ ],
+ "annotations": [
+ {
+ "name": "GoalType",
+ "value": "StaticValue"
+ },
+ {
+ "name": "KpiStatusType",
+ "value": "Linear"
+ },
+ {
+ "name": "KpiThresholdType",
+ "value": "Absolute"
+ },
+ {
+ "name": "KpiThresholdOrdering",
+ "value": "Ascending"
+ },
+ {
+ "name": "KpiThresholdCount",
+ "value": "2"
+ },
+ {
+ "name": "KpiThreshold_0",
+ "value": "1"
+ },
+ {
+ "name": "KpiThreshold_1",
+ "value": "1.07"
+ }
+ ]
+ },
+ "detailRowsDefinition": {}
+ },
+ {
+ "name": "InternetPreviousQuarterMargin",
+ "expression": "CALCULATE([InternetTotalMargin],PREVIOUSQUARTER('DimDate'[Date]))",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetCurrentQuarterMargin",
+ "expression": "TOTALQTD([InternetTotalMargin],'DimDate'[Date])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetPreviousQuarterMarginProportionToQTD",
+ "expression": "[InternetPreviousQuarterMargin]*([DaysCurrentQuarterToDate]/[DaysInCurrentQuarter])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetPreviousQuarterSales",
+ "expression": "CALCULATE([InternetTotalSales],PREVIOUSQUARTER('DimDate'[Date]))",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetCurrentQuarterSales",
+ "expression": "TOTALQTD([InternetTotalSales],'DimDate'[Date])",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "InternetPreviousQuarterSalesProportionToQTD",
+ "expression": "[InternetPreviousQuarterSales]*([DaysCurrentQuarterToDate]/[DaysInCurrentQuarter])",
+ "formatString": "0.00%;-0.00%;0.00%"
+ },
+ {
+ "name": "InternetCurrentQuarterMarginPerformance",
+ "expression": "IF([InternetPreviousQuarterMarginProportionToQTD]<>0,([InternetCurrentQuarterMargin]-[InternetPreviousQuarterMarginProportionToQTD])/[InternetPreviousQuarterMarginProportionToQTD],BLANK())",
+ "kpi": {
+ "targetExpression": "1.25",
+ "statusGraphic": "Shapes",
+ "statusExpression": [
+ "var x='FactInternetSales'[InternetCurrentQuarterMarginPerformance] return",
+ " if(ISBLANK(x),BLANK(),",
+ " If(x<0.8,-1,",
+ "\t If(x<1.03,0,1)",
+ " )",
+ " )",
+ " "
+ ],
+ "annotations": [
+ {
+ "name": "GoalType",
+ "value": "StaticValue"
+ },
+ {
+ "name": "KpiStatusType",
+ "value": "Linear"
+ },
+ {
+ "name": "KpiThresholdType",
+ "value": "Absolute"
+ },
+ {
+ "name": "KpiThresholdOrdering",
+ "value": "Ascending"
+ },
+ {
+ "name": "KpiThresholdCount",
+ "value": "2"
+ },
+ {
+ "name": "KpiThreshold_0",
+ "value": "0.8"
+ },
+ {
+ "name": "KpiThreshold_1",
+ "value": "1.03"
+ }
+ ]
+ },
+ "detailRowsDefinition": {}
+ },
+ {
+ "name": "YTD InternetTotalSales",
+ "expression": "CALCULATE([InternetTotalSales], DATESYTD(DimDate[Date]))",
+ "formatString": "\\$#,0;(\\$#,0);\\$#,0",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "DimCustomer",
+ "columns": [
+ {
+ "name": "CustomerKey",
+ "dataType": "int64",
+ "sourceColumn": "CustomerKey"
+ },
+ {
+ "name": "GeographyKey",
+ "dataType": "int64",
+ "sourceColumn": "GeographyKey"
+ },
+ {
+ "name": "CustomerAlternateKey",
+ "dataType": "string",
+ "sourceColumn": "CustomerAlternateKey"
+ },
+ {
+ "name": "Title",
+ "dataType": "string",
+ "sourceColumn": "Title"
+ },
+ {
+ "name": "FirstName",
+ "dataType": "string",
+ "sourceColumn": "FirstName"
+ },
+ {
+ "name": "MiddleName",
+ "dataType": "string",
+ "sourceColumn": "MiddleName"
+ },
+ {
+ "name": "LastName",
+ "dataType": "string",
+ "sourceColumn": "LastName"
+ },
+ {
+ "name": "NameStyle",
+ "dataType": "boolean",
+ "sourceColumn": "NameStyle"
+ },
+ {
+ "name": "BirthDate",
+ "dataType": "dateTime",
+ "sourceColumn": "BirthDate"
+ },
+ {
+ "name": "MaritalStatus",
+ "dataType": "string",
+ "sourceColumn": "MaritalStatus"
+ },
+ {
+ "name": "Suffix",
+ "dataType": "string",
+ "sourceColumn": "Suffix"
+ },
+ {
+ "name": "Gender",
+ "dataType": "string",
+ "sourceColumn": "Gender"
+ },
+ {
+ "name": "EmailAddress",
+ "dataType": "string",
+ "sourceColumn": "EmailAddress"
+ },
+ {
+ "name": "YearlyIncome",
+ "dataType": "decimal",
+ "sourceColumn": "YearlyIncome"
+ },
+ {
+ "name": "TotalChildren",
+ "dataType": "int64",
+ "sourceColumn": "TotalChildren"
+ },
+ {
+ "name": "NumberChildrenAtHome",
+ "dataType": "int64",
+ "sourceColumn": "NumberChildrenAtHome"
+ },
+ {
+ "name": "EnglishEducation",
+ "dataType": "string",
+ "sourceColumn": "EnglishEducation"
+ },
+ {
+ "name": "EnglishOccupation",
+ "dataType": "string",
+ "sourceColumn": "EnglishOccupation"
+ },
+ {
+ "name": "HouseOwnerFlag",
+ "dataType": "string",
+ "sourceColumn": "HouseOwnerFlag"
+ },
+ {
+ "name": "NumberCarsOwned",
+ "dataType": "int64",
+ "sourceColumn": "NumberCarsOwned"
+ },
+ {
+ "name": "AddressLine1",
+ "dataType": "string",
+ "sourceColumn": "AddressLine1"
+ },
+ {
+ "name": "AddressLine2",
+ "dataType": "string",
+ "sourceColumn": "AddressLine2"
+ },
+ {
+ "name": "Phone",
+ "dataType": "string",
+ "sourceColumn": "Phone"
+ },
+ {
+ "name": "DateFirstPurchase",
+ "dataType": "dateTime",
+ "sourceColumn": "DateFirstPurchase"
+ },
+ {
+ "name": "CommuteDistance",
+ "dataType": "string",
+ "sourceColumn": "CommuteDistance"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimCustomer",
+ "dataView": "full",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimCustomer = Source{[Schema=\"dbo\",Item=\"DimCustomer\"]}[Data],",
+ " #\"Removed Columns\" = Table.RemoveColumns(dbo_DimCustomer,{\"SpanishEducation\", \"FrenchEducation\", \"SpanishOccupation\", \"FrenchOccupation\"})",
+ "in",
+ " #\"Removed Columns\""
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "name": "DimDate",
+ "showAsVariationsOnly": true,
+ "dataCategory": "Time",
+ "columns": [
+ {
+ "name": "DateKey",
+ "dataType": "int64",
+ "sourceColumn": "DateKey"
+ },
+ {
+ "name": "Date",
+ "dataType": "dateTime",
+ "isKey": true,
+ "sourceColumn": "FullDateAlternateKey"
+ },
+ {
+ "name": "DayNumberOfWeek",
+ "dataType": "int64",
+ "sourceColumn": "DayNumberOfWeek"
+ },
+ {
+ "name": "EnglishDayNameOfWeek",
+ "dataType": "string",
+ "sourceColumn": "EnglishDayNameOfWeek"
+ },
+ {
+ "name": "DayNumberOfMonth",
+ "dataType": "int64",
+ "sourceColumn": "DayNumberOfMonth"
+ },
+ {
+ "name": "DayNumberOfYear",
+ "dataType": "int64",
+ "sourceColumn": "DayNumberOfYear"
+ },
+ {
+ "name": "WeekNumberOfYear",
+ "dataType": "int64",
+ "sourceColumn": "WeekNumberOfYear"
+ },
+ {
+ "name": "EnglishMonthName",
+ "dataType": "string",
+ "sourceColumn": "EnglishMonthName",
+ "sortByColumn": "MonthNumberOfYear"
+ },
+ {
+ "name": "MonthNumberOfYear",
+ "dataType": "int64",
+ "sourceColumn": "MonthNumberOfYear"
+ },
+ {
+ "name": "CalendarQuarter",
+ "dataType": "int64",
+ "sourceColumn": "CalendarQuarter"
+ },
+ {
+ "name": "CalendarYear",
+ "dataType": "int64",
+ "sourceColumn": "CalendarYear"
+ },
+ {
+ "name": "CalendarSemester",
+ "dataType": "int64",
+ "sourceColumn": "CalendarSemester"
+ },
+ {
+ "name": "FiscalQuarter",
+ "dataType": "int64",
+ "sourceColumn": "FiscalQuarter"
+ },
+ {
+ "name": "FiscalYear",
+ "dataType": "int64",
+ "sourceColumn": "FiscalYear"
+ },
+ {
+ "name": "FiscalSemester",
+ "dataType": "int64",
+ "sourceColumn": "FiscalSemester"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimDate",
+ "dataView": "full",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimDate = Source{[Schema=\"dbo\",Item=\"DimDate\"]}[Data],",
+ " #\"Removed Columns\" = Table.RemoveColumns(dbo_DimDate,{\"SpanishDayNameOfWeek\", \"FrenchDayNameOfWeek\", \"SpanishMonthName\", \"FrenchMonthName\"})",
+ "in",
+ " #\"Removed Columns\""
+ ]
+ }
+ }
+ ],
+ "measures": [
+ {
+ "name": "DaysCurrentQuarterToDate",
+ "expression": "COUNTROWS( DATESQTD( 'DimDate'[Date])) "
+ },
+ {
+ "name": "DaysInCurrentQuarter",
+ "expression": "COUNTROWS( DATESBETWEEN( 'DimDate'[Date], STARTOFQUARTER( LASTDATE('DimDate'[Date])), ENDOFQUARTER('DimDate'[Date])))"
+ }
+ ],
+ "hierarchies": [
+ {
+ "name": "Calendar",
+ "levels": [
+ {
+ "name": "Year",
+ "ordinal": 0,
+ "column": "CalendarYear"
+ },
+ {
+ "name": "Month",
+ "ordinal": 1,
+ "column": "EnglishMonthName"
+ },
+ {
+ "name": "Date",
+ "ordinal": 2,
+ "column": "Date"
+ }
+ ]
+ },
+ {
+ "name": "Fiscal",
+ "levels": [
+ {
+ "name": "FiscalYear",
+ "ordinal": 0,
+ "column": "FiscalYear"
+ },
+ {
+ "name": "Month",
+ "ordinal": 1,
+ "column": "EnglishMonthName"
+ },
+ {
+ "name": "Date",
+ "ordinal": 2,
+ "column": "Date"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "DimProduct",
+ "columns": [
+ {
+ "name": "ProductKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductKey"
+ },
+ {
+ "name": "ProductAlternateKey",
+ "dataType": "string",
+ "sourceColumn": "ProductAlternateKey"
+ },
+ {
+ "name": "ProductSubcategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryKey"
+ },
+ {
+ "name": "WeightUnitMeasureCode",
+ "dataType": "string",
+ "sourceColumn": "WeightUnitMeasureCode"
+ },
+ {
+ "name": "SizeUnitMeasureCode",
+ "dataType": "string",
+ "sourceColumn": "SizeUnitMeasureCode"
+ },
+ {
+ "name": "EnglishProductName",
+ "dataType": "string",
+ "sourceColumn": "EnglishProductName"
+ },
+ {
+ "name": "StandardCost",
+ "dataType": "decimal",
+ "sourceColumn": "StandardCost"
+ },
+ {
+ "name": "FinishedGoodsFlag",
+ "dataType": "boolean",
+ "sourceColumn": "FinishedGoodsFlag"
+ },
+ {
+ "name": "Color",
+ "dataType": "string",
+ "sourceColumn": "Color"
+ },
+ {
+ "name": "SafetyStockLevel",
+ "dataType": "int64",
+ "sourceColumn": "SafetyStockLevel"
+ },
+ {
+ "name": "ReorderPoint",
+ "dataType": "int64",
+ "sourceColumn": "ReorderPoint"
+ },
+ {
+ "name": "ListPrice",
+ "dataType": "decimal",
+ "sourceColumn": "ListPrice"
+ },
+ {
+ "name": "Size",
+ "dataType": "string",
+ "sourceColumn": "Size"
+ },
+ {
+ "name": "SizeRange",
+ "dataType": "string",
+ "sourceColumn": "SizeRange"
+ },
+ {
+ "name": "Weight",
+ "dataType": "double",
+ "sourceColumn": "Weight"
+ },
+ {
+ "name": "DaysToManufacture",
+ "dataType": "int64",
+ "sourceColumn": "DaysToManufacture"
+ },
+ {
+ "name": "ProductLine",
+ "dataType": "string",
+ "sourceColumn": "ProductLine"
+ },
+ {
+ "name": "DealerPrice",
+ "dataType": "decimal",
+ "sourceColumn": "DealerPrice"
+ },
+ {
+ "name": "Class",
+ "dataType": "string",
+ "sourceColumn": "Class"
+ },
+ {
+ "name": "Style",
+ "dataType": "string",
+ "sourceColumn": "Style"
+ },
+ {
+ "name": "ModelName",
+ "dataType": "string",
+ "sourceColumn": "ModelName"
+ },
+ {
+ "name": "EnglishDescription",
+ "dataType": "string",
+ "sourceColumn": "EnglishDescription"
+ },
+ {
+ "name": "StartDate",
+ "dataType": "dateTime",
+ "sourceColumn": "StartDate"
+ },
+ {
+ "name": "EndDate",
+ "dataType": "dateTime",
+ "sourceColumn": "EndDate"
+ },
+ {
+ "name": "Status",
+ "dataType": "string",
+ "sourceColumn": "Status"
+ },
+ {
+ "type": "calculated",
+ "name": "ProductSubCategoryName",
+ "dataType": "string",
+ "isDataTypeInferred": true,
+ "expression": "RELATED('DimProductSubcategory'[EnglishProductSubcategoryName]) "
+ },
+ {
+ "type": "calculated",
+ "name": "ProductCategoryName",
+ "dataType": "string",
+ "isDataTypeInferred": true,
+ "expression": "RELATED('DimProductCategory'[EnglishProductCategoryName]) "
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimProduct",
+ "dataView": "full",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimProduct = Source{[Schema=\"dbo\",Item=\"DimProduct\"]}[Data],",
+ " #\"Removed Columns\" = Table.RemoveColumns(dbo_DimProduct,{\"SpanishProductName\", \"FrenchProductName\", \"FrenchDescription\", \"ChineseDescription\", \"ArabicDescription\", \"HebrewDescription\", \"ThaiDescription\", \"GermanDescription\", \"JapaneseDescription\", \"TurkishDescription\"})",
+ "in",
+ " #\"Removed Columns\""
+ ]
+ }
+ }
+ ],
+ "hierarchies": [
+ {
+ "name": "Category",
+ "levels": [
+ {
+ "name": "Product",
+ "ordinal": 3,
+ "column": "EnglishProductName"
+ },
+ {
+ "name": "Category",
+ "ordinal": 0,
+ "column": "ProductCategoryName"
+ },
+ {
+ "name": "SubCategory",
+ "ordinal": 1,
+ "column": "ProductSubCategoryName"
+ },
+ {
+ "name": "Model",
+ "ordinal": 2,
+ "column": "ModelName"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "DimGeography",
+ "columns": [
+ {
+ "name": "GeographyKey",
+ "dataType": "int64",
+ "sourceColumn": "GeographyKey"
+ },
+ {
+ "name": "City",
+ "dataType": "string",
+ "sourceColumn": "City"
+ },
+ {
+ "name": "StateProvinceCode",
+ "dataType": "string",
+ "sourceColumn": "StateProvinceCode"
+ },
+ {
+ "name": "StateProvince",
+ "dataType": "string",
+ "sourceColumn": "StateProvinceName"
+ },
+ {
+ "name": "CountryCode",
+ "dataType": "string",
+ "sourceColumn": "CountryRegionCode"
+ },
+ {
+ "name": "Country",
+ "dataType": "string",
+ "sourceColumn": "EnglishCountryRegionName"
+ },
+ {
+ "name": "PostalCode",
+ "dataType": "string",
+ "sourceColumn": "PostalCode"
+ },
+ {
+ "name": "SalesTerritoryKey",
+ "dataType": "int64",
+ "sourceColumn": "SalesTerritoryKey"
+ },
+ {
+ "name": "IpAddressLocator",
+ "dataType": "string",
+ "sourceColumn": "IpAddressLocator"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimGeography",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimGeography = Source{[Schema=\"dbo\",Item=\"DimGeography\"]}[Data]",
+ "in",
+ " dbo_DimGeography"
+ ]
+ },
+ "annotations": [
+ {
+ "name": "QueryEditorSerialization",
+ "value": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimGeography = Source{[Schema=\"dbo\",Item=\"DimGeography\"]}[Data]",
+ "in",
+ " dbo_DimGeographyText]]>"
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "DimProductSubcategory",
+ "columns": [
+ {
+ "name": "ProductSubcategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryKey"
+ },
+ {
+ "name": "ProductSubcategoryAlternateKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryAlternateKey"
+ },
+ {
+ "name": "EnglishProductSubcategoryName",
+ "dataType": "string",
+ "sourceColumn": "EnglishProductSubcategoryName"
+ },
+ {
+ "name": "ProductCategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductCategoryKey"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimProductSubcategory",
+ "dataView": "full",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimProductSubcategory = Source{[Schema=\"dbo\",Item=\"DimProductSubcategory\"]}[Data],",
+ " #\"Removed Columns\" = Table.RemoveColumns(dbo_DimProductSubcategory,{\"SpanishProductSubcategoryName\", \"FrenchProductSubcategoryName\"})",
+ "in",
+ " #\"Removed Columns\""
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "name": "DimProductCategory",
+ "columns": [
+ {
+ "name": "ProductCategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductCategoryKey"
+ },
+ {
+ "name": "ProductCategoryAlternateKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductCategoryAlternateKey"
+ },
+ {
+ "name": "EnglishProductCategoryName",
+ "dataType": "string",
+ "sourceColumn": "EnglishProductCategoryName"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimProductCategory",
+ "dataView": "full",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_DimProductCategory = Source{[Schema=\"dbo\",Item=\"DimProductCategory\"]}[Data],",
+ " #\"Removed Columns\" = Table.RemoveColumns(dbo_DimProductCategory,{\"SpanishProductCategoryName\", \"FrenchProductCategoryName\"})",
+ "in",
+ " #\"Removed Columns\""
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "name": "FactInternetSalesAgg",
+ "columns": [
+ {
+ "name": "OrderDateKey",
+ "dataType": "int64",
+ "sourceColumn": "OrderDateKey"
+ },
+ {
+ "name": "CustomerKey",
+ "dataType": "int64",
+ "sourceColumn": "CustomerKey"
+ },
+ {
+ "name": "ProductSubcategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryKey"
+ },
+ {
+ "name": "SalesAmount_Sum",
+ "dataType": "decimal",
+ "sourceColumn": "SalesAmount_Sum"
+ },
+ {
+ "name": "UnitPrice_Sum",
+ "dataType": "decimal",
+ "sourceColumn": "UnitPrice_Sum"
+ },
+ {
+ "name": "UnitPrice_Count",
+ "dataType": "int64",
+ "sourceColumn": "UnitPrice_Count",
+ "formatString": "0"
+ },
+ {
+ "name": "FactInternetSales_Count",
+ "dataType": "int64",
+ "sourceColumn": "FactInternetSales_Count",
+ "formatString": "0"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "Partition",
+ "dataView": "full",
+ "source": {
+ "type": "m",
+ "expression": [
+ "let",
+ " Source = #\"SQL/localhost\\SP1;AdventureWorksDW\",",
+ " dbo_FactInternetSalesAgg = Source{[Schema=\"dbo\",Item=\"FactInternetSalesAgg\"]}[Data]",
+ "in",
+ " dbo_FactInternetSalesAgg"
+ ]
+ }
+ }
+ ]
+ }
+ ],
+ "relationships": [
+ {
+ "name": "eac275ef-12ed-44ab-95c5-367fe2964b7a",
+ "fromTable": "FactInternetSales",
+ "fromColumn": "CustomerKey",
+ "toTable": "DimCustomer",
+ "toColumn": "CustomerKey"
+ },
+ {
+ "name": "a5c2f953-e0a8-4f12-984a-82eba386bc31",
+ "fromTable": "FactInternetSales",
+ "fromColumn": "ProductKey",
+ "toTable": "DimProduct",
+ "toColumn": "ProductKey"
+ },
+ {
+ "name": "2f03b75d-266f-4c06-bf9a-c00a2a5fe63f",
+ "fromTable": "DimCustomer",
+ "fromColumn": "GeographyKey",
+ "toTable": "DimGeography",
+ "toColumn": "GeographyKey"
+ },
+ {
+ "name": "c3b3fe98-c83c-4340-89dc-0cdb8acba196",
+ "fromTable": "DimProduct",
+ "fromColumn": "ProductSubcategoryKey",
+ "toTable": "DimProductSubcategory",
+ "toColumn": "ProductSubcategoryKey"
+ },
+ {
+ "name": "fbe2a336-e918-4bc2-9765-da912e40e48b",
+ "fromTable": "DimProductSubcategory",
+ "fromColumn": "ProductCategoryKey",
+ "toTable": "DimProductCategory",
+ "toColumn": "ProductCategoryKey"
+ },
+ {
+ "name": "ae49b4e7-772e-4fde-a7e4-3f5f80915766",
+ "fromTable": "FactInternetSales",
+ "fromColumn": "OrderDateKey",
+ "toTable": "DimDate",
+ "toColumn": "DateKey"
+ },
+ {
+ "name": "72d7695a-23c7-4841-8127-421a75135b9b",
+ "fromTable": "FactInternetSalesAgg",
+ "fromColumn": "OrderDateKey",
+ "toTable": "DimDate",
+ "toColumn": "DateKey"
+ },
+ {
+ "name": "b8437b63-432f-4346-ab7a-c8a3402162a6",
+ "fromTable": "FactInternetSalesAgg",
+ "fromColumn": "CustomerKey",
+ "toTable": "DimCustomer",
+ "toColumn": "CustomerKey"
+ },
+ {
+ "name": "6e65c31f-3484-4301-b797-97fa8d62ebec",
+ "fromTable": "FactInternetSalesAgg",
+ "fromColumn": "ProductSubcategoryKey",
+ "toTable": "DimProductSubcategory",
+ "toColumn": "ProductSubcategoryKey"
+ }
+ ],
+ "perspectives": [
+ {
+ "name": "Internet Sales",
+ "tables": [
+ {
+ "name": "DimDate",
+ "columns": [
+ {
+ "name": "CalendarQuarter"
+ },
+ {
+ "name": "CalendarSemester"
+ },
+ {
+ "name": "CalendarYear"
+ },
+ {
+ "name": "Date"
+ },
+ {
+ "name": "DateKey"
+ },
+ {
+ "name": "DayNumberOfMonth"
+ },
+ {
+ "name": "DayNumberOfWeek"
+ },
+ {
+ "name": "DayNumberOfYear"
+ },
+ {
+ "name": "EnglishDayNameOfWeek"
+ },
+ {
+ "name": "EnglishMonthName"
+ },
+ {
+ "name": "FiscalQuarter"
+ },
+ {
+ "name": "FiscalSemester"
+ },
+ {
+ "name": "FiscalYear"
+ },
+ {
+ "name": "MonthNumberOfYear"
+ },
+ {
+ "name": "WeekNumberOfYear"
+ }
+ ],
+ "hierarchies": [
+ {
+ "name": "Calendar"
+ },
+ {
+ "name": "Fiscal"
+ }
+ ],
+ "measures": [
+ {
+ "name": "DaysCurrentQuarterToDate"
+ },
+ {
+ "name": "DaysInCurrentQuarter"
+ }
+ ]
+ },
+ {
+ "name": "DimGeography",
+ "columns": [
+ {
+ "name": "City"
+ },
+ {
+ "name": "CountryCode"
+ },
+ {
+ "name": "Country"
+ },
+ {
+ "name": "GeographyKey"
+ },
+ {
+ "name": "IpAddressLocator"
+ },
+ {
+ "name": "PostalCode"
+ },
+ {
+ "name": "SalesTerritoryKey"
+ },
+ {
+ "name": "StateProvinceCode"
+ },
+ {
+ "name": "StateProvince"
+ }
+ ]
+ },
+ {
+ "name": "DimProduct",
+ "columns": [
+ {
+ "name": "Class"
+ },
+ {
+ "name": "Color"
+ },
+ {
+ "name": "DaysToManufacture"
+ },
+ {
+ "name": "DealerPrice"
+ },
+ {
+ "name": "EndDate"
+ },
+ {
+ "name": "EnglishDescription"
+ },
+ {
+ "name": "EnglishProductName"
+ },
+ {
+ "name": "FinishedGoodsFlag"
+ },
+ {
+ "name": "ListPrice"
+ },
+ {
+ "name": "ModelName"
+ },
+ {
+ "name": "ProductAlternateKey"
+ },
+ {
+ "name": "ProductKey"
+ },
+ {
+ "name": "ProductLine"
+ },
+ {
+ "name": "ProductSubcategoryKey"
+ },
+ {
+ "name": "ReorderPoint"
+ },
+ {
+ "name": "SafetyStockLevel"
+ },
+ {
+ "name": "Size"
+ },
+ {
+ "name": "SizeRange"
+ },
+ {
+ "name": "SizeUnitMeasureCode"
+ },
+ {
+ "name": "StandardCost"
+ },
+ {
+ "name": "StartDate"
+ },
+ {
+ "name": "Status"
+ },
+ {
+ "name": "Style"
+ },
+ {
+ "name": "Weight"
+ },
+ {
+ "name": "WeightUnitMeasureCode"
+ }
+ ]
+ },
+ {
+ "name": "DimProductCategory",
+ "columns": [
+ {
+ "name": "EnglishProductCategoryName"
+ },
+ {
+ "name": "ProductCategoryAlternateKey"
+ },
+ {
+ "name": "ProductCategoryKey"
+ }
+ ]
+ },
+ {
+ "name": "DimProductSubcategory",
+ "columns": [
+ {
+ "name": "EnglishProductSubcategoryName"
+ },
+ {
+ "name": "ProductCategoryKey"
+ },
+ {
+ "name": "ProductSubcategoryAlternateKey"
+ },
+ {
+ "name": "ProductSubcategoryKey"
+ }
+ ]
+ },
+ {
+ "name": "FactInternetSales",
+ "columns": [
+ {
+ "name": "CarrierTrackingNumber"
+ },
+ {
+ "name": "CurrencyKey"
+ },
+ {
+ "name": "CustomerKey"
+ },
+ {
+ "name": "CustomerPONumber"
+ },
+ {
+ "name": "DiscountAmount"
+ },
+ {
+ "name": "DueDate"
+ },
+ {
+ "name": "DueDateKey"
+ },
+ {
+ "name": "ExtendedAmount"
+ },
+ {
+ "name": "Freight"
+ },
+ {
+ "name": "Margin"
+ },
+ {
+ "name": "OrderDate"
+ },
+ {
+ "name": "OrderDateKey"
+ },
+ {
+ "name": "OrderQuantity"
+ },
+ {
+ "name": "ProductKey"
+ },
+ {
+ "name": "ProductStandardCost"
+ },
+ {
+ "name": "PromotionKey"
+ },
+ {
+ "name": "RevisionNumber"
+ },
+ {
+ "name": "SalesAmount"
+ },
+ {
+ "name": "SalesOrderLineNumber"
+ },
+ {
+ "name": "SalesOrderNumber"
+ },
+ {
+ "name": "SalesTerritoryKey"
+ },
+ {
+ "name": "ShipDate"
+ },
+ {
+ "name": "ShipDateKey"
+ },
+ {
+ "name": "TaxAmt"
+ },
+ {
+ "name": "TotalProductCost"
+ },
+ {
+ "name": "UnitPrice"
+ },
+ {
+ "name": "UnitPriceDiscountPct"
+ }
+ ],
+ "measures": [
+ {
+ "name": "InternetCurrentQuarterMargin"
+ },
+ {
+ "name": "InternetCurrentQuarterSales"
+ },
+ {
+ "name": "InternetDistinctCountSalesOrder"
+ },
+ {
+ "name": "InternetOrderLinesCount"
+ },
+ {
+ "name": "InternetPreviousQuarterMargin"
+ },
+ {
+ "name": "InternetPreviousQuarterMarginProportionToQTD"
+ },
+ {
+ "name": "InternetPreviousQuarterSales"
+ },
+ {
+ "name": "InternetPreviousQuarterSalesProportionToQTD"
+ },
+ {
+ "name": "InternetTotalDiscountAmount"
+ },
+ {
+ "name": "InternetTotalFreight"
+ },
+ {
+ "name": "InternetTotalMargin"
+ },
+ {
+ "name": "InternetTotalProductCost"
+ },
+ {
+ "name": "InternetTotalSales"
+ },
+ {
+ "name": "InternetTotalTaxAmt"
+ },
+ {
+ "name": "InternetTotalUnits"
+ },
+ {
+ "name": "InternetCurrentQuarterMarginPerformance"
+ },
+ {
+ "name": "InternetCurrentQuarterSalesPerformance"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "expressions": [
+ {
+ "name": "RangeStart",
+ "kind": "m",
+ "expression": [
+ "let",
+ " Source = #datetime(2013, 6, 1, 0, 0, 0) meta [IsParameterQuery=true, Type=\"DateTime\", IsParameterQueryRequired=true]",
+ "in",
+ " Source"
+ ]
+ },
+ {
+ "name": "RangeEnd",
+ "kind": "m",
+ "expression": [
+ "let",
+ " Source = #datetime(2013, 6, 8, 0, 0, 0) meta [IsParameterQuery=true, Type=\"DateTime\", IsParameterQueryRequired=true]",
+ "in",
+ " Source"
+ ]
+ }
+ ],
+ "annotations": [
+ {
+ "name": "ClientCompatibilityLevel",
+ "value": "500"
+ }
+ ]
+ },
+ "id": "SemanticModel"
+}
\ No newline at end of file
diff --git a/SetUpAggs/AdventureWorksAggsProvider/AdventureWorksAggsProvider.smproj b/SetUpAggs/AdventureWorksAggsProvider/AdventureWorksAggsProvider.smproj
new file mode 100644
index 0000000..13c4019
--- /dev/null
+++ b/SetUpAggs/AdventureWorksAggsProvider/AdventureWorksAggsProvider.smproj
@@ -0,0 +1,45 @@
+
+
+ Development
+ 2.0
+ {274b7b29-6eae-44ce-a06b-ed91f1e52734}
+ Exe
+ MyRootNamespace
+ MyAssemblyName
+ false
+ bin\
+ AdventureWorksAggsProvider
+
+
+ bin\
+ asazure://southcentralus.asazure.windows.net/chwade003
+ Developer
+ Unknown
+ AdventureWorksAggsProvider_PH
+ Model
+ Default
+ False
+ Default
+ InMemory
+ Default
+
+
+ asazure://aspaastest14.asazure-int.windows.net/sukanyasaltsrc1
+ Developer
+ Unknown
+ AdventureWorksAggsProvider
+ Model
+ Default
+ False
+ Default
+ InMemory
+ Default
+
+
+
+
+ Code
+
+
+
+
\ No newline at end of file
diff --git a/SetUpAggs/AdventureWorksAggsProvider/Model.bim b/SetUpAggs/AdventureWorksAggsProvider/Model.bim
new file mode 100644
index 0000000..84698fb
--- /dev/null
+++ b/SetUpAggs/AdventureWorksAggsProvider/Model.bim
@@ -0,0 +1,1263 @@
+{
+ "name": "SemanticModel",
+ "compatibilityLevel": 1400,
+ "model": {
+ "defaultMode": "directQuery",
+ "culture": "en-US",
+ "dataSources": [
+ {
+ "name": "SqlServer chwadeaggs.database.windows.net chwadeAW",
+ "connectionString": "Provider=SQLNCLI11;Data Source=chwadeaggs.database.windows.net;Initial Catalog=chwadeAW;User ID=Jim;Persist Security Info=true",
+ "impersonationMode": "impersonateServiceAccount",
+ "annotations": [
+ {
+ "name": "ConnectionEditUISource",
+ "value": "SqlServer"
+ }
+ ]
+ }
+ ],
+ "tables": [
+ {
+ "name": "DimCustomer",
+ "columns": [
+ {
+ "name": "CustomerKey",
+ "dataType": "int64",
+ "sourceColumn": "CustomerKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "GeographyKey",
+ "dataType": "int64",
+ "sourceColumn": "GeographyKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "CustomerAlternateKey",
+ "dataType": "string",
+ "sourceColumn": "CustomerAlternateKey",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "Title",
+ "dataType": "string",
+ "sourceColumn": "Title",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FirstName",
+ "dataType": "string",
+ "sourceColumn": "FirstName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "MiddleName",
+ "dataType": "string",
+ "sourceColumn": "MiddleName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "LastName",
+ "dataType": "string",
+ "sourceColumn": "LastName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "NameStyle",
+ "dataType": "boolean",
+ "sourceColumn": "NameStyle",
+ "formatString": "\"TRUE\";\"TRUE\";\"FALSE\"",
+ "sourceProviderType": "Boolean"
+ },
+ {
+ "name": "BirthDate",
+ "dataType": "dateTime",
+ "sourceColumn": "BirthDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBDate"
+ },
+ {
+ "name": "MaritalStatus",
+ "dataType": "string",
+ "sourceColumn": "MaritalStatus",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "Suffix",
+ "dataType": "string",
+ "sourceColumn": "Suffix",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "Gender",
+ "dataType": "string",
+ "sourceColumn": "Gender",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "EmailAddress",
+ "dataType": "string",
+ "sourceColumn": "EmailAddress",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "YearlyIncome",
+ "dataType": "decimal",
+ "sourceColumn": "YearlyIncome",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "TotalChildren",
+ "dataType": "int64",
+ "sourceColumn": "TotalChildren",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "NumberChildrenAtHome",
+ "dataType": "int64",
+ "sourceColumn": "NumberChildrenAtHome",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "EnglishEducation",
+ "dataType": "string",
+ "sourceColumn": "EnglishEducation",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishEducation",
+ "dataType": "string",
+ "sourceColumn": "SpanishEducation",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchEducation",
+ "dataType": "string",
+ "sourceColumn": "FrenchEducation",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "EnglishOccupation",
+ "dataType": "string",
+ "sourceColumn": "EnglishOccupation",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishOccupation",
+ "dataType": "string",
+ "sourceColumn": "SpanishOccupation",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchOccupation",
+ "dataType": "string",
+ "sourceColumn": "FrenchOccupation",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "HouseOwnerFlag",
+ "dataType": "string",
+ "sourceColumn": "HouseOwnerFlag",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "NumberCarsOwned",
+ "dataType": "int64",
+ "sourceColumn": "NumberCarsOwned",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "AddressLine1",
+ "dataType": "string",
+ "sourceColumn": "AddressLine1",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "AddressLine2",
+ "dataType": "string",
+ "sourceColumn": "AddressLine2",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "Phone",
+ "dataType": "string",
+ "sourceColumn": "Phone",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "DateFirstPurchase",
+ "dataType": "dateTime",
+ "sourceColumn": "DateFirstPurchase",
+ "formatString": "General Date",
+ "sourceProviderType": "DBDate"
+ },
+ {
+ "name": "CommuteDistance",
+ "dataType": "string",
+ "sourceColumn": "CommuteDistance",
+ "sourceProviderType": "WChar"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimCustomer",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[DimCustomer].* FROM [dbo].[DimCustomer] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[DimCustomer].* FROM [dbo].[DimCustomer] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "DimCustomer"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "DimDate",
+ "columns": [
+ {
+ "name": "DateKey",
+ "dataType": "int64",
+ "sourceColumn": "DateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "FullDateAlternateKey",
+ "dataType": "dateTime",
+ "sourceColumn": "FullDateAlternateKey",
+ "formatString": "General Date",
+ "sourceProviderType": "DBDate"
+ },
+ {
+ "name": "DayNumberOfWeek",
+ "dataType": "int64",
+ "sourceColumn": "DayNumberOfWeek",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "EnglishDayNameOfWeek",
+ "dataType": "string",
+ "sourceColumn": "EnglishDayNameOfWeek",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishDayNameOfWeek",
+ "dataType": "string",
+ "sourceColumn": "SpanishDayNameOfWeek",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchDayNameOfWeek",
+ "dataType": "string",
+ "sourceColumn": "FrenchDayNameOfWeek",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "DayNumberOfMonth",
+ "dataType": "int64",
+ "sourceColumn": "DayNumberOfMonth",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "DayNumberOfYear",
+ "dataType": "int64",
+ "sourceColumn": "DayNumberOfYear",
+ "sourceProviderType": "SmallInt"
+ },
+ {
+ "name": "WeekNumberOfYear",
+ "dataType": "int64",
+ "sourceColumn": "WeekNumberOfYear",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "EnglishMonthName",
+ "dataType": "string",
+ "sourceColumn": "EnglishMonthName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishMonthName",
+ "dataType": "string",
+ "sourceColumn": "SpanishMonthName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchMonthName",
+ "dataType": "string",
+ "sourceColumn": "FrenchMonthName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "MonthNumberOfYear",
+ "dataType": "int64",
+ "sourceColumn": "MonthNumberOfYear",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "CalendarQuarter",
+ "dataType": "int64",
+ "sourceColumn": "CalendarQuarter",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "CalendarYear",
+ "dataType": "int64",
+ "sourceColumn": "CalendarYear",
+ "sourceProviderType": "SmallInt"
+ },
+ {
+ "name": "CalendarSemester",
+ "dataType": "int64",
+ "sourceColumn": "CalendarSemester",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "FiscalQuarter",
+ "dataType": "int64",
+ "sourceColumn": "FiscalQuarter",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "FiscalYear",
+ "dataType": "int64",
+ "sourceColumn": "FiscalYear",
+ "sourceProviderType": "SmallInt"
+ },
+ {
+ "name": "FiscalSemester",
+ "dataType": "int64",
+ "sourceColumn": "FiscalSemester",
+ "sourceProviderType": "UnsignedTinyInt"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimDate",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[DimDate].* FROM [dbo].[DimDate] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[DimDate].* FROM [dbo].[DimDate] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "DimDate"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "DimGeography",
+ "columns": [
+ {
+ "name": "GeographyKey",
+ "dataType": "int64",
+ "sourceColumn": "GeographyKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "City",
+ "dataType": "string",
+ "sourceColumn": "City",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "StateProvinceCode",
+ "dataType": "string",
+ "sourceColumn": "StateProvinceCode",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "StateProvinceName",
+ "dataType": "string",
+ "sourceColumn": "StateProvinceName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "CountryRegionCode",
+ "dataType": "string",
+ "sourceColumn": "CountryRegionCode",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "EnglishCountryRegionName",
+ "dataType": "string",
+ "sourceColumn": "EnglishCountryRegionName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishCountryRegionName",
+ "dataType": "string",
+ "sourceColumn": "SpanishCountryRegionName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchCountryRegionName",
+ "dataType": "string",
+ "sourceColumn": "FrenchCountryRegionName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "PostalCode",
+ "dataType": "string",
+ "sourceColumn": "PostalCode",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SalesTerritoryKey",
+ "dataType": "int64",
+ "sourceColumn": "SalesTerritoryKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "IpAddressLocator",
+ "dataType": "string",
+ "sourceColumn": "IpAddressLocator",
+ "sourceProviderType": "WChar"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimGeography",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[DimGeography].* FROM [dbo].[DimGeography] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[DimGeography].* FROM [dbo].[DimGeography] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "DimGeography"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "DimProduct",
+ "columns": [
+ {
+ "name": "ProductKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "ProductAlternateKey",
+ "dataType": "string",
+ "sourceColumn": "ProductAlternateKey",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "ProductSubcategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "WeightUnitMeasureCode",
+ "dataType": "string",
+ "sourceColumn": "WeightUnitMeasureCode",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SizeUnitMeasureCode",
+ "dataType": "string",
+ "sourceColumn": "SizeUnitMeasureCode",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "EnglishProductName",
+ "dataType": "string",
+ "sourceColumn": "EnglishProductName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishProductName",
+ "dataType": "string",
+ "sourceColumn": "SpanishProductName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchProductName",
+ "dataType": "string",
+ "sourceColumn": "FrenchProductName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "StandardCost",
+ "dataType": "decimal",
+ "sourceColumn": "StandardCost",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "FinishedGoodsFlag",
+ "dataType": "boolean",
+ "sourceColumn": "FinishedGoodsFlag",
+ "formatString": "\"TRUE\";\"TRUE\";\"FALSE\"",
+ "sourceProviderType": "Boolean"
+ },
+ {
+ "name": "Color",
+ "dataType": "string",
+ "sourceColumn": "Color",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SafetyStockLevel",
+ "dataType": "int64",
+ "sourceColumn": "SafetyStockLevel",
+ "sourceProviderType": "SmallInt"
+ },
+ {
+ "name": "ReorderPoint",
+ "dataType": "int64",
+ "sourceColumn": "ReorderPoint",
+ "sourceProviderType": "SmallInt"
+ },
+ {
+ "name": "ListPrice",
+ "dataType": "decimal",
+ "sourceColumn": "ListPrice",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "Size",
+ "dataType": "string",
+ "sourceColumn": "Size",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SizeRange",
+ "dataType": "string",
+ "sourceColumn": "SizeRange",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "Weight",
+ "dataType": "double",
+ "sourceColumn": "Weight",
+ "sourceProviderType": "Double"
+ },
+ {
+ "name": "DaysToManufacture",
+ "dataType": "int64",
+ "sourceColumn": "DaysToManufacture",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "ProductLine",
+ "dataType": "string",
+ "sourceColumn": "ProductLine",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "DealerPrice",
+ "dataType": "decimal",
+ "sourceColumn": "DealerPrice",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "Class",
+ "dataType": "string",
+ "sourceColumn": "Class",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "Style",
+ "dataType": "string",
+ "sourceColumn": "Style",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "ModelName",
+ "dataType": "string",
+ "sourceColumn": "ModelName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "EnglishDescription",
+ "dataType": "string",
+ "sourceColumn": "EnglishDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchDescription",
+ "dataType": "string",
+ "sourceColumn": "FrenchDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "ChineseDescription",
+ "dataType": "string",
+ "sourceColumn": "ChineseDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "ArabicDescription",
+ "dataType": "string",
+ "sourceColumn": "ArabicDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "HebrewDescription",
+ "dataType": "string",
+ "sourceColumn": "HebrewDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "ThaiDescription",
+ "dataType": "string",
+ "sourceColumn": "ThaiDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "GermanDescription",
+ "dataType": "string",
+ "sourceColumn": "GermanDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "JapaneseDescription",
+ "dataType": "string",
+ "sourceColumn": "JapaneseDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "TurkishDescription",
+ "dataType": "string",
+ "sourceColumn": "TurkishDescription",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "StartDate",
+ "dataType": "dateTime",
+ "sourceColumn": "StartDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBTimeStamp"
+ },
+ {
+ "name": "EndDate",
+ "dataType": "dateTime",
+ "sourceColumn": "EndDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBTimeStamp"
+ },
+ {
+ "name": "Status",
+ "dataType": "string",
+ "sourceColumn": "Status",
+ "sourceProviderType": "WChar"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimProduct",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[DimProduct].* FROM [dbo].[DimProduct] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[DimProduct].* FROM [dbo].[DimProduct] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "DimProduct"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "DimProductCategory",
+ "columns": [
+ {
+ "name": "ProductCategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductCategoryKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "ProductCategoryAlternateKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductCategoryAlternateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "EnglishProductCategoryName",
+ "dataType": "string",
+ "sourceColumn": "EnglishProductCategoryName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishProductCategoryName",
+ "dataType": "string",
+ "sourceColumn": "SpanishProductCategoryName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchProductCategoryName",
+ "dataType": "string",
+ "sourceColumn": "FrenchProductCategoryName",
+ "sourceProviderType": "WChar"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimProductCategory",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[DimProductCategory].* FROM [dbo].[DimProductCategory] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[DimProductCategory].* FROM [dbo].[DimProductCategory] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "DimProductCategory"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "DimProductSubcategory",
+ "columns": [
+ {
+ "name": "ProductSubcategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "ProductSubcategoryAlternateKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryAlternateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "EnglishProductSubcategoryName",
+ "dataType": "string",
+ "sourceColumn": "EnglishProductSubcategoryName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SpanishProductSubcategoryName",
+ "dataType": "string",
+ "sourceColumn": "SpanishProductSubcategoryName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "FrenchProductSubcategoryName",
+ "dataType": "string",
+ "sourceColumn": "FrenchProductSubcategoryName",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "ProductCategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductCategoryKey",
+ "sourceProviderType": "Integer"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "DimProductSubcategory",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[DimProductSubcategory].* FROM [dbo].[DimProductSubcategory] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[DimProductSubcategory].* FROM [dbo].[DimProductSubcategory] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "DimProductSubcategory"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "FactInternetSales",
+ "columns": [
+ {
+ "name": "ProductKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "OrderDateKey",
+ "dataType": "int64",
+ "sourceColumn": "OrderDateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "DueDateKey",
+ "dataType": "int64",
+ "sourceColumn": "DueDateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "ShipDateKey",
+ "dataType": "int64",
+ "sourceColumn": "ShipDateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "CustomerKey",
+ "dataType": "int64",
+ "sourceColumn": "CustomerKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "PromotionKey",
+ "dataType": "int64",
+ "sourceColumn": "PromotionKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "CurrencyKey",
+ "dataType": "int64",
+ "sourceColumn": "CurrencyKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "SalesTerritoryKey",
+ "dataType": "int64",
+ "sourceColumn": "SalesTerritoryKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "SalesOrderNumber",
+ "dataType": "string",
+ "sourceColumn": "SalesOrderNumber",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "SalesOrderLineNumber",
+ "dataType": "int64",
+ "sourceColumn": "SalesOrderLineNumber",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "RevisionNumber",
+ "dataType": "int64",
+ "sourceColumn": "RevisionNumber",
+ "sourceProviderType": "UnsignedTinyInt"
+ },
+ {
+ "name": "OrderQuantity",
+ "dataType": "int64",
+ "sourceColumn": "OrderQuantity",
+ "sourceProviderType": "SmallInt"
+ },
+ {
+ "name": "UnitPrice",
+ "dataType": "decimal",
+ "sourceColumn": "UnitPrice",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "ExtendedAmount",
+ "dataType": "decimal",
+ "sourceColumn": "ExtendedAmount",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "UnitPriceDiscountPct",
+ "dataType": "double",
+ "sourceColumn": "UnitPriceDiscountPct",
+ "sourceProviderType": "Double"
+ },
+ {
+ "name": "DiscountAmount",
+ "dataType": "double",
+ "sourceColumn": "DiscountAmount",
+ "sourceProviderType": "Double"
+ },
+ {
+ "name": "ProductStandardCost",
+ "dataType": "decimal",
+ "sourceColumn": "ProductStandardCost",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "TotalProductCost",
+ "dataType": "decimal",
+ "sourceColumn": "TotalProductCost",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "SalesAmount",
+ "dataType": "decimal",
+ "sourceColumn": "SalesAmount",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "TaxAmt",
+ "dataType": "decimal",
+ "sourceColumn": "TaxAmt",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "Freight",
+ "dataType": "decimal",
+ "sourceColumn": "Freight",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "CarrierTrackingNumber",
+ "dataType": "string",
+ "sourceColumn": "CarrierTrackingNumber",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "CustomerPONumber",
+ "dataType": "string",
+ "sourceColumn": "CustomerPONumber",
+ "sourceProviderType": "WChar"
+ },
+ {
+ "name": "OrderDate",
+ "dataType": "dateTime",
+ "sourceColumn": "OrderDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBTimeStamp"
+ },
+ {
+ "name": "DueDate",
+ "dataType": "dateTime",
+ "sourceColumn": "DueDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBTimeStamp"
+ },
+ {
+ "name": "ShipDate",
+ "dataType": "dateTime",
+ "sourceColumn": "ShipDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBTimeStamp"
+ },
+ {
+ "name": "LastUpdateDate",
+ "dataType": "dateTime",
+ "sourceColumn": "LastUpdateDate",
+ "formatString": "General Date",
+ "sourceProviderType": "DBTimeStamp"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "FactInternetSales",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[FactInternetSales].* FROM [dbo].[FactInternetSales] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[FactInternetSales].* FROM [dbo].[FactInternetSales] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "FactInternetSales"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ },
+ {
+ "name": "FactInternetSalesAgg",
+ "columns": [
+ {
+ "name": "OrderDateKey",
+ "dataType": "int64",
+ "sourceColumn": "OrderDateKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "CustomerKey",
+ "dataType": "int64",
+ "sourceColumn": "CustomerKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "ProductSubcategoryKey",
+ "dataType": "int64",
+ "sourceColumn": "ProductSubcategoryKey",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "SalesAmount_Sum",
+ "dataType": "decimal",
+ "sourceColumn": "SalesAmount_Sum",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "UnitPrice_Sum",
+ "dataType": "decimal",
+ "sourceColumn": "UnitPrice_Sum",
+ "formatString": "\\$#,0.00;(\\$#,0.00);\\$#,0.00",
+ "sourceProviderType": "Currency",
+ "annotations": [
+ {
+ "name": "Format",
+ "value": ""
+ }
+ ]
+ },
+ {
+ "name": "UnitPrice_Count",
+ "dataType": "int64",
+ "sourceColumn": "UnitPrice_Count",
+ "sourceProviderType": "Integer"
+ },
+ {
+ "name": "FactInternetSales_Count",
+ "dataType": "int64",
+ "sourceColumn": "FactInternetSales_Count",
+ "sourceProviderType": "Integer"
+ }
+ ],
+ "partitions": [
+ {
+ "name": "FactInternetSalesAgg",
+ "dataView": "full",
+ "source": {
+ "query": " SELECT [dbo].[FactInternetSalesAgg].* FROM [dbo].[FactInternetSalesAgg] ",
+ "dataSource": "SqlServer chwadeaggs.database.windows.net chwadeAW"
+ }
+ }
+ ],
+ "annotations": [
+ {
+ "name": "_TM_ExtProp_QueryDefinition",
+ "value": " SELECT [dbo].[FactInternetSalesAgg].* FROM [dbo].[FactInternetSalesAgg] "
+ },
+ {
+ "name": "_TM_ExtProp_DbTableName",
+ "value": "FactInternetSalesAgg"
+ },
+ {
+ "name": "_TM_ExtProp_DbSchemaName",
+ "value": "dbo"
+ }
+ ]
+ }
+ ],
+ "relationships": [
+ {
+ "name": "765aed4a-99a1-4e12-b9d3-89eaf354ed45",
+ "fromTable": "DimCustomer",
+ "fromColumn": "GeographyKey",
+ "toTable": "DimGeography",
+ "toColumn": "GeographyKey"
+ },
+ {
+ "name": "e2140f6e-071b-49f4-834f-fbc1e24d0ad4",
+ "fromTable": "DimProduct",
+ "fromColumn": "ProductSubcategoryKey",
+ "toTable": "DimProductSubcategory",
+ "toColumn": "ProductSubcategoryKey"
+ },
+ {
+ "name": "74ba0d0a-0c14-4e2b-9039-6b22915bcd1a",
+ "fromTable": "DimProductSubcategory",
+ "fromColumn": "ProductCategoryKey",
+ "toTable": "DimProductCategory",
+ "toColumn": "ProductCategoryKey"
+ },
+ {
+ "name": "87da72af-3d4e-4db5-9b4f-68ff5ab46f8e",
+ "fromTable": "FactInternetSales",
+ "fromColumn": "CustomerKey",
+ "toTable": "DimCustomer",
+ "toColumn": "CustomerKey"
+ },
+ {
+ "name": "812b8a30-9510-4748-aa13-33049751b839",
+ "fromTable": "FactInternetSales",
+ "fromColumn": "OrderDateKey",
+ "toTable": "DimDate",
+ "toColumn": "DateKey"
+ },
+ {
+ "name": "5014d792-e9f6-4a74-9fbe-ecdcd2190ac1",
+ "fromTable": "FactInternetSales",
+ "fromColumn": "ProductKey",
+ "toTable": "DimProduct",
+ "toColumn": "ProductKey"
+ },
+ {
+ "name": "0d09d702-9b79-4f5a-b163-f1519ed64f16",
+ "fromTable": "FactInternetSalesAgg",
+ "fromColumn": "OrderDateKey",
+ "toTable": "DimDate",
+ "toColumn": "DateKey"
+ },
+ {
+ "name": "98080ee4-523f-4353-a1d8-5278ce1511f1",
+ "fromTable": "FactInternetSalesAgg",
+ "fromColumn": "CustomerKey",
+ "toTable": "DimCustomer",
+ "toColumn": "CustomerKey"
+ },
+ {
+ "name": "575c575c-0564-4022-a6cd-95abcabefe37",
+ "fromTable": "FactInternetSalesAgg",
+ "fromColumn": "ProductSubcategoryKey",
+ "toTable": "DimProductSubcategory",
+ "toColumn": "ProductSubcategoryKey"
+ }
+ ],
+ "annotations": [
+ {
+ "name": "ClientCompatibilityLevel",
+ "value": "500"
+ }
+ ]
+ },
+ "id": "SemanticModel"
+}
\ No newline at end of file
diff --git a/SetUpAggs/AggsConfig.json b/SetUpAggs/AggsConfig.json
new file mode 100644
index 0000000..3460c5e
--- /dev/null
+++ b/SetUpAggs/AggsConfig.json
@@ -0,0 +1,74 @@
+{
+ "database": {
+ "name": "AdventureWorksAggsProvider_PH",
+ "tables": [
+ {
+ "name": "DimGeography",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimCustomer",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimDate",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimProductSubcategory",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimProductCategory",
+ "mode": "Dual"
+ },
+ {
+ "name": "FactInternetSalesAgg",
+ "mode": "Import",
+ "aggregationRules": [
+ {
+ "aggTableColumn": "OrderDateKey",
+ "summarization": "GroupBy",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "OrderDateKey"
+ },
+ {
+ "aggTableColumn": "CustomerKey",
+ "summarization": "GroupBy",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "CustomerKey"
+ },
+ {
+ "aggTableColumn": "ProductSubcategoryKey",
+ "summarization": "GroupBy",
+ "detailTable": "DimProduct",
+ "detailTableColumn": "ProductSubcategoryKey"
+ },
+ {
+ "aggTableColumn": "SalesAmount_Sum",
+ "summarization": "Sum",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "SalesAmount"
+ },
+ {
+ "aggTableColumn": "UnitPrice_Sum",
+ "summarization": "Min",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "UnitPrice"
+ },
+ {
+ "aggTableColumn": "UnitPrice_Count",
+ "summarization": "Count",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "UnitPrice"
+ },
+ {
+ "aggTableColumn": "FactInternetSales_Count",
+ "summarization": "CountTableRows",
+ "detailTable": "FactInternetSales"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/SetUpAggs/AggsConfig2.json b/SetUpAggs/AggsConfig2.json
new file mode 100644
index 0000000..0c40309
--- /dev/null
+++ b/SetUpAggs/AggsConfig2.json
@@ -0,0 +1,74 @@
+{
+ "database": {
+ "name": "AdventureWorksAggsProvider_PH",
+ "tables": [
+ {
+ "name": "DimGeography",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimCustomer",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimDate",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimProductSubcategory",
+ "mode": "Dual"
+ },
+ {
+ "name": "DimProductCategory",
+ "mode": "Dual"
+ },
+ {
+ "name": "FactInternetSalesAgg",
+ "mode": "Import",
+ "aggregationRules": [
+ {
+ "aggTableColumn": "OrderDateKey",
+ "summarization": "GroupBy",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "OrderDateKey"
+ },
+ {
+ "aggTableColumn": "CustomerKey",
+ "summarization": "GroupBy",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "CustomerKey"
+ },
+ {
+ "aggTableColumn": "ProductSubcategoryKey",
+ "summarization": "GroupBy",
+ "detailTable": "DimProduct",
+ "detailTableColumn": "ProductSubcategoryKey"
+ },
+ {
+ "aggTableColumn": "SalesAmount_Sum",
+ "summarization": "Sum",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "SalesAmount"
+ },
+ {
+ "aggTableColumn": "UnitPrice_Sum",
+ "summarization": "Sum",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "UnitPrice"
+ },
+ {
+ "aggTableColumn": "UnitPrice_Count",
+ "summarization": "Count",
+ "detailTable": "FactInternetSales",
+ "detailTableColumn": "UnitPrice"
+ },
+ {
+ "aggTableColumn": "FactInternetSales_Count",
+ "summarization": "CountTableRows",
+ "detailTable": "FactInternetSales"
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/SetUpAggs/App.config b/SetUpAggs/App.config
new file mode 100644
index 0000000..731f6de
--- /dev/null
+++ b/SetUpAggs/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SetUpAggs/Program.cs b/SetUpAggs/Program.cs
new file mode 100644
index 0000000..7a5e16b
--- /dev/null
+++ b/SetUpAggs/Program.cs
@@ -0,0 +1,463 @@
+using Microsoft.AnalysisServices.Tabular;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using PowerArgs;
+using System.Globalization;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+
+namespace SetUpAggs
+{
+ #region JsonHelper Class
+
+ public static class JsonHelper
+ {
+ public static string FromClass(T data, bool isEmptyToNull = false,
+ JsonSerializerSettings jsonSettings = null)
+ {
+ string response = string.Empty;
+
+ if (!EqualityComparer.Default.Equals(data, default(T)))
+ response = JsonConvert.SerializeObject(data, jsonSettings);
+
+ return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
+ }
+
+ public static T ToClass(string data, JsonSerializerSettings jsonSettings = null)
+ {
+ var response = default(T);
+
+ if (!string.IsNullOrEmpty(data))
+ response = jsonSettings == null
+ ? JsonConvert.DeserializeObject(data)
+ : JsonConvert.DeserializeObject(data, jsonSettings);
+
+ return response;
+ }
+ }
+ #endregion
+
+ #region Json Configuration Classes
+
+ public partial class AggsConfiguration
+ {
+ [JsonProperty("database")]
+ public Database Database { get; set; }
+ }
+
+ public partial class Database
+ {
+ [JsonProperty("name")]
+ public string Name { get; set; }
+
+ [JsonProperty("tables")]
+ public Table[] Tables { get; set; }
+ }
+
+ public partial class Table
+ {
+ [JsonProperty("name")]
+ public string Name { get; set; }
+
+ [JsonProperty("mode")]
+ public string Mode { get; set; }
+
+ [JsonProperty("aggregationRules", NullValueHandling = NullValueHandling.Ignore)]
+ public AggregationRule[] AggregationRules { get; set; }
+ }
+
+ public partial class AggregationRule
+ {
+ [JsonProperty("aggTableColumn")]
+ public string AggTableColumn { get; set; }
+
+ [JsonProperty("summarization")]
+ public string Summarization { get; set; }
+
+ [JsonProperty("detailTable")]
+ public string DetailTable { get; set; }
+
+ [JsonProperty("detailTableColumn", NullValueHandling = NullValueHandling.Ignore)]
+ public string DetailTableColumn { get; set; }
+ }
+
+ public partial class Object
+ {
+ [JsonProperty("database")]
+ public string Database { get; set; }
+ }
+
+ public partial class AggsConfiguration
+ {
+ public static AggsConfiguration FromJson(string json) => JsonConvert.DeserializeObject(json, SetUpAggs.Converter.Settings);
+ }
+
+ public static class Serialize
+ {
+ public static string ToJson(this AggsConfiguration self) => JsonConvert.SerializeObject(self, SetUpAggs.Converter.Settings);
+ }
+
+ internal static class Converter
+ {
+ public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
+ {
+ MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
+ DateParseHandling = DateParseHandling.None,
+ Converters =
+ {
+ new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
+ },
+ };
+ }
+ #endregion
+
+ #region Command Line Utility Arguments Handling
+
+ [ArgExceptionBehavior(ArgExceptionPolicy.StandardExceptionHandling)]
+ public class AggConfigurationUtility
+ {
+ Microsoft.AnalysisServices.Tabular.Server server = new Microsoft.AnalysisServices.Tabular.Server();
+ Microsoft.AnalysisServices.Tabular.Database database = new Microsoft.AnalysisServices.Tabular.Database();
+ AggsConfiguration aggsConfig;
+
+ [HelpHook, ArgShortcut("-?"), ArgDescription("Shows this help")]
+ public bool Help { get; set; }
+
+
+ ///
+ /// Validate the configuration file against the model before applying changes
+ ///
+ ///
+ private void ValidateConfigurationOfTable(Table tableConfig)
+ {
+ var table = database.Model.Tables.Find(tableConfig.Name);
+
+ if (table == null)
+ throw new Exception($"Could not find table [{tableConfig.Name}]");
+
+ try
+ {
+ Enum.Parse(typeof(ModeType), tableConfig.Mode);
+ }
+ catch(Exception)
+ {
+ throw new Exception($"Table [{tableConfig.Name}] has invalid mode type {tableConfig.Mode}, must be one of Default, DirectQuery, Dual, or Import");
+ }
+
+ if (table.Partitions.Count == 0)
+ throw new Exception($"No partitions found for table [{table.Name}]");
+
+ if(tableConfig.AggregationRules != null)
+ foreach (AggregationRule rule in tableConfig.AggregationRules)
+ {
+ if(rule.Summarization != "CountTableRows")
+ try
+ {
+ Enum.Parse(typeof(SummarizationType), rule.Summarization);
+ }
+ catch (Exception)
+ {
+ throw new Exception($"Aggregation rule summarization invalid [{rule.Summarization}], must be one of GroupBy, Sum, Min, Max, Count, or CountTableRows");
+ }
+
+ Microsoft.AnalysisServices.Tabular.Column aggColumn = table.Columns.Find(rule.AggTableColumn);
+
+ if (aggColumn == null)
+ throw new Exception($"Cound not find aggregation column [{table.Name}].[{rule.AggTableColumn}] in model");
+
+ var detailTable = database.Model.Tables.Find(rule.DetailTable);
+
+ if (detailTable == null)
+ throw new Exception($"Cound not find detail table [{rule.DetailTable}] in model");
+
+ var detailColumn = (rule.DetailTableColumn == null ? null : detailTable.Columns.Find(rule.DetailTableColumn));
+
+ bool isCountAggregate = rule.Summarization != "Count" || rule.Summarization != "CountTableRows";
+
+ if (detailColumn == null && !isCountAggregate)
+ throw new Exception($"Cound not find detail column [{rule.DetailTable}].[{rule.DetailTableColumn}] in model");
+
+ if (!isCountAggregate && aggColumn.DataType != detailColumn.DataType)
+ throw new Exception($"Data type mismatch for aggregation column [{table.Name}].[{rule.AggTableColumn}] and detail column [{rule.DetailTable}].[{rule.DetailTableColumn}]");
+
+ }
+
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine($"Validated aggregation rules for [{table.Name}], mode currently set to {table.Partitions[0].Mode.ToString()}");
+ }
+
+ ///
+ /// Applies the differences between the configuration file and the model
+ ///
+ ///
+ private int ApplyConfigurationOfTable(Table tableConfig)
+ {
+ // Update mode of each partition of the table if a difference is found between the model and the configuration
+ var table = database.Model.Tables.Find(tableConfig.Name);
+ int partitionModesChanged = 0;
+ table.Partitions.ForEach(p =>
+ {
+ var mode = (ModeType)Enum.Parse(typeof(ModeType), tableConfig.Mode);
+ if (p.Mode != mode)
+ {
+ p.Mode = mode;
+ partitionModesChanged++;
+ }
+ }
+ );
+
+ // Remove all alternateOf definitions from the model that do not match an aggregation rule in the configuration
+ int alternateOfRemoved = 0;
+ table.Columns.ForEach(c =>
+ {
+ int ruleMatch = 0;
+
+ if(tableConfig.AggregationRules != null && c.AlternateOf != null)
+ ruleMatch = tableConfig.AggregationRules.Where(r =>
+ r.Summarization != "CountTableRows" &&
+ r.AggTableColumn == c.Name &&
+ r.DetailTable == c.AlternateOf.BaseColumn.Table.Name &&
+ r.DetailTableColumn == c.AlternateOf.BaseColumn.Name &&
+ (SummarizationType)Enum.Parse(typeof(SummarizationType), r.Summarization) == c.AlternateOf.Summarization
+ ).Count() +
+ tableConfig.AggregationRules.Where(r =>
+ r.Summarization == "CountTableRows" &&
+ r.AggTableColumn == c.Name &&
+ r.DetailTable == c.AlternateOf.BaseTable.Name &&
+ c.AlternateOf.Summarization == SummarizationType.Count
+ ).Count();
+
+ if (ruleMatch == 0 && c.AlternateOf != null)
+ {
+ var baseObjectName = c.AlternateOf.BaseColumn == null ?
+ String.Format("[{0}]", c.AlternateOf.BaseTable.Name) :
+ String.Format("[{0}].[{1}]", c.AlternateOf.BaseColumn.Table.Name, c.AlternateOf.BaseColumn.Name);
+
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine($"Removing aggregation rule from column [{c.Name}] with alternate of {baseObjectName} aggregation {c.AlternateOf.Summarization}");
+
+ c.AlternateOf = null;
+ alternateOfRemoved++;
+ }
+ }
+ );
+
+ // Add all alternateOf definitions from the configuration that do not match an alternateOf definition in the model
+ int alternateOfAdded = 0;
+ if(tableConfig.AggregationRules != null)
+ tableConfig.AggregationRules.ForEach(r =>
+ {
+ var column = table.Columns.First(c => c.Name == r.AggTableColumn);
+ var detailTable = database.Model.Tables.Find(r.DetailTable);
+ var detailColumn = (r.DetailTableColumn != null) ? detailTable.Columns.Find(r.DetailTableColumn) : null;
+
+ if (column.AlternateOf == null)
+ {
+ if (r.Summarization == "CountTableRows")
+ column.AlternateOf = new AlternateOf
+ {
+ Summarization = SummarizationType.Count,
+ BaseTable = detailTable
+ };
+ else
+ column.AlternateOf = new AlternateOf
+ {
+ Summarization = (SummarizationType)Enum.Parse(typeof(SummarizationType), r.Summarization),
+ BaseColumn = detailColumn
+ };
+
+ alternateOfAdded++;
+
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine($"Adding aggregation rule for column [{column.Name}] with alternate of [{detailTable.Name + (detailColumn == null ? string.Empty : "].[" + detailColumn.Name)}] aggregation {column.AlternateOf.Summarization}");
+ }
+ }
+ );
+
+ return partitionModesChanged + alternateOfRemoved + alternateOfAdded;
+ }
+
+ ///
+ /// Connect to analysis services instance and database, throw if error is encountered
+ ///
+ ///
+ private void Connect(string serverName)
+ {
+ //string connectionString = $"Provider=MSOLAP;Data Source={args.Server};";
+ string connectionString = $"Provider=MSOLAP;Data Source={serverName};Integrated Security=SSPI;Persist Security Info=True;";
+ server.Connect(connectionString);
+
+ database = server.Databases.FindByName(aggsConfig.Database.Name);
+
+ if (database == null)
+ {
+ throw new Microsoft.AnalysisServices.ConnectionException($"Could not find database [{aggsConfig.Database.Name}]");
+ }
+ }
+
+ [ArgActionMethod, ArgDescription("Applies the Aggs configuration to the model specified")]
+ public void Apply(ServerAndConfigurationArgs args)
+ {
+ List updatedTableCollection = new List();
+
+ // Read configuration file
+ aggsConfig = JsonHelper.ToClass(File.ReadAllText(args.ConfigFile));
+
+ #region Connect
+
+ Connect(args.Server);
+
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine($"Start: {DateTime.Now.ToString("hh:mm:ss tt")}");
+ Console.WriteLine($"Server: {args.Server}");
+ Console.WriteLine($"Database: {aggsConfig.Database.Name}");
+
+ #endregion
+
+ #region Validate Configuration Against Model
+
+ aggsConfig.Database.Tables.ForEach(x => ValidateConfigurationOfTable(x));
+
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.WriteLine($"Validation successful");
+
+ #endregion
+
+ #region Update Model Compatibility
+
+ //Set database compat level
+ if (database.CompatibilityLevel < 1465)
+ {
+ database.CompatibilityLevel = 1465;
+ database.Update();
+ }
+
+ #endregion
+
+ #region Apply Model Changes
+
+ var changesApplied = 0;
+ aggsConfig.Database.Tables.ForEach(x =>
+ {
+
+ var delta = ApplyConfigurationOfTable(x);
+
+ if (delta > 0)
+ updatedTableCollection.Add(database.Model.Tables.Find(x.Name));
+
+ changesApplied += delta;
+ }
+ );
+
+ if (changesApplied == 0)
+ {
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ Console.WriteLine($"No changes applied to model");
+ }
+ else
+ {
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.WriteLine($"Applied model changes");
+ }
+
+ #endregion
+
+ #region Expand Full
+
+ if (changesApplied == 0)
+ {
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine("Skipping write to database, no changes detected");
+ }
+ else
+ {
+ // Set database UpdateOptions to ExpandFull
+ try
+ {
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write("Writing model changes to database ");
+ database.Update(Microsoft.AnalysisServices.UpdateOptions.ExpandFull);
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.WriteLine("SUCCESS");
+ }
+ catch (Exception e)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("FAILED");
+
+ throw e;
+ }
+ }
+
+ #endregion
+
+ #region Refresh Tables as Required
+
+ if (changesApplied == 0)
+ {
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine("Skipping table refresh, no changes detected");
+ }
+ else
+ {
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine("Refreshing tables - begin: " + DateTime.Now.ToString("hh:mm:ss tt"));
+
+ foreach (var tableObj in updatedTableCollection)
+ {
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write($"Refreshing table [{tableObj.Name}] ");
+ tableObj.RequestRefresh(RefreshType.Full);
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.WriteLine("COMPLETE");
+ }
+
+ database.Model.SaveChanges();
+
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine("Refreshing tables - end: " + DateTime.Now.ToString("hh:mm:ss tt"));
+ }
+
+ #endregion
+ }
+ }
+
+ public class ServerAndConfigurationArgs
+ {
+ [ArgRequired, ArgDescription("The URL to the Azure Analysis Services instance e.g.: asazure://host/instance"), ArgPosition(1)]
+ public string Server { get; set; }
+
+ [ArgRequired, ArgDescription("The file path to the JSON configuration file to apply to the database"), ArgPosition(2)]
+ public string ConfigFile { get; set; }
+ }
+
+ #endregion
+
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ try
+ {
+ Args.InvokeAction(args);
+ }
+ catch (Exception exc)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("");
+ Console.WriteLine($"Exception occurred: {DateTime.Now.ToString("hh:mm:ss tt")}");
+ Console.WriteLine($"Exception message: {exc.Message}");
+ }
+ finally
+ {
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.WriteLine("Press any key to exit");
+ Console.ReadKey();
+ }
+ }
+ }
+}
diff --git a/SetUpAggs/Properties/AssemblyInfo.cs b/SetUpAggs/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..2475a60
--- /dev/null
+++ b/SetUpAggs/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("SetUpAggs")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SetUpAggs")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2433edbd-ffb1-42b9-a0bf-2dfc2953acf1")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/SetUpAggs/SetUpAggs.csproj b/SetUpAggs/SetUpAggs.csproj
new file mode 100644
index 0000000..d6819e0
--- /dev/null
+++ b/SetUpAggs/SetUpAggs.csproj
@@ -0,0 +1,74 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}
+ Exe
+ SetUpAggs
+ SetUpAggs
+ v4.6.1
+ 512
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ packages\Microsoft.AnalysisServices.retail.amd64.15.8.0\lib\net45\Microsoft.AnalysisServices.dll
+
+
+ packages\Microsoft.AnalysisServices.retail.amd64.15.8.0\lib\net45\Microsoft.AnalysisServices.Core.dll
+
+
+ packages\Microsoft.AnalysisServices.retail.amd64.15.8.0\lib\net45\Microsoft.AnalysisServices.SPClient.Interfaces.dll
+
+
+ packages\Microsoft.AnalysisServices.retail.amd64.15.8.0\lib\net45\Microsoft.AnalysisServices.Tabular.dll
+
+
+ packages\Microsoft.AnalysisServices.retail.amd64.15.8.0\lib\net45\Microsoft.AnalysisServices.Tabular.Json.dll
+
+
+ packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll
+
+
+ packages\PowerArgs.3.5.0\lib\netstandard2.0\PowerArgs.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SetUpAggs/SetUpAggs.sln b/SetUpAggs/SetUpAggs.sln
new file mode 100644
index 0000000..eac324f
--- /dev/null
+++ b/SetUpAggs/SetUpAggs.sln
@@ -0,0 +1,73 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27703.2026
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetUpAggs", "SetUpAggs.csproj", "{2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}"
+EndProject
+Project("{6870E480-7721-4708-BFB8-9AE898AA21B3}") = "AdventureWorksAggs", "AW Internet Sales\AdventureWorksAggs.smproj", "{8CE414BB-95B2-4C99-9E03-51BA72086E22}"
+EndProject
+Project("{6870E480-7721-4708-BFB8-9AE898AA21B3}") = "AdventureWorksAggsProvider", "AdventureWorksAggsProvider\AdventureWorksAggsProvider.smproj", "{274B7B29-6EAE-44CE-A06B-ED91F1E52734}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x86 = Debug|x86
+ Development|Any CPU = Development|Any CPU
+ Development|x86 = Development|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Debug|x86.Build.0 = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Development|Any CPU.ActiveCfg = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Development|Any CPU.Build.0 = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Development|x86.ActiveCfg = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Development|x86.Build.0 = Debug|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Release|x86.ActiveCfg = Release|Any CPU
+ {2433EDBD-FFB1-42B9-A0BF-2DFC2953ACF1}.Release|x86.Build.0 = Release|Any CPU
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Debug|Any CPU.ActiveCfg = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Debug|Any CPU.Build.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Debug|Any CPU.Deploy.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Debug|x86.ActiveCfg = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Debug|x86.Build.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Debug|x86.Deploy.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Development|Any CPU.ActiveCfg = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Development|x86.ActiveCfg = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Development|x86.Build.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Development|x86.Deploy.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Release|Any CPU.ActiveCfg = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Release|Any CPU.Build.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Release|Any CPU.Deploy.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Release|x86.ActiveCfg = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Release|x86.Build.0 = Development|x86
+ {8CE414BB-95B2-4C99-9E03-51BA72086E22}.Release|x86.Deploy.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Debug|Any CPU.ActiveCfg = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Debug|Any CPU.Build.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Debug|Any CPU.Deploy.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Debug|x86.ActiveCfg = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Debug|x86.Build.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Debug|x86.Deploy.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Development|Any CPU.ActiveCfg = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Development|x86.ActiveCfg = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Development|x86.Build.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Development|x86.Deploy.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Release|Any CPU.ActiveCfg = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Release|Any CPU.Build.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Release|Any CPU.Deploy.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Release|x86.ActiveCfg = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Release|x86.Build.0 = Development|x86
+ {274B7B29-6EAE-44CE-A06B-ED91F1E52734}.Release|x86.Deploy.0 = Development|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {6C6322A8-7B54-4A88-88DA-24C189C35847}
+ EndGlobalSection
+EndGlobal
diff --git a/SetUpAggs/packages.config b/SetUpAggs/packages.config
new file mode 100644
index 0000000..919d42e
--- /dev/null
+++ b/SetUpAggs/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file