code: func (r *DescribeRule) newMatches(br blob.Ref, dr *DescribeRequest) (brs []blob.Ref) {
  	if r.IfResultRoot {
  		if !dr.blobInitiallyRequested(br) {
  			return nil
  		}
  	}
  	if r.parentRule != nil {
  		if _, ok := dr.resFromRule[r.parentRule][br]; !ok {
  			return nil
  		}
  	}
  	db, ok := dr.m[br.String()]
  	if !ok || db.Permanode == nil {
  		return nil
  	}
  	if t := r.IfCamliNodeType; t != "" {
  		gotType := db.Permanode.Attr.Get("camliNodeType")
  		if gotType != t {
  			return nil
  		}
  	}
  	for attr, vv := range db.Permanode.Attr {
  		matches := false
  		for _, matchAttr := range r.Attrs {
  			if attr == matchAttr {
  				matches = true
  				break
  			}
  			if strings.HasSuffix(matchAttr, "*") && strings.HasPrefix(attr, strings.TrimSuffix(matchAttr, "*")) {
  				matches = true
  				break
  			}
  		}
  		if !matches {
  			continue
  		}
  		for _, v := range vv {
  			if br, ok := blob.Parse(v); ok {
  				brs = append(brs, br)
  			}
  		}
  	}
  	return brs
  }
docs: // requires dr.mu be held.