private SqlScalarExpression VisitBuiltinFunction(MethodCallExpression methodCallExpression, TranslationContext context) { List <SqlScalarExpression> arguments = new List <SqlScalarExpression>(); if (methodCallExpression.Object != null) { arguments.Add(ExpressionToSql.VisitNonSubqueryScalarExpression(methodCallExpression.Object, context)); } foreach (Expression argument in methodCallExpression.Arguments) { arguments.Add(ExpressionToSql.VisitNonSubqueryScalarExpression(argument, context)); } return(SqlFunctionCallScalarExpression.CreateBuiltin(this.SqlName, arguments.ToArray())); }
protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) { if (methodCallExpression.Arguments.Count == 1 && methodCallExpression.Arguments[0].NodeType == ExpressionType.Constant && methodCallExpression.Arguments[0].Type == typeof(char[])) { char[] argumentsExpressions = (char[])((ConstantExpression)methodCallExpression.Arguments[0]).Value; if (argumentsExpressions.Length == 0) { SqlScalarExpression str = ExpressionToSql.VisitScalarExpression(methodCallExpression.Object, context); return(SqlFunctionCallScalarExpression.CreateBuiltin("RTRIM", str)); } } return(null); }
protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) { if (methodCallExpression.Arguments.Count == 1 && methodCallExpression.Arguments[0] is NewArrayExpression newArrayExpression) { ReadOnlyCollection <Expression> argumentsExpressions = newArrayExpression.Expressions; List <SqlScalarExpression> arguments = new List <SqlScalarExpression>(); foreach (Expression argument in argumentsExpressions) { arguments.Add(ExpressionToSql.VisitScalarExpression(argument, context)); } return(SqlFunctionCallScalarExpression.CreateBuiltin("CONCAT", arguments)); } return(null); }
protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) { if (methodCallExpression.Arguments.Count == 1) { SqlScalarExpression memberExpression = ExpressionToSql.VisitScalarExpression(methodCallExpression.Object, context); SqlScalarExpression indexExpression = ExpressionToSql.VisitScalarExpression(methodCallExpression.Arguments[0], context); var arguments = new SqlScalarExpression[] { memberExpression, indexExpression, ExpressionToSql.VisitScalarExpression(Expression.Constant(1), context) }; return(SqlFunctionCallScalarExpression.CreateBuiltin("SUBSTRING", arguments)); } return(null); }
protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) { if (methodCallExpression.Arguments.Count == 1) { SqlScalarExpression haystack = ExpressionToSql.VisitScalarExpression(methodCallExpression.Object, context); SqlScalarExpression needle = ExpressionToSql.VisitScalarExpression(methodCallExpression.Arguments[0], context); return(SqlFunctionCallScalarExpression.CreateBuiltin("CONTAINS", haystack, needle)); } else if (methodCallExpression.Arguments.Count == 2) { SqlScalarExpression haystack = ExpressionToSql.VisitScalarExpression(methodCallExpression.Arguments[0], context); SqlScalarExpression needle = ExpressionToSql.VisitScalarExpression(methodCallExpression.Arguments[1], context); return(SqlFunctionCallScalarExpression.CreateBuiltin("CONTAINS", haystack, needle)); } return(null); }
protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) { if (methodCallExpression.Arguments.Count == 1) { SqlScalarExpression left = ExpressionToSql.VisitScalarExpression(methodCallExpression.Object, context); SqlScalarExpression right = ExpressionToSql.VisitScalarExpression(methodCallExpression.Arguments[0], context); return(SqlBinaryScalarExpression.Create(SqlBinaryScalarOperatorKind.Equal, left, right)); } if (methodCallExpression.Arguments.Count == 2) { SqlScalarExpression left = ExpressionToSql.VisitScalarExpression(methodCallExpression.Object, context); SqlScalarExpression right = ExpressionToSql.VisitScalarExpression(methodCallExpression.Arguments[0], context); SqlScalarExpression caseInsensitive = SqlStringWithComparisonVisitor.GetCaseInsensitiveExpression(methodCallExpression.Arguments[1]); return(SqlFunctionCallScalarExpression.CreateBuiltin("STRINGEQUALS", left, right, caseInsensitive)); } return(null); }
public void ROUND() { // ROUND(4.84090499760142E+15) // offline engine has double precision errors AssertEvaluation( expected: CosmosNumber64.Create(4.84090499760142E+15), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Round, SqlLiteralScalarExpression.Create( SqlNumberLiteral.Create( JToken.Parse("4840904997601420").Value <double>())))); // ROUND(0.5, 1) // -> should round up AssertEvaluation( expected: CosmosNumber64.Create(1), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Round, SqlLiteralScalarExpression.Create( SqlNumberLiteral.Create(0.5)))); }
protected override SqlScalarExpression VisitImplicit(MethodCallExpression methodCallExpression, TranslationContext context) { int argumentCount = methodCallExpression.Arguments.Count; if (argumentCount == 0 || argumentCount > 2) { return(null); } List <SqlScalarExpression> arguments = new List <SqlScalarExpression> { ExpressionToSql.VisitNonSubqueryScalarExpression(methodCallExpression.Object, context), ExpressionToSql.VisitNonSubqueryScalarExpression(methodCallExpression.Arguments[0], context) }; if (argumentCount > 1) { arguments.Add(GetCaseInsensitiveExpression(methodCallExpression.Arguments[1])); } return(SqlFunctionCallScalarExpression.CreateBuiltin(this.SqlName, arguments.ToArray())); }
public void REPLICATE() { // REPLICATE("Hello", -1) // -> undefined AssertEvaluation( expected: Undefined, sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Replicate, hello, SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(-1)))); // REPLICATE("Hello", 1.5) // -> REPLICATE("Hello", 1) due to truncation AssertEvaluation( expected: CosmosString.Create("Hello"), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Replicate, hello, SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1.5)))); // REPLICATE("Hello", 10000) // -> undefined due to 10kb string cap AssertEvaluation( expected: Undefined, sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Replicate, hello, SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(10000)))); // REPLICATE("Hello", EXP(400)) // -> undefined due to 10kb string cap AssertEvaluation( expected: Undefined, sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Replicate, hello, SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(Math.Exp(400))))); }
public void ARRAY_CONTAINS() { // ARRAY_CONTAINS(["apples", "strawberries", "bananas"], "apples") AssertEvaluation( expected: CosmosBoolean.Create(new string[] { "apples", "strawberries", "bananas" }.Contains("apples")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("apples")))); // ARRAY_CONTAINS(["apples", "strawberries", "bananas"], "mangoes") AssertEvaluation( expected: CosmosBoolean.Create(new string[] { "apples", "strawberries", "bananas" }.Contains("mangoes")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlStringLiteral.Create("mangoes")))); // ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "apples"}, true) AssertEvaluation( expected: CosmosBoolean.Create(true), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, JTokenToSqlScalarExpression.Convert(new JArray( JObject.FromObject(new { name = "apples", fresh = true }), JObject.FromObject(new { name = "strawberries", fresh = true }))), JTokenToSqlScalarExpression.Convert(JObject.FromObject(new { name = "apples" })), trueBoolean)); // ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "apples"}, undefined) AssertEvaluation( expected: CosmosBoolean.Create(false), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, JTokenToSqlScalarExpression.Convert(new JArray( JObject.FromObject(new { name = "apples", fresh = true }), JObject.FromObject(new { name = "strawberries", fresh = true }))), JTokenToSqlScalarExpression.Convert(JObject.FromObject(new { name = "apples" })), SqlLiteralScalarExpression.Create(SqlUndefinedLiteral.Create()))); // ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "apples"}) AssertEvaluation( expected: CosmosBoolean.Create(false), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, JTokenToSqlScalarExpression.Convert(new JArray( JObject.FromObject(new { name = "apples", fresh = true }), JObject.FromObject(new { name = "strawberries", fresh = true }))), JTokenToSqlScalarExpression.Convert(JObject.FromObject(new { name = "apples" })))); // ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "mangoes"}, true) AssertEvaluation( expected: CosmosBoolean.Create(false), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, JTokenToSqlScalarExpression.Convert(new JArray( JObject.FromObject(new { name = "apples", fresh = true }), JObject.FromObject(new { name = "strawberries", fresh = true }))), JTokenToSqlScalarExpression.Convert(JObject.FromObject(new { name = "mangoes" })), trueBoolean)); // ARRAY_CONTAINS([SQUARE(2), POWER(2, 2)] 2) AssertEvaluation( expected: CosmosBoolean.Create(new double[] { 2 * 2, Math.Pow(2, 2) }.Contains(2)), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArrayContains, SqlArrayCreateScalarExpression.Create( SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Square, SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(2))), SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.Power, SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(2)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(2)))), JTokenToSqlScalarExpression.Convert(2))); }
public void ARRAY_SLICE() { // ARRAY_SLICE(["apples", "strawberries", "bananas"], 1) AssertEvaluation( expected: CosmosArray.Create(CosmosString.Create("strawberries"), CosmosString.Create("bananas")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)))); // ARRAY_SLICE(["apples", "strawberries", "bananas"], 1, 1) AssertEvaluation( expected: CosmosArray.Create(CosmosString.Create("strawberries")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)))); // ARRAY_SLICE(["apples", "strawberries", "bananas"], -2, 1) AssertEvaluation( expected: CosmosArray.Create(CosmosString.Create("strawberries")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(-2)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)))); // ARRAY_SLICE(["apples", "strawberries", "bananas"], -2, 2) AssertEvaluation( expected: CosmosArray.Create(CosmosString.Create("strawberries"), CosmosString.Create("bananas")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(-2)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(2)))); // ARRAY_SLICE(["apples", "strawberries", "bananas"], 1, 0) AssertEvaluation( expected: CosmosArray.Create(), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(0)))); // ARRAY_SLICE(["apples", "strawberries", "bananas"], 1, 0) AssertEvaluation( expected: CosmosArray.Create(CosmosString.Create("strawberries"), CosmosString.Create("bananas")), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1000)))); // ARRAY_SLICE(["apples", "strawberries", "bananas"], 1, 0) AssertEvaluation( expected: CosmosArray.Create(), sqlScalarExpression: SqlFunctionCallScalarExpression.CreateBuiltin( SqlFunctionCallScalarExpression.Identifiers.ArraySlice, JTokenToSqlScalarExpression.Convert(new JArray("apples", "strawberries", "bananas")), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(1)), SqlLiteralScalarExpression.Create(SqlNumberLiteral.Create(-100)))); }