diff --git a/media/features/json-in-table.png b/media/features/json-in-table.png new file mode 100644 index 00000000..8d68cca1 Binary files /dev/null and b/media/features/json-in-table.png differ diff --git a/samples/databases/contoso-data-warehouse/readme.md b/samples/databases/contoso-data-warehouse/readme.md index 5332d7cf..68b6704f 100644 --- a/samples/databases/contoso-data-warehouse/readme.md +++ b/samples/databases/contoso-data-warehouse/readme.md @@ -1,4 +1,4 @@ -# Contoso Retail Data Warehose +# Contoso Retail Data Warehouse Loads data from a public Azure Storage Blob into the Contoso Retail Data Warehouse schema in Azure SQL Data Warehouse. diff --git a/samples/demos/BelgradeProductCatalogDemo/app.config b/samples/demos/BelgradeProductCatalogDemo/app.config deleted file mode 100644 index 49aadfaa..00000000 --- a/samples/demos/BelgradeProductCatalogDemo/app.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/samples/demos/mssqltiger/LQS/Live Query Stats - Activity Monitor.sql b/samples/demos/LQS/Live Query Stats - Activity Monitor.sql similarity index 97% rename from samples/demos/mssqltiger/LQS/Live Query Stats - Activity Monitor.sql rename to samples/demos/LQS/Live Query Stats - Activity Monitor.sql index b9d759d4..e7805031 100644 --- a/samples/demos/mssqltiger/LQS/Live Query Stats - Activity Monitor.sql +++ b/samples/demos/LQS/Live Query Stats - Activity Monitor.sql @@ -59,4 +59,4 @@ GO INNER JOIN Person.Person AS p ON h.CustomerID = p.BusinessEntityID INNER JOIN Production.Product AS pr ON d.ProductID = pr.ProductID ) SELECT * FROM Prices; -GO \ No newline at end of file +GO diff --git a/samples/demos/mssqltiger/LQS/Live Query Stats - Own Session.sql b/samples/demos/LQS/Live Query Stats - Own Session.sql similarity index 97% rename from samples/demos/mssqltiger/LQS/Live Query Stats - Own Session.sql rename to samples/demos/LQS/Live Query Stats - Own Session.sql index 1c6e0b65..c0a6a749 100644 --- a/samples/demos/mssqltiger/LQS/Live Query Stats - Own Session.sql +++ b/samples/demos/LQS/Live Query Stats - Own Session.sql @@ -58,4 +58,4 @@ GO INNER JOIN Person.Person AS p ON h.CustomerID = p.BusinessEntityID INNER JOIN Production.Product AS pr ON d.ProductID = pr.ProductID ) SELECT * FROM Prices; -GO \ No newline at end of file +GO diff --git a/samples/demos/mssqltiger/LQS/README.md b/samples/demos/LQS/README.md similarity index 100% rename from samples/demos/mssqltiger/LQS/README.md rename to samples/demos/LQS/README.md diff --git a/samples/demos/mssqltiger/Plan-Comparison/Inside-Query-Store/QueryStoreSimpleDemo.exe b/samples/demos/Plan-Comparison/Inside-Query-Store/QueryStoreSimpleDemo.exe similarity index 100% rename from samples/demos/mssqltiger/Plan-Comparison/Inside-Query-Store/QueryStoreSimpleDemo.exe rename to samples/demos/Plan-Comparison/Inside-Query-Store/QueryStoreSimpleDemo.exe diff --git a/samples/demos/mssqltiger/Plan-Comparison/Inside-Query-Store/QueryStoreTest.bacpac b/samples/demos/Plan-Comparison/Inside-Query-Store/QueryStoreTest.bacpac similarity index 100% rename from samples/demos/mssqltiger/Plan-Comparison/Inside-Query-Store/QueryStoreTest.bacpac rename to samples/demos/Plan-Comparison/Inside-Query-Store/QueryStoreTest.bacpac diff --git a/samples/demos/mssqltiger/Plan-Comparison/Inside-Query-Store/README.md b/samples/demos/Plan-Comparison/Inside-Query-Store/README.md similarity index 100% rename from samples/demos/mssqltiger/Plan-Comparison/Inside-Query-Store/README.md rename to samples/demos/Plan-Comparison/Inside-Query-Store/README.md diff --git a/samples/demos/Plan-Comparison/Offline/Compare1_Plan1_Slow.sqlplan b/samples/demos/Plan-Comparison/Offline/Compare1_Plan1_Slow.sqlplan new file mode 100644 index 00000000..bdd4b967 --- /dev/null +++ b/samples/demos/Plan-Comparison/Offline/Compare1_Plan1_Slow.sqlplan @@ -0,0 +1,1074 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/demos/Plan-Comparison/Offline/Compare1_Plan2_Fast.sqlplan b/samples/demos/Plan-Comparison/Offline/Compare1_Plan2_Fast.sqlplan new file mode 100644 index 00000000..8424613f --- /dev/null +++ b/samples/demos/Plan-Comparison/Offline/Compare1_Plan2_Fast.sqlplan @@ -0,0 +1,1015 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/demos/mssqltiger/Plan-Comparison/Offline/README.md b/samples/demos/Plan-Comparison/Offline/README.md similarity index 100% rename from samples/demos/mssqltiger/Plan-Comparison/Offline/README.md rename to samples/demos/Plan-Comparison/Offline/README.md diff --git a/samples/demos/mssqltiger/Showplan/HashWarning.sql b/samples/demos/Showplan/HashWarning.sql similarity index 89% rename from samples/demos/mssqltiger/Showplan/HashWarning.sql rename to samples/demos/Showplan/HashWarning.sql index 3457e005..e4dec4a4 100644 --- a/samples/demos/mssqltiger/Showplan/HashWarning.sql +++ b/samples/demos/Showplan/HashWarning.sql @@ -30,7 +30,7 @@ GO -- Get Actual Execution Plan --- Execute the stored procedure first with parameter value WA which will select 1% of data. +-- Execute the stored procedure first with parameter value ‘WA’ – which will select 1% of data. DBCC FREEPROCCACHE GO EXEC CustomersByState 'WA' @@ -49,4 +49,4 @@ it is split into sub-partitions, which are also processed separately. This splitting process continues until each partition fits into available memory or until the maximum recursion level is reached. In this case it stopped at level 1. -*/ \ No newline at end of file +*/ diff --git a/samples/demos/mssqltiger/Showplan/MemoryGrant_Warning.sql b/samples/demos/Showplan/MemoryGrant_Warning.sql similarity index 96% rename from samples/demos/mssqltiger/Showplan/MemoryGrant_Warning.sql rename to samples/demos/Showplan/MemoryGrant_Warning.sql index 7c0a2853..58f283cb 100644 --- a/samples/demos/mssqltiger/Showplan/MemoryGrant_Warning.sql +++ b/samples/demos/Showplan/MemoryGrant_Warning.sql @@ -18,4 +18,4 @@ GO In SELECT node properties: MaxQueryMemory for maximum query memory grant under RG MAX_MEMORY_PERCENT hint MaxCompileMemory for maximum query optimizer memory in KB during compile under RG -*/ \ No newline at end of file +*/ diff --git a/samples/demos/mssqltiger/Showplan/MemoryGrant_Warning_Setup.sql b/samples/demos/Showplan/MemoryGrant_Warning_Setup.sql similarity index 100% rename from samples/demos/mssqltiger/Showplan/MemoryGrant_Warning_Setup.sql rename to samples/demos/Showplan/MemoryGrant_Warning_Setup.sql diff --git a/samples/demos/mssqltiger/Showplan/README.md b/samples/demos/Showplan/README.md similarity index 100% rename from samples/demos/mssqltiger/Showplan/README.md rename to samples/demos/Showplan/README.md diff --git a/samples/demos/mssqltiger/Showplan/SortWarning.sql b/samples/demos/Showplan/SortWarning.sql similarity index 94% rename from samples/demos/mssqltiger/Showplan/SortWarning.sql rename to samples/demos/Showplan/SortWarning.sql index b16479da..7027ed09 100644 --- a/samples/demos/mssqltiger/Showplan/SortWarning.sql +++ b/samples/demos/Showplan/SortWarning.sql @@ -18,4 +18,4 @@ GO /* Observe the type of Spill = 1 Means one pass over the data was enough to complete the sort in the Worktable -*/ \ No newline at end of file +*/ diff --git a/samples/demos/BelgradeProductCatalogDemo/.gitignore b/samples/demos/belgrade-product-catalog-demo/.gitignore similarity index 77% rename from samples/demos/BelgradeProductCatalogDemo/.gitignore rename to samples/demos/belgrade-product-catalog-demo/.gitignore index d012fcb9..e1ffc141 100644 --- a/samples/demos/BelgradeProductCatalogDemo/.gitignore +++ b/samples/demos/belgrade-product-catalog-demo/.gitignore @@ -8,4 +8,5 @@ obj/* *.lock.json Properties/PublishProfiles/* appsettings.Development.json -appsettings.Production.json \ No newline at end of file +appsettings.Production.json +*.ndjson \ No newline at end of file diff --git a/samples/demos/BelgradeProductCatalogDemo/Controllers/CompanyController.cs b/samples/demos/belgrade-product-catalog-demo/Controllers/CompanyController.cs similarity index 55% rename from samples/demos/BelgradeProductCatalogDemo/Controllers/CompanyController.cs rename to samples/demos/belgrade-product-catalog-demo/Controllers/CompanyController.cs index 0d187222..84003f3f 100644 --- a/samples/demos/BelgradeProductCatalogDemo/Controllers/CompanyController.cs +++ b/samples/demos/belgrade-product-catalog-demo/Controllers/CompanyController.cs @@ -28,17 +28,21 @@ namespace ProductCatalog.Controllers [HttpGet("login")] public void Login(string id) { - try + if(id=="0") + ControllerContext.HttpContext.Session.Remove("CompanyID"); + else + ControllerContext.HttpContext.Session.SetString("CompanyID", id); + string referer; + switch (Request.Query["page"]) { - if(id=="0") - ControllerContext.HttpContext.Session.Remove("CompanyID"); - else - ControllerContext.HttpContext.Session.SetString("CompanyID", id); - Response.Redirect("/index.html"); - } catch (Exception ex) - { - Response.WriteAsync(ex.Message); + case "index": referer = "/index.html"; break; + case "report1": referer = "/report-pie.html"; break; + case "report2": referer = "/report-multibar.html"; break; + case "dashboard": referer = "/dashboard.html"; break; + case "temporal": referer = "/temporal.html"; break; + default: referer = "/index.html"; break; } + Response.Redirect(referer); } } } \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/Controllers/ProductCatalogController.cs b/samples/demos/belgrade-product-catalog-demo/Controllers/ProductCatalogController.cs new file mode 100644 index 00000000..a01f9a82 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Controllers/ProductCatalogController.cs @@ -0,0 +1,50 @@ +using Microsoft.AspNetCore.Mvc; +using ProductCatalog.Models; +using System; +using System.Linq; + +namespace ProductCatalog.Controllers +{ + public class ProductCatalogController : Controller + { + private ProductCatalogContext _context; + + public ProductCatalogController (ProductCatalogContext context) + { + _context = context; + } + + [HttpGet] + public IActionResult Index() + { + ViewData["page"] = "index"; + return View(_context.Products.AsEnumerable()); + } + + // POST api/ProductCatalog/Add + public IActionResult Add(Product p) + { + try + { + _context.Products.Add(p); + _context.SaveChanges(); + return Redirect("/ProductCatalog/Index"); + } catch (Exception) + { + return Redirect("/ProductCatalog/Index"); + } + } + + public IActionResult Report1() + { + ViewData["page"] = "report1"; + return View(); + } + + public IActionResult Report2() + { + ViewData["page"] = "report2"; + return View(); + } + } +} \ No newline at end of file diff --git a/samples/demos/BelgradeProductCatalogDemo/Controllers/ProductController.cs b/samples/demos/belgrade-product-catalog-demo/Controllers/ProductController.cs similarity index 67% rename from samples/demos/BelgradeProductCatalogDemo/Controllers/ProductController.cs rename to samples/demos/belgrade-product-catalog-demo/Controllers/ProductController.cs index 8bfd3772..79e33881 100644 --- a/samples/demos/BelgradeProductCatalogDemo/Controllers/ProductController.cs +++ b/samples/demos/belgrade-product-catalog-demo/Controllers/ProductController.cs @@ -1,9 +1,9 @@ using Belgrade.SqlClient; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; using System; using System.Data.SqlClient; using System.IO; -using System.Text; using System.Threading.Tasks; // For more information on enabling Web API for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 @@ -16,18 +16,28 @@ namespace ProductCatalog.Controllers IQueryPipe sqlQuery = null; ICommand sqlCmd = null; private readonly string EMPTY_PRODUCTS_ARRAY = "{\"data\":[]}"; - private readonly byte[] EMPTY_PRODUCTS_ARRAY_GZIPPED = new byte[] {0x1F,0x8B,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xAB,0x66,0x50,0x62,0x48,0x61,0x48,0x64,0x28,0x01,0x62,0x25,0x06,0x2B,0x86,0x68,0x86,0x58,0x86,0x5A,0x06,0x00,0xB3,0x4C,0x62,0xB2,0x16,0x00,0x00,0x00}; + private readonly byte[] EMPTY_PRODUCTS_ARRAY_GZIPPED = new byte[] { 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xAB, 0x66, 0x50, 0x62, 0x48, 0x61, 0x48, 0x64, 0x28, 0x01, 0x62, 0x25, 0x06, 0x2B, 0x86, 0x68, 0x86, 0x58, 0x86, 0x5A, 0x06, 0x00, 0xB3, 0x4C, 0x62, 0xB2, 0x16, 0x00, 0x00, 0x00 }; + private readonly ILogger logger; - public ProductController(IQueryPipe sqlQueryService, ICommand sqlCommandService) + public ProductController(IQueryPipe sqlQueryService, ICommand sqlCommandService, ILogger logger) { this.sqlQuery = sqlQueryService; this.sqlCmd = sqlCommandService; + this.logger = logger; } // GET api/Product public async Task Get() { - await sqlQuery.Stream(@" + await sqlQuery + .OnError( + ex => + { + logger.LogError("Error while trying to get products: {Error}\n{StackTrace}", ex.Message, ex.StackTrace); + this.Response.StatusCode = 500; + throw ex; + }) + .Stream(@" select ProductID, Name, Color, Price, Quantity, JSON_VALUE(Data, '$.MadeIn') as MadeIn, JSON_QUERY(Tags) as Tags from Product @@ -64,7 +74,7 @@ FOR JSON PATH, WITHOUT_ARRAY_WRAPPER"); cmd.Parameters.AddWithValue("id", id); await sqlQuery.Stream(cmd, Response.Body, "{}"); } - + // POST api/Product [HttpPost] public async Task Post() @@ -116,7 +126,47 @@ FOR JSON PATH, WITHOUT_ARRAY_WRAPPER"); var cmd = new SqlCommand("EXEC RestoreProduct @productid, @date"); cmd.Parameters.AddWithValue("@productid", ProductId); cmd.Parameters.AddWithValue("@date", DateModified); - this.sqlCmd.ExecuteNonQuery(cmd); + this.sqlCmd + .OnError( + ex => + { + logger.LogError("Error while trying to restore product with id {ProductID} from time {DateModified}.\n{Error}\n{StackTrace}", ProductId, DateModified, ex.Message, ex.StackTrace); + this.Response.StatusCode = 500; + throw ex; + }) + .ExecuteNonQuery(cmd); + } + + + [HttpGet("Report1")] + [Produces("application/json")] + public async Task Report1() + { + await sqlQuery + .Stream(@" +select color as x, sum(quantity) as y +from product +where color is not null +group by color +for json path", Response.Body, EMPTY_PRODUCTS_ARRAY); + } + + + [HttpGet("Report2")] + [Produces("application/json")] + public async Task Report2() + { + await sqlQuery + .Stream(@" +select name as [key], [values].x, [values].y + from company + join (select companyid, color as x, sum(quantity) as y + from product + where color is not null + group by companyid, color + ) as [values] on company.companyid = [values].companyid +order by company.companyid +for json auto", Response.Body, EMPTY_PRODUCTS_ARRAY); } } } \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/Models/Models.cs b/samples/demos/belgrade-product-catalog-demo/Models/Models.cs new file mode 100644 index 00000000..2c0397ef --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Models/Models.cs @@ -0,0 +1,74 @@ +using Microsoft.EntityFrameworkCore; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace ProductCatalog.Models +{ + [Table("Product")] + public class Product + { + public int ProductId { get; set; } + + public string Name { get; set; } + + public string Color { get; set; } + + public string Size { get; set; } + + public decimal Price { get; set; } + + public int Quantity { get; set; } + + public int CompanyID { get; set; } + + [NotMapped] + public string[] Tags + { + get { return _Tags == null ? null : JsonConvert.DeserializeObject(_Tags); } + set { _Tags = JsonConvert.SerializeObject(value); } + } + + internal string _Tags { get; set; } + + [NotMapped] + public Properties Data + { + get { return (this._Data == null) ? null : JsonConvert.DeserializeObject(this._Data); } + set { _Data = JsonConvert.SerializeObject(value); } + } + + internal string _Data { get; set; } + } + + public class Properties + { + public string Type { get; set; } + + public string MadeIn { get; set; } + } + + public class ProductCatalogContext : DbContext + { + public ProductCatalogContext(DbContextOptions options) + : base(options) + { } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .Property(x => x.ProductId) + .HasDefaultValueSql("NEXT VALUE FOR ProductId"); + + modelBuilder.Entity() + .Property(b => b._Tags).HasColumnName("Tags"); + + modelBuilder.Entity() + .Property(b => b._Data).HasColumnName("Data"); + } + + public DbSet Products { get; set; } + } + +} \ No newline at end of file diff --git a/samples/demos/BelgradeProductCatalogDemo/ProductCatalog.xproj b/samples/demos/belgrade-product-catalog-demo/ProductCatalog.xproj similarity index 95% rename from samples/demos/BelgradeProductCatalogDemo/ProductCatalog.xproj rename to samples/demos/belgrade-product-catalog-demo/ProductCatalog.xproj index bddc4a1d..d6cd6870 100644 --- a/samples/demos/BelgradeProductCatalogDemo/ProductCatalog.xproj +++ b/samples/demos/belgrade-product-catalog-demo/ProductCatalog.xproj @@ -7,7 +7,7 @@ 7e230e5a-b0b6-4f56-9561-942fd1817b80 - product_catalog + ProductCatalog .\obj .\bin\ v4.6 diff --git a/samples/demos/BelgradeProductCatalogDemo/Program.cs b/samples/demos/belgrade-product-catalog-demo/Program.cs similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/Program.cs rename to samples/demos/belgrade-product-catalog-demo/Program.cs diff --git a/samples/demos/BelgradeProductCatalogDemo/Properties/launchSettings.json b/samples/demos/belgrade-product-catalog-demo/Properties/launchSettings.json similarity index 84% rename from samples/demos/BelgradeProductCatalogDemo/Properties/launchSettings.json rename to samples/demos/belgrade-product-catalog-demo/Properties/launchSettings.json index c6fe2039..e834e31c 100644 --- a/samples/demos/BelgradeProductCatalogDemo/Properties/launchSettings.json +++ b/samples/demos/belgrade-product-catalog-demo/Properties/launchSettings.json @@ -11,7 +11,7 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "index.html", + "launchUrl": "ProductCatalog/Index", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -19,7 +19,7 @@ "ProductCatalog": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "http://localhost:5000/index.html", + "launchUrl": "http://localhost:5000/ProductCatalog/Index", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/samples/demos/BelgradeProductCatalogDemo/README.md b/samples/demos/belgrade-product-catalog-demo/README.md similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/README.md rename to samples/demos/belgrade-product-catalog-demo/README.md diff --git a/samples/demos/BelgradeProductCatalogDemo/Startup.cs b/samples/demos/belgrade-product-catalog-demo/Startup.cs similarity index 55% rename from samples/demos/BelgradeProductCatalogDemo/Startup.cs rename to samples/demos/belgrade-product-catalog-demo/Startup.cs index 42eb7458..309f4c44 100644 --- a/samples/demos/BelgradeProductCatalogDemo/Startup.cs +++ b/samples/demos/belgrade-product-catalog-demo/Startup.cs @@ -1,12 +1,17 @@ -using Belgrade.SqlClient; -using Belgrade.SqlClient.SqlDb; +using Belgrade.SqlClient.SqlDb; using Belgrade.SqlClient.SqlDb.Rls; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using ProductCatalog.Models; +using Serilog; +#if NET46 +using Serilog.Sinks.MSSqlServer; +#endif using System; using System.Data.SqlClient; using System.Linq; @@ -23,6 +28,24 @@ namespace ProductCatalog .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); +#if NETCOREAPP1_0 + Log.Logger = new LoggerConfiguration() + .WriteTo.RollingFile(new Serilog.Formatting.Json.JsonFormatter(), System.IO.Path.Combine(env.ContentRootPath, "log-{Date}.ndjson")) + .CreateLogger(); +#endif +#if NET46 + var columnOptions = new ColumnOptions(); + // Don't include the Properties XML column. + columnOptions.Store.Remove(StandardColumn.Properties); + columnOptions.Store.Remove(StandardColumn.MessageTemplate); + columnOptions.Store.Remove(StandardColumn.Exception); + // Do include the log event data as JSON. + columnOptions.Store.Add(StandardColumn.LogEvent); + + Log.Logger = new LoggerConfiguration() + .WriteTo.MSSqlServer(Configuration["ConnectionStrings:BelgradeDemo"], "dbo.Logs", columnOptions: columnOptions) + .CreateLogger(); +#endif } public IConfigurationRoot Configuration { get; } @@ -30,30 +53,24 @@ namespace ProductCatalog // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - //string ConnString = Configuration.GetConnectionString("BelgradeDemo"); string ConnString = Configuration["ConnectionStrings:BelgradeDemo"]; - + + services.AddDbContext(options => options.UseSqlServer(new SqlConnection(ConnString))); + // Adding data access services/components. - services.AddTransient( - sp => - { - return new QueryPipeSessionContextAdapter( - new QueryPipe(new SqlConnection(ConnString)), - "CompanyID", - () => GetCompanyIdFromSession(sp)); - }); + services.AddTransient( + sp => new QueryPipe(new SqlConnection(ConnString)) + .AddRls("CompanyID",() => GetCompanyIdFromSession(sp)) + ); - services.AddTransient( - sp => - { - return new CommandSessionContextAdapter( - new Command(new SqlConnection(ConnString)), - "CompanyID", - () => GetCompanyIdFromSession(sp)); - }); + services.AddTransient( + sp => new Command(new SqlConnection(ConnString)) + .AddRls("CompanyID", () => GetCompanyIdFromSession(sp)) + ); - // Add framework services. + //// Add framework services. services.AddSingleton(); + services.AddLogging(); services.AddSession(); services.AddMvc(); } @@ -63,10 +80,17 @@ namespace ProductCatalog { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); + loggerFactory.AddSerilog(); app.UseSession(); - app.UseMvc(); app.UseStaticFiles(); + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=ProductCatalog}/{action=Index}"); + }); + } /// diff --git a/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Index.cshtml b/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Index.cshtml new file mode 100644 index 00000000..aeb38ab5 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Index.cshtml @@ -0,0 +1,124 @@ +
+
+

