public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { /* (systimestamp + 3) */ generator.SqlBuilder.Append("("); exp.Object.Accept(generator); generator.SqlBuilder.Append(" + "); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEPART(SqlGeneratorBase generator, string interval, DbExpression exp) { /* CAST(STRFTIME('%M','2016-08-06 09:01:24') AS INTEGER) */ generator.SqlBuilder.Append("CAST("); generator.SqlBuilder.Append("STRFTIME('%", interval, "',"); exp.Accept(generator); generator.SqlBuilder.Append(")"); generator.SqlBuilder.Append(" AS INTEGER)"); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { /* add_months(systimestamp,2) */ generator.SqlBuilder.Append("ADD_MONTHS("); exp.Object.Accept(generator); generator.SqlBuilder.Append(","); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEADD(SqlGeneratorBase generator, string interval, DbMethodCallExpression exp) { //DATE_ADD(now(),INTERVAL 1 day),DATE_ADD(now(),INTERVAL 10 MINUTE) generator.SqlBuilder.Append("DATE_ADD("); exp.Object.Accept(generator); generator.SqlBuilder.Append(",INTERVAL "); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(" ", interval); generator.SqlBuilder.Append(")"); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { exp.Object.Accept(generator); generator.SqlBuilder.Append(" LIKE "); generator.SqlBuilder.Append("CONCAT("); generator.SqlBuilder.Append("'%',"); exp.Arguments.First().Accept(generator); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEPART(SqlGeneratorBase generator, string interval, DbExpression exp) { generator.SqlBuilder.Append("CAST("); generator.SqlBuilder.Append("DATE_PART("); generator.SqlBuilder.Append("'", interval, "'"); generator.SqlBuilder.Append(","); exp.Accept(generator); generator.SqlBuilder.Append(")"); generator.SqlBuilder.Append(" as integer)"); }
public static void Append_DiffYears(SqlGeneratorBase generator, DbExpression startDateTimeExp, DbExpression endDateTimeExp) { /* (CAST(STRFTIME('%Y',endDateTimeExp) as INTEGER) - CAST(STRFTIME('%Y',startDateTimeExp) as INTEGER)) */ generator.SqlBuilder.Append("("); DbFunction_DATEPART(generator, "Y", endDateTimeExp); generator.SqlBuilder.Append(" - "); DbFunction_DATEPART(generator, "Y", startDateTimeExp); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEADD(SqlGeneratorBase generator, string interval, DbMethodCallExpression exp) { generator.SqlBuilder.Append("DATEADD("); generator.SqlBuilder.Append(interval); generator.SqlBuilder.Append(","); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(","); exp.Object.Accept(generator); generator.SqlBuilder.Append(")"); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { generator.SqlBuilder.Append("REPLACE("); exp.Object.Accept(generator); generator.SqlBuilder.Append(","); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(","); exp.Arguments[1].Accept(generator); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEDIFF(SqlGeneratorBase generator, string interval, DbExpression startDateTimeExp, DbExpression endDateTimeExp) { generator.SqlBuilder.Append("DATEDIFF("); generator.SqlBuilder.Append(interval); generator.SqlBuilder.Append(","); startDateTimeExp.Accept(generator); generator.SqlBuilder.Append(","); endDateTimeExp.Accept(generator); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEDIFF(SqlGeneratorBase generator, string interval, DbExpression startDateTimeExp, DbExpression endDateTimeExp) { //TIMESTAMPDIFF(HOUR,'2003-02-01 11:00','2003-02-01 12:00'); generator.SqlBuilder.Append("TIMESTAMPDIFF("); generator.SqlBuilder.Append(interval); generator.SqlBuilder.Append(","); startDateTimeExp.Accept(generator); generator.SqlBuilder.Append(","); endDateTimeExp.Accept(generator); generator.SqlBuilder.Append(")"); }
public static void DbFunction_DATEADD(SqlGeneratorBase generator, string interval, DbMethodCallExpression exp) { /* DATETIME(@P_0,'+' || 1 || ' years') */ generator.SqlBuilder.Append("DATETIME("); exp.Object.Accept(generator); generator.SqlBuilder.Append(",'+' || "); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(" || ' ", interval, "'"); generator.SqlBuilder.Append(")"); }
static void Method_String_Contains(DbMethodCallExpression exp, SqlGeneratorBase generator) { exp.Object.Accept(generator); generator.SqlBuilder.Append(" LIKE "); generator.SqlBuilder.Append("CONCAT("); generator.SqlBuilder.Append("'%',"); exp.Arguments.First().Accept(generator); generator.SqlBuilder.Append(",'%'"); generator.SqlBuilder.Append(")"); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { if (exp.Object.Type == PublicConstants.TypeOfString) { exp.Object.Accept(generator); return; } DbConvertExpression c = DbExpression.Convert(exp.Object, PublicConstants.TypeOfString); c.Accept(generator); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { List <WhenThenExpressionPair> pairs = new List <WhenThenExpressionPair>(); GetWhenThenPairs(exp.Object as DbMethodCallExpression, pairs); pairs.Reverse(); List <WhenThenExpressionPair> whenThenPairs = pairs; DbExpression elseExp = exp.Arguments[0]; DbCaseWhenExpression caseWhenExp = new DbCaseWhenExpression(exp.Type, whenThenPairs, elseExp); caseWhenExp.Accept(generator); }
public static void Aggregate_Sum(SqlGeneratorBase generator, DbExpression exp, Type retType) { if (retType.IsNullable()) { AppendAggregateFunction(generator, exp, retType, "SUM", false); } else { generator.SqlBuilder.Append("NVL("); AppendAggregateFunction(generator, exp, retType, "SUM", false); generator.SqlBuilder.Append(","); generator.SqlBuilder.Append("0"); generator.SqlBuilder.Append(")"); } }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { DbExpression arg = exp.Arguments[0]; DbExpression e = DbExpression.Convert(arg, exp.Method.ReturnType); if (exp.Method.ReturnType == PublicConstants.TypeOfBoolean) { e.Accept(generator); generator.SqlBuilder.Append(" = "); DbConstantExpression.True.Accept(generator); } else { e.Accept(generator); } }
public static void DbFunction_DATEPART(SqlGeneratorBase generator, string interval, DbExpression exp, bool castToTimestamp = false) { /* cast(to_char(sysdate,'yyyy') as number) */ generator.SqlBuilder.Append("CAST(TO_CHAR("); if (castToTimestamp) { (generator as SqlGenerator).BuildCastState(exp, "TIMESTAMP"); } else { exp.Accept(generator); } generator.SqlBuilder.Append(",'"); generator.SqlBuilder.Append(interval); generator.SqlBuilder.Append("') AS NUMBER)"); }
public static void Append_DateDiff(SqlGeneratorBase generator, DbExpression startDateTimeExp, DbExpression endDateTimeExp, int?multiplier) { /* CAST((JULIANDAY(endDateTimeExp)- JULIANDAY(startDateTimeExp)) AS INTEGER) */ /* OR */ /* CAST((JULIANDAY(endDateTimeExp)- JULIANDAY(startDateTimeExp)) * multiplier AS INTEGER) */ generator.SqlBuilder.Append("CAST("); Append_JULIANDAY(generator, startDateTimeExp, endDateTimeExp); if (multiplier != null) { generator.SqlBuilder.Append(" * ", multiplier.Value.ToString()); } generator.SqlBuilder.Append(" AS INTEGER)"); }
static void In(SqlGeneratorBase generator, List <DbExpression> elementExps, DbExpression operand) { if (elementExps.Count == 0) { generator.SqlBuilder.Append("1=0"); return; } List <List <DbExpression> > batches = Utils.InBatches(elementExps, UtilConstants.InElements); if (batches.Count > 1) { generator.SqlBuilder.Append("("); } for (int batchIndex = 0; batchIndex < batches.Count; batchIndex++) { if (batchIndex > 0) { generator.SqlBuilder.Append(" OR "); } List <DbExpression> batch = batches[batchIndex]; operand.Accept(generator); generator.SqlBuilder.Append(" IN ("); for (int i = 0; i < batch.Count; i++) { if (i > 0) { generator.SqlBuilder.Append(","); } batch[i].Accept(generator); } generator.SqlBuilder.Append(")"); } if (batches.Count > 1) { generator.SqlBuilder.Append(")"); } }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { MethodInfo method = exp.Method; /* public static bool In<T>(this T obj, IEnumerable<T> source) */ Type[] genericArguments = method.GetGenericArguments(); Type genericType = genericArguments[0]; MethodInfo method_Contains = PublicConstants.MethodInfo_Enumerable_Contains.MakeGenericMethod(genericType); List <DbExpression> arguments = new List <DbExpression>(2) { exp.Arguments[1], exp.Arguments[0] }; DbMethodCallExpression newExp = new DbMethodCallExpression(null, method_Contains, arguments); newExp.Accept(generator); }
public static void DbFunction_DATEADD(SqlGeneratorBase generator, string interval, DbMethodCallExpression exp) { /* * Just support hour/minute/second * systimestamp + numtodsinterval(1,'HOUR') * sysdate + numtodsinterval(50,'MINUTE') * sysdate + numtodsinterval(45,'SECOND') */ generator.SqlBuilder.Append("("); exp.Object.Accept(generator); generator.SqlBuilder.Append(" + "); generator.SqlBuilder.Append("NUMTODSINTERVAL("); exp.Arguments[0].Accept(generator); generator.SqlBuilder.Append(",'"); generator.SqlBuilder.Append(interval); generator.SqlBuilder.Append("')"); generator.SqlBuilder.Append(")"); }
static void Append_JULIANDAY(SqlGeneratorBase generator, DbExpression startDateTimeExp, DbExpression endDateTimeExp) { /* (JULIANDAY(endDateTimeExp)- JULIANDAY(startDateTimeExp)) */ generator.SqlBuilder.Append("("); generator.SqlBuilder.Append("JULIANDAY("); endDateTimeExp.Accept(generator); generator.SqlBuilder.Append(")"); generator.SqlBuilder.Append(" - "); generator.SqlBuilder.Append("JULIANDAY("); startDateTimeExp.Accept(generator); generator.SqlBuilder.Append(")"); generator.SqlBuilder.Append(")"); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { string sequenceName = (string)exp.Arguments[0].Evaluate(); if (string.IsNullOrEmpty(sequenceName)) throw new ArgumentException("The sequence name cannot be empty."); string sequenceSchema = (string)exp.Arguments[1].Evaluate(); generator.SqlBuilder.Append("NEXT VALUE FOR "); if (!string.IsNullOrEmpty(sequenceSchema)) { (generator as SqlGenerator).QuoteName(sequenceSchema); generator.SqlBuilder.Append("."); } (generator as SqlGenerator).QuoteName(sequenceName); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { MethodInfo method = exp.Method; if (method.DeclaringType == PublicConstants.TypeOfSql) { Method_Sql_Equals(exp, generator); return; } DbExpression right = exp.Arguments[0]; if (right.Type != exp.Object.Type) { right = DbExpression.Convert(right, exp.Object.Type); } DbExpression.Equal(exp.Object, right).Accept(generator); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { exp.Object.Accept(generator); generator.SqlBuilder.Append(" + interval "); generator.SqlBuilder.Append("'"); var argExp = exp.Arguments[0]; if (!argExp.IsEvaluable()) { throw UtilExceptions.NotSupportedMethod(exp.Method); } var arg = argExp.Evaluate(); generator.SqlBuilder.Append(arg.ToString()); generator.SqlBuilder.Append(" "); generator.SqlBuilder.Append("milliseconds"); generator.SqlBuilder.Append("'"); }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { DbExpression e = exp.Arguments.First(); DbEqualExpression equalNullExpression = DbExpression.Equal(e, DbExpression.Constant(null, PublicConstants.TypeOfString)); DbEqualExpression equalEmptyExpression = DbExpression.Equal(e, DbExpression.Constant(string.Empty)); DbOrExpression orExpression = DbExpression.Or(equalNullExpression, equalEmptyExpression); DbCaseWhenExpression.WhenThenExpressionPair whenThenPair = new DbCaseWhenExpression.WhenThenExpressionPair(orExpression, DbConstantExpression.One); List <DbCaseWhenExpression.WhenThenExpressionPair> whenThenExps = new List <DbCaseWhenExpression.WhenThenExpressionPair>(1); whenThenExps.Add(whenThenPair); DbCaseWhenExpression caseWhenExpression = DbExpression.CaseWhen(whenThenExps, DbConstantExpression.Zero, PublicConstants.TypeOfBoolean); var eqExp = DbExpression.Equal(caseWhenExpression, DbConstantExpression.One); eqExp.Accept(generator); }
static void AppendAggregateFunction(SqlGeneratorBase generator, DbExpression exp, Type retType, string functionName, bool withCast) { string dbTypeString = null; if (withCast == true) { Type underlyingType = ReflectionExtension.GetUnderlyingType(retType); if (underlyingType != PublicConstants.TypeOfDecimal /* We don't know the precision and scale,so,we can not cast exp to decimal,otherwise maybe cause problems. */ && CastTypeMap.TryGetValue(underlyingType, out dbTypeString)) { generator.SqlBuilder.Append("CAST("); } } generator.SqlBuilder.Append(functionName, "("); exp.Accept(generator); generator.SqlBuilder.Append(")"); if (dbTypeString != null) { generator.SqlBuilder.Append(" AS ", dbTypeString, ")"); } }
public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator) { /* SELECT "SYSTEM"."USERS_AUTOID"."NEXTVAL" FROM "DUAL" */ string sequenceName = (string)exp.Arguments[0].Evaluate(); if (string.IsNullOrEmpty(sequenceName)) { throw new ArgumentException("The sequence name cannot be empty."); } string sequenceSchema = (string)exp.Arguments[1].Evaluate(); if (!string.IsNullOrEmpty(sequenceSchema)) { (generator as SqlGenerator).QuoteName(sequenceSchema); generator.SqlBuilder.Append("."); } (generator as SqlGenerator).QuoteName(sequenceName); generator.SqlBuilder.Append(".nextval"); }
static void AppendAggregateFunction(SqlGeneratorBase generator, DbExpression exp, Type retType, string functionName, bool withCast) { string dbTypeString = null; if (withCast == true) { Type underlyingType = ReflectionExtension.GetUnderlyingType(retType); if (CastTypeMap.TryGetValue(underlyingType, out dbTypeString)) { generator.SqlBuilder.Append("CAST("); } } generator.SqlBuilder.Append(functionName, "("); exp.Accept(generator); generator.SqlBuilder.Append(")"); if (dbTypeString != null) { generator.SqlBuilder.Append(" AS ", dbTypeString, ")"); } }