private QilNode MatchPattern(QilNode pattern, QilIterator testNode)
{
QilList list;
if (pattern.NodeType == QilNodeType.Error)
{
// Invalid pattern
return pattern;
}
else if (pattern.NodeType == QilNodeType.Sequence)
{
list = (QilList)pattern;
Debug.Assert(0 < list.Count, "Pattern should have at least one filter");
}
else
{
list = _f.BaseFactory.Sequence();
list.Add(pattern);
}
QilNode result = _f.False();
for (int i = list.Count - 1; 0 <= i; i--)
{
QilLoop filter = (QilLoop)list[i];
_ptrnBuilder.AssertFilter(filter);
result = _f.Or(
_refReplacer.Replace(filter.Body, filter.Variable, testNode),
result
);
}
return result;
}