code: func (p *Selection) convert2PhysicalPlan(prop *requiredProperty) (*physicalPlanInfo, error) {
  	info, err := p.getPlanInfo(prop)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	if info != nil {
  		return info, nil
  	}
  	// Firstly, we try to push order.
  	info, err = p.convert2PhysicalPlanPushOrder(prop)
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	if len(prop.props) > 0 {
  		// Secondly, we push nothing and enforce this property.
  		infoEnforce, err := p.convert2PhysicalPlanEnforce(prop)
  		if err != nil {
  			return nil, errors.Trace(err)
  		}
  		if infoEnforce.cost < info.cost {
  			info = infoEnforce
  		}
  	}
  	if _, ok := p.GetChildByIndex(0).(*DataSource); !ok {
  		info = p.matchProperty(prop, info)
  	}
  	p.storePlanInfo(prop, info)
  	return info, nil
  }
docs: // convert2PhysicalPlan implements the LogicalPlan convert2PhysicalPlan interface.