anchor.diff:      end.
   
   join_left_bnode(#bnode{id=Id,left_key_fun=LeftKeyFun}=BNode, _Op, Token, Env) ->
  -    ?ECHO(join_left_bnode),
       Key=LeftKeyFun(Token),
       modify_left_index(Id, Key, _Op, Token, Env),
       FetchedWMEs=fetch_right_index(Id, Key, Env),
  
positive.code:     end.
  
  join_right_bnode(#bnode{id=Id,right_key_fun=RightKeyFun}=BNode, {_Op,WME}=WMO, Env) ->
      ?ECHO(join_right_bnode),
      Key=RightKeyFun(WME),
      case modify_right_index(Id, Key, WMO, Env) of
          false -> % WM not modified
  
negative.code:     Token ++ [WME].
  
  downstream_tokens(#bnode{id=Id,bnode_ids=BNodeIds,pnodes=PNodes}=BNode, _Op, Tokens, Env) ->
      % Filter tokens with b-node match critera (e.g. check additional guards before output)
      MatchedTokens=[ T || T <- Tokens, match_token(BNode, T)],
      % Each matched token pass to the next b-nodes (i.e. downstreaming)
  