private Node predictNode(Node currentNode, Dictionary<string, dynamic> inputData)
{
bool missingField;
string fieldId;
dynamic predicateValue;
dynamic inDataValue;
foreach (Node children in currentNode.Children)
{
fieldId = children.Predicate.Field;
missingField = !inputData.ContainsKey(fieldId);
if ((missingField) && (children.Predicate.MissingOperator))
{
predictNode(children, inputData);
}
else
{
//is a text field or items
bool textOrItems = children.Predicate.HasTerm;
if (missingField)
{
if (textOrItems)
{
inDataValue = "";
}
else
{
continue;
}
}
else
{
inDataValue = inputData[fieldId];
}
predicateValue = children.Predicate.Value;
if (textOrItems)
{
inDataValue = termMatches(inDataValue, fieldId, children.Predicate.Term);
}
switch (children.Predicate.Operator)
{
case "<":
case "<*":
if (inDataValue < predicateValue)
{
return predictNode(children, inputData);
}
break;
case "<=":
case "<=*":
if (inDataValue <= predicateValue)
{
return predictNode(children, inputData);
}
break;
case ">":
case ">*":
if (inDataValue > predicateValue)
{
return predictNode(children, inputData);
}
break;
case ">=*":
case ">=":
if (inDataValue >= predicateValue)
{
return predictNode(children, inputData);
}
break;
case "=*":
case "==*":
case "=":
case "==":
if (inDataValue == predicateValue)
{
return predictNode(children, inputData);
}
break;
case "!=*":
case "!=":
case "<>*":
case "<>":
if (inDataValue != predicateValue)
{
return predictNode(children, inputData);
}
break;
default:
throw new System.Exception(children.Predicate.Operator + " is not recognized");
}
}
}
return currentNode;
}