protected void addLocalCandidates(
      Channel template,
      List<Set<? extends NamedChannel>> broadcastPlanChannels,
      RequestedGlobalProperties rgps,
      List<PlanNode> target,
      CostEstimator estimator) {
    for (RequestedLocalProperties ilp :
        this.inConn.getInterestingProperties().getLocalProperties()) {
      final Channel in = template.clone();
      ilp.parameterizeChannel(in);

      // instantiate a candidate, if the instantiated local properties meet one possible local
      // property set
      outer:
      for (OperatorDescriptorSingle dps : getPossibleProperties()) {
        for (RequestedLocalProperties ilps : dps.getPossibleLocalProperties()) {
          if (ilps.isMetBy(in.getLocalProperties())) {
            in.setRequiredLocalProps(ilps);
            instantiateCandidate(dps, in, broadcastPlanChannels, target, estimator, rgps, ilp);
            break outer;
          }
        }
      }
    }
  }
 @Override
 protected List<RequestedLocalProperties> createPossibleLocalProperties() {
   RequestedLocalProperties props = new RequestedLocalProperties();
   if (this.ordering == null) {
     props.setGroupedFields(this.keys);
   } else {
     props.setOrdering(this.ordering);
   }
   return Collections.singletonList(props);
 }