//---------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
namespace System.Data.Query.InternalTrees
{
using System;
using pc = System.Data.Query.PlanCompiler; // To be able to use PlanCompiler.Assert instead of Debug.Assert in this class.
///
/// Simple implemenation of the BasicOpVisitor interface.
///
internal abstract class BasicOpVisitor
{
///
/// Default constructor.
///
internal BasicOpVisitor() { }
#region Visitor Helpers
///
/// Visit the children of this Node
///
/// The Node that references the Op
protected virtual void VisitChildren(Node n)
{
foreach (Node chi in n.Children)
{
VisitNode(chi);
}
}
///
/// Visit the children of this Node. but in reverse order
///
/// The current node
protected virtual void VisitChildrenReverse(Node n)
{
for (int i = n.Children.Count - 1; i >= 0; i--)
{
VisitNode(n.Children[i]);
}
}
///
/// Visit this node
///
///
internal virtual void VisitNode(Node n)
{
n.Op.Accept(this, n);
}
///
/// Default node visitor
///
///
protected virtual void VisitDefault(Node n)
{
VisitChildren(n);
}
///
/// Default handler for all constantOps
///
/// the constant op
/// the node
protected virtual void VisitConstantOp(ConstantBaseOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Default handler for all TableOps
///
///
///
protected virtual void VisitTableOp(ScanTableBaseOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Default handler for all JoinOps
///
/// join op
///
protected virtual void VisitJoinOp(JoinBaseOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Default handler for all ApplyOps
///
/// apply op
///
protected virtual void VisitApplyOp(ApplyBaseOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Default handler for all SetOps
///
/// set op
///
protected virtual void VisitSetOp(SetOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Default handler for all SortOps
///
/// sort op
///
protected virtual void VisitSortOp(SortBaseOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Default handler for all GroupBy ops
///
/// sort op
///
protected virtual void VisitGroupByOp(GroupByBaseOp op, Node n)
{
VisitRelOpDefault(op, n);
}
#endregion
#region BasicOpVisitor Members
///
/// Trap method for unrecognized Op types
///
/// The Op being visited
/// The Node that references the Op
public virtual void Visit(Op op, Node n)
{
throw new NotSupportedException(System.Data.Entity.Strings.Iqt_General_UnsupportedOp(op.GetType().FullName));
}
#region ScalarOps
protected virtual void VisitScalarOpDefault(ScalarOp op, Node n)
{
VisitDefault(n);
}
///
/// Visitor pattern method for ConstantOp
///
/// The ConstantOp being visited
/// The Node that references the Op
public virtual void Visit(ConstantOp op, Node n)
{
VisitConstantOp(op, n);
}
///
/// Visitor pattern method for NullOp
///
/// The NullOp being visited
/// The Node that references the Op
public virtual void Visit(NullOp op, Node n)
{
VisitConstantOp(op, n);
}
///
/// Visitor pattern method for NullSentinelOp
///
/// The NullSentinelOp being visited
/// The Node that references the Op
public virtual void Visit(NullSentinelOp op, Node n)
{
VisitConstantOp(op, n);
}
///
/// Visitor pattern method for InternalConstantOp
///
/// The InternalConstantOp being visited
/// The Node that references the Op
public virtual void Visit(InternalConstantOp op, Node n)
{
VisitConstantOp(op, n);
}
///
/// Visitor pattern method for ConstantPredicateOp
///
/// The ConstantPredicateOp being visited
/// The Node that references the Op
public virtual void Visit(ConstantPredicateOp op, Node n)
{
VisitConstantOp(op, n);
}
///
/// Visitor pattern method for FunctionOp
///
/// The FunctionOp being visited
/// The Node that references the Op
public virtual void Visit(FunctionOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for PropertyOp
///
/// The PropertyOp being visited
/// The Node that references the Op
public virtual void Visit(PropertyOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for RelPropertyOp
///
/// The RelPropertyOp being visited
/// The Node that references the Op
public virtual void Visit(RelPropertyOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for CaseOp
///
/// The CaseOp being visited
/// The Node that references the Op
public virtual void Visit(CaseOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for ComparisonOp
///
/// The ComparisonOp being visited
/// The Node that references the Op
public virtual void Visit(ComparisonOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for LikeOp
///
/// The LikeOp being visited
/// The Node that references the Op
public virtual void Visit(LikeOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for AggregateOp
///
/// The AggregateOp being visited
/// The Node that references the Op
public virtual void Visit(AggregateOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for NewInstanceOp
///
/// The NewInstanceOp being visited
/// The Node that references the Op
public virtual void Visit(NewInstanceOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for NewEntityOp
///
/// The NewEntityOp being visited
/// The Node that references the Op
public virtual void Visit(NewEntityOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for DiscriminatedNewInstanceOp
///
/// The DiscriminatedNewInstanceOp being visited
/// The Node that references the Op
public virtual void Visit(DiscriminatedNewEntityOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for NewMultisetOp
///
/// The NewMultisetOp being visited
/// The Node that references the Op
public virtual void Visit(NewMultisetOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for NewRecordOp
///
/// The NewRecordOp being visited
/// The Node that references the Op
public virtual void Visit(NewRecordOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for RefOp
///
/// The RefOp being visited
/// The Node that references the Op
public virtual void Visit(RefOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for VarRefOp
///
/// The VarRefOp being visited
/// The Node that references the Op
public virtual void Visit(VarRefOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for ConditionalOp
///
/// The ConditionalOp being visited
/// The Node that references the Op
public virtual void Visit(ConditionalOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for ArithmeticOp
///
/// The ArithmeticOp being visited
/// The Node that references the Op
public virtual void Visit(ArithmeticOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for TreatOp
///
/// The TreatOp being visited
/// The Node that references the Op
public virtual void Visit(TreatOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for CastOp
///
/// The CastOp being visited
/// The Node that references the Op
public virtual void Visit(CastOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for SoftCastOp
///
/// The SoftCastOp being visited
/// The Node that references the Op
public virtual void Visit(SoftCastOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for IsOp
///
/// The IsOp being visited
/// The Node that references the Op
public virtual void Visit(IsOfOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for ExistsOp
///
/// The ExistsOp being visited
/// The Node that references the Op
public virtual void Visit(ExistsOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for ElementOp
///
/// The ElementOp being visited
/// The Node that references the Op
public virtual void Visit(ElementOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for GetEntityRefOp
///
/// The GetEntityRefOp being visited
/// The Node that references the Op
public virtual void Visit(GetEntityRefOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for GetRefKeyOp
///
/// The GetRefKeyOp being visited
/// The Node that references the Op
public virtual void Visit(GetRefKeyOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
///
/// Visitor pattern method for NestOp
///
/// The NestOp being visited
/// The Node that references the Op
public virtual void Visit(CollectOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
public virtual void Visit(DerefOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
public virtual void Visit(NavigateOp op, Node n)
{
VisitScalarOpDefault(op, n);
}
#endregion
#region AncillaryOps
protected virtual void VisitAncillaryOpDefault(AncillaryOp op, Node n)
{
VisitDefault(n);
}
///
/// Visitor pattern method for VarDefOp
///
/// The VarDefOp being visited
/// The Node that references the Op
public virtual void Visit(VarDefOp op, Node n)
{
VisitAncillaryOpDefault(op, n);
}
///
/// Visitor pattern method for VarDefListOp
///
/// The VarDefListOp being visited
/// The Node that references the Op
public virtual void Visit(VarDefListOp op, Node n)
{
VisitAncillaryOpDefault(op, n);
}
#endregion
#region RelOps
protected virtual void VisitRelOpDefault(RelOp op, Node n)
{
VisitDefault(n);
}
///
/// Visitor pattern method for ScanTableOp
///
/// The ScanTableOp being visited
/// The Node that references the Op
public virtual void Visit(ScanTableOp op, Node n)
{
VisitTableOp(op, n);
}
///
/// Visitor pattern method for ScanViewOp
///
/// The ScanViewOp being visited
/// The Node that references the Op
public virtual void Visit(ScanViewOp op, Node n)
{
VisitTableOp(op, n);
}
///
/// Visitor pattern method for UnnestOp
///
/// The UnnestOp being visited
/// The Node that references the Op
public virtual void Visit(UnnestOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Visitor pattern method for ProjectOp
///
/// The ProjectOp being visited
/// The Node that references the Op
public virtual void Visit(ProjectOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Visitor pattern method for FilterOp
///
/// The FilterOp being visited
/// The Node that references the Op
public virtual void Visit(FilterOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Visitor pattern method for SortOp
///
/// The SortOp being visited
/// The Node that references the Op
public virtual void Visit(SortOp op, Node n)
{
VisitSortOp(op, n);
}
///
/// Visitor pattern method for ConstrainedSortOp
///
/// The ConstrainedSortOp being visited
/// The Node that references the Op
public virtual void Visit(ConstrainedSortOp op, Node n)
{
VisitSortOp(op, n);
}
///
/// Visitor pattern method for GroupByOp
///
/// The GroupByOp being visited
/// The Node that references the Op
public virtual void Visit(GroupByOp op, Node n)
{
VisitGroupByOp(op, n);
}
///
/// Visitor pattern method for GroupByIntoOp
///
/// The GroupByIntoOp being visited
/// The Node that references the Op
public virtual void Visit(GroupByIntoOp op, Node n)
{
VisitGroupByOp(op, n);
}
///
/// Visitor pattern method for CrossJoinOp
///
/// The CrossJoinOp being visited
/// The Node that references the Op
public virtual void Visit(CrossJoinOp op, Node n)
{
VisitJoinOp(op, n);
}
///
/// Visitor pattern method for InnerJoinOp
///
/// The InnerJoinOp being visited
/// The Node that references the Op
public virtual void Visit(InnerJoinOp op, Node n)
{
VisitJoinOp(op, n);
}
///
/// Visitor pattern method for LeftOuterJoinOp
///
/// The LeftOuterJoinOp being visited
/// The Node that references the Op
public virtual void Visit(LeftOuterJoinOp op, Node n)
{
VisitJoinOp(op, n);
}
///
/// Visitor pattern method for FullOuterJoinOp
///
/// The FullOuterJoinOp being visited
/// The Node that references the Op
public virtual void Visit(FullOuterJoinOp op, Node n)
{
VisitJoinOp(op, n);
}
///
/// Visitor pattern method for CrossApplyOp
///
/// The CrossApplyOp being visited
/// The Node that references the Op
public virtual void Visit(CrossApplyOp op, Node n)
{
VisitApplyOp(op, n);
}
///
/// Visitor pattern method for OuterApplyOp
///
/// The OuterApplyOp being visited
/// The Node that references the Op
public virtual void Visit(OuterApplyOp op, Node n)
{
VisitApplyOp(op, n);
}
///
/// Visitor pattern method for UnionAllOp
///
/// The UnionAllOp being visited
/// The Node that references the Op
public virtual void Visit(UnionAllOp op, Node n)
{
VisitSetOp(op, n);
}
///
/// Visitor pattern method for IntersectOp
///
/// The IntersectOp being visited
/// The Node that references the Op
public virtual void Visit(IntersectOp op, Node n)
{
VisitSetOp(op, n);
}
///
/// Visitor pattern method for ExceptOp
///
/// The ExceptOp being visited
/// The Node that references the Op
public virtual void Visit(ExceptOp op, Node n)
{
VisitSetOp(op, n);
}
///
/// Visitor pattern method for DistinctOp
///
/// The DistinctOp being visited
/// The Node that references the Op
public virtual void Visit(DistinctOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Visitor pattern method for SingleRowOp
///
/// The SingleRowOp being visited
/// The Node that references the Op
public virtual void Visit(SingleRowOp op, Node n)
{
VisitRelOpDefault(op, n);
}
///
/// Visitor pattern method for SingleRowTableOp
///
/// The SingleRowTableOp being visited
/// The Node that references the Op
public virtual void Visit(SingleRowTableOp op, Node n)
{
VisitRelOpDefault(op, n);
}
#endregion
#region PhysicalOps
protected virtual void VisitPhysicalOpDefault(PhysicalOp op, Node n)
{
VisitDefault(n);
}
///
/// Visitor pattern method for PhysicalProjectOp
///
/// The op being visited
/// The Node that references the Op
public virtual void Visit(PhysicalProjectOp op, Node n)
{
VisitPhysicalOpDefault(op, n);
}
#region NestOps
///
/// Common handling for all nestOps
///
/// nest op
///
protected virtual void VisitNestOp(NestBaseOp op, Node n)
{
VisitPhysicalOpDefault(op, n);
}
///
/// Visitor pattern method for SingleStreamNestOp
///
/// The op being visited
/// The Node that references the Op
public virtual void Visit(SingleStreamNestOp op, Node n)
{
VisitNestOp(op, n);
}
///
/// Visitor pattern method for MultistreamNestOp
///
/// The op being visited
/// The Node that references the Op
public virtual void Visit(MultiStreamNestOp op, Node n)
{
VisitNestOp(op, n);
}
#endregion
#endregion
#endregion
}
///
/// Simple implementation of the BasicOpVisitorOfT interface"/>
///
/// type parameter
internal abstract class BasicOpVisitorOfT
{
#region visitor helpers
///
/// Simply iterates over all children, and manages any updates
///
/// The current node
protected virtual void VisitChildren(Node n)
{
for (int i = 0; i < n.Children.Count; i++)
{
VisitNode(n.Children[i]);
}
}
///
/// Simply iterates over all children, and manages any updates, but in reverse order
///
/// The current node
protected virtual void VisitChildrenReverse(Node n)
{
for (int i = n.Children.Count - 1; i >= 0; i--)
{
VisitNode(n.Children[i]);
}
}
///
/// Simple wrapper to invoke the appropriate action on a node
///
/// the node to process
///
internal TResultType VisitNode(Node n)
{
// Invoke the visitor
return n.Op.Accept(this, n);
}
///
/// A default processor for any node. Visits the children and returns itself unmodified.
///
/// the node to process
/// a potentially new node
protected virtual TResultType VisitDefault(Node n)
{
VisitChildren(n);
return default(TResultType);
}
#endregion
///
/// No processing yet for this node - raises an exception
///
///
internal virtual TResultType Unimplemented(Node n)
{
pc.PlanCompiler.Assert(false, "Not implemented op type");
return default(TResultType);
}
///
/// Catch-all processor - raises an exception
///
///
///
///
public virtual TResultType Visit(Op op, Node n)
{
return Unimplemented(n);
}
#region AncillaryOp Visitors
///
/// A default processor for all AncillaryOps.
///
/// Allows new visitors to just override this to handle all AncillaryOps
///
/// the AncillaryOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitAncillaryOpDefault(AncillaryOp op, Node n)
{
return VisitDefault(n);
}
///
/// VarDefOp
///
///
///
///
public virtual TResultType Visit(VarDefOp op, Node n)
{
return VisitAncillaryOpDefault(op, n);
}
///
/// VarDefListOp
///
///
///
///
public virtual TResultType Visit(VarDefListOp op, Node n)
{
return VisitAncillaryOpDefault(op, n);
}
#endregion
#region PhysicalOp Visitors
///
/// A default processor for all PhysicalOps.
///
/// Allows new visitors to just override this to handle all PhysicalOps
///
/// the PhysicalOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitPhysicalOpDefault(PhysicalOp op, Node n)
{
return VisitDefault(n);
}
///
/// PhysicalProjectOp
///
///
///
///
public virtual TResultType Visit(PhysicalProjectOp op, Node n)
{
return VisitPhysicalOpDefault(op, n);
}
#region NestOp Visitors
///
/// A default processor for all NestOps.
///
/// Allows new visitors to just override this to handle all NestOps
///
/// the NestOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitNestOp(NestBaseOp op, Node n)
{
return VisitPhysicalOpDefault(op, n);
}
///
/// SingleStreamNestOp
///
///
///
///
public virtual TResultType Visit(SingleStreamNestOp op, Node n)
{
return VisitNestOp(op, n);
}
///
/// MultiStreamNestOp
///
///
///
///
public virtual TResultType Visit(MultiStreamNestOp op, Node n)
{
return VisitNestOp(op, n);
}
#endregion
#endregion
#region RelOp Visitors
///
/// A default processor for all RelOps.
///
/// Allows new visitors to just override this to handle all RelOps
///
/// the RelOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitRelOpDefault(RelOp op, Node n)
{
return VisitDefault(n);
}
#region ApplyOp Visitors
///
/// Common handling for all ApplyOps
///
/// the ApplyOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitApplyOp(ApplyBaseOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// CrossApply
///
///
///
///
public virtual TResultType Visit(CrossApplyOp op, Node n)
{
return VisitApplyOp(op, n);
}
///
/// OuterApply
///
///
///
///
public virtual TResultType Visit(OuterApplyOp op, Node n)
{
return VisitApplyOp(op, n);
}
#endregion
#region JoinOp Visitors
///
/// A default processor for all JoinOps.
///
/// Allows new visitors to just override this to handle all JoinOps.
///
/// the JoinOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitJoinOp(JoinBaseOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// CrossJoin
///
///
///
///
public virtual TResultType Visit(CrossJoinOp op, Node n)
{
return VisitJoinOp(op, n);
}
///
/// FullOuterJoin
///
///
///
///
public virtual TResultType Visit(FullOuterJoinOp op, Node n)
{
return VisitJoinOp(op, n);
}
///
/// LeftOuterJoin
///
///
///
///
public virtual TResultType Visit(LeftOuterJoinOp op, Node n)
{
return VisitJoinOp(op, n);
}
///
/// InnerJoin
///
///
///
///
public virtual TResultType Visit(InnerJoinOp op, Node n)
{
return VisitJoinOp(op, n);
}
#endregion
#region SetOp Visitors
///
/// A default processor for all SetOps.
///
/// Allows new visitors to just override this to handle all SetOps.
///
/// the SetOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitSetOp(SetOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// Except
///
///
///
///
public virtual TResultType Visit(ExceptOp op, Node n)
{
return VisitSetOp(op, n);
}
///
/// Intersect
///
///
///
///
public virtual TResultType Visit(IntersectOp op, Node n)
{
return VisitSetOp(op, n);
}
///
/// UnionAll
///
///
///
///
public virtual TResultType Visit(UnionAllOp op, Node n)
{
return VisitSetOp(op, n);
}
#endregion
///
/// Distinct
///
///
///
///
public virtual TResultType Visit(DistinctOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// FilterOp
///
///
///
///
public virtual TResultType Visit(FilterOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// GroupByBaseOp
///
///
///
///
protected virtual TResultType VisitGroupByOp(GroupByBaseOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// GroupByOp
///
///
///
///
public virtual TResultType Visit(GroupByOp op, Node n)
{
return VisitGroupByOp(op, n);
}
///
/// GroupByIntoOp
///
///
///
///
public virtual TResultType Visit(GroupByIntoOp op, Node n)
{
return VisitGroupByOp(op, n);
}
///
/// ProjectOp
///
///
///
///
public virtual TResultType Visit(ProjectOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
#region TableOps
///
/// Default handler for all TableOps
///
///
///
///
protected virtual TResultType VisitTableOp(ScanTableBaseOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// ScanTableOp
///
///
///
///
public virtual TResultType Visit(ScanTableOp op, Node n)
{
return VisitTableOp(op, n);
}
///
/// ScanViewOp
///
///
///
///
public virtual TResultType Visit(ScanViewOp op, Node n)
{
return VisitTableOp(op, n);
}
#endregion
///
/// Visitor pattern method for SingleRowOp
///
/// The SingleRowOp being visited
/// The Node that references the Op
///
public virtual TResultType Visit(SingleRowOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// Visitor pattern method for SingleRowTableOp
///
/// The SingleRowTableOp being visited
/// The Node that references the Op
///
public virtual TResultType Visit(SingleRowTableOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// A default processor for all SortOps.
///
/// Allows new visitors to just override this to handle ConstrainedSortOp/SortOp.
///
/// the SetOp
/// the node to process
/// a potentially modified subtree
protected virtual TResultType VisitSortOp(SortBaseOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
///
/// SortOp
///
///
///
///
public virtual TResultType Visit(SortOp op, Node n)
{
return VisitSortOp(op, n);
}
///
/// ConstrainedSortOp
///
///
///
///
public virtual TResultType Visit(ConstrainedSortOp op, Node n)
{
return VisitSortOp(op, n);
}
///
/// UnnestOp
///
///
///
///
public virtual TResultType Visit(UnnestOp op, Node n)
{
return VisitRelOpDefault(op, n);
}
#endregion
#region ScalarOp Visitors
///
/// A default processor for all ScalarOps.
///
/// Allows new visitors to just override this to handle all ScalarOps
///
/// the ScalarOp
/// the node to process
/// a potentially new node
protected virtual TResultType VisitScalarOpDefault(ScalarOp op, Node n)
{
return VisitDefault(n);
}
///
/// Default handler for all constant Ops
///
///
///
///
protected virtual TResultType VisitConstantOp(ConstantBaseOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// AggregateOp
///
///
///
///
public virtual TResultType Visit(AggregateOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// ArithmeticOp
///
///
///
///
public virtual TResultType Visit(ArithmeticOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// CaseOp
///
///
///
///
public virtual TResultType Visit(CaseOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// CastOp
///
///
///
///
public virtual TResultType Visit(CastOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// SoftCastOp
///
///
///
///
public virtual TResultType Visit(SoftCastOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// NestOp
///
///
///
///
public virtual TResultType Visit(CollectOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// ComparisonOp
///
///
///
///
public virtual TResultType Visit(ComparisonOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// ConditionalOp
///
///
///
///
public virtual TResultType Visit(ConditionalOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// ConstantOp
///
///
///
///
public virtual TResultType Visit(ConstantOp op, Node n)
{
return VisitConstantOp(op, n);
}
///
/// ConstantPredicateOp
///
///
///
///
public virtual TResultType Visit(ConstantPredicateOp op, Node n)
{
return VisitConstantOp(op, n);
}
///
/// ElementOp
///
///
///
///
public virtual TResultType Visit(ElementOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// ExistsOp
///
///
///
///
public virtual TResultType Visit(ExistsOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// FunctionOp
///
///
///
///
public virtual TResultType Visit(FunctionOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// GetEntityRefOp
///
///
///
///
public virtual TResultType Visit(GetEntityRefOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// GetRefKeyOp
///
///
///
///
public virtual TResultType Visit(GetRefKeyOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// InternalConstantOp
///
///
///
///
public virtual TResultType Visit(InternalConstantOp op, Node n)
{
return VisitConstantOp(op, n);
}
///
/// IsOfOp
///
///
///
///
public virtual TResultType Visit(IsOfOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// LikeOp
///
///
///
///
public virtual TResultType Visit(LikeOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// NewEntityOp
///
///
///
///
public virtual TResultType Visit(NewEntityOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// NewInstanceOp
///
///
///
///
public virtual TResultType Visit(NewInstanceOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// DiscriminatedNewInstanceOp
///
///
///
///
public virtual TResultType Visit(DiscriminatedNewEntityOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// NewMultisetOp
///
///
///
///
public virtual TResultType Visit(NewMultisetOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// NewRecordOp
///
///
///
///
public virtual TResultType Visit(NewRecordOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// NullOp
///
///
///
///
public virtual TResultType Visit(NullOp op, Node n)
{
return VisitConstantOp(op, n);
}
///
/// NullSentinelOp
///
///
///
///
public virtual TResultType Visit(NullSentinelOp op, Node n)
{
return VisitConstantOp(op, n);
}
///
/// PropertyOp
///
///
///
///
public virtual TResultType Visit(PropertyOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// RelPropertyOp
///
///
///
///
public virtual TResultType Visit(RelPropertyOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// RefOp
///
///
///
///
public virtual TResultType Visit(RefOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// TreatOp
///
///
///
///
public virtual TResultType Visit(TreatOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
///
/// VarRefOp
///
///
///
///
public virtual TResultType Visit(VarRefOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
public virtual TResultType Visit(DerefOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
public virtual TResultType Visit(NavigateOp op, Node n)
{
return VisitScalarOpDefault(op, n);
}
#endregion
}
///
/// A visitor implementation that allows subtrees to be modified (in a bottom-up
/// fashion)
///
internal abstract class BasicOpVisitorOfNode : BasicOpVisitorOfT
{
#region visitor helpers
///
/// Simply iterates over all children, and manages any updates
///
/// The current node
protected override void VisitChildren(Node n)
{
for (int i = 0; i < n.Children.Count; i++)
{
n.Children[i] = VisitNode(n.Children[i]);
}
}
///
/// Simply iterates over all children, and manages any updates, but in reverse order
///
/// The current node
protected override void VisitChildrenReverse(Node n)
{
for (int i = n.Children.Count - 1; i >= 0; i--)
{
n.Children[i] = VisitNode(n.Children[i]);
}
}
///
/// A default processor for any node. Visits the children and returns itself unmodified.
///
/// the node to process
/// a potentially new node
protected override Node VisitDefault(Node n)
{
VisitChildren(n);
return n;
}
#endregion
#region AncillaryOp Visitors
///
/// A default processor for all AncillaryOps.
///
/// Allows new visitors to just override this to handle all AncillaryOps
///
/// the AncillaryOp
/// the node to process
/// a potentially modified subtree
protected override Node VisitAncillaryOpDefault(AncillaryOp op, Node n)
{
return VisitDefault(n);
}
#endregion
#region PhysicalOp Visitors
///
/// A default processor for all PhysicalOps.
///
/// Allows new visitors to just override this to handle all PhysicalOps
///
/// the PhysicalOp
/// the node to process
/// a potentially modified subtree
protected override Node VisitPhysicalOpDefault(PhysicalOp op, Node n)
{
return VisitDefault(n);
}
#endregion
#region RelOp Visitors
///
/// A default processor for all RelOps.
///
/// Allows new visitors to just override this to handle all RelOps
///
/// the RelOp
/// the node to process
/// a potentially modified subtree
protected override Node VisitRelOpDefault(RelOp op, Node n)
{
return VisitDefault(n);
}
#endregion
#region ScalarOp Visitors
///
/// A default processor for all ScalarOps.
///
/// Allows new visitors to just override this to handle all ScalarOps
///
/// the ScalarOp
/// the node to process
/// a potentially new node
protected override Node VisitScalarOpDefault(ScalarOp op, Node n)
{
return VisitDefault(n);
}
#endregion
}
}