code: func (p *PhysicalHashJoin) MarshalJSON() ([]byte, error) {
  	leftChild := p.children[0].(PhysicalPlan)
  	rightChild := p.children[1].(PhysicalPlan)
  	eqConds, err := json.Marshal(p.EqualConditions)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	leftConds, err := json.Marshal(p.LeftConditions)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	rightConds, err := json.Marshal(p.RightConditions)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	otherConds, err := json.Marshal(p.OtherConditions)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	buffer := bytes.NewBufferString("{")
  	buffer.WriteString(fmt.Sprintf(
  		"\"eqCond\": %s,\n "+
  			"\"leftCond\": %s,\n "+
  			"\"rightCond\": %s,\n "+
  			"\"otherCond\": %s,\n"+
  			"\"leftPlan\": \"%s\",\n "+
  			"\"rightPlan\": \"%s\""+
  			"}",
  		eqConds, leftConds, rightConds, otherConds, leftChild.GetID(), rightChild.GetID()))
  	return buffer.Bytes(), nil
  }
docs: // MarshalJSON implements json.Marshaler interface.