From 4bae2ddba4daa4ea67fd9153361bafdd6dbfd065 Mon Sep 17 00:00:00 2001 From: "phares@iscn5cg20977xq" Date: Mon, 22 Sep 2025 16:46:33 -0700 Subject: [PATCH] Add IndexOf property to WSRequest and Description classes; implement getValue function in recipes-and-patterns.js --- .../OpenInsightMetrologyViewer/WSRequest.cs | 2 + Adaptation/FileHandlers/pcl/Description.cs | 1 + .../_Tests/Static/recipes-and-patterns.js | 118 ++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 Adaptation/_Tests/Static/recipes-and-patterns.js diff --git a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs index ae29c0b..4cf6548 100644 --- a/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs +++ b/Adaptation/FileHandlers/OpenInsightMetrologyViewer/WSRequest.cs @@ -30,6 +30,7 @@ public class WSRequest public string GradeRadialGradient { get; set; } public string GradeStdDev { get; set; } public int Id { get; set; } + public string IndexOf { get; set; } public string Layer { get; set; } public string Lot { get; set; } public string Model { get; set; } @@ -96,6 +97,7 @@ public class WSRequest GradeRadialGradient = x.GradeRadialGradient; GradeStdDev = x.GradeStdDev; Operator = logistics.MesEntity; // different name + IndexOf = x.IndexOf; Layer = x.Layer; Lot = x.Lot; Model = x.Model; diff --git a/Adaptation/FileHandlers/pcl/Description.cs b/Adaptation/FileHandlers/pcl/Description.cs index d3fc847..5ab34aa 100644 --- a/Adaptation/FileHandlers/pcl/Description.cs +++ b/Adaptation/FileHandlers/pcl/Description.cs @@ -30,6 +30,7 @@ public class Description : IDescription, Shared.Properties.IDescription [JsonPropertyName("PSN")] public string PSN { get; set; } [JsonPropertyName("Reactor")] public string Reactor { get; set; } [JsonPropertyName("Recipe")] public string Recipe { get; set; } + [JsonPropertyName("IndexOf")] public string IndexOf { get; set; } // [JsonPropertyName("Area")] public string Area { get; set; } [JsonPropertyName("Folder")] public string Folder { get; set; } diff --git a/Adaptation/_Tests/Static/recipes-and-patterns.js b/Adaptation/_Tests/Static/recipes-and-patterns.js new file mode 100644 index 0000000..06029ff --- /dev/null +++ b/Adaptation/_Tests/Static/recipes-and-patterns.js @@ -0,0 +1,118 @@ +// Recipe 1 = Matched +// recipes-and-patterns.js under IndexOf +// RecipesAndPatternsMatch +// ($('dcp.HGCV1/csv/Index', 0) + 1) == $('dcp.HGCV1/csv/Count', 0) +// getValue('HGCV', $('dcp.HGCV1/csv/Count', 0), $('dcp.HGCV1/csv/SetupFile', ''), $('dcp.HGCV1/csv/Pattern', ''), getContextData('2', 'cds.NULL_DATA', '')); + +function getValue(tool, patternSize, recipe, pattern, json) { + let result; + if (tool == undefined || tool.length === 0 || patternSize == undefined || patternSize.length === 0 || recipe == undefined || recipe.length === 0 || pattern == undefined || pattern.length === 0 || json == undefined || json.length === 0) + result = 'A) Invalid input!'; + else { + let parsed; + try { + parsed = JSON.parse(json); + } catch (error) { + parsed = null; + } + if (parsed == null) + result = 'B) Invalid input!'; + else if (parsed.rds == undefined || parsed.rds.prodSpec == undefined || parsed.rds.prodSpec.recipesAndPatterns == undefined) + result = 'C) No Spec!'; + else { + let toolMatches = []; + for (let index = 0; index < parsed.rds.prodSpec.recipesAndPatterns.length; index++) { + if (parsed.rds.prodSpec.recipesAndPatterns[index].tool === tool) { + toolMatches.push(parsed.rds.prodSpec.recipesAndPatterns[index]); + } + } + if (toolMatches == null || toolMatches.length === 0) + result = 'Tool [' + tool + '] not found in OI API results!'; + else { + let debug = ''; + let matches = 0; + for (let index = 0; index < toolMatches.length; index++) { + debug += 'patternSize: ' + toolMatches[index].patternSize + + '; recipe: ' + toolMatches[index].recipe + + '; pattern: ' + toolMatches[index].pattern + ';~'; + if (toolMatches[index].patternSize == patternSize && + toolMatches[index].recipe.localeCompare(recipe, ['en-US'], { sensitivity: 'base' }) === 0 && + toolMatches[index].pattern.localeCompare(pattern, ['en-US'], { sensitivity: 'base' }) === 0) { + matches++; + } + } + if (matches > 0) + result = '1'; + else { + result = 'Value not matched~Run~patternSize: ' + patternSize + '; recipe: ' + recipe + '; pattern: ' + pattern + ';~API~' + debug; + } + } + } + } + return result; +} + +getValue('HGCV', 9, '6IN4_10.SET', '6_9PLUS.PAT', '{"rds":{"prodSpec":{"recipesAndPatterns":[{"recipe":"6IN4_10.SET","pattern":"6_9PLUS.PAT","patternSize":9,"tool":"HGCV"}]}}}'); + +let json; +let tool; +let recipe; +let pattern; +let patternSize; + +tool = 'HGCV' +patternSize = 9; +recipe = '6IN4_10.SET'; +pattern = '6_9PLUS.PAT'; +json = '{"rds":{"prodSpec":{"recipesAndPatterns":[{"recipe":"6IN4_10.SET","pattern":"6_9PLUS.PAT","patternSize":9,"tool":"HGCV"}]}}}'; +const testA = getValue(tool, patternSize, recipe, pattern, json); +if (testA !== '1') + throw 'Test A failed: ' + testA; +tool = null; +const testB = getValue(tool, patternSize, recipe, pattern, json); +if (testB !== 'A) Invalid input!') + throw 'Test L failed: ' + testB; +tool = ''; +const testC = getValue(tool, patternSize, recipe, pattern, json); +if (testC !== 'A) Invalid input!') + throw 'Test M failed: ' + testC; +patternSize = null; +const testD = getValue(tool, patternSize, recipe, pattern, json); +if (testD !== 'A) Invalid input!') + throw 'Test J failed: ' + testD; +patternSize = ''; +const testE = getValue(tool, patternSize, recipe, pattern, json); +if (testE !== 'A) Invalid input!') + throw 'Test K failed: ' + testE; +recipe = null; +const testF = getValue(tool, patternSize, recipe, pattern, json); +if (testF !== 'A) Invalid input!') + throw 'Test F failed: ' + testF; +recipe = ''; +const testG = getValue(tool, patternSize, recipe, pattern, json); +if (testG !== 'A) Invalid input!') + throw 'Test G failed: ' + testG; +pattern = null; +const testH = getValue(tool, patternSize, recipe, pattern, json); +if (testH !== 'A) Invalid input!') + throw 'Test H failed: ' + testH; +pattern = ''; +const testI = getValue(tool, patternSize, recipe, pattern, json); +if (testI !== 'A) Invalid input!') + throw 'Test I failed: ' + testI; +json = ''; +const testK = getValue(tool, patternSize, recipe, pattern, json); +if (testK !== 'A) Invalid input!') + throw 'Test B failed: ' + testK; +json = 'invalid'; +const testL = getValue(tool, patternSize, recipe, pattern, json); +if (testL !== 'B) Invalid input!') + throw 'Test C failed: ' + testL; +json = '{"rds":{}}'; +const testM = getValue(tool, patternSize, recipe, pattern, json); +if (testM !== 'C) No Spec!') + throw 'Test D failed: ' + testM; +json = '{"rds":{"prodSpec":{"recipesAndPatterns":[]}}}'; +const testN = getValue(tool, patternSize, recipe, pattern, json); +if (testN !== 'Tool [HGCV] not found in OI API results!') + throw 'Test E failed: ' + testN;