public static VfpExpression Rewrite(VfpProviderManifest vfpManifest, VfpExpression expression)
        {
            expression = RedundantCaseExpressionRemover.Remove(expression);

            expression = FlattenFilterRewritter.Rewrite(expression);
            expression = ApplyRewritter.Rewrite(expression);

            expression = InRewritter.Rewrite(expression);
            expression = XmlToCursorRewritter.Rewrite(expression);
            //expression = XmlToCursorMoveToInnerExpressionRewriter.Rewrite(expression);
            expression = XmlToCursorJoinRewriter.Rewrite(expression);

            expression = ComparisonRewritter.Rewrite(expression);
            expression = LikeRewritter.Rewrite(expression);
            expression = LikeCRewritter.Rewrite(expression);
            expression = CaseWithNullRewriter.Rewrite(expression);

            expression = SingleRowTableRewritter.Rewrite(expression);
            expression = MissingOrderByRewritter.Rewrite(expression);
            expression = VariableReferenceRewritter.Rewrite(expression);
            expression = ConstantToParameterRewritter.Rewrite(expression);
            expression = FilterProjectRewritter.Rewrite(expression);

            expression = DecimalPropertyRewritter.Rewrite(vfpManifest, expression);

            return(expression);
        }
Exemple #2
0
        public static string Format(VfpProviderManifest vfpManifest, System.Data.Entity.Core.Common.CommandTrees.DbQueryCommandTree dbQueryCommandTree, out List <DbParameter> parameters)
        {
            var visitor       = new ExpressionConverterVisitor();
            var VfpExpression = visitor.Visit(dbQueryCommandTree.Query);

            return(Format(vfpManifest, VfpExpression, out parameters));
        }
        private static T GetCommandTreeExpression <T>(VfpProviderManifest vfpManifest, System.Data.Entity.Core.Common.CommandTrees.DbCommandTree commandTree) where T : VfpCommandTree
        {
            var visitor          = new ExpressionConverterVisitor();
            var queryCommandTree = visitor.Visit(commandTree);

            return((T)ExpressionRewritter.Rewrite(vfpManifest, queryCommandTree));
        }
Exemple #4
0
        private static void GenerateUpdateReturningSql(VfpProviderManifest vfpManifest, VfpUpdateCommandTree commandTree, DmlSqlFormatter formatter, VfpExpression returning)
        {
            if (returning == null)
            {
                return;
            }

            formatter.WriteLine(Indentation.Same);
            formatter.Write(VfpCommand.SplitCommandsToken);
            formatter.WriteLine(Indentation.Same);

            // select
            formatter.Write("SELECT ");
            returning.Accept(formatter);
            formatter.WriteLine(Indentation.Same);

            // from
            formatter.Write("FROM ");
            commandTree.Target.Expression.Accept(formatter);
            formatter.WriteLine(Indentation.Same);

            // where
            formatter.Write("WHERE ");
            commandTree.Predicate.Accept(formatter);
        }
Exemple #5
0
        public static string Format(VfpProviderManifest vfpManifest, VfpExpression expression, out List <DbParameter> parameters)
        {
            expression = ExpressionRewritter.Rewrite(vfpManifest, expression);

            var formatter = new SqlFormatter();

            formatter.Visit(expression);
            parameters = formatter.parameters;

            return(formatter.ToString());
        }
