protected override QilNode VisitDocOrderDistinct(QilUnary local0) {
QilNode local1 = local0[0];
if (this[XmlILOptimization.FoldNone]) {
if ( (object) ( (local1).XmlType ) == (object) XmlQueryTypeFactory.None ) {
if (AllowReplace(XmlILOptimization.FoldNone, local0)) {
return Replace(XmlILOptimization.FoldNone, local0, VisitNop(f.Nop(local1)));
}
}
}
if (this[XmlILOptimization.EliminateDod]) {
if ( IsDocOrderDistinct(local1) ) {
if (AllowReplace(XmlILOptimization.EliminateDod, local0)) {
return Replace(XmlILOptimization.EliminateDod, local0, local1);
}
}
}
if (this[XmlILOptimization.FoldNamedDescendants]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local7 = local1[1];
if (local2.NodeType == QilNodeType.For) {
QilNode local3 = local2[0];
if (local3.NodeType == QilNodeType.Loop) {
QilNode local4 = local3[0];
QilNode local5 = local3[1];
if (local5.NodeType == QilNodeType.DescendantOrSelf) {
QilNode local6 = local5[0];
if (local7.NodeType == QilNodeType.Filter) {
QilNode local8 = local7[0];
QilNode local9 = local7[1];
if ((( OptimizerPatterns.Read((QilNode) (local7)).MatchesPattern(OptimizerPatternName.FilterElements) ) || ( OptimizerPatterns.Read((QilNode) (local7)).MatchesPattern(OptimizerPatternName.FilterContentKind) )) && ( IsStepPattern(local7, QilNodeType.Content) )) {
if (AllowReplace(XmlILOptimization.FoldNamedDescendants, local0)) {
QilNode local10 = VisitFor(f.For(VisitDescendant(f.Descendant(local6))));
return Replace(XmlILOptimization.FoldNamedDescendants, local0, VisitDocOrderDistinct(f.DocOrderDistinct(VisitLoop(f.Loop(local4, VisitFilter(f.Filter(local10, Subs(local9, local8, local10) )))))));
}
}
}
}
}
}
}
}
if (this[XmlILOptimization.FoldNamedDescendants]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local5 = local1[1];
if (local2.NodeType == QilNodeType.For) {
QilNode local3 = local2[0];
if (local3.NodeType == QilNodeType.DescendantOrSelf) {
QilNode local4 = local3[0];
if (local5.NodeType == QilNodeType.Filter) {
QilNode local6 = local5[0];
QilNode local7 = local5[1];
if ((( OptimizerPatterns.Read((QilNode) (local5)).MatchesPattern(OptimizerPatternName.FilterElements) ) || ( OptimizerPatterns.Read((QilNode) (local5)).MatchesPattern(OptimizerPatternName.FilterContentKind) )) && ( IsStepPattern(local5, QilNodeType.Content) )) {
if (AllowReplace(XmlILOptimization.FoldNamedDescendants, local0)) {
QilNode local8 = VisitFor(f.For(VisitDescendant(f.Descendant(local4))));
return Replace(XmlILOptimization.FoldNamedDescendants, local0, VisitFilter(f.Filter(local8, Subs(local7, local6, local8) )));
}
}
}
}
}
}
}
if (this[XmlILOptimization.CommuteDodFilter]) {
if (local1.NodeType == QilNodeType.Filter) {
QilNode local2 = local1[0];
QilNode local4 = local1[1];
if (local2.NodeType == QilNodeType.For) {
QilNode local3 = local2[0];
if ( !OptimizerPatterns.Read(local2).MatchesPattern(OptimizerPatternName.IsPositional) ) {
if (((!( OptimizerPatterns.Read((QilNode) (local1)).MatchesPattern(OptimizerPatternName.FilterElements) )) && (!( OptimizerPatterns.Read((QilNode) (local1)).MatchesPattern(OptimizerPatternName.FilterContentKind) ))) && (!( OptimizerPatterns.Read((QilNode) (local1)).MatchesPattern(OptimizerPatternName.FilterAttributeKind) ))) {
if (AllowReplace(XmlILOptimization.CommuteDodFilter, local0)) {
QilNode local5 = VisitFor(f.For(VisitDocOrderDistinct(f.DocOrderDistinct(local3))));
return Replace(XmlILOptimization.CommuteDodFilter, local0, VisitFilter(f.Filter(local5, Subs(local4, local2, local5) )));
}
}
}
}
}
}
if (this[XmlILOptimization.CommuteDodFilter]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local3 = local1[1];
if (local3.NodeType == QilNodeType.Filter) {
QilNode local4 = local3[0];
QilNode local6 = local3[1];
if (local4.NodeType == QilNodeType.For) {
QilNode local5 = local4[0];
if ( !OptimizerPatterns.Read(local4).MatchesPattern(OptimizerPatternName.IsPositional) ) {
if (!(DependsOn(local6,local2))) {
if (((!( OptimizerPatterns.Read((QilNode) (local3)).MatchesPattern(OptimizerPatternName.FilterElements) )) && (!( OptimizerPatterns.Read((QilNode) (local3)).MatchesPattern(OptimizerPatternName.FilterContentKind) ))) && (!( OptimizerPatterns.Read((QilNode) (local3)).MatchesPattern(OptimizerPatternName.FilterAttributeKind) ))) {
if (AllowReplace(XmlILOptimization.CommuteDodFilter, local0)) {
QilNode local7 = VisitFor(f.For(VisitDocOrderDistinct(f.DocOrderDistinct(VisitLoop(f.Loop(local2, local5))))));
return Replace(XmlILOptimization.CommuteDodFilter, local0, VisitFilter(f.Filter(local7, Subs(local6, local4, local7) )));
}
}
}
}
}
}
}
}
if (this[XmlILOptimization.IntroduceDod]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local4 = local1[1];
if (local2.NodeType == QilNodeType.For) {
QilNode local3 = local2[0];
if (!( IsDocOrderDistinct(local3) )) {
if (( !OptimizerPatterns.Read(local2).MatchesPattern(OptimizerPatternName.IsPositional) ) && ( (local3).XmlType .IsSubtypeOf( XmlQueryTypeFactory.NodeNotRtfS ) )) {
if (((!( OptimizerPatterns.Read((QilNode) (local1)).MatchesPattern(OptimizerPatternName.FilterElements) )) && (!( OptimizerPatterns.Read((QilNode) (local1)).MatchesPattern(OptimizerPatternName.FilterContentKind) ))) && (!( OptimizerPatterns.Read((QilNode) (local1)).MatchesPattern(OptimizerPatternName.FilterAttributeKind) ))) {
if (AllowReplace(XmlILOptimization.IntroduceDod, local0)) {
QilNode local5 = VisitFor(f.For(VisitDocOrderDistinct(f.DocOrderDistinct(local3))));
return Replace(XmlILOptimization.IntroduceDod, local0, VisitDocOrderDistinct(f.DocOrderDistinct(VisitLoop(f.Loop(local5, Subs(local4, local2, local5) )))));
}
}
}
}
}
}
}
if (this[XmlILOptimization.IntroducePrecedingDod]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local3 = local1[1];
if ((!( IsDocOrderDistinct(local3) )) && ( IsStepPattern(local3, QilNodeType.PrecedingSibling) )) {
if (AllowReplace(XmlILOptimization.IntroducePrecedingDod, local0)) {
return Replace(XmlILOptimization.IntroducePrecedingDod, local0, VisitDocOrderDistinct(f.DocOrderDistinct(VisitLoop(f.Loop(local2, VisitDocOrderDistinct(f.DocOrderDistinct(local3)))))));
}
}
}
}
if (this[XmlILOptimization.EliminateReturnDod]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local3 = local1[1];
if (local3.NodeType == QilNodeType.DocOrderDistinct) {
QilNode local4 = local3[0];
if (!( IsStepPattern(local4, QilNodeType.PrecedingSibling) )) {
if (AllowReplace(XmlILOptimization.EliminateReturnDod, local0)) {
return Replace(XmlILOptimization.EliminateReturnDod, local0, VisitDocOrderDistinct(f.DocOrderDistinct(VisitLoop(f.Loop(local2, local4)))));
}
}
}
}
}
if (this[XmlILOptimization.AnnotateDod]) {
if (AllowReplace(XmlILOptimization.AnnotateDod, local0)) {
OptimizerPatterns.Write((QilNode) (local0)).AddPattern(OptimizerPatternName.IsDocOrderDistinct); OptimizerPatterns.Inherit((QilNode) (local1), (QilNode) (local0), OptimizerPatternName.SameDepth); }
}
if (this[XmlILOptimization.AnnotateDodReverse]) {
if ( AllowDodReverse(local1) ) {
if (AllowReplace(XmlILOptimization.AnnotateDodReverse, local0)) {
OptimizerPatterns.Write((QilNode) (local0)).AddPattern(OptimizerPatternName.DodReverse); OptimizerPatterns.Write((QilNode) (local0)).AddArgument(OptimizerPatternArgument.DodStep, local1); }
}
}
if (this[XmlILOptimization.AnnotateJoinAndDod]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local2 = local1[0];
QilNode local4 = local1[1];
if (local2.NodeType == QilNodeType.For) {
QilNode local3 = local2[0];
if ( IsDocOrderDistinct(local3) ) {
if (( AllowJoinAndDod(local4) ) && ( (local2) == ( OptimizerPatterns.Read((QilNode) (local4)).GetArgument(OptimizerPatternArgument.StepInput) ) )) {
if (AllowReplace(XmlILOptimization.AnnotateJoinAndDod, local0)) {
OptimizerPatterns.Write((QilNode) (local0)).AddPattern(OptimizerPatternName.JoinAndDod); OptimizerPatterns.Write((QilNode) (local0)).AddArgument(OptimizerPatternArgument.DodStep, local4); }
}
}
}
}
}
if (this[XmlILOptimization.AnnotateDodMerge]) {
if (local1.NodeType == QilNodeType.Loop) {
QilNode local3 = local1[1];
if (local3.NodeType == QilNodeType.Invoke) {
if ( IsDocOrderDistinct(local3) ) {
if (AllowReplace(XmlILOptimization.AnnotateDodMerge, local0)) {
OptimizerPatterns.Write((QilNode) (local0)).AddPattern(OptimizerPatternName.DodMerge); }
}
}
}
}
return NoReplace(local0);
}