Example #1
0
 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(")");
 }
Example #2
0
 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)");
 }
Example #3
0
 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(")");
 }
Example #4
0
 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(")");
 }
Example #5
0
        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(")");
        }
Example #6
0
 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)");
 }
Example #7
0
        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(")");
        }
Example #8
0
 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(")");
 }
Example #9
0
 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(")");
 }
Example #10
0
 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(")");
 }
Example #11
0
 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(")");
 }
Example #12
0
        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(")");
        }
Example #13
0
        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(")");
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }
Example #16
0
 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(")");
     }
 }
Example #17
0
        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);
            }
        }
Example #18
0
 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)");
 }
Example #19
0
        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)");
        }
Example #20
0
        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(")");
            }
        }
Example #21
0
        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);
        }
Example #22
0
 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(")");
 }
Example #23
0
        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(")");
        }
Example #24
0
        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);
        }
Example #25
0
        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);
        }
Example #26
0
        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("'");
        }
Example #27
0
        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);
        }
Example #28
0
        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");
        }
Example #30
0
        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, ")");
            }
        }