B2026 053 find unlinked values of selected #795

Merged
mschill merged 28 commits from B2026-053-Find-Unlinked-Values-of-Selected into Development 2026-07-30 15:29:20 -04:00
+52 -26
View File
@@ -2016,35 +2016,16 @@ namespace Volian.Controls.Library
{ {
ReportTitle = string.Format("Search for '{0}'", TextSearchString); ReportTitle = string.Format("Search for '{0}'", TextSearchString);
// C2020-009: Search - Allow search 'By Word'.
string byWordPrefix = string.Empty; string byWordPrefix = string.Empty;
string byWordSuffix = string.Empty; string byWordSuffix = string.Empty;
if (cbxByWord.Checked) if (cbxByWord.Checked)
Outdated
Review

Was this if intentionally commented out? -- just checking since doesn't it change the logic around this other search --- for testing would make sure both searches tested with the different options.

Was this if intentionally commented out? -- just checking since doesn't it change the logic around this other search --- for testing would make sure both searches tested with the different options.
Outdated
Review

Thanks, that code needs to be there and account of that I need to change the logic for updating the pre and post additions.

Thanks, that code needs to be there and account of that I need to change the logic for updating the pre and post additions.
{ {
// Generate a prefix & suffix to be used in the sql query around the search string. byWordPrefix = GetByWordSettings(TextSearchString, true);
jjenko marked this conversation as resolved Outdated
Outdated
Review

Please move this descriptive comment (the stuff inside the curly braces) into the function you had created.

Then remove the rest of the stuff you had commented out.

Please move this descriptive comment (the stuff inside the curly braces) into the function you had created. Then remove the rest of the stuff you had commented out.
// If the search string starts (prefix)/ends(suffix) with a number, then use an expression that byWordSuffix = GetByWordSettings(TextSearchString, false);
// does not allow the preceding/following text to have a number, '.', letter or other rtf
// commands. If the search string starts/ends with a letter, then use an expression that does not
// find the preceding/following text that is text, i.e. a letter.
if (Regex.IsMatch(TextSearchString, @"^[\d\.]")) // starts with a number or '.' decimal pt
{
byWordPrefix = @"[^0-9a-zA-Z.vbpi:\\-]";
}
else if (Regex.IsMatch(TextSearchString, @"^[a-zA-Z]")) // starts with a letter
{
byWordPrefix = @"[^a-zA-Z]";
}
if (Regex.IsMatch(TextSearchString, @"[\d\.]$")) // ends with a number or decimal
{
byWordSuffix = @"[^0-9a-zA-Z.vbpi:\\-]";
}
else if (Regex.IsMatch(TextSearchString, @"[a-zA-Z]$")) // ends with a letter
{
byWordSuffix = @"[^a-zA-Z]";
}
} }
SearchString = TextSearchString;
// B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results. SearchString = TextSearchString;
SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, TextSearchString /*.Replace(@"\",@"\u9586?")*/, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, cbxIncROTextSrch.Checked ? ItemSearchIncludeLinks.Value : ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix); SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, TextSearchString /*.Replace(@"\",@"\u9586?")*/, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, cbxIncROTextSrch.Checked ? ItemSearchIncludeLinks.Value : ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, byWordPrefix, byWordSuffix);
cmbResultsStyleIndex = 3; // display step text in results cmbResultsStyleIndex = 3; // display step text in results
@@ -2078,8 +2059,8 @@ namespace Volian.Controls.Library
if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked) if (cbxFndUnLnkROVals.Enabled && cbxFndUnLnkROVals.Checked)
{ {
// B2022-031 - added a cbxProcSectSrch to filter out procedure and section titles from global search results.
SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, string.Empty, string.Empty); SearchResults = ItemInfoList.GetListFromTextSearch(DVISearchList, TypeSearchList, ROSearchList, cbxBooleanTxtSrch.Checked ? 2 : cbxCaseSensitive.Checked ? 1 : 0, cbxProcSectSrch.Checked ? 1 : 0, ItemSearchIncludeLinks.Nothing, includeRTFformat, includeSpecialChars, unitPrefix, GetByWordSettings(ROSearchList, true), GetByWordSettings(ROSearchList, false));
cmbResultsStyleIndex = 3; // display step text in results cmbResultsStyleIndex = 3; // display step text in results
} }
else else
3
@@ -2189,7 +2170,52 @@ namespace Volian.Controls.Library
} }
OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks))); OnSearchComplete(new DisplaySearchEventArgs(TimeSpan.FromTicks(DateTime.Now.Ticks - start.Ticks)));
} }
private string GetByWordSettings(string ss, bool checkstart)
{
// C2020-009: Search - Allow search 'By Word'.
// // Generate a prefix & suffix to be used in the sql query around the search string.
jjenko marked this conversation as resolved Outdated
Outdated
Review

Please remove the code you had commented out.

Please remove the code you had commented out.
// // If the search string starts (prefix)/ends(suffix) with a number, then use an expression that
// // does not allow the preceding/following text to have a number, '.', letter or other rtf
// // commands. If the search string starts/ends with a letter, then use an expression that does not
// // find the preceding/following text that is text, i.e. a letter.
if (ss.Length > 0)
{
mschill marked this conversation as resolved Outdated
Outdated
Review

Previous comments regarding Regexes still apply -- also it appears now we have 2 variables that we declared but did not use in string byWordPrefix & string byWordSuffix

Previous comments regarding Regexes still apply -- also it appears now we have 2 variables that we declared but did not use in string byWordPrefix & string byWordSuffix
Outdated
Review

I removed the two unneeded variable declarations. I used what was previous used for the regex string. If you notice both tests are looking to see what the first character is and not the whole searchstring and from that it selects different regex strings. On account of this I am not sure char.IsNumeric will work because there are searchstrings that start with a number but are a mix of numbers and characters. Example 5% code: "if (Regex.IsMatch(ss, @"^[\d.]")) // starts with a number or '.' decimal pt"

I removed the two unneeded variable declarations. I used what was previous used for the regex string. If you notice both tests are looking to see what the first character is and not the whole searchstring and from that it selects different regex strings. On account of this I am not sure char.IsNumeric will work because there are searchstrings that start with a number but are a mix of numbers and characters. Example 5% code: "if (Regex.IsMatch(ss, @"^[\d\.]")) // starts with a number or '.' decimal pt"
//checking start
if (checkstart)
{
// starts with a number or '.' decimal pt
if (char.IsNumber(ss, 0) || ss[0] == '.')
{
return @"[^0-9a-zA-Z.vbpi:\\-]";
}
// starts with a letter
jjenko marked this conversation as resolved Outdated
Outdated
Review

by always adding a space before the search text, it will not find places where the unlinked RO Value is the first thing on the line. Ex. an Equipment List might have only the unlinked RO Value.

I noticed that the last two fields in the call to GetListFromTextSearch() are for a "by word" text search and passes in a Regx expression. Could that be used? - look for "if (cbxByWord.Checked)"

by always adding a space before the search text, it will not find places where the unlinked RO Value is the first thing on the line. Ex. an Equipment List might have only the unlinked RO Value. I noticed that the last two fields in the call to GetListFromTextSearch() are for a "by word" text search and passes in a Regx expression. Could that be used? - look for "if (cbxByWord.Checked)"
else if (char.IsLetter(ss, 0))
{
return @"[^a-zA-Z]";
}
}
//checking end
else
{
mschill marked this conversation as resolved Outdated
Outdated
Review

What if multiple % signs? - like search for:
3% or 4% --- I believe the matches returned by the Regex object will give position of what is found.

What if multiple % signs? - like search for: 3% or 4% --- I believe the matches returned by the Regex object will give position of what is found.
// ends with a number or '.' decimal pt
if (char.IsNumber(ss, ss.Length - 1) || ss[ss.Length - 1] == '.')
{
return @"[^0-9a-zA-Z.vbpi:\\-]";
}
// ends with a letter
mschill marked this conversation as resolved Outdated
Outdated
Review

With working on tech debt project --- moving forward need to follow suggested code practices / suggestions by SonarLint --- if (isNumeric == true) should be
if (isNumeric)

With working on tech debt project --- moving forward need to follow suggested code practices / suggestions by SonarLint --- if (isNumeric == true) should be if (isNumeric)
else if (char.IsLetter(ss, ss.Length - 1))
{
mschill marked this conversation as resolved Outdated
Outdated
Review

With working on technical debt - should avoid concatenating strings & use string interpolation instead.

With working on technical debt - should avoid concatenating strings & use string interpolation instead.
return @"[^a-zA-Z]";
}
}
}
mschill marked this conversation as resolved Outdated
Outdated
Review

With working on technical debt - should avoid concatenating strings & use string interpolation instead.

With working on technical debt - should avoid concatenating strings & use string interpolation instead.
//default
return string.Empty;
}
private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click) private void ClearResults() // B2021-103 if no results when RNO only, clear results list. (moved from btnSearch_Click)
{ {
if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4]) if (tabSearchTypes.SelectedTab != tabSearchTypes.Tabs[4])
3