Exemple #6
0
        internal static string GenerateSql(VfpProviderManifest vfpManifest, DbCommandTree commandTree, out List <DbParameter> parameters, out CommandType commandType)
        {
            commandType = CommandType.Text;
            parameters  = null;

            //Handle Query
            var queryCommandTree = commandTree as DbQueryCommandTree;

            if (queryCommandTree != null)
            {
                var sqlSelectVisitor = new SqlVisitor();
                var sqlFragment      = sqlSelectVisitor.Visit(vfpManifest, queryCommandTree, out parameters);

                return(WriteSql(sqlFragment, sqlSelectVisitor));
            }

            //Handle Function
            var functionCommandTree = commandTree as DbFunctionCommandTree;

            if (functionCommandTree != null)
            {
                return(DmlSqlFormatter.GenerateFunctionSql(functionCommandTree, out commandType));
            }

            //Handle Insert
            var insertCommandTree = commandTree as DbInsertCommandTree;

            if (insertCommandTree != null)
            {
                return(DmlSqlFormatter.GenerateInsertSql(vfpManifest, insertCommandTree, out parameters));
            }

            //Handle Delete
            var deleteCommandTree = commandTree as DbDeleteCommandTree;

            if (deleteCommandTree != null)
            {
                return(DmlSqlFormatter.GenerateDeleteSql(vfpManifest, deleteCommandTree, out parameters));
            }

            //Handle Update
            var updateCommandTree = commandTree as DbUpdateCommandTree;

            if (updateCommandTree != null)
            {
                return(DmlSqlFormatter.GenerateUpdateSql(vfpManifest, updateCommandTree, out parameters));
            }

            return(null);
        }
        internal static string GenerateDeleteSql(VfpProviderManifest vfpManifest, System.Data.Entity.Core.Common.CommandTrees.DbDeleteCommandTree deleteCommandTree, out List <DbParameter> parameters)
        {
            var formatter   = new DmlSqlFormatter();
            var commandTree = GetCommandTreeExpression <VfpDeleteCommandTree>(vfpManifest, deleteCommandTree);

            formatter.Write("DELETE FROM ");
            commandTree.Target.Expression.Accept(formatter);

            formatter.Write(" WHERE ");
            commandTree.Predicate.Accept(formatter);

            parameters = GetParameters(commandTree);

            return(formatter.ToString());
        }
        internal static string GenerateUpdateSql(VfpProviderManifest vfpManifest, System.Data.Entity.Core.Common.CommandTrees.DbUpdateCommandTree updateCommandTree, out List <DbParameter> parameters)
        {
            var commandTree = GetCommandTreeExpression <VfpUpdateCommandTree>(vfpManifest, updateCommandTree);
            var formatter   = new DmlSqlFormatter();

            formatter.Write("UPDATE x");
            formatter.WriteLine(Indentation.Same);

            // set c1 = ..., c2 = ..., ...
            var first = true;

            formatter.Write("SET ");

            foreach (var setClause in commandTree.SetClauses)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    formatter.Write(", ");
                }

                formatter.Write("x.");
                setClause.Property.Accept(formatter);
                formatter.Write(" = ");
                setClause.Value.Accept(formatter);
            }

            if (first)
            {
                // If first is still true, it indicates there were no set
                // clauses. Introduce a fake set clause so that:
                // - we acquire the appropriate locks
                // - server-gen columns (e.g. timestamp) get recomputed
                //
                // We use the following pattern:
                //
                //  update Foo
                //  set @i = 0
                //  where ...
                var parameter = formatter.CreateParameter(default(Int32), DbType.Int32);

                formatter.Write(parameter.ParameterName);
                formatter.Write(" = 0");
            }

            formatter.WriteLine(Indentation.Same);

            formatter.Write("FROM ");
            commandTree.Target.Expression.Accept(formatter);
            formatter.Write(" AS x");
            formatter.WriteLine(Indentation.Same);

            // where c1 = ..., c2 = ...
            formatter.Write("WHERE ");

            formatter._usePrefix = true;
            commandTree.Predicate.Accept(formatter);
            formatter._usePrefix = false;

            formatter.WriteLine(Indentation.Same);

            // generate returning sql
            GenerateReturningSql(vfpManifest, commandTree, formatter, commandTree.Returning);

            parameters = GetParameters(commandTree);

            return(formatter.ToString());
        }
        private static void GenerateReturningSql(VfpProviderManifest vfpManifest, VfpModificationCommandTree commandTree, DmlSqlFormatter formatter, VfpExpression returning)
        {
            if (returning == null)
            {
                return;
            }

            formatter.WriteLine(Indentation.Same);
            formatter.Write(VfpCommand.SplitCommandsToken);
            formatter.WriteLine(Indentation.Same);

            // select
            formatter.Write("SELECT ");
            returning.Accept(formatter);
            formatter.WriteLine(Indentation.Same);

            // from
            formatter.Write("FROM ");
            commandTree.Target.Expression.Accept(formatter);
            formatter.WriteLine(Indentation.Same);

            // where
            formatter.Write("WHERE ");

            var table    = ((VfpScanExpression)commandTree.Target.Expression).Target;
            var identity = false;
            var first    = true;

            foreach (var keyMember in table.ElementType.KeyMembers)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    formatter.Write(" and ");
                }

                formatter.Write(keyMember);

                // retrieve member value sql. the translator remembers member values
                // as it constructs the DML statement (which precedes the "returning"
                // SQL)
                DbParameter value;
                if (formatter.memberValues.TryGetValue(keyMember, out value))
                {
                    formatter.Write(" = ");
                    formatter.Write(value.ParameterName);
                }
                else
                {
                    if (identity)
                    {
                        throw new NotSupportedException(string.Format("Server generated keys are only supported for identity columns. More than one key column is marked as server generated in table '{0}'.", table.Name));
                    }

                    formatter.Write(" = ");
                    formatter.Write(VfpCommand.ExecuteScalarBeginDelimiter);
                    formatter.Write("=");
                    formatter.Write(GetTableName(commandTree));
                    formatter.Write(".");
                    formatter.Write(keyMember.Name);
                    formatter.Write(VfpCommand.ExecuteScalarEndDelimiter);
                    formatter.Write(" ");

                    identity = true;
                }
            }
        }
        public static string GenerateInsertSql(VfpProviderManifest vfpManifest, System.Data.Entity.Core.Common.CommandTrees.DbInsertCommandTree insertCommandTree, out List <DbParameter> parameters)
        {
            var commandTree = GetCommandTreeExpression <VfpInsertCommandTree>(vfpManifest, insertCommandTree);
            var formatter   = new DmlSqlFormatter();

            formatter.Write("INSERT INTO ");
            commandTree.Target.Expression.Accept(formatter);

            // (c1, c2, c3, ...)
            formatter.Write("(");

            var setClauses = commandTree.SetClauses.Where(x => x.Value.ExpressionKind != VfpExpressionKind.Null).ToArray();

            var first = true;

            foreach (var setClause in setClauses)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    formatter.Write(", ");
                }

                setClause.Property.Accept(formatter);
            }

            formatter.Write(")");
            formatter.WriteLine(Indentation.Same);

            // values c1, c2, ...
            first = true;
            formatter.Write("values (");

            foreach (var setClause in setClauses)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    formatter.Write(", ");
                }

                setClause.Value.Accept(formatter);
                //translator.RegisterMemberValue(setClause.Property, setClause.Value);
            }

            formatter.Write(")");
            formatter.WriteLine(Indentation.Same);

            // generate returning sql
            GenerateReturningSql(vfpManifest, commandTree, formatter, commandTree.Returning);

            parameters = GetParameters(commandTree);

            return(formatter.ToString());
        }
Exemple #11
0
 public DecimalPropertyRewritter(VfpProviderManifest vfpManifest)
 {
     _vfpManifest = vfpManifest;
 }
Exemple #12
0
        public static VfpExpression Rewrite(VfpProviderManifest vfpManifest, VfpExpression expression)
        {
            var rewriter = new DecimalPropertyRewritter(vfpManifest);

            return(rewriter.Visit(expression));
        }