private bool AllowDodReverse(QilNode nd) {
OptimizerPatterns patt = OptimizerPatterns.Read(nd);
// AllowDodReverse if this pattern is the ancestor, ancestor-or-self, preceding, or preceding-sibling axis,
// filtered by either an element name or a node kind test.
if (patt.MatchesPattern(OptimizerPatternName.Axis) ||
patt.MatchesPattern(OptimizerPatternName.FilterElements) ||
patt.MatchesPattern(OptimizerPatternName.FilterContentKind)) {
if (IsStepPattern(patt, QilNodeType.Ancestor) || IsStepPattern(patt, QilNodeType.AncestorOrSelf) ||
IsStepPattern(patt, QilNodeType.XPathPreceding) || IsStepPattern(patt, QilNodeType.PrecedingSibling)) {
return true;
}
}
return false;
}