public Entity next()

in query/src/main/java/jetbrains/exodus/query/InMemoryQuickSortIterable.java [51:123]


            public Entity next() {
                if (src == null) {
                    init();
                }
                if (current >= src.size()) {
                    throw new NoSuchElementException();
                }
                while (top >= 0 && right.get(top) < current) {
                    left.remove(top);
                    right.remove(top);
                    medianStart.remove(top);
                    medianEnd.remove(top);
                    top--;
                }
                // either current == 0 (and top == -1)
                // or     medianStart[top] <= current <= medianEnd[top]
                // or     current == medianEnd[top] + 1 and we should go deeper
                if (top < 0 || current > medianEnd.get(top)) {
                    final Comparator<Entity> comparator = getComparator();
                    do {
                        int l;
                        int r;
                        if (top < 0) {
                            l = 0;
                            r = src.size() - 1;
                        } else if (current == left.get(top)) {
                            l = left.get(top);
                            r = medianStart.get(top) - 1;
                        } else {
                            l = medianEnd.get(top) + 1;
                            r = right.get(top);
                        }

                        Entity median = src.get((l + r) / 2);
                        int i = l;
                        medians.clear();
                        toRight.clear();
                        do {
                            while (i <= r && comparator.compare(src.get(i), median) < 0) {
                                if (toRight.size() + medians.size() > 0) {
                                    src.set(i - toRight.size() - medians.size(), src.get(i));
                                }
                                i++;
                            }
                            // src[i] >= median
                            if (i <= r) {
                                Entity entity = src.get(i);
                                if (comparator.compare(entity, median) == 0) {
                                    medians.add(entity);
                                } else {
                                    toRight.add(entity);
                                }
                                i++;
                            }
                        } while (i <= r);
                        // i == r + 1
                        int current = i - toRight.size() - medians.size();
                        for (Entity e : medians) {
                            src.set(current++, e);
                        }
                        for (Entity e : toRight) {
                            src.set(current++, e);
                        }

                        left.add(l);
                        right.add(r);
                        medianStart.add(r + 1 - toRight.size() - medians.size());
                        medianEnd.add(r - toRight.size());
                        top++;
                    } while (current < medianStart.get(top));
                }
                return src.get(current++);
            }