File: System\Data\Common\CommandTrees\BasicCommandTreeVisitor.cs
Project: ndp\fx\src\DataEntity\System.Data.Entity.csproj (System.Data.Entity)
//---------------------------------------------------------------------
// <copyright file="BasicCommandTreeVisitor.cs" company="Microsoft">
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// @owner  Microsoft
// @backupOwner Microsoft
//---------------------------------------------------------------------
 
using System.Collections.Generic;
using System.Diagnostics;
 
using System.Data.Metadata.Edm;
 
namespace System.Data.Common.CommandTrees
{
    /// <summary>
    /// An abstract base type for types that implement the IExpressionVisitor interface to derive from.
    /// </summary>
    /*CQT_PUBLIC_API(*/internal/*)*/ abstract class BasicCommandTreeVisitor : BasicExpressionVisitor
    {
        #region protected API, may be overridden to add functionality at specific points in the traversal
 
        protected virtual void VisitSetClause(DbSetClause setClause)
        {
            EntityUtil.CheckArgumentNull(setClause, "setClause");
            this.VisitExpression(setClause.Property);
            this.VisitExpression(setClause.Value);
        }
 
        protected virtual void VisitModificationClause(DbModificationClause modificationClause)
        {
            EntityUtil.CheckArgumentNull(modificationClause, "modificationClause");
            // Set clause is the only current possibility
            this.VisitSetClause((DbSetClause)modificationClause);
        }
 
        protected virtual void VisitModificationClauses(IList<DbModificationClause> modificationClauses)
        {
            EntityUtil.CheckArgumentNull(modificationClauses, "modificationClauses");
            for (int idx = 0; idx < modificationClauses.Count; idx++)
            {
                this.VisitModificationClause(modificationClauses[idx]);
            }
        }
        
        #endregion
 
        #region public convenience API
 
        public virtual void VisitCommandTree(DbCommandTree commandTree)
        {
            EntityUtil.CheckArgumentNull(commandTree, "commandTree");
            switch (commandTree.CommandTreeKind)
            {
                case DbCommandTreeKind.Delete:
                    this.VisitDeleteCommandTree((DbDeleteCommandTree)commandTree);
                    break;
 
                case DbCommandTreeKind.Function:
                    this.VisitFunctionCommandTree((DbFunctionCommandTree)commandTree);
                    break;
 
                case DbCommandTreeKind.Insert:
                    this.VisitInsertCommandTree((DbInsertCommandTree)commandTree);
                    break;
 
                case DbCommandTreeKind.Query:
                    this.VisitQueryCommandTree((DbQueryCommandTree)commandTree);
                    break;
 
                case DbCommandTreeKind.Update:
                    this.VisitUpdateCommandTree((DbUpdateCommandTree)commandTree);
                    break;
 
                default:
                    throw EntityUtil.NotSupported();
            }
        }
 
        #endregion
 
        #region CommandTree-specific Visitor Methods
 
        protected virtual void VisitDeleteCommandTree(DbDeleteCommandTree deleteTree)
        {
            EntityUtil.CheckArgumentNull(deleteTree, "deleteTree");
            this.VisitExpressionBindingPre(deleteTree.Target);
            this.VisitExpression(deleteTree.Predicate);
            this.VisitExpressionBindingPost(deleteTree.Target);
        }
 
        protected virtual void VisitFunctionCommandTree(DbFunctionCommandTree functionTree)
        {
            EntityUtil.CheckArgumentNull(functionTree, "functionTree");
 
        }
 
        protected virtual void VisitInsertCommandTree(DbInsertCommandTree insertTree)
        {
            EntityUtil.CheckArgumentNull(insertTree, "insertTree");
            this.VisitExpressionBindingPre(insertTree.Target);
            this.VisitModificationClauses(insertTree.SetClauses);
            if (insertTree.Returning != null)
            {
                this.VisitExpression(insertTree.Returning);
            }
            this.VisitExpressionBindingPost(insertTree.Target);
        }
 
        protected virtual void VisitQueryCommandTree(DbQueryCommandTree queryTree)
        {
            EntityUtil.CheckArgumentNull(queryTree, "queryTree");
            this.VisitExpression(queryTree.Query);
        }
 
        protected virtual void VisitUpdateCommandTree(DbUpdateCommandTree updateTree)
        {
            EntityUtil.CheckArgumentNull(updateTree, "updateTree");
            this.VisitExpressionBindingPre(updateTree.Target);
            this.VisitModificationClauses(updateTree.SetClauses);
            this.VisitExpression(updateTree.Predicate);
            if (updateTree.Returning != null)
            {
                this.VisitExpression(updateTree.Returning);
            }
            this.VisitExpressionBindingPost(updateTree.Target);
        }
 
        #endregion
 
    }
}