diff --git a/Microsoft.Azure.Cosmos/src/ClientResources.Designer.cs b/Microsoft.Azure.Cosmos/src/ClientResources.Designer.cs index 3736d0fbbd..30604d77d4 100644 --- a/Microsoft.Azure.Cosmos/src/ClientResources.Designer.cs +++ b/Microsoft.Azure.Cosmos/src/ClientResources.Designer.cs @@ -19,7 +19,7 @@ namespace Microsoft.Azure.Cosmos { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ClientResources { @@ -438,6 +438,15 @@ internal static string InvalidTypesForMethod { } } + /// + /// Looks up a localized string similar to Extension function can be used in Linq expressions only and are evaluated in Azure CosmosDB server.. + /// + internal static string LINQExtensionFunctionNotImplemented { + get { + return ResourceManager.GetString("LINQExtensionFunctionNotImplemented", resourceCulture); + } + } + /// /// Looks up a localized string similar to MediaLink is invalid. /// @@ -565,38 +574,38 @@ internal static string ServerResponseDeserializationFailure { } /// - /// Looks up a localized string similar to The right hand side of string.CompareTo() comparison must be constant '0'. + /// Looks up a localized string similar to The right-hand side of String.Compare() comparison must be constant '0'.. /// - internal static string StringCompareToInvalidConstant { + internal static string StringCompareInvalidConstant { get { - return ResourceManager.GetString("StringCompareToInvalidConstant", resourceCulture); + return ResourceManager.GetString("StringCompareInvalidConstant", resourceCulture); } } /// - /// Looks up a localized string similar to Invalid operator for string.CompareTo(). Vaid operators are ('==', '<', '<=', '>' or '>='). + /// Looks up a localized string similar to Invalid operator for string.Compare(). Vaid operators are ('==', '<', '<=', '>' or '>='). /// - internal static string StringCompareToInvalidOperator { + internal static string StringCompareInvalidOperator { get { - return ResourceManager.GetString("StringCompareToInvalidOperator", resourceCulture); + return ResourceManager.GetString("StringCompareInvalidOperator", resourceCulture); } } /// - /// Looks up a localized string similar to Invalid operator for string.Compare(). Valid operators are ('==', '<', '<=', '>' or '>='). + /// Looks up a localized string similar to The right-hand side of String.CompareTo() comparison must be constant '0'.. /// - internal static string StringCompareInvalidOperator { + internal static string StringCompareToInvalidConstant { get { - return ResourceManager.GetString("StringCompareInvalidOperator", resourceCulture); + return ResourceManager.GetString("StringCompareToInvalidConstant", resourceCulture); } } /// - /// Looks up a localized string similar to The right hand side of string.Compare() comparison must be constant '0'. + /// Looks up a localized string similar to Invalid operator for string.CompareTo(). Vaid operators are ('==', '<', '<=', '>' or '>='). /// - internal static string StringCompareInvalidConstant { + internal static string StringCompareToInvalidOperator { get { - return ResourceManager.GetString("StringCompareInvalidConstant", resourceCulture); + return ResourceManager.GetString("StringCompareToInvalidOperator", resourceCulture); } } diff --git a/Microsoft.Azure.Cosmos/src/ClientResources.resx b/Microsoft.Azure.Cosmos/src/ClientResources.resx index 7a3e336e2a..c1b07762cb 100644 --- a/Microsoft.Azure.Cosmos/src/ClientResources.resx +++ b/Microsoft.Azure.Cosmos/src/ClientResources.resx @@ -324,4 +324,7 @@ The continuation was generated for container {0} but current container is {1}. + + Extension function can be used in Linq expressions only and are evaluated in Azure CosmosDB server. + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/BuiltinFunctionVisitor.cs b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/BuiltinFunctionVisitor.cs index 82f427c206..3dbbedce16 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/BuiltinFunctionVisitor.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/BuiltinFunctionVisitor.cs @@ -51,7 +51,10 @@ public static SqlScalarExpression VisitBuiltinFunctionCall(MethodCallExpression if (methodCallExpression.Method.DeclaringType.GeUnderlyingSystemType() == typeof(CosmosLinqExtensions)) { // CosmosLinq Extensions can be RegexMatch, DocumentId or Type check functions (IsString, IsBool, etc.) - if (methodCallExpression.Method.Name == nameof(CosmosLinqExtensions.RegexMatch)) + if ((methodCallExpression.Method.Name == nameof(CosmosLinqExtensions.RegexMatch)) || + (methodCallExpression.Method.Name == nameof(CosmosLinqExtensions.FullTextContains)) || + (methodCallExpression.Method.Name == nameof(CosmosLinqExtensions.FullTextContainsAll)) || + (methodCallExpression.Method.Name == nameof(CosmosLinqExtensions.FullTextContainsAny))) { return StringBuiltinFunctions.Visit(methodCallExpression, context); } diff --git a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/SqlBuiltinFunctionVisitor.cs b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/SqlBuiltinFunctionVisitor.cs index 2e45453147..347811ae9e 100644 Binary files a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/SqlBuiltinFunctionVisitor.cs and b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/SqlBuiltinFunctionVisitor.cs differ diff --git a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/StringBuiltinFunctions.cs b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/StringBuiltinFunctions.cs index 7d833a03bd..02b48cff7b 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/StringBuiltinFunctions.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/BuiltinFunctions/StringBuiltinFunctions.cs @@ -423,6 +423,91 @@ protected override SqlScalarExpression VisitImplicit(MethodCallExpression method return null; } } + + private class FullTextContainsVisit : SqlBuiltinFunctionVisitor + { + public FullTextContainsVisit() + : base("FullTextContains", + true, + new List() + { + new Type[]{typeof(object), typeof(string)} + }) + { + } + } + + private class FullTextContainsAllVisit : SqlBuiltinFunctionVisitor + { + public FullTextContainsAllVisit() + : base("FullTextContainsAll", + true, + new List() + { + new Type[]{typeof(object), typeof(string[])} + }) + { + } + + protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) + { + Console.WriteLine(methodCallExpression.Arguments[1].Type); + if (methodCallExpression.Arguments.Count == 2 + && methodCallExpression.Arguments[1] is ConstantExpression stringListArgumentExpression + && ExpressionToSql.VisitConstant(stringListArgumentExpression, context) is SqlArrayCreateScalarExpression arrayScalarExpressions) + { + List arguments = new List(); + + arguments.Add(ExpressionToSql.VisitNonSubqueryScalarExpression(methodCallExpression.Arguments[0], context)); + arguments.AddRange(arrayScalarExpressions.Items); + + return SqlFunctionCallScalarExpression.CreateBuiltin(SqlFunctionCallScalarExpression.Names.FullTextContainsAll, arguments.ToImmutableArray()); + } + + return null; + } + + protected override SqlScalarExpression VisitExplicit(MethodCallExpression methodCallExpression, TranslationContext context) + { + return null; + } + } + + private class FullTextContainsAnyVisit : SqlBuiltinFunctionVisitor + { + public FullTextContainsAnyVisit() + : base("FullTextContainsAny", + true, + new List() + { + new Type[]{typeof(object), typeof(string[])} + }) + { + } + + protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) + { + Console.WriteLine(methodCallExpression.Arguments[1].Type); + if (methodCallExpression.Arguments.Count == 2 + && methodCallExpression.Arguments[1] is ConstantExpression stringListArgumentExpression + && ExpressionToSql.VisitConstant(stringListArgumentExpression, context) is SqlArrayCreateScalarExpression arrayScalarExpressions) + { + List arguments = new List(); + + arguments.Add(ExpressionToSql.VisitNonSubqueryScalarExpression(methodCallExpression.Arguments[0], context)); + arguments.AddRange(arrayScalarExpressions.Items); + + return SqlFunctionCallScalarExpression.CreateBuiltin(SqlFunctionCallScalarExpression.Names.FullTextContainsAny, arguments.ToImmutableArray()); + } + + return null; + } + + protected override SqlScalarExpression VisitExplicit(MethodCallExpression methodCallExpression, TranslationContext context) + { + return null; + } + } static StringBuiltinFunctions() { @@ -528,6 +613,18 @@ static StringBuiltinFunctions() { "Equals", new StringEqualsVisitor() + }, + { + nameof(CosmosLinqExtensions.FullTextContains), + new FullTextContainsVisit() + }, + { + nameof(CosmosLinqExtensions.FullTextContainsAll), + new FullTextContainsAllVisit() + }, + { + nameof(CosmosLinqExtensions.FullTextContainsAny), + new FullTextContainsAnyVisit() } }; } diff --git a/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs b/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs index a45b282d15..58998a2a52 100644 --- a/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs +++ b/Microsoft.Azure.Cosmos/src/Linq/CosmosLinqExtensions.cs @@ -212,7 +212,7 @@ public static bool IsString(this object obj) /// public static bool RegexMatch(this object obj, string regularExpression) { - throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); + throw new NotImplementedException(ClientResources.LINQExtensionFunctionNotImplemented); } /// @@ -234,9 +234,72 @@ public static bool RegexMatch(this object obj, string regularExpression) /// public static bool RegexMatch(this object obj, string regularExpression, string searchModifier) { - throw new NotImplementedException(ClientResources.TypeCheckExtensionFunctionsNotImplemented); - } - + throw new NotImplementedException(ClientResources.LINQExtensionFunctionNotImplemented); + } + + /// + /// Returns a boolean indicating whether the keyword string expression is contained in a specified property path. + /// For more information, see https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/query/fulltextcontains. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// The string to find. + /// Returns true if a given string is contained in the specified property of a document. + /// + /// + /// document.Name.FullTextContains()); + /// ]]> + /// + /// + public static bool FullTextContains(this object obj, string search) + { + throw new NotImplementedException(ClientResources.LINQExtensionFunctionNotImplemented); + } + + /// + /// Returns a boolean indicating whether all of the provided string expressions are contained in a specified property path. + /// For more information, see https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/query/fulltextcontainsall. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// The strings to find. + /// Returns true if all of the given strings are contained in the specified property of a document. + /// + /// + /// document.Name.FullTextContainsAll(, , , ...)); + /// ]]> + /// + /// + public static bool FullTextContainsAll(this object obj, params string[] searches) + { + throw new NotImplementedException(ClientResources.LINQExtensionFunctionNotImplemented); + } + + /// + /// Returns a boolean indicating whether any of the provided string expressions are contained in a specified property path. + /// For more information, see https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/query/fulltextcontainsany. + /// This method is to be used in LINQ expressions only and will be evaluated on server. + /// There's no implementation provided in the client library. + /// + /// + /// The strings to find. + /// Returns true if any of the given strings are contained in the specified property of a document. + /// + /// + /// document.Name.FullTextContainsAny(, , , ...)); + /// ]]> + /// + /// + public static bool FullTextContainsAny(this object obj, params string[] searches) + { + throw new NotImplementedException(ClientResources.LINQExtensionFunctionNotImplemented); + } + /// /// This method generate query definition from LINQ query. /// diff --git a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlFunctionCallScalarExpression.cs b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlFunctionCallScalarExpression.cs index 651ad5726d..a4a3af39da 100644 --- a/Microsoft.Azure.Cosmos/src/SqlObjects/SqlFunctionCallScalarExpression.cs +++ b/Microsoft.Azure.Cosmos/src/SqlObjects/SqlFunctionCallScalarExpression.cs @@ -85,6 +85,9 @@ sealed class SqlFunctionCallScalarExpression : SqlScalarExpression { Names.Endswith, Identifiers.Endswith }, { Names.Exp, Identifiers.Exp }, { Names.Floor, Identifiers.Floor }, + { Names.FullTextContains, Identifiers.FullTextContains }, + { Names.FullTextContainsAll, Identifiers.FullTextContainsAll }, + { Names.FullTextContainsAny, Identifiers.FullTextContainsAny }, { Names.GetCurrentDateTime, Identifiers.GetCurrentDateTime }, { Names.GetCurrentTicks, Identifiers.GetCurrentTicks }, { Names.GetCurrentTimestamp, Identifiers.GetCurrentTimestamp }, @@ -294,6 +297,9 @@ public static class Names public const string Endswith = "ENDSWITH"; public const string Exp = "EXP"; public const string Floor = "FLOOR"; + public const string FullTextContains = "FullTextContains"; + public const string FullTextContainsAll = "FullTextContainsAll"; + public const string FullTextContainsAny = "FullTextContainsAny"; public const string GetCurrentDateTime = "GetCurrentDateTime"; public const string GetCurrentTicks = "GetCurrentTicks"; public const string GetCurrentTimestamp = "GetCurrentTimestamp"; @@ -437,6 +443,9 @@ public static class Identifiers public static readonly SqlIdentifier Endswith = SqlIdentifier.Create(Names.Endswith); public static readonly SqlIdentifier Exp = SqlIdentifier.Create(Names.Exp); public static readonly SqlIdentifier Floor = SqlIdentifier.Create(Names.Floor); + public static readonly SqlIdentifier FullTextContains = SqlIdentifier.Create(Names.FullTextContains); + public static readonly SqlIdentifier FullTextContainsAll = SqlIdentifier.Create(Names.FullTextContainsAll); + public static readonly SqlIdentifier FullTextContainsAny = SqlIdentifier.Create(Names.FullTextContainsAny); public static readonly SqlIdentifier GetCurrentDateTime = SqlIdentifier.Create(Names.GetCurrentDateTime); public static readonly SqlIdentifier GetCurrentTicks = SqlIdentifier.Create(Names.GetCurrentTicks); public static readonly SqlIdentifier GetCurrentTimestamp = SqlIdentifier.Create(Names.GetCurrentTimestamp); diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestFullTextContainsFunction.xml b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestFullTextContainsFunction.xml new file mode 100644 index 0000000000..d1ce25f084 --- /dev/null +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/BaselineTest/TestBaseline/LinqTranslationBaselineTests.TestFullTextContainsFunction.xml @@ -0,0 +1,145 @@ + + + + + doc.StringField.FullTextContains("test"))]]> + + + + + + + + + + (doc.StringField.FullTextContains("test1") OrElse doc.StringField.FullTextContains("test2")))]]> + + + + + + + + + + doc.StringField.FullTextContains("test1")).Where(doc => doc.StringField.FullTextContains("test2"))]]> + + + + + + + + + + doc.StringField.FullTextContainsAll(new [] {"test"}))]]> + + + + + + + + + + doc.StringField.FullTextContainsAll(new [] {"test1", "test2", "test3"}))]]> + + + + + + + + + + (doc.StringField.FullTextContainsAll(new [] {"test"}) OrElse doc.StringField.FullTextContainsAll(new [] {"test1", "test2", "test3"})))]]> + + + + + + + + + + doc.StringField.FullTextContainsAll(new [] {"test"})).Where(doc => doc.StringField.FullTextContainsAll(new [] {"test1", "test2", "test3"}))]]> + + + + + + + + + + doc.StringField.FullTextContainsAny(new [] {"test"}))]]> + + + + + + + + + + doc.StringField.FullTextContainsAny(new [] {"test1", "test2", "test3"}))]]> + + + + + + + + + + (doc.StringField.FullTextContainsAny(new [] {"test"}) OrElse doc.StringField.FullTextContainsAny(new [] {"test1", "test2", "test3"})))]]> + + + + + + + + + + doc.StringField.FullTextContainsAny(new [] {"test"})).Where(doc => doc.StringField.FullTextContainsAny(new [] {"test1", "test2", "test3"}))]]> + + + + + + + \ No newline at end of file diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqTranslationBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqTranslationBaselineTests.cs index e53ec6a9f6..ad4a0081f1 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqTranslationBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Linq/LinqTranslationBaselineTests.cs @@ -344,6 +344,37 @@ public void TestRegexMatchFunction() new LinqTestInput("RegexMatch with 2nd argument invalid string options", b => getQuery(b).Where(doc => doc.StringField.RegexMatch("abcd", "this should error out on the back end"))), }; this.ExecuteTestSuite(inputs); + } + + [TestMethod] + public void TestFullTextContainsFunction() + { + // Similar to the type checking function, FullTextContains/FullTextContainsAll/FullTextContainsAny are not supported client side. + // Therefore this method is verified with baseline only. + List data = new List(); + IOrderedQueryable query = testContainer.GetItemLinqQueryable(allowSynchronousQueryExecution: true); + Func> getQuery = useQuery => useQuery ? query : data.AsQueryable(); + + List inputs = new List + { + // FullTextContains + new LinqTestInput("FullTextContains with 1 argument", b => getQuery(b).Where(doc => doc.StringField.FullTextContains("test"))), + new LinqTestInput("FullTextContains with conditional", b => getQuery(b).Where(doc => doc.StringField.FullTextContains("test1") || doc.StringField.FullTextContains("test2"))), + new LinqTestInput("FullTextContains with conditional 2", b => getQuery(b).Where(doc => doc.StringField.FullTextContains("test1")).Where(doc => doc.StringField.FullTextContains("test2"))), + + // FullTextContainsAll + new LinqTestInput("FullTextContainsAll with 1 argument", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAll("test"))), + new LinqTestInput("FullTextContainsAll with 3 argument", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAll("test1", "test2", "test3"))), + new LinqTestInput("FullTextContainsAll with conditional", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAll("test") || doc.StringField.FullTextContainsAll("test1", "test2", "test3"))), + new LinqTestInput("FullTextContainsAll with conditional 2", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAll("test")).Where(doc => doc.StringField.FullTextContainsAll("test1", "test2", "test3"))), + + // FullTextContainsAny + new LinqTestInput("FullTextContainsAny with 1 argument", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAny("test"))), + new LinqTestInput("FullTextContainsAny with 3 argument", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAny("test1", "test2", "test3"))), + new LinqTestInput("FullTextContainsAny with conditional", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAny("test") || doc.StringField.FullTextContainsAny("test1", "test2", "test3"))), + new LinqTestInput("FullTextContainsAny with conditional 2", b => getQuery(b).Where(doc => doc.StringField.FullTextContainsAny("test")).Where(doc => doc.StringField.FullTextContainsAny("test1", "test2", "test3"))) + }; + this.ExecuteTestSuite(inputs); } [TestMethod] diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj index edcd384b97..a334d6bdf2 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.EmulatorTests/Microsoft.Azure.Cosmos.EmulatorTests.csproj @@ -241,6 +241,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json index e1118ce863..7961a69bbd 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Contracts/DotNetSDKAPI.json @@ -6680,6 +6680,27 @@ "Microsoft.Azure.Cosmos.Linq.CosmosLinqExtensions;System.Object;IsAbstract:True;IsSealed:True;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": { "Subclasses": {}, "Members": { + "Boolean FullTextContains(System.Object, System.String)[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean FullTextContains(System.Object, System.String);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean FullTextContainsAll(System.Object, System.String[])[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean FullTextContainsAll(System.Object, System.String[]);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, + "Boolean FullTextContainsAny(System.Object, System.String[])[System.Runtime.CompilerServices.ExtensionAttribute()]": { + "Type": "Method", + "Attributes": [ + "ExtensionAttribute" + ], + "MethodInfo": "Boolean FullTextContainsAny(System.Object, System.String[]);IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;" + }, "Boolean IsArray(System.Object)[System.Runtime.CompilerServices.ExtensionAttribute()]": { "Type": "Method", "Attributes": [