protected EntityIterableHandle getHandleImpl()

in entity-store/src/main/java/jetbrains/exodus/entitystore/iterate/SortIndirectIterable.java [142:235]


    protected EntityIterableHandle getHandleImpl() {
        return new EntityIterableHandleDecorator(getStore(), getType(), source.getHandle()) {
            private final EntityIterableHandleBase sortedLinksHandle = (EntityIterableHandleBase) sortedLinks.getHandle();

            @NotNull
            private final int[] linkIds = mergeFieldIds(new int[]{linkId}, mergeFieldIds(decorated.getLinkIds(), sortedLinksHandle.getLinkIds()));

            @NotNull
            @Override
            public int[] getLinkIds() {
                return linkIds;
            }

            @Override
            public void toString(@NotNull final StringBuilder builder) {
                super.toString(builder);
                builder.append(sourceTypeId);
                builder.append('-');
                builder.append(linkId);
                builder.append('-');
                applyDecoratedToBuilder(builder);
                builder.append('-');
                sortedLinksHandle.toString(builder);
            }

            @Override
            public void hashCode(@NotNull final EntityIterableHandleHash hash) {
                hash.apply(sourceTypeId);
                hash.applyDelimiter();
                hash.apply(linkId);
                hash.applyDelimiter();
                super.hashCode(hash);
                hash.applyDelimiter();
                hash.apply(sortedLinksHandle);
            }

            @Override
            public boolean isMatchedEntityAdded(@NotNull final EntityId added) {
                return decorated.isMatchedEntityAdded(added) ||
                        sortedLinksHandle.isMatchedEntityAdded(added);
            }

            @Override
            public boolean isMatchedEntityDeleted(@NotNull final EntityId deleted) {
                return decorated.isMatchedEntityDeleted(deleted) ||
                        sortedLinksHandle.isMatchedEntityDeleted(deleted);
            }

            @Override
            public boolean isMatchedLinkAdded(@NotNull final EntityId source,
                                              @NotNull final EntityId target,
                                              final int linkId) {
                if (SortIndirectIterable.this.linkId == linkId) {
                    return true;
                }
                if (decorated.hasLinkId(linkId)) {
                    if (decorated.isMatchedLinkAdded(source, target, linkId)) {
                        return true;
                    }
                    if (!sortedLinksHandle.hasLinkId(linkId)) {
                        return false;
                    }
                }
                return sortedLinksHandle.isMatchedLinkAdded(source, target, linkId);
            }

            @Override
            public boolean isMatchedLinkDeleted(@NotNull final EntityId source,
                                                @NotNull final EntityId target,
                                                final int linkId) {
                if (SortIndirectIterable.this.linkId == linkId) {
                    return true;
                }
                if (decorated.hasLinkId(linkId)) {
                    if (decorated.isMatchedLinkDeleted(source, target, linkId)) {
                        return true;
                    }
                    if (!sortedLinksHandle.hasLinkId(linkId)) {
                        return false;
                    }
                }
                return sortedLinksHandle.isMatchedLinkDeleted(source, target, linkId);
            }

            @Override
            public boolean isMatchedPropertyChanged(@NotNull EntityId id,
                                                    final int propertyId,
                                                    @Nullable final Comparable oldValue,
                                                    @Nullable final Comparable newValue) {
                return decorated.isMatchedPropertyChanged(id, propertyId, oldValue, newValue) ||
                        sortedLinksHandle.isMatchedPropertyChanged(id, propertyId, oldValue, newValue);
            }
        };
    }