Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-06-18 17:49:30 +03:00
parent 149cea778e
commit d1fbe60aeb
5 changed files with 216 additions and 105 deletions

View File

@@ -672,6 +672,20 @@ func cleanProductPricingFilterValues(values []string) []string {
return clean
}
func isProductCodeOnlyPricingFilter(filters ProductPricingFilters) bool {
return len(cleanProductPricingFilterValues(filters.ProductCode)) > 0 &&
strings.TrimSpace(filters.Search) == "" &&
len(cleanProductPricingFilterValues(filters.BrandGroup)) == 0 &&
len(cleanProductPricingFilterValues(filters.AskiliYan)) == 0 &&
len(cleanProductPricingFilterValues(filters.Kategori)) == 0 &&
len(cleanProductPricingFilterValues(filters.UrunIlkGrubu)) == 0 &&
len(cleanProductPricingFilterValues(filters.UrunAnaGrubu)) == 0 &&
len(cleanProductPricingFilterValues(filters.UrunAltGrubu)) == 0 &&
len(cleanProductPricingFilterValues(filters.Icerik)) == 0 &&
len(cleanProductPricingFilterValues(filters.Karisim)) == 0 &&
len(cleanProductPricingFilterValues(filters.Marka)) == 0
}
func GetProductPricingPage(ctx context.Context, page int, limit int, filters ProductPricingFilters, includeTotal bool, sortBy string, descending bool) (ProductPricingPage, error) {
result := ProductPricingPage{
Rows: []models.ProductPricing{},
@@ -751,8 +765,28 @@ func GetProductPricingPage(ctx context.Context, page int, limit int, filters Pro
}, " OR ")+")")
}
whereSQL := strings.Join(whereParts, " AND ")
cleanProductCodes := cleanProductPricingFilterValues(filters.ProductCode)
productCodeOnlyFilter := isProductCodeOnlyPricingFilter(filters)
if includeTotal {
if includeTotal && productCodeOnlyFilter {
result.TotalCount = len(cleanProductCodes)
if result.TotalCount == 0 {
result.TotalPages = 0
result.Page = 1
return result, nil
}
totalPages := int(math.Ceil(float64(result.TotalCount) / float64(limit)))
if totalPages <= 0 {
totalPages = 1
}
if page > totalPages {
page = totalPages
offset = (page - 1) * limit
}
result.Page = page
result.Limit = limit
result.TotalPages = totalPages
} else if includeTotal {
countQuery := `
SELECT COUNT(DISTINCT LTRIM(RTRIM(ProductCode)))
FROM ProductFilterWithDescription('TR')
@@ -789,7 +823,7 @@ func GetProductPricingPage(ctx context.Context, page int, limit int, filters Pro
// Stage 1: fetch only paged products first. Exact product-code filters do not
// need the stock sort temp table here; detailed metrics are fetched below.
productCodeFastPath := len(cleanProductPricingFilterValues(filters.ProductCode)) > 0
productCodeFastPath := len(cleanProductCodes) > 0
sortBy = strings.TrimSpace(sortBy)
orderDir := "DESC"
if !descending {
@@ -876,7 +910,72 @@ func GetProductPricingPage(ctx context.Context, page int, limit int, filters Pro
OFFSET ` + strconv.Itoa(offset) + ` ROWS
FETCH NEXT ` + strconv.Itoa(limit) + ` ROWS ONLY;
`
if productCodeFastPath {
if productCodeOnlyFilter {
valueRows := make([]string, 0, len(cleanProductCodes))
directArgs := make([]any, 0, len(cleanProductCodes))
for i, code := range cleanProductCodes {
paramName := "@p" + strconv.Itoa(i+1)
valueRows = append(valueRows, "("+paramName+")")
directArgs = append(directArgs, code)
}
args = directArgs
productQuery = `
WITH req_codes AS (
SELECT DISTINCT LTRIM(RTRIM(v.ProductCode)) AS ProductCode
FROM (VALUES ` + strings.Join(valueRows, ",") + `) v(ProductCode)
WHERE LEN(LTRIM(RTRIM(v.ProductCode))) > 0
),
attr AS (
SELECT
LTRIM(RTRIM(a.ItemCode)) AS ProductCode,
MAX(CASE WHEN a.AttributeTypeCode = 45 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS AskiliYan,
MAX(CASE WHEN a.AttributeTypeCode = 44 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS Kategori,
MAX(CASE WHEN a.AttributeTypeCode = 42 THEN LTRIM(RTRIM(a.AttributeCode)) ELSE '' END) AS UrunIlkGrubuCode,
MAX(CASE WHEN a.AttributeTypeCode = 42 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS UrunIlkGrubu,
MAX(CASE WHEN a.AttributeTypeCode = 1 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS UrunAnaGrubu,
MAX(CASE WHEN a.AttributeTypeCode = 2 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS UrunAltGrubu,
MAX(CASE WHEN a.AttributeTypeCode = 41 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS Icerik,
MAX(CASE WHEN a.AttributeTypeCode = 29 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS Karisim,
MAX(CASE WHEN a.AttributeTypeCode = 10 THEN COALESCE(NULLIF(LTRIM(RTRIM(d.AttributeDescription)), ''), LTRIM(RTRIM(a.AttributeCode))) ELSE '' END) AS Marka,
MAX(CASE WHEN a.AttributeTypeCode = 10 THEN LTRIM(RTRIM(a.AttributeCode)) ELSE '' END) AS BrandCode
FROM dbo.prItemAttribute a WITH(NOLOCK)
INNER JOIN req_codes rc
ON rc.ProductCode = LTRIM(RTRIM(a.ItemCode))
LEFT JOIN dbo.cdItemAttributeDesc d WITH(NOLOCK)
ON d.ItemTypeCode = a.ItemTypeCode
AND d.AttributeTypeCode = a.AttributeTypeCode
AND d.AttributeCode = a.AttributeCode
AND d.LangCode = 'TR'
WHERE a.ItemTypeCode = 1
AND a.AttributeTypeCode IN (1,2,10,29,41,42,44,45)
GROUP BY LTRIM(RTRIM(a.ItemCode))
)
SELECT
rc.ProductCode,
CAST('' AS NVARCHAR(100)) AS BrandGroupSec,
COALESCE(attr.AskiliYan, '') AS AskiliYan,
COALESCE(attr.Kategori, '') AS Kategori,
COALESCE(attr.UrunIlkGrubu, '') AS UrunIlkGrubu,
COALESCE(attr.UrunAnaGrubu, '') AS UrunAnaGrubu,
COALESCE(attr.UrunAltGrubu, '') AS UrunAltGrubu,
COALESCE(attr.Icerik, '') AS Icerik,
COALESCE(attr.Karisim, '') AS Karisim,
COALESCE(attr.Marka, '') AS Marka,
COALESCE(attr.BrandCode, '') AS BrandCode
FROM req_codes rc
INNER JOIN dbo.cdItem ci WITH(NOLOCK)
ON ci.ItemTypeCode = 1
AND LTRIM(RTRIM(ci.ItemCode)) = rc.ProductCode
LEFT JOIN attr
ON attr.ProductCode = rc.ProductCode
WHERE ISNULL(ci.IsBlocked, 0) = 0
AND LEN(LTRIM(RTRIM(ci.ItemCode))) = 13
AND COALESCE(attr.UrunIlkGrubuCode, '') IN ('SERI', 'AKSESUAR')
ORDER BY rc.ProductCode ASC
OFFSET ` + strconv.Itoa(offset) + ` ROWS
FETCH NEXT ` + strconv.Itoa(limit) + ` ROWS ONLY;
`
} else if productCodeFastPath {
productQuery = `
IF OBJECT_ID('tempdb..#req_codes') IS NOT NULL DROP TABLE #req_codes;

View File

@@ -258,8 +258,9 @@ norm AS (
COALESCE(price, 0) AS price
FROM input
),
-- Prefer PG's authoritative variant dimension table (mmitem_dim). Fall back to cache table if needed.
dims_mmitem_dim AS (
-- Only PG's authoritative variant dimension table may drive delta writes.
-- Do not union sdprc/cache dimensions; stale rows there can re-create wrong variant keys.
dims AS (
SELECT
norm.product_code AS product_code,
md.val1::bigint AS dim1,
@@ -275,41 +276,7 @@ norm AS (
AND COALESCE(md.is_active, TRUE) = TRUE
WHERE md.val1 IS NOT NULL
AND md.val1 > 0
GROUP BY norm.product_code, md.val1, md.val2
),
dims_cache_table AS (
SELECT
NULLIF(BTRIM(c.product_code), '') AS product_code,
c.dim1::bigint AS dim1,
c.dim3::bigint AS dim3
FROM mk_mmitem_dim_combo c
JOIN norm
ON norm.product_code = c.product_code
WHERE c.dim1 IS NOT NULL
),
dims_cache AS (
SELECT product_code, dim1, dim3 FROM dims_mmitem_dim
UNION
SELECT product_code, dim1, dim3 FROM dims_cache_table
),
dims_sdprc AS (
SELECT
norm.product_code AS product_code,
s.dim1 AS dim1,
s.dim3 AS dim3
FROM norm
JOIN mmitem mm
ON mm.code = norm.product_code
JOIN sdprc s
ON s.mmitem_id = mm.id
WHERE s.dim1 IS NOT NULL
AND s.dim1 > 0
GROUP BY norm.product_code, s.dim1, s.dim3
),
dims AS (
SELECT product_code, dim1, dim3 FROM dims_cache
UNION
SELECT product_code, dim1, dim3 FROM dims_sdprc
GROUP BY norm.product_code, md.val1, md.val3
),
mapped AS (
SELECT