private string GetWholeAssociationPath(CriteriaImpl.Subcriteria subcriteria, out string parentAlias)
        {
            string path = subcriteria.Path;

            // some messy, complex stuff here, since createCriteria() can take an
            // aliased path, or a path rooted at the creating criteria instance
            ICriteria parent = null;

            if (StringHelper.IsNotRoot(path, out var testAlias))
            {
                // if it is a compound path
                if (!testAlias.Equals(subcriteria.Alias))
                {
                    // and the qualifier is not the alias of this criteria
                    //      -> check to see if we belong to some criteria other
                    //          than the one that created us
                    aliasCriteriaMap.TryGetValue(testAlias, out parent);
                }
            }
            if (parent == null)
            {
                // otherwise assume the parent is the the criteria that created us
                parent = subcriteria.Parent;
            }
            else
            {
                path = StringHelper.Unroot(path);
            }

            parentAlias = parent.Alias;

            if (parent.Equals(rootCriteria))
            {
                // if its the root criteria, we are done
                return(path);
            }
            else
            {
                // otherwise, recurse
                return(GetWholeAssociationPath((CriteriaImpl.Subcriteria)parent, out _) + '.' + path);
            }
        }