private static Join<?, ?> joinRecursively(String[] properties, Join<?, ?> join, int index) {
        if (index < properties.length - 1) {
            return joinRecursively(properties, findOrCreateJoin(properties[index], join), index + 1);
        } else {
            return join;
        }
    }
private static Join<?, ?> joinRecursively(String[] properties, Join<?, ?> join, int index) {
        if (index < properties.length - 1) {
            return joinRecursively(properties, findOrCreateJoin(properties[index], join), index + 1);
        } else {
            return join;
        }
    }
private static Join < ? , ? > joinRecursively ( String [ ] properties , Join < ? , ? > join , int index ) { if ( index < properties . length - 1 ) { return joinRecursively ( properties , findOrCreateJoin ( properties [ index ] , join ) , index + 1 ) ; } else { return join ; } }
Join recursively using the split property path.

@param properties property path.
@param join       current join.
@param index      index of the current property to be joined.
@return the resulting join.
Join recursively using the split property path .