Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-06-23 17:17:44 +03:00
parent e980d6c2d5
commit 0f9b7549ec
2 changed files with 234 additions and 12 deletions

View File

@@ -621,27 +621,147 @@ func productSeriesResolvePGVariant(ctx context.Context, pg *sql.DB, productCode,
}
return 0, 0, sql.NullInt64{}, false, err
}
var dim1ID int64
if err := pg.QueryRowContext(ctx, `SELECT dim_id FROM mk_dim_token_map WHERE dim_column='dimval1' AND token=$1`, strings.TrimSpace(colorCode)).Scan(&dim1ID); err != nil {
if err == sql.ErrNoRows {
return 0, 0, sql.NullInt64{}, false, nil
}
dim1ID, ok, err := productSeriesResolveDimTokenID(ctx, pg, "dimval1", colorCode, mmitemID)
if err != nil {
return 0, 0, sql.NullInt64{}, false, err
}
if !ok || dim1ID <= 0 {
return 0, 0, sql.NullInt64{}, false, nil
}
var dim3ID sql.NullInt64
if strings.TrimSpace(dim3Code) != "" {
var id int64
if err := pg.QueryRowContext(ctx, `SELECT dim_id FROM mk_dim_token_map WHERE dim_column='dimval3' AND token=$1`, strings.TrimSpace(dim3Code)).Scan(&id); err != nil {
if err == sql.ErrNoRows {
return 0, 0, sql.NullInt64{}, false, nil
}
id, ok, err := productSeriesResolveDimTokenID(ctx, pg, "dimval3", dim3Code, mmitemID)
if err != nil {
return 0, 0, sql.NullInt64{}, false, err
}
if !ok || id <= 0 {
return 0, 0, sql.NullInt64{}, false, nil
}
dim3ID = sql.NullInt64{Int64: id, Valid: true}
}
return mmitemID, dim1ID, dim3ID, true, nil
}
func productSeriesResolveDimTokenID(ctx context.Context, pg *sql.DB, column string, token string, mmitemID int64) (int64, bool, error) {
tok := strings.ToUpper(strings.TrimSpace(token))
if tok == "" || tok == "0" {
return 0, false, nil
}
// dimval3 tokens like "001" can map to different dim ids per product in this installation.
// Prefer per-mmitem inference from dfblob (src_id filter) to avoid global mk_dim_token_map mismatches.
if column == "dimval3" && mmitemID > 0 {
if inferred, ok := productSeriesInferDimIDFromImages(pg, mmitemID, column, tok); ok {
return inferred, true, nil
}
}
var id int64
err := pg.QueryRowContext(ctx, `SELECT dim_id FROM mk_dim_token_map WHERE dim_column=$1 AND token=$2`, column, tok).Scan(&id)
if err == nil {
return id, id > 0, nil
}
if err != sql.ErrNoRows {
return 0, false, err
}
// Fallback: infer from dfblob filenames. For dimval3 do not persist globally.
if mmitemID > 0 {
if inferred, ok := productSeriesInferDimIDFromImages(pg, mmitemID, column, tok); ok {
return inferred, true, nil
}
}
v := productSeriesResolveDimvalFromFileNameToken(pg, column, tok, 0)
if v == "" {
return 0, false, nil
}
parsed, perr := strconv.ParseInt(v, 10, 64)
if perr != nil || parsed <= 0 {
return 0, false, nil
}
if column == "dimval1" {
// Persist only for dimval1 where tokens are globally stable.
_, _ = pg.ExecContext(ctx, `
INSERT INTO mk_dim_token_map (dim_column, token, dim_id, updated_at)
VALUES ($1,$2,$3,now())
ON CONFLICT (dim_column, token)
DO UPDATE SET dim_id = EXCLUDED.dim_id, updated_at = EXCLUDED.updated_at
`, column, tok, parsed)
}
return parsed, true, nil
}
func productSeriesBuildNameLikePatterns(token string) []string {
t := strings.ToUpper(strings.TrimSpace(token))
if t == "" {
return nil
}
return []string{
"% " + t + " %",
"%-" + t + "-%",
"%-" + t + "_%",
"%_" + t + "_%",
"%(" + t + ")%",
t + " %",
}
}
func productSeriesResolveDimvalFromFileNameToken(pg *sql.DB, column, token string, mmitemID int64) string {
patterns := productSeriesBuildNameLikePatterns(token)
if len(patterns) == 0 {
return ""
}
srcFilter := ""
args := []any{patterns[0], patterns[1], patterns[2], patterns[3], patterns[4], patterns[5]}
if mmitemID > 0 {
srcFilter = " AND src_id=$7"
args = append(args, mmitemID)
}
query := fmt.Sprintf(`
SELECT x.dimv
FROM (
SELECT COALESCE(%s::text, '') AS dimv, COUNT(*) AS cnt
FROM dfblob
WHERE src_table='mmitem'
AND typ='img'
AND COALESCE(%s::text, '') <> ''
%s
AND (
UPPER(COALESCE(file_name,'')) LIKE $1 OR
UPPER(COALESCE(file_name,'')) LIKE $2 OR
UPPER(COALESCE(file_name,'')) LIKE $3 OR
UPPER(COALESCE(file_name,'')) LIKE $4 OR
UPPER(COALESCE(file_name,'')) LIKE $5 OR
UPPER(COALESCE(file_name,'')) LIKE $6
)
GROUP BY COALESCE(%s::text, '')
) x
ORDER BY x.cnt DESC, x.dimv
LIMIT 1
`, column, column, srcFilter, column)
var v string
if err := pg.QueryRow(query, args...).Scan(&v); err != nil {
return ""
}
v = strings.TrimSpace(v)
if v == "" || v == "0" {
return ""
}
return v
}
func productSeriesInferDimIDFromImages(pg *sql.DB, mmitemID int64, column, token string) (int64, bool) {
v := productSeriesResolveDimvalFromFileNameToken(pg, column, token, mmitemID)
if v == "" {
return 0, false
}
id, err := strconv.ParseInt(v, 10, 64)
if err != nil || id <= 0 {
return 0, false
}
return id, true
}
func productSeriesClaimQueue(ctx context.Context, tx *sql.Tx, limit int) ([]productSeriesQueueItem, error) {
rows, err := tx.QueryContext(ctx, `
WITH picked AS (