private void traverseAndSetMultiValuedFields(PartitionFieldNode root,
      TreeMap<Long, Partition> partitions, TreeMap<Long, StorageDescriptor> sds,
      TreeMap<Long, SerDeInfo> serdes, TreeMap<Long, List<FieldSchema>> cds) throws MetaException {
    if (root == null) {
      return;
    }
    // if a multi-valued node is found set its value using its value-setters
    // note that once a multi-valued node is found the method does not recurse further
    // this is because the multi-valued setter also sets the values of all its descendents
    if (root.isMultiValued) {
      MutivaluedFieldSetter multiValuedFieldSetter = multiValuedFieldSetters.get(root.fieldName);
      if (multiValuedFieldSetter == null) {
        throw new MetaException(
            "Cannot find multi-valued field setter for field " + root.fieldName);
      }
      multiValuedFieldSetter.setValue(root, partitions, sds, serdes, cds);
    } else {
      for (PartitionFieldNode child : root.children) {
        traverseAndSetMultiValuedFields(child, partitions, sds, serdes, cds);
      }
    }
  }
Given a list of partition ids, returns the List of partially filled partitions based on the
projection list used to instantiate this PartitionProjectionEvaluator
@param partitionIds List of partition ids corresponding to the Partitions objects which are requested
@return Partitions where each partition has only the projected fields set
@throws MetaException
standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/PartitionProjectionEvaluator.java