public Iterable instantiate()

in query/src/main/java/jetbrains/exodus/query/TreeKeepingEntityIterable.java [110:156]


    public Iterable<Entity> instantiate() {
        optimize();
        Iterable<Entity> result;
        if (instance == null) {
            result = instantiateForWholeHierarchy();
        } else if (optimizedTree instanceof GetAll) {
            result = instance;
        } else {
            // clone
            TreeKeepingEntityIterable tkei = new TreeKeepingEntityIterable(null, entityType, optimizedTree.getClone(), queryEngine);
            tkei.optimizedTree = optimizedTree;
            result = queryEngine.toEntityIterable(queryEngine.intersect(instance, tkei));
        }
        if (sorts != null) {
            result = sorts.apply(entityType, result, queryEngine);
        }
        if (result == null) {
            result = instantiateForWholeHierarchy();
        }
        if (isExplainOn) {
            Iterable<Entity> explained = result;
            while (explained instanceof SortEngine.InMemorySortIterable) {
                explained = ((SortEngine.InMemorySortIterable) explained).getSrc();
            }
            if (explained instanceof EntityIterableBase) {
                final EntityIterableBase entityIterable = ((EntityIterableBase) explained).getSource();
                if (entityIterable != EntityIterableBase.EMPTY) {
                    final PersistentEntityStoreImpl store = queryEngine.getPersistentStore();
                    final Explainer explainer = store.getExplainer();
                    final boolean explainForcedForThread = Explainer.isExplainForcedForThread();
                    if (!explainForcedForThread) {
                        explainer.start(origin);
                    }
                    entityIterable.setOrigin(origin);
                    explainer.explain(origin, Explainer.INITIAL_TREE, annotatedTree);
                    explainer.explain(origin, Explainer.OPTIMIZED_TREE, optimizedTree);
                    if (!explainForcedForThread) {
                        for (Entity entity : result) {
                            explainer.explain(origin, Explainer.ITERABLE_ADVANCES);
                        }
                        explainer.log(origin);
                    }
                }
            }
        }
        return result;
    }