protected override QilNode VisitFunction(QilFunction local0) {
QilNode local1 = local0[0];
QilNode local2 = local0[1];
QilNode local3 = local0[2];
XmlQueryType local4 = (XmlQueryType)((QilFunction)local0).XmlType;
if (( (local0).XmlType .IsSubtypeOf( XmlQueryTypeFactory.NodeS ) ) && (this[XmlILOptimization.AnnotateIndex1])) {
if ((( local1.Count == 2 ) && ( ( (QilNode) (local1)[0] ).XmlType .IsSubtypeOf( XmlQueryTypeFactory.Node ) )) && ( ( ( (QilNode) (local1)[1] ).XmlType ) == ( XmlQueryTypeFactory.StringX ) )) {
if (local2.NodeType == QilNodeType.Filter) {
QilNode local5 = local2[0];
QilNode local7 = local2[1];
if (local5.NodeType == QilNodeType.For) {
QilNode local6 = local5[0];
if (local7.NodeType == QilNodeType.Not) {
QilNode local8 = local7[0];
if (local8.NodeType == QilNodeType.IsEmpty) {
QilNode local9 = local8[0];
if (local9.NodeType == QilNodeType.Filter) {
QilNode local10 = local9[0];
QilNode local12 = local9[1];
if (local10.NodeType == QilNodeType.For) {
QilNode local11 = local10[0];
if (local12.NodeType == QilNodeType.Eq) {
QilNode local13 = local12[0];
QilNode local14 = local12[1];
if (local13 == local10) {
if (local14.NodeType == QilNodeType.Parameter) {
if ( (local14) == ( (QilNode) (local1)[1] ) ) {
if (AllowReplace(XmlILOptimization.AnnotateIndex1, local0)) {
// The following conditions must be true for this pattern to match:
// 1. The function must have exactly two arguments
// 2. The type of the first argument must be a subtype of Node
// 3. The type of the second argument must be String
// 4. The return type must be a subtype of Node*
// 5. Every reference to $args[0] (context document) must be wrapped in an (Root *) function
// 6. $keyParam cannot be used with the $bindingNodes and $bindingKeys expressions
EqualityIndexVisitor visitor = new EqualityIndexVisitor();
if (visitor.Scan(local6, local1[0], local14) && visitor.Scan(local11, local1[0], local14)) {
// All conditions were true, so annotate Filter with the EqualityIndex pattern
OptimizerPatterns patt = OptimizerPatterns.Write(local2);
patt.AddPattern(OptimizerPatternName.EqualityIndex);
patt.AddArgument(OptimizerPatternArgument.IndexedNodes, local5);
patt.AddArgument(OptimizerPatternArgument.KeyExpression, local11);
}
}
}
}
}
}
}
}
}
}
}
}
}
}
if (this[XmlILOptimization.AnnotateIndex2]) {
if ((( local1.Count == 2 ) && ( ( ( (QilNode) (local1)[0] ).XmlType ) == ( XmlQueryTypeFactory.Node ) )) && ( ( ( (QilNode) (local1)[1] ).XmlType ) == ( XmlQueryTypeFactory.StringX ) )) {
if (local2.NodeType == QilNodeType.Filter) {
QilNode local5 = local2[0];
QilNode local7 = local2[1];
if (local5.NodeType == QilNodeType.For) {
QilNode local6 = local5[0];
if (local7.NodeType == QilNodeType.Eq) {
QilNode local8 = local7[0];
QilNode local9 = local7[1];
if (local9.NodeType == QilNodeType.Parameter) {
if ( (local9) == ( (QilNode) (local1)[1] ) ) {
if (AllowReplace(XmlILOptimization.AnnotateIndex2, local0)) {
// Same as EqualityIndex1, except that each nodes has at most one key value
EqualityIndexVisitor visitor = new EqualityIndexVisitor();
if (visitor.Scan(local6, local1[0], local9) && visitor.Scan(local8, local1[0], local9)) {
// All conditions were true, so annotate Filter with the EqualityIndex pattern
OptimizerPatterns patt = OptimizerPatterns.Write(local2);
patt.AddPattern(OptimizerPatternName.EqualityIndex);
patt.AddArgument(OptimizerPatternArgument.IndexedNodes, local5);
patt.AddArgument(OptimizerPatternArgument.KeyExpression, local8);
}
}
}
}
}
}
}
}
}
return NoReplace(local0);
}