private String generateProjectionName(CompiledValue projExpr, ExecutionContext context) {
    String name = null;
    if (projExpr instanceof RuntimeIterator) {
      RuntimeIterator rIter = (RuntimeIterator) projExpr;
      name = rIter.getDefinition();
      int index = name.lastIndexOf('.');
      if (index > 0) {
        name = name.substring(index + 1);
      } else if (name.charAt(0) == '/') {
        index = name.lastIndexOf('/');
        name = name.substring(index + 1);
      } else {
        name = rIter.getInternalId();
      }
    } else {
      int type = projExpr.getType();
      if (type == PATH) {
        name = ((CompiledPath) projExpr).getTailID();
      } else if (type == Identifier) {
        name = ((CompiledID) projExpr).getId();
      } else if (type == LITERAL) {
        name = (((CompiledLiteral) projExpr)._obj).toString();
      } else if (type == METHOD_INV) {
        name = ((CompiledOperation) projExpr).getMethodName();
      } else {
        name = "field$" + context.nextFieldNum();
        // name = projExpr.toString();
      }
    }
    return name;
  }
This function should be used to create a StructType for those queries which have * as
projection attribute (implying null projection attribute) & multiple from clauses
geode-core/src/main/java/org/apache/geode/cache/query/internal/CompiledSelect.java