code: func (c *Constraint) matchesPermanodeTypes() []string {
  	if c == nil {
  		return nil
  	}
  	if pc := c.Permanode; pc != nil && pc.Attr == "camliNodeType" && pc.Value != "" {
  		return []string{pc.Value}
  	}
  	if lc := c.Logical; lc != nil {
  		sa := lc.A.matchesPermanodeTypes()
  		sb := lc.B.matchesPermanodeTypes()
  		switch lc.Op {
  		case "and":
  			if len(sa) != 0 {
  				return sa
  			}
  			return sb
  		case "or":
  			return append(sa, sb...)
  		}
  	}
  	return nil
  
  }
docs: // matchesPermanodeTypes returns a set of valid permanode types that a matching
  // permanode must have as its "camliNodeType" attribute.
  // It returns a zero-length slice if this constraint might include things other
  // things.