Catalog

Multiple sites: Building the outgoing URLs

In previous recipe we talked about multiple catalogs with same "UriSegment" - which we had a working implementation for incoming URL, i.e. when a customer visit a product url, we know which catalog we should choose from. But we still need to cover the generation of outgoing URL. I.e. when we link a product (For example, from a campaign page), we need to generate an URL which take the "catalog-less" pattern into account. We need to understand how the outgoing URL is built. The hierarchical router builds the URL by the RouteSegment of contents. However, we want to the urls appear to have same catalog, so the RouteSegment part for the catalogs must be the same, regardless of the true catalogs. Because all catalogs are on same level, their RouteSegment must be unique - and this is enforced from Framework level (which is understandable, otherwise, how can it know which content to choose). (more…)

By vimvq1987, ago
Catalog

Multiple catalogs with same url

This is an excerpt from my second book . The first chapter is available to read for free. A business is having an Episerver Commerce instance with multiple sites and multiple catalogs set up. They want to make sure each site will use one catalog, and all of them will share the same url for catalog structure. So it'll be "https://site-a.com/products/category/", and "https://site-b.com/products/category/". Site A and site B are using different catalogs. Is this doable? Yes! It's just a matter of magic with the routing. This time, we would need to do an implementation of HierarchicalCatalogPartialRouter ourselves. First, let's create a template for it: [crayon-5b06b6238a64f253120617/] (more…)

By vimvq1987, ago
Catalog

Speed up your Catalog incremental indexing

As your products are being constantly updated, you would naturally want them to be properly (and timely) indexed - as that's crucial to have the search results that would influence your customers into buying stuffs. For example, if you just drop the prices of your products , you would want those products to appear in new price segment as soon as possible. This should be very easy with Find.Commerce - so if you are using Find (which you should) - stop reading, nothing for you here. Things, however, can be more complicated if you are using the more "traditional" SearchProvider. (more…)

By vimvq1987, ago
Catalog

Mass update catalog entries

This is something you don't do daily, but you will probably need one day, so it might come in handy. Recently we got a question on how to update the code of all entries in the catalog. This is interesting, because even thought you don't update the codes that often (if at all, as the code is the identity to identify the entries with external system, such as ERPs or PIMs), it raises a question on how to do mass update on catalog entries.

    • Update the code directly via database query. It is supposedly the fastest to do such thing. If you have been following my posts closely, you must be familiar with my note regarding how Episerver does not disclose the database schema. I list it here because it's an option, but not the good one. It easily goes wrong (and cause catastrophes), you have to deal with versions and cache, and those can be hairy to get right. Direct data manipulation should be only used as the last resort when no other option is available.
(more…)

By vimvq1987, ago
Catalog

A curious case of SQL Server function

This time, we will talk about ecfVersion_ListFiltered, again. This stored procedure was previously the subject of several blog posts regarding SQL Server performance optimizations. When I thought it is perfect (in term of performance), I learned something more. Recently we received a performance report from a customer asking about an issue after upgrading from Commerce 10.4.2 to Commerce 10.8 (the last version before Commerce 11). The job "Publish Delayed Content Versions" starts to throw timeout exceptions. This scheduled job calls to a ecfVersion_ListFiltered to load the content versions which are in status DelayedPublish, it looks like this when it reaches SQL Server: [crayon-5b06b6238b3f0055024191/]This query is known to be slow. The reason is quite obvious - Status contains only 5 or 6 distinct values, so it's not indexed. SQL Server will have to do a Clustered Index Scan, and if ecfVersion is big enough, it's inevitably slow. (more…)

By vimvq1987, ago
Catalog

Please, rebuild your database indexes, now

I will make it quick and to the point: if you are expecting a lot of customers visiting your site tomorrow (and you should) for Black Friday, you should rebuild your database indexes, now. On average, it will help you to serve more customers and they will be happier with a more responsive, faster website. On best cases it will help prevent catastrophes. (more…)

By vimvq1987, ago
Catalog

Read only Catalog UI – part 1

https://world.episerver.com/forum/developer-forum/Episerver-Commerce/Thread-Container/2015/6/read-only-catalog/ A while back, we had this question on World. It's not uncommon to update the catalog data by an external system, mostly from a PIM - Product information management system. In such cases, it might not make senses to enable editing in Catalog UI. You might need the new UI for the other parts, such as Marketing UI, but you wouldn't want the editors to accidentally update the product information - because those would be lost, anyway. Is there away to do it? Yes, there is. (more…)

By vimvq1987, ago
Catalog

Beware of IContentLoader.GetChildren() for CatalogContent

This is more of a self-to-note. If you are using IContentLoader.GetChildren<T>(ContentReference), one important thing to remember is this uses the current preferred language. Normally when you get children of a catalog, or a node, that would not be a problem, because a catalog entity - node or entry, will be available in every language supported by the catalog. So if you just want to get the children references, the language is not important. (Note that, if you just need the children references, IRelationRepository should be a faster, more lightweight way to go, but that's another story). If you want to get children in a specific language - which is the most common case, you know that you can use the other overload of GetChildren<T>(ContentReference, ILanguageSelector) , where you can specify the language you want to load. (more…)

By vimvq1987, ago
Catalog

A curious case of SQL execution plan, part 2

Recently I wrote about how to look into, identify and solve the problem with a SQL Server execution plan - as you can read here: https://vimvq1987.com/2017/10/curious-case-sql-execution-plan/ I have some more time to revisit the query now, and I realized I made a "small" mistake. The "optimized" query is using a Clustered Index Scan

So it's not as fast as it should be, and it will perform quite poorly in no cache scenario (when the buffer is empty, for example) - it takes about 40s to complete. Yes it's still better than the original one, both in non cached and cached cases. But it's not good enough. An index scan, even cached, is not only slower, but also more prone to deadlocks. It's also worse in best case scenario, when the original one can use the proper index seek. (more…)

By vimvq1987, ago