Products

+ +
+ + + + + + + + + + + + + + + + + + @foreach (var product in Model) + { + + + + + + + + + } + +
ProductColorPriceQuantityMade inTags
@product.Name@product.Color@product.Price@product.Quantity@(product.Data == null ? string.Empty : product.Data.MadeIn)@(product.Tags==null ? string.Empty : string.Join(", ", product.Tags))
+ +
+ +@section styles { + + + + +} + +@section scripts { + + + + + + + + + + +} \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Report1.cshtml b/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Report1.cshtml new file mode 100644 index 00000000..d5b7544c --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Report1.cshtml @@ -0,0 +1,80 @@ +
+
+ +@section styles { + + +} + +@section scripts { + + + +} \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Report2.cshtml b/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Report2.cshtml new file mode 100644 index 00000000..d843f2a6 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Views/ProductCatalog/Report2.cshtml @@ -0,0 +1,57 @@ +
+ +
+ + +@section styles { + + + +} + +@section scripts { + + + +} \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/Views/Shared/_Layout.cshtml b/samples/demos/belgrade-product-catalog-demo/Views/Shared/_Layout.cshtml new file mode 100644 index 00000000..1a9ba475 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Views/Shared/_Layout.cshtml @@ -0,0 +1,57 @@ + + + + + + + + + Product Catalog + + @RenderSection("styles", required: false) + + + + + + + + @RenderBody() + + + + + + + @RenderSection("scripts", required: false) + + + diff --git a/samples/demos/belgrade-product-catalog-demo/Views/_ViewStart.cshtml b/samples/demos/belgrade-product-catalog-demo/Views/_ViewStart.cshtml new file mode 100644 index 00000000..a5f10045 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/samples/demos/BelgradeProductCatalogDemo/appsettings.json b/samples/demos/belgrade-product-catalog-demo/appsettings.json similarity index 56% rename from samples/demos/BelgradeProductCatalogDemo/appsettings.json rename to samples/demos/belgrade-product-catalog-demo/appsettings.json index 036d345c..edbf02e3 100644 --- a/samples/demos/BelgradeProductCatalogDemo/appsettings.json +++ b/samples/demos/belgrade-product-catalog-demo/appsettings.json @@ -1,6 +1,6 @@ -{ +{ "Logging": { - "IncludeScopes": false, + "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", @@ -8,6 +8,6 @@ } }, "ConnectionStrings": { - "BelgradeDemo": "Server=.;Database=ProductCatalog;Integrated Security=true" + "BelgradeDemo": "Server=.\\SQLEXPRESS;Database=ProductCatalog;Integrated Security=true" } -} +} \ No newline at end of file diff --git a/samples/demos/BelgradeProductCatalogDemo/project.json b/samples/demos/belgrade-product-catalog-demo/project.json similarity index 83% rename from samples/demos/BelgradeProductCatalogDemo/project.json rename to samples/demos/belgrade-product-catalog-demo/project.json index cedf47c6..0935c448 100644 --- a/samples/demos/BelgradeProductCatalogDemo/project.json +++ b/samples/demos/belgrade-product-catalog-demo/project.json @@ -1,17 +1,22 @@ { "dependencies": { - "Belgrade.Sql.Client": "0.6.0", + "Belgrade.Sql.Client": "0.6.2", "Microsoft.AspNetCore.Mvc": "1.0.0", "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", "Microsoft.AspNetCore.Session": "1.0.0", "Microsoft.AspNetCore.StaticFiles": "1.0.0", + "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1", "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", "Microsoft.Extensions.Configuration.Json": "1.0.0", "Microsoft.Extensions.Logging": "1.0.0", "Microsoft.Extensions.Logging.Console": "1.0.0", "Microsoft.Extensions.Logging.Debug": "1.0.0", + "Serilog": "2.3.0", + "Serilog.Extensions.Logging": "1.3.1", + "Serilog.Sinks.PeriodicBatching": "2.1.0", + "Serilog.Sinks.RollingFile": "3.3.0", "System.Data.SqlClient": "4.1.0" }, @@ -33,6 +38,7 @@ }, "net46": { "dependencies": { + "Serilog.Sinks.MSSqlServer": "4.2.0" } } }, diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/0 cleanup.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/0 cleanup.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/0 cleanup.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/0 cleanup.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/1 setup.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/1 setup.sql similarity index 57% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/1 setup.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/1 setup.sql index 9ecc47e3..e34b7e97 100644 --- a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/1 setup.sql +++ b/samples/demos/belgrade-product-catalog-demo/sql-scripts/1 setup.sql @@ -35,7 +35,7 @@ CREATE TABLE Product ( GO DECLARE @products NVARCHAR(MAX) = -N'[{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":100.0000,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":16,"Name":"Bearing Ball","Color":"Magenta","Size":"62","Price":15.9900,"Quantity":90,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":17,"Name":"BB Ball Bearing","Color":"Magenta","Size":"62","Price":28.9900,"Quantity":80,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":18,"Name":"Blade","Color":"Magenta","Size":"62","Price":18.0000,"Quantity":45,"CompanyID":4,"Data":{},"Tags":["new"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":19,"Name":"Sport-100 Helmet, Red","Color":"Red","Size":"72","Price":41.9900,"Quantity":38,"CompanyID":3,"Data":{"ManufacturingCost":30.652700,"Type":"Еquipment","MadeIn":"China"},"Tags":["promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":20,"Name":"Sport-100 Helmet, Black","Color":"Black","Size":"72","Price":31.4900,"Quantity":60,"CompanyID":1,"Data":{"ManufacturingCost":22.987700,"Type":"Еquipment","MadeIn":"China"},"Tags":["new","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":21,"Name":"Mountain Bike Socks, M","Color":"White","Size":"M","Price":560.9900,"Quantity":30,"CompanyID":2,"Data":{"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":22,"Name":"Mountain Bike Socks, L","Color":"White","Size":"L","Price":120.9900,"Quantity":20,"CompanyID":3,"Data":{"ManufacturingCost":88.322700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":23,"Name":"Long-Sleeve Logo Jersey, XL","Color":"Multi","Size":"XL","Price":44.9900,"Quantity":60,"CompanyID":4,"Data":{"ManufacturingCost":32.842700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":24,"Name":"Road-650 Black, 52","Color":"Black","Size":"52","Price":704.6900,"Quantity":70,"CompanyID":5,"Data":{"Type":"Bike","MadeIn":"UK"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":25,"Name":"Mountain-100 Silver, 38","Color":"Silver","Size":"38","Price":359.9900,"Quantity":45,"CompanyID":1,"Data":{"ManufacturingCost":262.792700,"Type":"Bike","MadeIn":"UK"},"Tags":["promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":26,"Name":"Road-250 Black, 48","Color":"Black","Size":"48","Price":299.0200,"Quantity":25,"CompanyID":2,"Data":{"ManufacturingCost":218.284600,"Type":"Bike","MadeIn":"UK"},"Tags":["new","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":27,"Name":"ML Bottom Bracket","Price":101.2400,"Quantity":50,"CompanyID":3,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":28,"Name":"HL Bottom Bracket","Price":121.4900,"Quantity":65,"CompanyID":4,"Data":{"ManufacturingCost":88.687700,"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"}]' +N'[{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":100.0000,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":16,"Name":"Bearing Ball","Color":"Magenta","Size":"62","Price":15.9900,"Quantity":90,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":17,"Name":"BB Ball Bearing","Color":"Magenta","Size":"62","Price":28.9900,"Quantity":80,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":18,"Name":"Blade","Color":"Silver","Size":"62","Price":18.0000,"Quantity":45,"CompanyID":1,"Data":{},"Tags":["new"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":19,"Name":"Sport-100 Helmet, Red","Color":"Black","Size":"72","Price":41.9900,"Quantity":38,"CompanyID":3,"Data":{"ManufacturingCost":30.652700,"Type":"Еquipment","MadeIn":"China"},"Tags":["promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":20,"Name":"Sport-100 Helmet, Black","Color":"Black","Size":"72","Price":31.4900,"Quantity":60,"CompanyID":1,"Data":{"ManufacturingCost":22.987700,"Type":"Еquipment","MadeIn":"China"},"Tags":["new","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":21,"Name":"Mountain Bike Socks, M","Color":"White","Size":"M","Price":560.9900,"Quantity":30,"CompanyID":2,"Data":{"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":22,"Name":"Mountain Bike Socks, L","Color":"White","Size":"L","Price":120.9900,"Quantity":20,"CompanyID":3,"Data":{"ManufacturingCost":88.322700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":23,"Name":"Long-Sleeve Logo Jersey, XL","Color":"White","Size":"XL","Price":44.9900,"Quantity":60,"CompanyID":1,"Data":{"ManufacturingCost":32.842700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":24,"Name":"Road-650 Black, 52","Color":"Black","Size":"52","Price":704.6900,"Quantity":70,"CompanyID":1,"Data":{"Type":"Bike","MadeIn":"UK"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":25,"Name":"Mountain-100 Silver, 38","Color":"White","Size":"38","Price":359.9900,"Quantity":45,"CompanyID":1,"Data":{"ManufacturingCost":262.792700,"Type":"Bike","MadeIn":"UK"},"Tags":["promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":26,"Name":"Road-250 Black, 48","Color":"Black","Size":"48","Price":299.0200,"Quantity":25,"CompanyID":2,"Data":{"ManufacturingCost":218.284600,"Type":"Bike","MadeIn":"UK"},"Tags":["new","promo"],"DateModified":"2016-02-11T21:27:32"},{"ProductID":27,"Name":"ML Bottom Bracket","Color":"Silver","Size":"36","Price":101.2400,"Quantity":50,"CompanyID":3,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"},{"ProductID":28,"Name":"HL Bottom Bracket","Color":"Silver","Size":"36","Price":121.4900,"Quantity":65,"CompanyID":2,"Data":{"ManufacturingCost":88.687700,"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:27:32"}]' INSERT INTO Product (ProductID, Name, Color, Size, Price, Quantity, CompanyID, Data, Tags, DateModified) SELECT ProductID, Name, Color, Size, Price, Quantity, CompanyID, Data, Tags, DateModified FROM OPENJSON (@products) WITH( @@ -53,6 +53,7 @@ CREATE TABLE Company ( CompanyID int PRIMARY KEY DEFAULT (NEXT VALUE FOR CompanyId), Name nvarchar(50) NOT NULL, Address nvarchar(100) NULL, + Contact nvarchar(100) NULL, Email nvarchar(50) NULL, Phone nvarchar(50) NULL, Postcode nvarchar(20) NULL, @@ -60,11 +61,11 @@ CREATE TABLE Company ( GO declare @companies nvarchar(max) = -N'[{"CompanyID":1,"Name":"A Datum Corporation","Email":"msavic@datum.com","Address":"Suite 10, 183838 Southwest Boulevard, Surrey","Phone":"(381) 555-7639","Postcode":"46077"},{"CompanyID":2,"Name":"Contoso, Ltd.","Email":"zmisic@contoso.com","Address":"Unit 2, 2934 Night Road, Jolimont","Phone":"(360) 555-4901","Postcode":"98253"},{"CompanyID":3,"Name":"Consolidated Messenger","Email":"rputnik@consolidated-messanger.com","Address":"894 Market Day Street, West Mont","Phone":"(415) 555-1105","Postcode":"94101"}]' -INSERT INTO Company (CompanyID, Name, Address, Email, Phone, Postcode) -SELECT CompanyID, Name, Address, Email, Phone, Postcode +N'[{"CompanyID":1,"Name":"A Datum Corporation","Email":"msavic@datum.com","Address":"Suite 10, 183838 Southwest Boulevard, Surrey","Contact":"Milunka Savic","Phone":"(381) 555-7639","Postcode":"46077"},{"CompanyID":2,"Name":"Contoso, Ltd.","Email":"zmisic@contoso.com","Address":"Unit 2, 2934 Night Road, Jolimont","Contact":"Zivojin Misic","Phone":"(360) 555-4901","Postcode":"98253"},{"CompanyID":3,"Name":"Consolidated Messenger","Contact":"Radomir Putnik","Email":"rputnik@consolidated-messanger.com","Address":"894 Market Day Street, West Mont","Phone":"(415) 555-1105","Postcode":"94101"}]' +INSERT INTO Company (CompanyID, Name, Address, Email, Phone, Postcode, Contact) +SELECT CompanyID, Name, Address, Email, Phone, Postcode, Contact FROM OPENJSON (@companies) - WITH(CompanyID int, Name nvarchar(50), Address nvarchar(100), Email nvarchar(50), Phone nvarchar(50), Postcode nvarchar(20)) + WITH(CompanyID int, Name nvarchar(50), Address nvarchar(100), Email nvarchar(50), Phone nvarchar(50), Postcode nvarchar(20),Contact nvarchar(100)) GO DROP PROCEDURE IF EXISTS [dbo].[InsertProductFromJson] @@ -112,3 +113,15 @@ AS BEGIN END GO +DROP TABLE IF EXISTS Logs; +GO +CREATE TABLE Logs ( + Id int IDENTITY PRIMARY KEY, + Message nvarchar(max) NULL, + MessageTemplate nvarchar(max) NULL, + Level nvarchar(128) NULL, + TimeStamp datetimeoffset(7) NOT NULL, + Exception nvarchar(max) NULL, + Properties xml NULL, + LogEvent nvarchar(max) NULL +); \ No newline at end of file diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/2 json.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/2 json.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/2 json.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/2 json.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/3 setup-temporal.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/3 setup-temporal.sql similarity index 62% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/3 setup-temporal.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/3 setup-temporal.sql index 7e545a2c..917013a5 100644 --- a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/3 setup-temporal.sql +++ b/samples/demos/belgrade-product-catalog-demo/sql-scripts/3 setup-temporal.sql @@ -21,7 +21,7 @@ CREATE TABLE History.Product( DECLARE @products NVARCHAR(MAX) = -N'[{"ProductID":15,"Name":"Adjustable Race","Price":75.9900,"Quantity":50,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2015-05-07T03:39:52","ValidTo":"2015-08-07T03:40:01"},{"ProductID":16,"Name":"Bearing Ball","Price":35.9900,"Quantity":80,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-05-07T03:39:52","ValidTo":"2015-08-07T03:40:01"},{"ProductID":17,"Name":"BB Ball Bearing","Price":75.0000,"Quantity":20,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2015-05-07T03:39:52","ValidTo":"2015-08-07T03:40:01"},{"ProductID":18,"Name":"Blade","Color":"Silver","Price":20.9900,"Quantity":70,"CompanyID":4,"Data":{},"Tags":["new"],"DateModified":"2015-05-07T03:40:01","ValidTo":"2015-08-07T03:40:01"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":89.9900,"Quantity":80,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":16,"Name":"Bearing Ball","Color":"Blue","Size":"62","Price":15.9900,"Quantity":120,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":17,"Name":"BB Ball Bearing","Color":"Magenta","Size":"62","Price":25.1900,"Quantity":65,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":18,"Name":"Blade","Color":"Silver","Size":"62","Price":20.9900,"Quantity":80,"CompanyID":4,"Data":{},"Tags":["new"],"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":18,"Name":"Blade","Color":"Silver","Size":"62","Price":20.1500,"Quantity":95,"CompanyID":4,"Data":{},"Tags":["new"],"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":17,"Name":"BB Ball Bearing","Color":"Magenta","Size":"62","Price":37.9900,"Quantity":90,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":16,"Name":"Bearing Ball","Color":"Blue","Size":"62","Price":0,"Quantity":110,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":105.9900,"Quantity":100,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":26,"Name":"Road-250 Black, 48","Color":"Black","Size":"48","Price":1250.9900,"Quantity":90,"CompanyID":2,"Data":{"ManufacturingCost":218.284600,"Type":"Bike","MadeIn":"UK"},"Tags":["new","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":25,"Name":"Mountain-100 Silver, 38","Color":"Silver","Size":"38","Price":799.9900,"Quantity":90,"CompanyID":1,"Data":{"ManufacturingCost":262.792700,"Type":"Bike","MadeIn":"UK"},"Tags":["promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":24,"Name":"Road-650 Black, 52","Color":"Black","Size":"52","Price":529.9900,"Quantity":90,"CompanyID":5,"Data":{"Type":"Bike","MadeIn":"UK"},"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":23,"Name":"Long-Sleeve Logo Jersey, XL","Color":"Multi","Size":"XL","Price":49.9900,"Quantity":90,"CompanyID":4,"Data":{"ManufacturingCost":32.842700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":22,"Name":"Mountain Bike Socks, L","Color":"White","Size":"L","Price":19.9900,"Quantity":90,"CompanyID":3,"Data":{"ManufacturingCost":88.322700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":21,"Name":"Mountain Bike Socks, M","Color":"White","Size":"M","Price":9.5000,"Quantity":90,"CompanyID":2,"Data":{"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":20,"Name":"Sport-100 Helmet, Black","Color":"Black","Price":45.9900,"Quantity":10,"CompanyID":1,"Data":{"ManufacturingCost":22.987700,"Type":"Еquipment","MadeIn":"China"},"Tags":["new","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":19,"Name":"Sport-100 Helmet, Red","Color":"Red","Price":34.9900,"Quantity":10,"CompanyID":3,"Data":{"ManufacturingCost":30.652700,"Type":"Еquipment","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":32.9900,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-10T21:19:20","ValidTo":"2016-02-11T21:15:48"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":100.0000,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:15:48","ValidTo":"2016-02-11T21:24:12"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":120.0000,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:24:12","ValidTo":"2016-02-11T21:27:32"}]'; +N'[{"ProductID":15,"Name":"Adjustable Race","Price":75.9900,"Quantity":50,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2015-05-07T03:39:52","ValidTo":"2015-08-07T03:40:01"},{"ProductID":16,"Name":"Bearing Ball","Price":35.9900,"Quantity":80,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-05-07T03:39:52","ValidTo":"2015-08-07T03:40:01"},{"ProductID":17,"Name":"BB Ball Bearing","Price":75.0000,"Quantity":20,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2015-05-07T03:39:52","ValidTo":"2015-08-07T03:40:01"},{"ProductID":18,"Name":"Blade","Color":"Silver","Price":20.9900,"Quantity":70,"CompanyID":1,"Data":{},"Tags":["new"],"DateModified":"2015-05-07T03:40:01","ValidTo":"2015-08-07T03:40:01"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":89.9900,"Quantity":80,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":16,"Name":"Bearing Ball","Color":"Blue","Size":"62","Price":15.9900,"Quantity":120,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":17,"Name":"BB Ball Bearing","Color":"Magenta","Size":"62","Price":25.1900,"Quantity":65,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":18,"Name":"Blade","Color":"Silver","Size":"62","Price":20.9900,"Quantity":80,"CompanyID":1,"Data":{},"Tags":["new"],"DateModified":"2015-08-07T03:40:01","ValidTo":"2015-11-07T03:40:09"},{"ProductID":18,"Name":"Blade","Color":"Silver","Size":"62","Price":20.1500,"Quantity":95,"CompanyID":1,"Data":{},"Tags":["new"],"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":17,"Name":"BB Ball Bearing","Color":"Magenta","Size":"62","Price":37.9900,"Quantity":90,"CompanyID":3,"Data":{"ManufacturingCost":21.162700,"Type":"Part","MadeIn":"China"},"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":16,"Name":"Bearing Ball","Color":"Blue","Size":"62","Price":0.0000,"Quantity":110,"CompanyID":2,"Data":{"ManufacturingCost":11.672700,"Type":"Part","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":105.9900,"Quantity":100,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2015-11-07T03:40:09","ValidTo":"2016-02-07T03:40:15"},{"ProductID":26,"Name":"Road-250 Black, 48","Color":"Black","Size":"48","Price":1250.9900,"Quantity":90,"CompanyID":2,"Data":{"ManufacturingCost":218.284600,"Type":"Bike","MadeIn":"UK"},"Tags":["new","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":25,"Name":"Mountain-100 Silver, 38","Color":"Silver","Size":"38","Price":799.9900,"Quantity":90,"CompanyID":1,"Data":{"ManufacturingCost":262.792700,"Type":"Bike","MadeIn":"UK"},"Tags":["promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":24,"Name":"Road-650 Black, 52","Color":"Black","Size":"52","Price":529.9900,"Quantity":90,"CompanyID":1,"Data":{"Type":"Bike","MadeIn":"UK"},"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":23,"Name":"Long-Sleeve Logo Jersey, XL","Color":"Multi","Size":"XL","Price":49.9900,"Quantity":90,"CompanyID":1,"Data":{"ManufacturingCost":32.842700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":22,"Name":"Mountain Bike Socks, L","Color":"White","Size":"L","Price":19.9900,"Quantity":90,"CompanyID":3,"Data":{"ManufacturingCost":88.322700,"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":21,"Name":"Mountain Bike Socks, M","Color":"White","Size":"M","Price":9.5000,"Quantity":90,"CompanyID":2,"Data":{"Type":"Clothes"},"Tags":["sales","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":20,"Name":"Sport-100 Helmet, Black","Color":"Black","Price":45.9900,"Quantity":10,"CompanyID":1,"Data":{"ManufacturingCost":22.987700,"Type":"Еquipment","MadeIn":"China"},"Tags":["new","promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":19,"Name":"Sport-100 Helmet, Red","Color":"Red","Price":34.9900,"Quantity":10,"CompanyID":3,"Data":{"ManufacturingCost":30.652700,"Type":"Еquipment","MadeIn":"China"},"Tags":["promo"],"DateModified":"2015-12-28T03:40:15","ValidTo":"2016-02-07T03:40:15"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":32.9900,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-10T21:19:20","ValidTo":"2016-02-11T21:15:48"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":100.0000,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:15:48","ValidTo":"2016-02-11T21:24:12"},{"ProductID":15,"Name":"Adjustable Race","Color":"Magenta","Size":"62","Price":120.0000,"Quantity":75,"CompanyID":1,"Data":{"Type":"Part","MadeIn":"China"},"DateModified":"2016-02-11T21:24:12","ValidTo":"2016-02-11T21:27:32"}]'; INSERT INTO History.Product(ProductID, Name, Color, Size, Price, Quantity, CompanyID, Data, Tags, DateModified, ValidTo) SELECT ProductID, Name, Color, Size, Price, Quantity, CompanyID, Data, Tags, DateModified, ValidTo FROM OPENJSON (@products) WITH( diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/4 temporal.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/4 temporal.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/4 temporal.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/4 temporal.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/5 data-masking.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/5 data-masking.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/5 data-masking.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/5 data-masking.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/6 rls.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/6 rls.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/6 rls.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/6 rls.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/7. xtp.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/7. xtp.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/7. xtp.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/7. xtp.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/A1 fraud-detection.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/A1 fraud-detection.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/A1 fraud-detection.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/A1 fraud-detection.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/A2 compare-products.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/A2 compare-products.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/A2 compare-products.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/A2 compare-products.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/sql-scripts/A3 setup-temporal-3-part-name.sql b/samples/demos/belgrade-product-catalog-demo/sql-scripts/A3 setup-temporal-3-part-name.sql similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/sql-scripts/A3 setup-temporal-3-part-name.sql rename to samples/demos/belgrade-product-catalog-demo/sql-scripts/A3 setup-temporal-3-part-name.sql diff --git a/samples/demos/BelgradeProductCatalogDemo/web.config b/samples/demos/belgrade-product-catalog-demo/web.config similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/web.config rename to samples/demos/belgrade-product-catalog-demo/web.config diff --git a/samples/demos/belgrade-product-catalog-demo/wwwroot/dashboard.html b/samples/demos/belgrade-product-catalog-demo/wwwroot/dashboard.html new file mode 100644 index 00000000..211b731f --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/wwwroot/dashboard.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/wwwroot/data/dataTables.js b/samples/demos/belgrade-product-catalog-demo/wwwroot/data/dataTables.js new file mode 100644 index 00000000..0035b267 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/wwwroot/data/dataTables.js @@ -0,0 +1,104 @@ +{ + "data": [{ + "ProductID": 15, + "Name": "Adjustable Race", + "Color": "Magenta", + "Price": 100.0000, + "Quantity": 75, + "MadeIn": "China" + }, { + "ProductID": 16, + "Name": "Bearing Ball", + "Color": "Magenta", + "Price": 15.9900, + "Quantity": 90, + "MadeIn": "China", + "Tags": ["promo"] + }, { + "ProductID": 17, + "Name": "BB Ball Bearing", + "Color": "Magenta", + "Price": 28.9900, + "Quantity": 80, + "MadeIn": "China" + }, { + "ProductID": 18, + "Name": "Blade", + "Color": "Magenta", + "Price": 18.0000, + "Quantity": 45, + "Tags": ["new"] + }, { + "ProductID": 19, + "Name": "Sport-100 Helmet, Red", + "Color": "Red", + "Price": 41.9900, + "Quantity": 38, + "MadeIn": "China", + "Tags": ["promo"] + }, { + "ProductID": 20, + "Name": "Sport-100 Helmet, Black", + "Color": "Black", + "Price": 31.4900, + "Quantity": 60, + "MadeIn": "China", + "Tags": ["new", "promo"] + }, { + "ProductID": 21, + "Name": "Mountain Bike Socks, M", + "Color": "White", + "Price": 560.9900, + "Quantity": 30, + "Tags": ["sales", "promo"] + }, { + "ProductID": 22, + "Name": "Mountain Bike Socks, L", + "Color": "White", + "Price": 120.9900, + "Quantity": 20, + "Tags": ["sales", "promo"] + }, { + "ProductID": 23, + "Name": "Long-Sleeve Logo Jersey, XL", + "Color": "Multi", + "Price": 44.9900, + "Quantity": 60, + "Tags": ["sales", "promo"] + }, { + "ProductID": 24, + "Name": "Road-650 Black, 52", + "Color": "Black", + "Price": 704.6900, + "Quantity": 70, + "MadeIn": "UK" + }, { + "ProductID": 25, + "Name": "Mountain-100 Silver, 38", + "Color": "Silver", + "Price": 359.9900, + "Quantity": 45, + "MadeIn": "UK", + "Tags": ["promo"] + }, { + "ProductID": 26, + "Name": "Road-250 Black, 48", + "Color": "Black", + "Price": 299.0200, + "Quantity": 25, + "MadeIn": "UK", + "Tags": ["new", "promo"] + }, { + "ProductID": 27, + "Name": "ML Bottom Bracket", + "Price": 101.2400, + "Quantity": 50, + "MadeIn": "China" + }, { + "ProductID": 28, + "Name": "HL Bottom Bracket", + "Price": 121.4900, + "Quantity": 65, + "MadeIn": "China" + }] +} \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/wwwroot/data/nvd3-multibar.js b/samples/demos/belgrade-product-catalog-demo/wwwroot/data/nvd3-multibar.js new file mode 100644 index 00000000..10283b88 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/wwwroot/data/nvd3-multibar.js @@ -0,0 +1,25 @@ +[ + { + "key": "A Datum Corporation", + "values": [ + { "x": "Black", "y": 31.4900 }, + { "x": "Magenta", "y": 100.0000 }, + { "x": "Silver", "y": 359.9900 } + ] + }, + { + "key": "Consolidated Messenger", + "values": [ + { "x": "Magenta", "y": 28.9900 }, + { "x": "Red", "y": 41.9900 }, + { "x": "White", "y": 120.9900 } + ] + }, { + "key": "Contoso, Ltd.", + "values": [ + { "x": "White", "y": 560.9900 }, + { "x": "Magenta", "y": 15.9900 }, + { "x": "Black", "y": 299.0200 } + ] + } +] \ No newline at end of file diff --git a/samples/demos/belgrade-product-catalog-demo/wwwroot/data/nvd3-pie.js b/samples/demos/belgrade-product-catalog-demo/wwwroot/data/nvd3-pie.js new file mode 100644 index 00000000..0b625c11 --- /dev/null +++ b/samples/demos/belgrade-product-catalog-demo/wwwroot/data/nvd3-pie.js @@ -0,0 +1,9 @@ +[ + { "x": "Red", "y": 5 }, + { "x": "Silver", "y": 2 }, + { "x": "Black", "y": 9 }, + { "x": "Red", "y": 7 }, + { "x": "Magenta", "y": 4 }, + { "x": "White", "y": 3 }, + { "x": "Blue", "y": 0.5 } +] \ No newline at end of file diff --git a/samples/demos/BelgradeProductCatalogDemo/wwwroot/favicon.ico b/samples/demos/belgrade-product-catalog-demo/wwwroot/favicon.ico similarity index 100% rename from samples/demos/BelgradeProductCatalogDemo/wwwroot/favicon.ico rename to samples/demos/belgrade-product-catalog-demo/wwwroot/favicon.ico diff --git a/samples/demos/BelgradeProductCatalogDemo/wwwroot/index.html b/samples/demos/belgrade-product-catalog-demo/wwwroot/index.html similarity index 94% rename from samples/demos/BelgradeProductCatalogDemo/wwwroot/index.html rename to samples/demos/belgrade-product-catalog-demo/wwwroot/index.html index 1d3a2167..2c75825a 100644 --- a/samples/demos/BelgradeProductCatalogDemo/wwwroot/index.html +++ b/samples/demos/belgrade-product-catalog-demo/wwwroot/index.html @@ -23,9 +23,9 @@ - - - + + + @@ -38,20 +38,22 @@ - Product Catalog Demo + Product Catalog Demo