digraph interpreter {
  node [fontname="dejavusansmono"]
  edge [fontname="dejavusansmono"]
  node [shape=record]
  edge [dir=back,arrowtail=empty,arrowsize=1.5]
  Interpreter [label="{\N|+ operator(query : string, ...) : Results\l|
                      # MakeLogicalPlan(...) : LogicalPlan\l|
                      - plan_cache_ : Map(QueryHash, CachedPlan)\l}"]
  Interpreter -> DistributedInterpreter
  Results [label="{\N|+ PullAll(stream) : void\l|- plan_ : CachedPlan\l}"]
  Interpreter -> Results
    [dir=forward,style=dashed,arrowhead=open,label="<<create>>"]
  CachedPlan -> Results
    [dir=forward,arrowhead=odiamond,taillabel="1",headlabel="*"]
  Interpreter -> CachedPlan [arrowtail=diamond,taillabel="1",headlabel="*"]
  CachedPlan -> LogicalPlan [arrowtail=diamond]
  LogicalPlan [label="{\N|+ GetRoot() : LogicalOperator
                      \l+ GetCost() : double\l}"]
  LogicalPlan -> SingleNodeLogicalPlan [style=dashed]
  LogicalPlan -> DistributedLogicalPlan [style=dashed]
  DistributedInterpreter -> DistributedLogicalPlan
    [dir=forward,style=dashed,arrowhead=open,label="<<create>>"]
}
