ITree openImmutableTree(@NotNull final MetaTreeImpl metaTree) { final int structureId = getStructureId(); final long upToDateRootAddress = metaTree.getRootAddress(structureId); final boolean hasDuplicates = metaInfo.hasDuplicates(); final boolean treeIsEmpty = upToDateRootAddress == Loggable.NULL_ADDRESS; final Log log = environment.getLog(); final ITree result; if (!metaInfo.isKeyPrefixing()) { final BTreeBalancePolicy balancePolicy = environment.getBTreeBalancePolicy(); result = treeIsEmpty ? new BTreeEmpty(log, balancePolicy, hasDuplicates, structureId) : new BTree(log, balancePolicy, upToDateRootAddress, hasDuplicates, structureId); } else { if (treeIsEmpty) { result = new PatriciaTreeEmpty(log, structureId, hasDuplicates); } else { result = hasDuplicates ? new PatriciaTreeWithDuplicates(log, upToDateRootAddress, structureId) : new PatriciaTree(log, upToDateRootAddress, structureId); } } return result; }