diff --git a/src/queries/category-count.js b/src/queries/category-count.js index ee17a31..d43dcbf 100644 --- a/src/queries/category-count.js +++ b/src/queries/category-count.js @@ -4,13 +4,28 @@ import { getDemoCategoryCount } from '../demo/store.js'; import { getPool } from '../db.js'; import { CATEGORY_TREE_CTE, categoryTreeRequest, getRootCategoryId } from './category-tree.js'; +const LANGUAGE_ID = Number(process.env.LANGUAGE_ID) || 1; + const CATEGORY_COUNT_SQL = ` ${CATEGORY_TREE_CTE} SELECT COUNT(*) AS CategoryCount FROM dbo.tKategorie k -WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree) - AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks WHERE ks.kKategorie = k.kKategorie AND ks.kShop = @kShop)) - AND CONVERT(BIGINT, k.bRowversion) > @cursor; +LEFT JOIN dbo.tKategorieSprache ks ON ks.kKategorie = k.kKategorie AND ks.kSprache = @languageId +LEFT JOIN dbo.tKategoriebildPlattform kbp ON kbp.kKategorie = k.kKategorie +CROSS APPLY ( + SELECT MAX(v) AS lastChanged + FROM (VALUES + (CONVERT(BIGINT, k.bRowversion)), + (CONVERT(BIGINT, ks.bRowversion)), + (CONVERT(BIGINT, kbp.bRowversion)), + ((SELECT MAX(CONVERT(BIGINT, ka.bRowversion)) FROM dbo.tKategorieArtikel ka WHERE ka.kKategorie = k.kKategorie)), + ((SELECT MAX(CONVERT(BIGINT, ksh.bRowversion)) FROM dbo.tKategorieShop ksh WHERE ksh.kKategorie = k.kKategorie AND (@kShop = 0 OR ksh.kShop = @kShop))) + ) AS t(v) +) rv +WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree WHERE kKategorie <> @rootCategoryId) + AND k.cAktiv = 'Y' + AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks2 WHERE ks2.kKategorie = k.kKategorie AND ks2.kShop = @kShop)) + AND rv.lastChanged > @cursor; `; export async function getCategoryCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) { @@ -20,6 +35,7 @@ export async function getCategoryCount({ cursor = 0, rootCategoryId = getRootCat const result = await categoryTreeRequest(getPool(), rootCategoryId) .input('cursor', sql.BigInt, cursor) + .input('languageId', sql.Int, LANGUAGE_ID) .query(CATEGORY_COUNT_SQL); return result.recordset[0]?.CategoryCount ?? 0; } diff --git a/src/queries/category-list.js b/src/queries/category-list.js index 27c33a9..79cd6c5 100644 --- a/src/queries/category-list.js +++ b/src/queries/category-list.js @@ -14,17 +14,27 @@ SELECT TOP (@limit) k.nSort AS sort, ks.cName AS name, b.cHash AS imgHash, - CONVERT(BIGINT, k.bRowversion) AS lastChanged + rv.lastChanged FROM dbo.tKategorie k INNER JOIN dbo.tKategorieSprache ks ON ks.kKategorie = k.kKategorie AND ks.kSprache = @languageId LEFT JOIN dbo.tKategoriebildPlattform kbp ON kbp.kKategorie = k.kKategorie LEFT JOIN dbo.tBild b ON b.kBild = kbp.kBild +CROSS APPLY ( + SELECT MAX(v) AS lastChanged + FROM (VALUES + (CONVERT(BIGINT, k.bRowversion)), + (CONVERT(BIGINT, ks.bRowversion)), + (CONVERT(BIGINT, kbp.bRowversion)), + ((SELECT MAX(CONVERT(BIGINT, ka.bRowversion)) FROM dbo.tKategorieArtikel ka WHERE ka.kKategorie = k.kKategorie)), + ((SELECT MAX(CONVERT(BIGINT, ksh.bRowversion)) FROM dbo.tKategorieShop ksh WHERE ksh.kKategorie = k.kKategorie AND (@kShop = 0 OR ksh.kShop = @kShop))) + ) AS t(v) +) rv WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree WHERE kKategorie <> @rootCategoryId) AND k.cAktiv = 'Y' AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks2 WHERE ks2.kKategorie = k.kKategorie AND ks2.kShop = @kShop)) - AND CONVERT(BIGINT, k.bRowversion) > @cursor -ORDER BY lastChanged ASC; + AND rv.lastChanged > @cursor +ORDER BY rv.lastChanged ASC; `; export async function getCategoryList({ cursor = 0, limit = 20, rootCategoryId = getRootCategoryId() } = {}) { diff --git a/src/queries/product-count.js b/src/queries/product-count.js index 8c307d8..9dbd7be 100644 --- a/src/queries/product-count.js +++ b/src/queries/product-count.js @@ -4,23 +4,30 @@ import { getDemoProductCount } from '../demo/store.js'; import { getPool } from '../db.js'; import { CATEGORY_TREE_CTE, categoryTreeRequest, getRootCategoryId } from './category-tree.js'; +const LANGUAGE_ID = Number(process.env.LANGUAGE_ID) || 1; + const PRODUCT_COUNT_SQL = ` ${CATEGORY_TREE_CTE} SELECT COUNT(DISTINCT a.kArtikel) AS ProductCount FROM dbo.tArtikel a INNER JOIN dbo.tKategorieArtikel ka ON ka.kArtikel = a.kArtikel +LEFT JOIN dbo.tlagerbestand lb ON lb.kArtikel = a.kArtikel +LEFT JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId +CROSS APPLY ( + SELECT MAX(v) AS lastChanged + FROM (VALUES + (CONVERT(BIGINT, a.bRowversion)), + (CONVERT(BIGINT, lb.bRowversion)), + (CONVERT(BIGINT, ab.bRowversion)), + ((SELECT MAX(CONVERT(BIGINT, abp.bRowversion)) FROM dbo.tArtikelbildPlattform abp WHERE abp.kArtikel = a.kArtikel AND (@kShop = 0 OR abp.kShop = @kShop))), + ((SELECT MAX(CONVERT(BIGINT, p.bRowversion)) FROM dbo.tPreis p WHERE p.kArtikel = a.kArtikel AND (@kShop = 0 OR p.kShop = @kShop))), + ((SELECT MAX(CONVERT(BIGINT, sp.bRowversion)) FROM dbo.tArtikelSonderpreis sp WHERE sp.kArtikel = a.kArtikel)) + ) AS t(v) +) rv WHERE a.cAktiv = 'Y' AND ka.kKategorie IN (SELECT kKategorie FROM CategoryTree) AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks WHERE ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop)) - AND ( - CONVERT(BIGINT, a.bRowversion) > @cursor - OR EXISTS ( - SELECT 1 FROM dbo.tArtikelbildPlattform abp - WHERE abp.kArtikel = a.kArtikel - AND abp.kShop = @kShop - AND CONVERT(BIGINT, abp.bRowversion) > @cursor - ) - ); + AND rv.lastChanged > @cursor; `; export async function getProductCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) { @@ -30,6 +37,7 @@ export async function getProductCount({ cursor = 0, rootCategoryId = getRootCate const result = await categoryTreeRequest(getPool(), rootCategoryId) .input('cursor', sql.BigInt, cursor) + .input('languageId', sql.Int, LANGUAGE_ID) .query(PRODUCT_COUNT_SQL); return result.recordset[0]?.ProductCount ?? 0; } diff --git a/src/queries/product-list.js b/src/queries/product-list.js index e3d8845..8f78729 100644 --- a/src/queries/product-list.js +++ b/src/queries/product-list.js @@ -15,12 +15,6 @@ WITH TaxRates AS ( SELECT kSteuerklasse, fSteuersatz FROM dbo.tSteuersatz WHERE kSteuerzone IN (SELECT kSteuerzone FROM dbo.tSteuerzone WHERE cName = @taxZoneName) -), -ImageRV AS ( - SELECT kArtikel, MAX(CONVERT(BIGINT, bRowversion)) AS maxImageRV - FROM dbo.tArtikelbildPlattform - WHERE kShop = @kShop - GROUP BY kArtikel ) SELECT TOP (@limit) a.kArtikel AS id, @@ -29,11 +23,7 @@ SELECT TOP (@limit) a.fVKNetto AS netPrice, tr.fSteuersatz AS taxRate, a.dErstelldatum AS createdAt, - CASE - WHEN ir.maxImageRV IS NOT NULL AND ir.maxImageRV > CONVERT(BIGINT, a.bRowversion) - THEN ir.maxImageRV - ELSE CONVERT(BIGINT, a.bRowversion) - END AS lastChanged, + rv.lastChanged, ( SELECT TOP 1 img.cHash FROM dbo.tArtikelbildPlattform abp @@ -59,20 +49,28 @@ SELECT TOP (@limit) ISNULL(v.fBestand, 0) AS fBestand FROM dbo.tArtikel a INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId +LEFT JOIN dbo.tlagerbestand lb ON lb.kArtikel = a.kArtikel LEFT JOIN TaxRates tr ON tr.kSteuerklasse = a.kSteuerklasse -LEFT JOIN ImageRV ir ON ir.kArtikel = a.kArtikel LEFT JOIN dbo.vLagerbestandProLager v ON v.kArtikel = a.kArtikel AND v.kWarenlager = @warenlagerId +CROSS APPLY ( + SELECT MAX(val) AS lastChanged + FROM (VALUES + (CONVERT(BIGINT, a.bRowversion)), + (CONVERT(BIGINT, lb.bRowversion)), + (CONVERT(BIGINT, ab.bRowversion)), + ((SELECT MAX(CONVERT(BIGINT, abp.bRowversion)) FROM dbo.tArtikelbildPlattform abp WHERE abp.kArtikel = a.kArtikel AND (@kShop = 0 OR abp.kShop = @kShop))), + ((SELECT MAX(CONVERT(BIGINT, p.bRowversion)) FROM dbo.tPreis p WHERE p.kArtikel = a.kArtikel AND (@kShop = 0 OR p.kShop = @kShop))), + ((SELECT MAX(CONVERT(BIGINT, sp.bRowversion)) FROM dbo.tArtikelSonderpreis sp WHERE sp.kArtikel = a.kArtikel)) + ) AS t(val) +) rv WHERE a.cAktiv = 'Y' AND (@kShop = 0 OR EXISTS ( SELECT 1 FROM dbo.tKategorieArtikel ka INNER JOIN dbo.tKategorieShop ks ON ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop WHERE ka.kArtikel = a.kArtikel )) - AND ( - CONVERT(BIGINT, a.bRowversion) > @cursor - OR (ir.maxImageRV IS NOT NULL AND ir.maxImageRV > @cursor) - ) -ORDER BY lastChanged ASC; + AND rv.lastChanged > @cursor +ORDER BY rv.lastChanged ASC; `; function priceOverridesSql(articleIds) {