/**
  * Analyzes filter expression to build query graph model.
  *
  * @param topNode - filter top node
  * @param queryGraph - model containing relationships between streams, to be written to
  */
 public static void analyze(ExprNode topNode, QueryGraph queryGraph, boolean isOuterJoin) {
   // Analyze relationships between streams. Relationships are properties in AND and EQUALS nodes
   // of joins.
   if (topNode instanceof ExprEqualsNode) {
     ExprEqualsNode equalsNode = (ExprEqualsNode) topNode;
     if (!equalsNode.isNotEquals()) {
       analyzeEqualsNode(equalsNode, queryGraph, isOuterJoin);
     }
   } else if (topNode instanceof ExprAndNode) {
     ExprAndNode andNode = (ExprAndNode) topNode;
     analyzeAndNode(andNode, queryGraph, isOuterJoin);
   } else if (topNode instanceof ExprBetweenNode) {
     ExprBetweenNode betweenNode = (ExprBetweenNode) topNode;
     analyzeBetweenNode(betweenNode, queryGraph);
   } else if (topNode instanceof ExprRelationalOpNode) {
     ExprRelationalOpNode relNode = (ExprRelationalOpNode) topNode;
     analyzeRelationalOpNode(relNode, queryGraph);
   } else if (topNode instanceof ExprDotNode && !isOuterJoin) {
     ExprDotNode dotNode = (ExprDotNode) topNode;
     analyzeDotNode(dotNode, queryGraph);
   }
 }