From ab0027000389b0edfeb654f22f244d5c88f19f51 Mon Sep 17 00:00:00 2001 From: Paulo Morgado <470455+paulomorgado@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:49:05 +0100 Subject: [PATCH 1/2] Replace string creation with static strings for Regex options conversion to string --- .../ObjectModel/BsonRegularExpression.cs | 67 ++++++++++++++----- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs b/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs index 27c2090c28b..dbffdb54333 100644 --- a/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs +++ b/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs @@ -80,22 +80,59 @@ public BsonRegularExpression(Regex regex) throw new ArgumentNullException("regex"); } _pattern = regex.ToString(); - _options = ""; - if ((regex.Options & RegexOptions.IgnoreCase) != 0) + switch (regex.Options & (RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace)) { - _options += "i"; - } - if ((regex.Options & RegexOptions.Multiline) != 0) - { - _options += "m"; - } - if ((regex.Options & RegexOptions.Singleline) != 0) - { - _options += "s"; - } - if ((regex.Options & RegexOptions.IgnorePatternWhitespace) != 0) - { - _options += "x"; + case RegexOptions.None: + _options = string.Empty; + break; + case RegexOptions.IgnoreCase: + _options = "i"; + break; + case RegexOptions.Multiline: + _options = "m"; + break; + case RegexOptions.Singleline: + _options = "s"; + break; + case RegexOptions.IgnorePatternWhitespace: + _options = "x"; + break; + case RegexOptions.IgnoreCase | RegexOptions.Multiline: + _options = "im"; + break; + case RegexOptions.IgnoreCase | RegexOptions.Singleline: + _options = "is"; + break; + case RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace: + _options = "ix"; + break; + case RegexOptions.Multiline | RegexOptions.Singleline: + _options = "ms"; + break; + case RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace: + _options = "mx"; + break; + case RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: + _options = "sx"; + break; + case RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline: + _options = "ims"; + break; + case RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace: + _options = "imx"; + break; + case RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: + _options = "isx"; + break; + case RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: + _options = "msx"; + break; + case RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: + _options = "imsx"; + break; + default: + _options = string.Empty; + break; } } From c22b878b72e0d4965fc4a1265e5be2ce1a92c347 Mon Sep 17 00:00:00 2001 From: Paulo Morgado <470455+paulomorgado@users.noreply.github.com> Date: Tue, 24 Dec 2024 15:39:51 +0000 Subject: [PATCH 2/2] Addressed review comments. --- .../ObjectModel/BsonRegularExpression.cs | 88 +++++++------------ 1 file changed, 34 insertions(+), 54 deletions(-) diff --git a/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs b/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs index dbffdb54333..0c90899224b 100644 --- a/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs +++ b/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs @@ -24,6 +24,27 @@ namespace MongoDB.Bson /// public class BsonRegularExpression : BsonValue, IComparable, IEquatable { + // private static fields + private static readonly string[] RegexOptionStrings = new[] + { + "", // 0000 + "i", // 0001 + "m", // 0010 + "im", // 0011 + "s", // 0100 + "is", // 0101 + "ms", // 0110 + "ims", // 0111 + "x", // 1000 + "ix", // 1001 + "mx", // 1010 + "imx", // 1011 + "sx", // 1100 + "isx", // 1101 + "msx", // 1110 + "imsx" // 1111 + }; + // private fields private readonly string _pattern; private readonly string _options; @@ -80,60 +101,19 @@ public BsonRegularExpression(Regex regex) throw new ArgumentNullException("regex"); } _pattern = regex.ToString(); - switch (regex.Options & (RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace)) - { - case RegexOptions.None: - _options = string.Empty; - break; - case RegexOptions.IgnoreCase: - _options = "i"; - break; - case RegexOptions.Multiline: - _options = "m"; - break; - case RegexOptions.Singleline: - _options = "s"; - break; - case RegexOptions.IgnorePatternWhitespace: - _options = "x"; - break; - case RegexOptions.IgnoreCase | RegexOptions.Multiline: - _options = "im"; - break; - case RegexOptions.IgnoreCase | RegexOptions.Singleline: - _options = "is"; - break; - case RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace: - _options = "ix"; - break; - case RegexOptions.Multiline | RegexOptions.Singleline: - _options = "ms"; - break; - case RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace: - _options = "mx"; - break; - case RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: - _options = "sx"; - break; - case RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline: - _options = "ims"; - break; - case RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace: - _options = "imx"; - break; - case RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: - _options = "isx"; - break; - case RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: - _options = "msx"; - break; - case RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace: - _options = "imsx"; - break; - default: - _options = string.Empty; - break; - } + _options = ConvertToBsonRegularExpressionOptions(regex); + } + + private static string ConvertToBsonRegularExpressionOptions(Regex regex) + { + var regexOptions = regex.Options; + + var index = ((regexOptions & RegexOptions.IgnoreCase) != 0 ? 1 : 0) | + ((regexOptions & RegexOptions.Multiline) != 0 ? 1 : 0) << 1 | + ((regexOptions & RegexOptions.Singleline) != 0 ? 1 : 0) << 2 | + ((regexOptions & RegexOptions.IgnorePatternWhitespace) != 0 ? 1 : 0) << 3; + + return RegexOptionStrings[index]; } // public properties