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); }
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)); }
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); }
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()); }
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()); }
public DecimalPropertyRewritter(VfpProviderManifest vfpManifest) { _vfpManifest = vfpManifest; }
public static VfpExpression Rewrite(VfpProviderManifest vfpManifest, VfpExpression expression) { var rewriter = new DecimalPropertyRewritter(vfpManifest); return(rewriter.Visit(expression)); }