private Predicate processUserPredicate(Predicate predicate) {
    if (predicate == null) {
      return null;
    }
    ProcessingPredicateVisitor visitor = new ProcessingPredicateVisitor(this);
    PredicateHelper.visit(predicate, visitor);

    // add the sub-resource to the request
    Set<String> categories = visitor.getSubResourceCategories();
    for (String category : categories) {
      addPropertyToSubResource(category, null);
    }
    // record the sub-resource properties on this query
    subResourcePredicateProperties.addAll(visitor.getSubResourceProperties());

    if (hasSubResourcePredicate()) {
      for (Map.Entry<String, QueryImpl> entry : requestedSubResources.entrySet()) {
        subResourcePredicate = getSubResourcePredicate(predicate, entry.getKey());
        entry.getValue().processUserPredicate(subResourcePredicate);
      }
    }

    processedPredicate = visitor.getProcessedPredicate();
    return processedPredicate;
  }
Merge the tree of query properties returned by the renderer with properties in
the query tree.

@param node   property tree node
@param query  query associated with the property tree node
ambari-server/src/main/java/org/apache/ambari/server/api/query/QueryImpl.java