void resolveXMLSelect(Query query, GroupSymbol group, List<ElementSymbol> validElements, QueryMetadataInterface metadata)
    throws QueryMetadataException, TeiidComponentException, QueryResolverException {
        
        GroupContext externalGroups = null;
    Select select = query.getSelect();
    // Allow SELECT DISTINCT, which is ignored.  It is meaningless except for
    // self-entity relation using relate() functionality
    List elements = select.getSymbols();
    for (int i = 0; i < elements.size(); i++) {
      SelectSymbol ss = (SelectSymbol) elements.get(i);
      if (ss instanceof ElementSymbol) {
        // Here we make an assumption that: all elements named with "xml" must use qualified name
        // rather than a simple "xml" in order to distinguish it from "SELECT xml" and
        // "SELECT model.document.xml" case, both of whom stand for selecting the whole document.
        // Then "SELECT xml" or "SELECT model.document.xml" can only stand for one meaning with two cases:
        // 1) whole document
        // 2) whole document, root name = "xml", too
        // There are other cases of "xml", such as, element name = "xml",
        // but those are ok because those will be resolved later as normal elements
        String symbolName = ss.getName();
        if(symbolName.equalsIgnoreCase("xml") || symbolName.equalsIgnoreCase(group.getName() + ".xml")) { //$NON-NLS-1$ //$NON-NLS-2$
          if(elements.size() != 1) {
            throw new QueryResolverException(QueryPlugin.Util.getString("XMLQueryResolver.xml_only_valid_alone")); //$NON-NLS-1$
          }
          select.clearSymbols();
                    AllSymbol all = new AllSymbol();
                    all.setElementSymbols(validElements);
          select.addSymbol(all);
          query.setSelect(select);
          return;
        }
                // normal elements
        resolveElement((ElementSymbol)ss, validElements, externalGroups, metadata);
      } else if (ss instanceof AllInGroupSymbol) {
        // Resolve the element with "*" case. such as "A.*"
        // by stripping off the ".*" part,
        String symbolName = ss.getName();
        int index = symbolName.indexOf("*"); //$NON-NLS-1$
        String elementPart = symbolName.substring(0, index-1);
                // Check for case where we have model.doc.*
                if(elementPart.equalsIgnoreCase(group.getName())) {
                    select.clearSymbols();
                    AllSymbol all = new AllSymbol();
                    all.setElementSymbols(validElements);
                    select.addSymbol(all);
                    query.setSelect(select);
                } else {
                    // resovlve the node which is specified
                    ElementSymbol elementSymbol = new ElementSymbol(elementPart);
                    resolveElement(elementSymbol, validElements, externalGroups, metadata);